对于这个地球上大多数人来说,真正的数字化革命还没有开始。在接下来的10年里,变化将无处不在,让我们一起来给这个世界编码吧!——Eric Schmidt Google执行主席
在授课过程中,我们会注重多解释一些“为什么”以及错误程序的分析,从环环相扣的问题入手,将一些易被忽视且对高水平程序设计很重要的“点”,沿着数据结构从简单到复杂的主线逐一展开,在实例的“不断深化和提升”中引出知识点,通过对问题的举一反三和前后知识点的融会贯通,由浅入深地引导你循序渐进地编写规模逐步增大的程序。
在过去30年90%的时间里,C语言独领风骚,仅偶尔被 Java 超越,可见其魅力。C语言作为一种高级语言,其实并不高级,但正是这种“低级”给我们更多思考的机会。期望通过本课程的学习,你不只是简单地能够掌握一种语言的语法,还能理解隐含在语法背后的思想,并初步具备灵活使用这些思想进行编写程序解决实际问题的能力。如果你掌握了这些,你会发现,迈向成功的最后一步不过是选择一种合适的编程工具而已。
你想从“菜鸟”升级为“程序猿”吗?那就加入“稀饭”的行列,和我们一起踏上爱上C语言之旅吧。
考核环节 | 所占分值 | 考核与评价细则 | 对应课程目标 |
(1)自主式作业 | 20% | 自主式作业,占总成绩的20%。 | 课程目标1 至课程目标2 |
(2) 开放式实验大作业 | 20% | 开放式实验大作业,占总成绩的20%。 | 课程目标3 |
(3) 实验上机随堂测试 | 50% | 实验上机随堂测试,占总成绩的50%。 不提交实验大作业者,课程总成绩按0分计。 | 课程目标1 至课程目标2 |
(4) 小班主题研讨 | 10% | 小班主题研讨,占总成绩的10%。 | 课程目标3 |
(5)附加分 | 0-15分 | (1)实验上机随堂测试获得附加题的附加分(0-5分)。 (2)参加期末的“实验课堂大翻转、创意程序大比拼”,可以获得1~10分的附加分。 | 课程目标1 至课程目标3 |
课程免修 |
| (1)参加ACM/ICPC、NOI/NOIP竞赛并获得省级或省级以上奖项者,在中国大学MOOC平台上选修《C语言程序设计精髓》MOOC课程并获得合格认证证书者,或选修《程序设计基础》MOOC课程(含大学先修课)并获得优秀认证证书者,均有资格参加免修考试。 (2)免修考试成绩在90分及以上者,可以免修本课程。 (3)具有参加免修考试资格但未参加免修考试或免修考试未达到90分者,可以免自主式作业,均按满分计。 |
|
课程最终成绩 = (1)+(2)+(3)+(4)+(5) |
序号 | 教学内容 | 教学要求 | 学时 | 教学方式 | 对应课程 目标 |
1 | 0.课程内容与学习方法 1. 程序设计的方法学基础——基本运算和基本I/O (1) 冯.诺依曼计算机的组成和工作原理,不同类型数据在计算机中的存储与表示; (2) 软件开发的基本过程,常用的C语言集成开发工具,程序在计算机中的编辑、编译、链接和运行; (3) 基本数据类型,常量与变量,运算符与表达式,优先级与结合性,算术运算,赋值运算,自动类型转换和强制类型转换; (4) 数据的键盘输入和屏幕输出等简单I/O操作,顺序结构程序设计。 | 1.掌握常用的集成开发环境,以及程序在计算机中编辑、编译、链接和运行的过程 2. 掌握变量、常量、数据类型的基本概念,能够用基本数据类型在计算机中表示和存储数据 3. 掌握算术、赋值等基本运算符以及运算符的优先级和结合性 4. 掌握键盘输入和屏幕输出等简单的I/O操作,能够用基本数据类型、基本运算和顺序结构构造程序 | 2 | 慕课自学/ 课堂讲授/ 讲练结合/ 边讲边练 | 课程目标1 |
2 | 1. 程序设计的方法学基础——基本控制结构 (1) 算法的基本概念,算法的流程图描述; (2) 关系运算,逻辑运算,复杂逻辑的计算机表示; (3) 条件语句和开关语句,单分支、双分支、多分支选择结构; (4) for、while、do-while三种循环语句,当型循环和直到型循环,计数控制、条件控制和标记控制的循环结构; (5) 程序的三种基本控制结构的嵌套,嵌套循环的执行过程。 | 1. 掌握算法的基本概念,对于给定的算法能够用流程图描述 2. 掌握选择结构和循环结构的基本控制方法,能够用顺序、选择和循环三种基本控制结构构造结构化程序 3. 掌握嵌套循环程序的设计和实现方法 | 2 | 慕课自学/ 课堂讲授/ 讲练结合/ 边讲边练 | 课程目标1 |
3 | 1. 程序设计的方法学基础——程序测试和调试 (1) 累加求和、连乘求积、统计、计算均值和方差等常用算法; (2) 测试用例的基本概念,程序测试的目的,程序测试的基本方法; (3) 程序错误的类型,利用现代集成开发环境和单步跟踪或可视化调试工具调试程序的基本方法。 | 1. 掌握累加求和、连乘求积、统计、计算均值和方差等常用算法; 2. 针对给定的设计任务,能够选择恰当的基本控制结构构造程序 3. 掌握程序测试和程序调试的基本方法和技巧,能够选择恰当的工具和方法对程序进行测试和调试 | 2 | 慕课自学/ 课堂讲授/ 讲练结合/ 边讲边练 | 课程目标1 |
4 | 1. 程序设计的方法学基础——函数 (1) 信息隐藏,过程抽象,函数封装,函数复用,模块分解,自顶向下、逐步求精的模块化程序设计方法; (2) 函数定义,函数调用,函数原型,函数的参数传递,函数的返回值,用简单变量做函数参数重构代码; (3) 变量的作用域,变量的生存期 (4) 断言,防御式编程,程序的健壮性、可读性和可维护性。 | 1. 掌握自顶向下、逐步求精的模块化程序设计方法 2. 掌握用函数封装和过程抽象重构或复用代码的基本方法,理解分而治之对提高程序质量的重要性 3. 掌握防御式编程的基本方法 | 2 | 慕课自学/ 课堂讲授/ 讲练结合/ 边讲边练 | 课程目标1 |
5 | 2. 程序设计的问题求解基础——枚举与递推 (1) 枚举、递推/迭代等常用问题求解策略; (2) 流程转移控制的基本方法,流程转移控制语句(break,continue, goto),结构化程序的特点 (3) 算法的效率,程序的优化。 | 1. 掌握枚举、递推/迭代等常用问题求解方法的基本原理思想,针对给定的问题,能够选择恰当的方法求解问题,能够使用启发式策略对程序的效率进行优化 2. 掌握流程转移控制的方法,以及结构化程序设计的基本思想,理解好结构对提高程序可读性的重要性 | 2 | 慕课自学/ 课堂讲授/ 讲练结合/ 边讲边练 | 课程目标2 |
6 | 2. 程序设计的问题求解基础——分治与递归 (1) 分治、递归等常用问题求解策略; (2) 递归函数的定义、调用和执行过程,条件递归的基本要素; (3) 递归的优缺点分析。 (4) 程序注释,代码风格。 | 1. 掌握分治、递归等问题求解方法的基本思想,理解分治与递归、递归与迭代之间的关系 2. 掌握递归程序的设计和实现方法 3. 理解良好的代码风格对提高程序可读性的重要性 | 2 | 慕课自学/ 课堂讲授/ 讲练结合/ 边讲边练 | 课程目标2 |
7 | 3. 程序设计的算法和数据结构基础——数组 (1) 一维数组和二维数组,线性表的顺序存储结构; (2) 数组做函数参数,传值调用与模拟传引用调用; (3) 数组元素的增、删、改查等基本算法,求最值算法; (4) 数组下标越界问题分析。 | 1. 理解数组下标越界产生的危害和后果 2. 掌握传值调用与模拟传引用调用的区别,以及数组元素增删改查相关程序的设计和实现方法 3. 掌握计算最大最小值算法及其程序设计和实现方法 | 2 | 慕课自学/ 课堂讲授/ 讲练结合/ 边讲边练 | 课程目标3 |
8 | 3. 程序设计的算法和数据结构基础——排序和查找 (1) 顺序查找、二分查找等经典的查找算法; (2) 选择排序、插入排序、冒泡排序、快速排序等经典的排序算法; (3) 算法的时间复杂度。 | 1.掌握常用的排序和查找算法及其程序设计和实现方法,针对给定的问题,能够选择恰当的算法构造程序 2.了解算法时间复杂度的概念 | 2 | 慕课自学/ 课堂讲授/ 讲练结合/ 边讲边练 | 课程目标3 |
9 | 3. 程序设计的算法和数据结构基础——指针 (1) 内存的编址方法,直接寻址与间接寻址,指针的基本概念,指针变量的定义、初始化和解引用; (2) 指针变量作函数参数的参数传递方式,用指针变量作函数参数的必要性; (3) 内存映像,动态内存分配函数; (4) 函数指针及其应用。 | 1. 掌握指针的概念,及指针的定义和解引用方法 2. 掌握指针做函数参数的参数传递方式,掌握指针做函数参数的程序设计和实现方法 3.掌握用函数指针作函数参数的必要性,掌握用函数指针编写通用函数的程序设计和实现方法 | 2 | 慕课自学/ 课堂讲授/ 讲练结合/ 边讲边练 | 课程目标3 |
10 | 3. 程序设计的算法和数据结构基础——字符数组和字符指针 (1) 字符指针和一维字符数组,字符串的输入输出; (2) 字符指针或一维字符数组做函数参数; (3) 缓冲区溢出,缓冲区溢出攻击。 | 1. 掌握字符串的存储和输入输出方法 2. 掌握向函数传递字符串的程序设计和实现方法 | 2 | 慕课自学/ 课堂讲授/ 讲练结合/ 边讲边练 | 课程目标3 |
11 | 3. 程序设计的算法和数据结构基础——字符串处理与相关算法 (1) 字符串的复制、连接、比较等基本操作; (2) 字符串的排序、检索和匹配等相关算法。 | 1.掌握字符串复制、连接、比较等基本操作及其程序设计与实现方法 2. 掌握字符串排序、检索、匹配等多个字符串的处理方法及其程序设计与实现方法 | 2 | 慕课自学/ 课堂讲授/ 讲练结合/ 边讲边练 | 课程目标3 |
12 | 3. 程序设计的算法和数据结构基础——结构体和共用体 (1) 结构体类型,共用体类型,枚举类型,结构体变量、结构体数组,结构体指针,结构体成员和共用体成员的引用; (2) 用结构体变量、数组或指针封装函数参数,向函数传递结构体数据。 | 1. 掌握结构体类型和共用体类型的定义和使用方法 2.掌握用结构体封装函数参数向函数传递结构体数据的程序设计和实现方法 | 2 | 慕课自学/ 课堂讲授/ 讲练结合/ 边讲边练 | 课程目标3 |
13 | 3. 程序设计的算法和数据结构基础——结构体和共用体的应用 (1) 结构体类型的应用; (2) 共用体类型的应用; (3) 抽象数据类型,从结构体到类,从面向过程到面向对象。 习题课(1学时):结构体编程练习 | 掌握结构体和共用体类型的不同特点和应用场合,针对具体问题能够选择恰当的数据类型构造数据结构 | 2 | 慕课自学/ 课堂讲授/ 讲练结合/ 边讲边练 | 课程目标3 |
14 | 3. 程序设计的算法和数据结构基础——动态数据结构 (1) 动态数组,静态数据结构,动态数据结构; (2) 线性表的链式存储结构,单向链表的基本操作和程序设计,链表在求解实际问题中的应用; (3) 栈、队列、树、图等其他数据结构及其应用。 | 1. 掌握静态数据结构和动态数据结构的优缺点,针对给定的问题,能够选择恰当的数据结构构造程序 2. 理解定长数组和动态数组的区别,掌握使用动态数组的程序设计和实现方法 3. 掌握单向链表的基本操作及其程序设计和实现方法 4. 了解其他数据结构 | 2 | 慕课自学/ 课堂讲授/ 讲练结合/ 边讲边练 | 课程目标3 |
15 | 3. 程序设计的算法和数据结构基础——指针和数组 (1) 指针和数组间的关系; (2) 指针数组,索引存储结构,字符串的物理排序与索引排序。 (3) 命令行参数。 | 1.理解数组与指针之间的关系 2.掌握指针数组的概念,以及使用指针数组处理字符串的程序设计和实现方法 | 2 | 慕课自学/ 讲练结合/ 先学后练/ 边讲边练 | 课程目标3 |
16 | 3. 程序设计的算法和数据结构基础 —内存管理和文件I/O (1) 内存泄漏、非法内存访问等常见的内存错误及其解决对策; (2) 文件I/O操作; (3) 综合应用程序设计。 | 1. 掌握文件的I/O操作 2. 掌握内存管理的基本方法 3. 能够综合应用数组、指针、字符串、结构体、文件编写一个完整的数据管理系统 | 2 | 讲练结合/ 边讲边练 | 课程目标3 |
实验1 | 熟悉系统开发环境,上机模拟测试 | 掌握常用的集成开发环境,以及程序在计算机中编辑、编译、链接和运行的过程 | 2 | 讲练结合/ 以考促学 | 课程目标1 |
实验2 | 实验上机随堂测试+实验课堂小翻转。 测试内容:基本控制结构和穷举/递推/迭代/递归算法 | 掌握结构化程序的设计方法,能够选择恰当的问题求解策略求解实际问题 | 3 | 过程评价/ 以考促学/ 生讲生评 | 课程目标1~2 |
实验3 | 实验上机随堂测试+实验课堂小翻转。 测试内容:数组和排序查找算法 | 掌握数组的增删改查等基本操作,能够选择和应用恰当的算法求解实际问题 | 3 | 过程评价/ 以考促学/ 生讲生评 | 课程目标3 |
实验4 | 实验上机随堂测试+实验课堂小翻转。 测试内容:字符串/指针/结构体/链表 | 掌握字符串的复制、连接、比较、检索、匹配等基本操作,能够选择和应用恰当的数据结构求解实际问题 | 3 | 过程评价/ 以考促学/ 生讲生评 | 课程目标3 |
实验5 | 主题研讨。采用“生讲生评、互动研学的方式”进行小班主题研讨。 | 通过查阅资料和自学相关内容,进行实践专题研讨。 | 2 | 实践研学/ 互动展学/ 生讲生评 | 课程目标1~3 |
实验6 | 实验课堂大翻转。采用“生讲生评、互动展学的方式”进行“实验课堂大翻转、创意程序大比拼”。 | 通过查阅资料和自学相关内容,以团队合作方式完成一个综合应用型项目的设计,并进行成果展示和答辩 | 3 | 实践研学/ 互动展学/ 生讲生评 | 课程目标1~3 |
本门课程的基本内容是面向零基础的学生。
进阶内容是面向有一定编程基础或学过本平台的“程序设计基础”MOOC课程(https://www.icourse163.org/course/HIT-56001)的学生。
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定义变量得到的计算结果也可能在结果的最后一位小数上有所不同。