对于这个地球上大多数人来说,真正的数字化革命还没有开始。在接下来的10年里,变化将无处不在,让我们一起来给这个世界编码吧!——Eric Schmidt Google执行主席
编程语言层出不穷,不胜枚举,能帮助我们以不变应万变的奥秘何在?答案就是“编程之魂”。传统的编程入门课,都是以教授一种语言的基本语法为主,试图通过语言来传达“编程之魂”,但这样也许你会将更多的精力用在理解语言的语法细节上,只见树木不见森林。
期望通过本课程的学习,你不只是简单地能够掌握一种语言的语法,还能理解隐含在语法背后的思想,并初步具备灵活使用这些思想进行编写程序解决实际问题的能力。如果你掌握了这些,你会发现,迈向成功的最后一步不过是选择一种合适的编程工具而已。
我们会用15周的时间来深入讲解C语言,在授课过程中,我们会注重多解释一些“为什么”以及错误程序的分析,从环环相扣的问题入手,将一些易被忽视且对高水平程序设计很重要的“点”,沿着数据结构从简单到复杂的主线逐一展开,在实例的“不断深化和提升”中引出知识点,通过对问题的举一反三和前后知识点的融会贯通,由浅入深地引导你循序渐进地编写规模逐步增大的程序。
程序设计语言数以千计,能广为流传的不过几十种,能风光三十年的更是屈指可数,其中影响最大、寿命最长的非C语言莫属。尽管Java等后起之秀呈后来居上之势,但C语言宝刀不老,仍然笑傲天下,论剑江湖,铁杆粉丝遍布世界各地。
你想加入“稀饭”的行列吗?你想从“菜鸟”升级为“程序猿”吗?那就加入我们,和我们一起踏上爱上C语言之旅吧。
本门课总成绩100分。每周我们都留有在线完成的单元测验(单选题,每周3分,15周合计45分);单元作业(编程题在线测试题,3-12周每周4分,10周合计40分);在期末,我们会统一安排一次在线期末考试(15分)。
第1-2周的编程题以及第13-15周的编程题,以及所有练兵区的题目,都仅作为自测练习题,不计入总分。
先做练兵区的单元测试题,可以提高得高分的几率。
练兵区的编程题稍有难度,可作为深入和扩展练习。
讨论区的答疑活跃度和发帖答疑质量(发水贴者将被列入黑名单)仅作为期末赠书奖励的参考,不计入总分。
总评成绩达到60分及以上的,可以获得本课程的合格证书。总成绩在80分以上的可以获得优秀证书。
第1周 初识C语言(主讲:朱聪慧):
1.1 计算机基础
1.2 C语言的集成开发环境 Code::Blocks和Visual C++6.0介绍
1.3 变量的定义和debug简介
1.4 不同类型数据的存储与表示
1.5 宏常量与const常量
第2周 简单计算(主讲:朱聪慧):
2.1 赋值运算符
2.2 算术运算符
2.3 增1和减1运算符
2.4 自动类型转换与类型提升
2.5 强制类型转换
第3周 输入输出(主讲:朱聪慧):
3.1 数据的格式化屏幕输出
3.2 数据的格式化键盘输入
3.3 单个字符的输入输出
3.4 进阶内容1——用getchar()输入数据存在的问题(错误案例分析)
3.5 进阶内容2——用%c格式符输入数据存在的问题(错误案例分析)
第4周 选择结构(主讲:朱聪慧):
4.1 关系运算和逻辑运算
4.2 条件语句
4.3 开关语句及错误案例分析
4.4 进阶内容——数值溢出和精度损失问题分析
4.5 进阶内容——软件测试和错误实例分析
第5周 循环结构(主讲:朱聪慧):
5.1 计数控制的循环和累加累乘-for语句
5.2 标记控制的循环和递推求解-while和do-while语句
5.3 条件控制的循环—猜数游戏
5.4 嵌套循环
5.5 流程的转移控制和穷举法求解问题
5.6 进阶内容——软件调试与错误实例分析
第6周 函数(主讲:朱聪慧):
6.1 函数定义、函数调用与参数传递、函数原型
6.2 函数封装与程序的健壮性
6.3 断言与防御式编程
6.4 进阶内容——代码风格
第7周 函数与递归(主讲:朱聪慧):
7.1 函数的嵌套调用和递归调用
7.2 递归函数与函数调用栈
7.3 进阶内容——尾递归
7.4 变量的作用域
7.5 变量的存储类型
第8周 数组(主讲:朱聪慧):
8.1 数组的定义和初始化
8.2 进阶内容——数组元素的访问和螺旋矩阵
8.3 向函数传递一维数组和二维数组
8.4 计算最值和查找算法的函数实现
8.5 排序算法的函数实现
8.6 进阶内容——数组的其他应用
第9周 指针与字符串(主讲:朱聪慧):
9.1 指针变量的定义、初始化及其解引用
9.2 指针变量做函数参数
9.3 字符数组和字符指针
9.4 字符串处理函数
第10周 指针与函数(主讲:朱聪慧):
10.1 向函数传递字符串
10.2 从函数返回字符串
10.3 进阶内容——缓冲区溢出与数组下标越界问题
10.4 进阶内容——函数指针及其应用
第11周 指针与数组(主讲:朱聪慧):
11.1 指针的算术运算
11.2 指针和一维数组间的关系
11.3 进阶内容——指针和二维数组间的关系
11.4 进阶内容——指针数组及其应用
第12周 结构体和共用体(主讲:朱聪慧):
12.1 结构体类型与结构体变量
12.2 结构体数组
12.3 结构体的相关计算和操作
12.4 向函数传递结构体及结构体指针
12.5 枚举类型和共用体及其应用
12.6 进阶内容——结构体应用的典型实例
第13周 动态内存分配(主讲:朱聪慧):
11.1 C程序的内存映像和动态内存分配
11.2 进阶内容——动态数组
11.3 进阶内容——常见的内存错误及其解决对策
第14周 文件操作(主讲:朱聪慧):
14.1 二进制文件、文本文件和标准输入输出流
14.2 文件的打开和关闭
14.3 按格式读写文件
14.4 按字符和行读写文件
14.4.1 按字符和行读写文件
14.4.2 进阶内容——使用函数feof()的注意事项
14.5 按数据块读写文件
14.6 文件的随机读写和文件缓冲
第15周 动态数据结构(主讲:朱聪慧):
15.1 单向链表
15.2 进阶内容——其他数据结构简介
注:进阶内容有一定的难度,不在考试范围内。
本门课程的基本内容是面向零基础的学生。进阶内容是面向有一定编程基础或者有大学计算机基础的学生,但是进阶内容不做为课程的考试内容。
1. 面向读者的教材网站(https://book.sunner.cn)
该网站的服务对象是我们自编教材的读者,提供教材课件、例题源代码、教材勘误表等资源,便于学生浏览和下载后自学,读者也可利用该网站反馈教材使用意见和建议。
2. 作业在线测试系统(https://sse.hit.edu.cn/t)
该网站的服务对象是使用我们自编教材的读者,在我们编写的由高等教育出版社出版的《C语言程序设计(第2版)》的封底有一个刮刮卡,刮开可以获得一个免费的注册账号,登陆我们开发的C语言作业在线测试系统,在该系统中可以自主选择教材对应章编号中的习题进行自测,提交习题答案后,系统会实时显示评分,另外在习题市场中读者还可以发布题目给其他读者练习。
3. 参考教材
1)苏小红,王宇颖,孙志岗,《C语言程序设计(第3版)》,高等教育出版社,2015年9月,购书网址:京东
2)苏小红,车万翔,王甜甜,《C语言程序设计学习指导(第3版)》,高等教育出版社,2015年9月,购书网址:京东
3)苏小红,孙志岗,陈惠鹏,《C语言大学实用教程(第3版)》,电子工业出版社,2012年6月,购书网址:亚马逊
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-13.12mingw-setup.exe)
Q:如何提问,能得到快速的解答?
A:
1)标题:撰写标题时,要注意把要问的问题的出处和核心词写出来,最好用【】标出来,比如【第1周编程题在线测试的第1题】求解。
2)内容:内容上要把你不懂的地方说出来,最好详细点,把自己尝试修改的过程也说一下。
3)附源代码:把源码贴到讨论区(不要使用图片,因为图片看不清,也不能拷贝),这样大家可以通过你贴出的源码帮你分析错在哪里。
4)附错误提示:把编译出错的提示也贴出来(一般是英文形式),这样大家不用拷贝粘贴和调试程序也能帮你分析出错原因了。
Q:常见的运行结果错误的原因有哪些?
A:程序提交后通常显示三类错误:格式错误、结果错误、运行超时。
对于格式错误,请检查你的程序的输入输出信息是否和题目要求的完全一致。
对于结果错误,请检查你的程序使用的算法和计算公式是否正确。
对于运行超时错误,请检查你的程序是否存在死循环,死循环通常由永真的循环控制条件或者while后面添加了不必要的分号引起。
注意事项如下:
1)数据输入输出的格式没有严格按照题目的要求写,直接拷贝粘贴题目中给的格式字符串和提示信息,是最简单和不易出现格式错误的方法。
2)输入输出字符串中的字符大小写有错误,或者空格数量和位置与题目中的要求不一致,或者缺少换行等。
3)仔细审题,例如题目要求计算半圆的周长,就不要加上直径,更不要计算整个圆的周长。
4)如果只有几个测试用例通过,还有没有通过的测试用例,那么说明你没有考虑所有的可能性,甚至是非法输入的情况。
5)检查是否为英文输入,切记切换成英文状态再输入。一些同学误用了中文作为输入法,就会出现不能编译的问题,例如中文状态下输入的分号和英文状态下输入的分号是完全不同的,语句的末尾使用的分号一定要在英文状态下输入。
Q:我想考二级,学完这个课程可以考吗?
A:二级考试题考查语言的语法细节较多,所以能否通过二级考试,要看你的应试水平如何。本课侧重于讲解程序设计的方法以及错误程序的排错方法,更关注实战能力,因此应该说本课程对学生的要求是高于二级考试的要求的。
Q:上机编写C语言程序使用什么软件好?
A:课程演示会使用Code::Blocks+gcc+gdb集成开发环境,但是你使用任何其他C语言开发工具也都可以。不过,我们推荐使用Code::Blocks,在教材网站(https://book.sunner.cn)上有软件下载的网址链接,《C语言程序设计学习指导(第2版)》上有关于如何使用这个软件的详细介绍,它是一个开源的跨平台的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语言程序设计学习指导(第2版)》
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-13.12mingw-setup.exe)。请下载带gcc编译器和gdb调试器的code::blocks(下载软件名中务必包含mingw-setup),否则程序无法编译。无法从官方下载软件的,也可以从百度云盘上下载:链接: https://pan.baidu.com/s/1dDnLNET 密码: joyh
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任务应该就能够纠正这个问题。
Q:为什么我的程序与网站上的程序运行结果中的小数点最后一位存在差异?
A: 这是因为网站的OJ使用的操作系统和编译器与我们自己使用的操作系统和编译器不一样,从而导致浮点运算的精度不一致。
此外,使用float和double定义变量得到的计算结果也可能在结果的最后一位小数上有所不同。