对于这个地球上大多数人来说,真正的数字化革命还没有开始。在接下来的10年里,变化将无处不在,让我们一起来给这个世界编码吧!——Eric Schmidt Google执行主席
我们会用15周的时间来深入讲解C语言,在授课过程中,我们会注重多解释一些“为什么”以及错误程序的分析,从环环相扣的问题入手,将一些易被忽视且对高水平程序设计很重要的“点”,沿着数据结构从简单到复杂的主线逐一展开,在实例的“不断深化和提升”中引出知识点,通过对问题的举一反三和前后知识点的融会贯通,由浅入深地引导你循序渐进地编写规模逐步增大的程序。
在过去30年90%的时间里,C语言独领风骚,仅偶尔被 Java 超越,可见其魅力。C语言作为一种高级语言,其实并不高级,但正是这种“低级”给我们更多思考的机会。期望通过本课程的学习,你不只是简单地能够掌握一种语言的语法,还能理解隐含在语法背后的思想,并初步具备灵活使用这些思想进行编写程序解决实际问题的能力。如果你掌握了这些,你会发现,迈向成功的最后一步不过是选择一种合适的编程工具而已。
你想从“菜鸟”升级为“程序猿”吗?那就加入“稀饭”的行列,和我们一起踏上爱上C语言之旅吧。
学习本课前你必须知道的那些事儿
向老师提问、做编程作业的注意事项
小白遇到的安装使用问题尽在其中
开篇
授课视频内容进度概览
本课程使用的教材和软件开发平台
第1周——初识C语言从认识变量和常量开始
1.1 为什么要学C语言(10分钟)
1.2 C 语言集成开发环境简介(16分钟)
1.3 如何定义一个变量(10分钟)
1.4 变量的表数范围和存储形式(29分钟)
1.5 宏常量与const常量(13分钟)
本周课件、知识点小结和常见错误小结
先修知识(有基础者越过)——二进制和内存(11分半)
第1周测验
练兵区——单选题——不计入总分
练兵区——编程题——不计入总分
第2周——数字间的那些事儿,做点计算哈
2.1 算术运算(20分钟)
2.2 赋值运算(15分钟)
2.3 增1和减1运算(17分钟)
2.4 自动类型转换(5分钟)
2.5 强制类型转换(7分半)
本周课件、知识点小结和常见错误小结
第2周测验
练兵区——单选题——不计入总分
练兵区——编程题——不计入总分
第3周——从键盘中来,到键盘中去,开始输入和输出啦
3.1 数据的格式化屏幕输出(15分钟)
3.2 数据的格式化键盘输入(18分钟)
3.3 单个字符的输入输出(15分半)
3.4 进阶:用getchar()输入数据存在的问题(含错误案例分析)(10分)
3.5 进阶:用%c输入数据存在的问题(含错误案例分析)(10分)
本周课件、知识点小结和常见错误小结
第3周测验
练兵区——单选题——不计入总分
第3周编程题在线测试
练兵区——编程题——不计入总分
第4周——无处不在的抉择
4.1 关系运算符和逻辑运算符(23分钟)
4.2 条件语句(14分钟)
4.3 开关语句——条条道路通罗马(28分钟)
4.4 进阶:数值溢出和精度损失问题(34分半)
4.5 进阶:软件测试与错误实例分析(20分半)
本周课件、知识点小结和常见错误小结
选学——用raptor绘制选择结构的流程图(27分钟)
第4周测验
练兵区——单选题——不计入总分
第4周编程题在线测试
练兵区——编程题——不计入总分
第5周——周而复始的循环之道
5.1 计数控制的循环(31分钟)
5.2 递推(33分钟)
5.3 条件控制的循环(32分钟)
5.4 嵌套循环(17分钟)
5.5 穷举(39分钟)
5.6 进阶:软件调试与错误实例分析(27分钟)
本周课件、知识点小结和常见错误小结
选学——用raptor绘制循环结构的流程图(25分钟)
第5周测验
练兵区——单选题——不计入总分
第5周编程题在线测试
练兵区——编程题——不计入总分
第6周——函数:分工与合作的艺术
6.1 函数定义、调用、参数传递和函数原型(35分半)
6.2 函数封装与程序的健壮性(23分钟)
6.3 进阶:断言与防御式编程(14分钟)
6.4 进阶:代码风格(22分钟)
本周课件、知识点小结和常见错误小结
选学——结构化与模块化程序设计方法(41分)
第6周测验
练兵区——单选题——不计入总分
第6周编程题在线测试
练兵区——编程题——不计入总分
第7周——《盗梦空间》的逻辑:探寻递归的奥秘
7.1 从嵌套调用到递归调用(20分钟)
7.2 递归是如何执行的(16分钟)
7.3 进阶:尾递归是什么鬼?(14分半)
7.4 变量的作用域(22分半)
7.5 进阶:变量的生存期(33分半)
本周课件、知识点小结和常见错误小结
选学——分治和迭代(33分半)
7.6 进阶: 多文件结构(7分半)
第7周测验
练兵区——单选题——不计入总分
第7周编程题在线测试
练兵区——编程题——不计入总分
第8周—— 一堆数据来了,你准备好了吗
本周内容导读
8.1 数组的定义和初始化(43分)
8.2 向函数传递一堆相同类型的数据(15分半)
8.3 查找算法——众里寻他千百度(37分半)
8.4 排序算法——让世界变得更有序(17分半)
本周课件、知识点小结和常见错误小结
第8周测验
练兵区——单选题——不计入总分
第8周编程题在线测试
练兵区——编程题——不计入总分
第9周——指针:C语言世界中所向披靡的“金箍棒”
本周内容导读
9.1 指针变量的定义、初始化及其解引用(19分)
9.2 指针变量作函数参数(36分半)
9.3 进阶:函数指针及其应用(27分)
9.4 进阶:数组的趣味应用(50分)
本周课件、知识点小结和常见错误小结
第9周测验
练兵区——单选题——不计入总分
第9周编程题在线测试
练兵区——编程题——不计入总分
第10周——字符串:C语言世界中的大力水手
本周内容导读
10.1 字符串的存储与表示(28分)
10.2 字符串处理操作(15分)
10.3 向函数传递和从函数返回字符串(26分)
10.4 进阶:缓冲区溢出与缓冲区溢出攻击(39分半)
本周课件、知识点小结和常见错误小结
第10周测验
练兵区——单选题——不计入总分
第10周编程题在线测试
练兵区——编程题——不计入总分
第11周——指针的孪生兄弟
本周内容导读
11.1 指针的运算(8分)
11.2 指针和一维数组间的关系(14分)
11.3 指针和二维数组间的关系(18分)
11.4 进阶:指针数组及其应用(22分)
本周课件、知识点小结和常见错误小结
第11周测验
练兵区——单选题——不计入总分
第11周编程题在线测试
练兵区——编程题——不计入总分
第12周——海陆空齐上阵:又来了一堆数据
本周内容导读
12.1 结构体类型(13分)
12.2 结构体与数组的嵌套(7分)
12.3 结构体的相关计算和操作(19分)
12.4 向函数传递一堆不同类型的数据(28分半)
12.5 枚举类型和共用体类型有什么用(25分)
12.6 进阶:典型应用实例——洗发牌模拟(20分)
本周课件、知识点小结和常见错误小结
第12周测验
练兵区——单选题——不计入总分
第12周编程题在线测试
练兵区——编程题——不计入总分
第13周——原来内存也可以这么玩,我是指针我怕谁
本周内容导读
13.1 何为动态内存分配(26分)
13.2 动态数组
13.3 进阶:常见的内存错误及其解决对策(52分半)
本周课件、知识点小结和常见错误小结
第13周测验
练兵区——单选题——不计入总分
练兵区——编程题——不计入总分
第14周——结构设计的艺术
本周内容导读
14.1 数据的链式存储——单向链表
14.2 进阶内容:其他数据结构简介(21分)
本周课件
学习体会
第14周测验
练兵区——单选题——不计入总分
练兵区——编程题——不计入总分
第15周——学会保存你的数据
本周内容导读
15.1 二进制文件与文本文件(14分)
15.2 文件的打开和关闭(8分)
15.3 格式化数据的文件读写(5分)
15.4 字符和字符串的文件读写(39分)
15.5 内存数据块的文件读写(7分)
15.6 随机读写与文件缓冲(6分半)
本周课件、知识点小结和常见错误小结
第15周测验
练兵区——单选题——不计入总分
练兵区——编程题——不计入总分
本门课程的基本内容是面向零基础的学生。
进阶内容是面向有一定编程基础或学过本平台的“程序设计基础”MOOC课程(https://www.icourse163.org/course/HIT-56001)的学生,但是进阶内容不做为课程的考试内容。
评分方案:本门课总成绩100分。
每周的单元测验(单选题,15周,占45%);单元作业(编程题在线测试题,3-12周合计10周,占40%);课堂交流区的回帖质量和数量占5%,期末在线考试占10%。
第1-2周的编程题以及第13-15周的编程题,作为自测练习题,不计入总分。
练兵区的所有题目都不计入总分,仅供练兵而已。
课程成绩和在讨论区义务为同学答疑的质量(发水贴者将被列入黑名单)将作为期末赠书奖励的参考。
证书:
设置“合格”(达到60分以上)、"优秀"(达到80分以上)两档标准,由任课教师签发课程结业证书,其中成绩“优秀”者将颁发优秀证书。
1. 面向读者的教材网站(https://book.sunner.cn)
该网站的服务对象是我们自编教材的读者,提供教材课件、例题源代码、教材勘误表等资源,便于学生浏览和下载后自学,读者也可利用该网站反馈教材使用意见和建议。
2. 作业在线测试系统
该网站的服务对象是使用我们自编教材的读者,在我们编写的由高等教育出版社出版的《C语言程序设计(第3版)》的封底有一个刮刮卡,刮开可以获得一个免费的注册账号,登陆我们开发的C语言作业在线测试系统,在该系统中可以自主选择教材对应章编号中的习题进行自测,提交习题答案后,系统会实时显示评分,另外在习题市场中读者还可以发布题目给其他读者练习。
3. 参考教材
1)苏小红,王宇颖,孙志岗,《C语言程序设计(第3版)》,高等教育出版社,2015年7月,购书网址:京东
2)苏小红,车万翔,王甜甜,《C语言程序设计学习指导(第3版)》,高等教育出版社,2015年8月,购书网址:京东
3)苏小红,孙志岗,陈惠鹏,《C语言大学实用教程(第4版)》,电子工业出版社,2017年1月,购书网址:亚马逊
4)苏小红,孙志岗等,《C语言大学实用教程学习指导(第3版)》,电子工业出版社,2012年6月,购书网址:亚马逊
5)苏小红等,《程序设计基础》,高等教育出版社,待出版
5.相关链接
爱课程国家精品资源共享课:https://www.icourses.cn/coursestatic/course_3153.html
相关MOOC课程:程序设计基础:https://www.icourse163.org/course/hit-56001#/info
带gcc编译器和gdb调试器的code::blocks集成开发环境的官网下载地址:https://www.codeblocks.org/downloads/26
(例如codeblocks-17.12mingw-setup.exe,一定要带mingw哦),安装注意事项见《C语言程序设计学习指导(第3版)》。
安装软件的完整步骤可参考:https://jingyan.baidu.com/article/b24f6c822756b886bfe5da90.html
(https://www.jianshu.com/p/1e7f0e6b99d0 大牛给计算机专业学生的7个建议,告诉你为什么毕业前要学好C语言)
Q:如何提问,能得到快速的解答?
A:
1)标题:撰写标题时,要注意把要问的问题的出处和核心词写出来,最好用【】标出来,比如【第1周编程题在线测试的第1题】求解。
2)内容:内容上要把你不懂的地方说出来,最好详细点,把自己尝试修改的过程也说一下。
3)附源代码:把源码贴到讨论区(不要使用图片,因为图片看不清,也不能拷贝),这样大家可以通过你贴出的源码帮你分析错在哪里。
4)附错误提示:把编译出错的提示也贴出来(一般是英文形式),这样大家不用拷贝粘贴和调试程序也能帮你分析出错原因了。
Q:常见的运行结果错误的原因有哪些?
A:程序提交后通常显示三类错误:格式错误、结果错误、运行超时。
对于格式错误,请检查你的程序的输入输出信息是否和题目要求的完全一致。
对于结果错误,请检查你的程序使用的算法和计算公式是否正确,如果涉及浮点运算,可以尝试将float换成double或者反之。
对于运行超时错误,请检查你的程序是否存在死循环,死循环通常由永真的循环控制条件或者while后面添加了不必要的分号引起。注意在本网站提交程序进行测试时,不要使用flush()函数清除缓冲区,输入字符串也不要使用fgets(),原因详见视频讲解 。
注意事项如下:
1)数据输入输出的格式没有严格按照题目的要求写,直接拷贝粘贴题目中给的格式字符串和提示信息,是最简单和不易出现格式错误的方法。
2)输入输出字符串中的字符大小写有错误,或者空格数量和位置与题目中的要求不一致,或者缺少换行等。
3)仔细审题,例如题目要求计算半圆的周长,就不要加上直径,更不要计算整个圆的周长。
4)如果只有几个测试用例通过,还有没有通过的测试用例,那么说明你没有考虑所有的可能性,甚至是非法输入的情况。
5)检查是否为英文输入,切记切换成英文状态再输入。一些同学误用了中文作为输入法,就会出现不能编译的问题,例如中文状态下输入的分号和英文状态下输入的分号是完全不同的,语句的末尾使用的分号一定要在英文状态下输入。
Q:如果无法正常观看视频,我该怎么办?
A:如果无法正常观看视频,请尝试进行如下操作:
1.确认你使用了支持视频播放的浏览器。切换到flash播放器无法调整播放速度,切换到HTML5播放器可以调整播放速度。建议都切换到HTML5播放器。
2.清除浏览器的浏览数据及缓存。
3.关闭硬件加速。请在浏览器的 设置 - 显示高级设置 中,将“使用硬件加速模式”(如果可用)一项取消勾选,并重新启动浏览器。
4.检查你的网速。你可以尝试在其他视频网站播放视频(如优酷、土豆等),如果你在其他网站仍无法观看视频,那么你的网络连接很可能有问题。你需要重新连接你的网络或者切换至网速更快的网络以实现流畅的视频播放。
Q:我想考二级,学完这个课程可以考吗?
A:二级考试题考查语言的语法细节较多,所以能否通过二级考试,要看你的应试水平如何。本课侧重于讲解程序设计的方法以及错误程序的排错方法,更关注实战能力,因此应该说本课程对学生的要求是高于二级考试的要求的。
Q:上机编写C语言程序使用什么软件好?
A:课程演示会使用Code::Blocks+gcc+gdb集成开发环境,但是你使用任何其他C语言开发工具也都可以。不过,我们推荐使用Code::Blocks,在教材网站(https://book.sunner.cn)上有软件下载的网址链接,《C语言程序设计学习指导(第3版)》上有关于如何使用这个软件的详细介绍,它是一个开源的跨平台的C/C++集成开发环境,它安装简单,比Visual C 6.0等其他集成开发环境更简单易学。
Q:使用codeblocks在sources中新建一个file,也就是不在原来默认的main.c里面写代码,那么应该如何调试才能使运行的时候直接运行新建的里面的程序呢?
A:给工程添加完新的文件后,移出旧的文件main.c再重新编译即可,移出文件的方法和添加的方法类似。
Q:为什么安装好软件后创建新项目的时候软件总是说:could not save project<invalid path> maybe the file is write-protected 呢?
A:codeblocks要求软件安装的目录最好不要带空格或汉字,不要按默认设置安装到program file目录下,卸载后再选择安装到根目录下试试。更多注意事项,参见高等教育出版社的《C语言程序设计学习指导(第3版)》
Q:请问为什么我在Code::Blocks里面点开Debug中的watch里面是空白的?
A:按照视频1.2讲的方法新建一个控制台应用程序,不要直接新建一个C文件,直接新建或者打开一个 C文件是无法使用调试功能的。
检查一下是不是将CB安装到默认的program files目录下了,CB不能安装到中文或者有空格的目录下,请卸载软件,重新安装到根目录下,再试试。
此外,全速运行程序时,是看不到watch窗口内的内容的,必须在单步运行的时候才能看到watch窗口内的内容。
Q:为什么我的程序编译不了?
A:一种可能是你安装了不带编译器和调试器的版本,重新安装带编译器和调试器的版本。免费开源的C 语言集成开发环境Code::Blocks+gcc+gdb的官方下载网址:https://www.codeblocks.org/downloads/26(目前最新版本是codeblocks-17.12mingw-setup.exe)。请下载带gcc编译器和gdb调试器的code::blocks(下载软件名中务必包含mingw),否则程序无法编译。无法从官方下载软件的,也可以从百度云盘上下载:链接: https://pan.baidu.com/s/1bqzj4yN 密码: sucp
C 语言集成开发环境code::blocks的安装和使用方法见教材《C语言程序设计学习指导(第3版)》
如果不想重装系统,可参考
安装软件的完整步骤可参考:https://jingyan.baidu.com/article/b24f6c822756b886bfe5da90.html
另一种可能是你用的系统自带了迈克菲杀毒软件,请卸载迈克菲上毒软件即可。
Q:为什么我的程序无法运行,显示cannot open output file bin\Debug\election.exe Permission denied.
A:可能是你的文件正在别的程序中使用,或者还有程序的副本正在执行(或者你上次运行没有关闭),因此不能写入election.exe,把副本关闭或者结束election.exe任务应该就能够纠正这个问题。另外,请检查一下你的IDE是不是是不是安装到C盘的默认目录下了,请将IDE安装到D盘,并将你的程序也保存到D盘,不要保存到C盘。
Q:为什么我的程序与网站上的程序运行结果中的小数点最后一位存在差异?
A: 这是因为网站的OJ使用的操作系统和编译器与我们自己使用的操作系统和编译器不一样,从而导致浮点运算的精度不一致。
此外,使用float和double定义变量得到的计算结果也可能在结果的最后一位小数上有所不同。