王国维在《人间词话》中说:古今之成大事业、大学问者,必经过三种境界:
昨夜西风凋碧树。独上高楼,望断天涯路。
衣带渐宽终不悔,为伊消得人憔悴。
众里寻他千百度,暮然回首,那人却在灯火阑珊处。
成为编程高手的过程中,同样也要经历这样三个境界。
程序设计语言数以千计,能广为流传的不过几十种,能风光三十年以上的更是屈指可数,其中影响最大、寿命最长的非C语言莫属。尽管Java等后起之秀呈后来居上之势,但C语言宝刀不老,仍然笑傲天下,论剑江湖,铁杆粉丝遍布世界各地。
https://www.jianshu.com/p/1e7f0e6b99d0
大牛给计算机专业学生的7个建议,告诉你为什么毕业前要学好C语言
来吧小伙伴们,和我们一起踏上爱上程序设计之旅吧。
了解软件开发的基本过程和集成开发环境,具备程序测试和调试的能力;掌握多种程序设计技巧和程序调试方法,具备良好的编程素养,针对具体实际问题能够选择恰当的算法和数据结构,并综合运用所学程序设计语言、方法、技巧和常用问题求解策略设计实现程序的能力。
因疫情防控需要,各位同学不能及时返校,为了减轻各位同学的学业负担,我们重新拟定了本学期的成绩累计方式,减少了考核的环节,尤其是后半学期开展的考核环节,去掉了小班主题研讨和课堂大翻转。具体如下:
(1)自主式作业
由系统随机抽题的自主式作业,占总成绩的25%。
学生登录面向学生自主学习的高级语言能力测试平台(SSE),自主选择知识点和难度系数,平台自动从后台的题库系统中随机抽取相应知识点和难度系数的题目给学生,学生在线上限时完成并提交代码,获得作业分。分数评定和奖惩规则如下:
1)根据学生上机测试成绩柔性定制个人作业满分线,使其个人作业满分线与其上机测试总成绩成反比。个人作业满分线=(实验上机随堂测试满分线-实际上机随堂测试总分)*100。若按此公式计算出来的满分线超过了2000分,则2000分封顶,即2000分为个人刷题满分线的上限。
2)若未达到自己的个人作业满分线,则按下面公式计算:个人实际刷题分数 / 个人满分线 * 作业满分25分。例如,学生上机测试分数为35分,则其个人刷题满分线为500分,其实际在sse只刷了250分,那么其最终sse作业分为250/500*25=12.5分,如果其实际刷题等于500分或者超过了500分,那么其sse作业分为500/500*25=25。
3)在习题市场中自主设计有创意的题目或找错题,每录用1道题或找到一个错题,可减免作业分20分(相当于降低其个人作业满分线)。
4)多次上机考试的总成绩达到满分或超过满分者,可免自主式作业,成绩按满分计;
5)参加ACM/ICPC、NOI/NOIP竞赛获得省赛一、二等奖或校赛一等奖者,可免自主式作业,成绩按满分计。
(2) 开放式实验大作业
开放式实验大作业,占总成绩的30%。
实验程序和实验报告的综合成绩由学生在SPOC里互评,教师对学生互评结果进行随机抽查,对于不合理的分数可以由教师重评,取代学生的互评分。
未在规定的截止时间内在SPOC中提交实验程序和报告,按0分计。未在规定的截止时间内在SPOC中完成指定数量的互评,扣除一定的互评分。
不做实验大作业者,即使其他项分数累计可以及格,最终的总成绩也一律按0分计。
(3) 实验上机随堂测试——返校后进行
实验上机随堂测试,占总成绩的40%。
第1次实验课熟悉系统环境,进行模拟演练,仅安排2个实验学时。
第2次~第4次实验课,利用3学时进行实验上机随堂测试和试卷点评。实验上机测试内容分别覆盖基本控制结构和穷举/递推/迭代/递归等问题求解算法、排序和查找算法、字符串/结构体/链表等内容。
每次上机随堂测试必做题满分为50分(另有附加分2分),总计考3次,取3次测试的平均分作为实验上机测试的总分。
因属于随堂测试,故缺考者不给补考机会,当次考试成绩按0分计。因病不能参加考试者,需出具医院开的病假条,按实际参加测试的次数计算平均分。
参加ACM/ICPC、NOI/NOIP竞赛获得省赛一、二等奖或校赛一等奖者,可免上机测试,成绩按满分计。
(4) SPOC上课时的测试签到——从第一周开始
占总成绩的5%。
只要在上课时间进入spoc做签到测试题即可记录一次签到记录,根据学生返校前所需签到次数,折合成5分计入总分。没有电脑的同学,可以手机下载爱课程中国大学MOOC的App,手机登录完成测试。测试题型为单选、多选、判断对错。测试分数不作为签到成绩,只按上课签到的次数计算签到分数。
课程最终成绩 = (1)+(2)+(3)+(4)
其中,(1)+(2)+(4)合计60分,有电脑和网络条件的同学可以考虑在返校前完成。
课程最终成绩 = (1)+(2)+(3)+(4)+(5)
开放式实验大作业互评标准:
互评过程如果有问题,可以先看网易提供的帮助文档:https://www.icourse163.org/help/help.htm#/hf?t=3
报告模版在spoc的“实验互评”里下载。
每个学生至少评5个(爱课程网站要求至少5个)。未参与互评的将给与所得分的50%,未完成互评的将给与所得分的80%,全部完成互评的将给与所得分的100%。若代码涉嫌抄袭或雷同,则整个大作业直接按0分计。
在提交截止到成绩公布之间留出三天时间,任课教师和助教对各个互评分数相差较大的学生作业进行复核,对于评分明显不合理的作业,可以用教师或助教的评分取代学生的互评分。
综合应用包括小型信息管理系统和游戏类程序两类开放式题目,供学生自由选择,要求按照算法、数据结构和简单应用的各个知识模块进行组合应用,不同组合具有不同的难度。
1)算法和数据结构的难度——10分
数据结构的起评分:
2分:数组
3分:结构体数组
4分:结构体数组 + 指针(结构体指针/指针数组/函数指针/动态数组等)
5分:链表等动态数据结构
在以上起评分的基础上,按以下要素累计算法加分,10分封顶。
+1分:枚举/递推/迭代/分类统计
+1分:排序/查找
+1分:模糊匹配
+1分:文件操作
+1分:加入音效
+2分:递归
+3分:与树或图等数据结构相关的算法,或其他人工智能算法
2)程序设计质量——6分
加分原则:按以下要素累计加分,6分封顶
+1分:模块化设计,模块划分合理,函数接口简洁,独立性和可复用性好
+1分:防御式编程,健壮性好,对错误或非法输入有容错能力,函数有入口参数检查
+1分:代码规范,函数和变量命名见名知意,代码有缩进,代码有注释,可读性好
+1分:用户界面友好
+1分:增加了新颖独特的设计
+1分:使用了与树或图等数据结构相关的算法,或其他人工智能算法
扣分原则:在以上加分的基础上,按以下要素累计扣分,0分封底
-2分:程序有bug
-1分:代码可读性不好
-1分:代码健壮性不好
-1分:模块独立性不好,使用了大量全局变量
3)实验报告中反思内容的撰写质量——4分
按以下要素累计加分, 4分封顶。若实验报告中有雷同内容,本项分数直接按0分计。
+1分:认真,格式规范
+1分:有编程中遇到的问题及分析
+1分:问题的解决过程、方法和反思内容真实可信
+1分:流程图无错误
第1次课: 基本运算(2月24日)
线上学习内容:
MOOC第1周:
1.3 如何定义一个变量
1.4 变量的表数范围和存储形式
1.5 宏常量与const常量
MOOC第2周:
2.1 算术运算
2.2 赋值运算
2.3 增1和减1运算
2.4 自动类型转换
2.5 强制类型转换
学习目标:
(1) 冯.诺依曼计算机的组成和工作原理,不同类型数据在计算机中的存储与表示;
(2) 软件开发的基本过程,常用的C语言集成开发工具,程序在计算机中的编辑、编译、链接和运行;
(3) 基本数据类型,常量与变量,运算符与表达式,优先级与结合性,算术运算,赋值运算,自动类型转换和强制类型转换;
第2次课:基本输入输出(2月27日)
线上学习内容:
MOOC第3周:
3.1 数据的格式化屏幕输出
3.2 数据的格式化键盘输入
3.3 单个字符的输入输出
学习目标:
(1) 数据的键盘输入和屏幕输出等简单I/O操作,顺序结构程序设计。
第3次课:选择控制结构(3月5日)
线上学习内容:
MOOC第4周:
4.1 关系运算符和逻辑运算符
4.2 条件语句
4.3 开关语句
4.5 进阶:软件测试与错误实例分析
学习目标:
(1) 算法的基本概念,算法的流程图描述;
(2) 关系运算,逻辑运算,复杂逻辑的计算机表示;
(3) 条件语句和开关语句,单分支、双分支、多分支选择结构;
(4) 测试用例的基本概念,程序测试的目的,程序测试的基本方法;
第4次课:循环控制结构(3月9日)
线上学习内容:
MOOC第5周:
5.1 计数控制的循环
5.3 条件控制的循环
5.6 进阶:软件调试与错误实例分析
学习目标:
(1) for、while、do-while三种循环语句,当型循环和直到型循环,计数控制、条件控制和标记控制的循环结构;
(2) 累加求和、连乘求积、统计、计算均值和方差等常用算法;
(3) 程序错误的类型,利用现代集成开发环境和单步跟踪或可视化调试工具调试程序的基本方法。
第5次课:函数(3月12日)
MOOC学习内容:
MOOC第6周:
6.1 函数定义、调用、参数传递和函数原型
6.2 函数封装与程序的健壮性
6.3 进阶:断言与防御式编程
学习目标:
(1) 信息隐藏,过程抽象,函数封装,函数复用,模块分解,自顶向下、逐步求精的模块化程序设计方法;
(2) 函数定义,函数调用,函数原型,函数的参数传递,函数的返回值,用简单变量做函数参数重构代码;
(3) 防御式编程,程序的健壮性、可读性和可维护性。
第6次课:穷举和递推(3月19日)
MOOC学习内容:
MOOC第5周:
5.2 递推
5.4 嵌套循环
5.5 穷举
(1) 枚举、递推/迭代等常用问题求解策略;
(2) 嵌套循环,流程转移控制的基本方法,流程转移控制语句(break,continue, goto),结构化程序的特点;
(3) 算法的效率,程序的优化。
第7次课:递归(3月26日)
MOOC学习内容:
MOOC第7周:
7.1 从嵌套调用到递归调用
7.2 递归是如何执行的
7.4 变量的作用域
7.5 进阶:变量的生存期
学习目标:
(1) 分治、递归等常用问题求解策略;
(2) 递归函数的定义、调用和执行过程,条件递归的基本要素,递归的优缺点分析。
(3) 变量的作用域,变量的生存期。
第8次课:数组(4月2日)
MOOC学习内容:
MOOC第8周:
8.1 数组的定义和初始化
8.2 向函数传递一堆相同类型的数据
学习目标:
(1) 一维数组和二维数组,线性表的顺序存储结构;
(2) 数组做函数参数,传值调用与模拟传引用调用,数组元素的增、删、改查等基本算法,求最值算法。
第9次课:排序和查找(4月9日)
MOOC学习内容:
MOOC第8周:
8.3 查找算法
8.4 排序算法
学习目标:
(1) 顺序查找、二分查找等经典的查找算法;
(2) 选择排序、插入排序、冒泡排序、快速排序等经典的排序算法;
(3) 算法的时间复杂度。
第10次课:指针和函数指针(4月16日)
MOOC学习内容:
MOOC第9周:
9.1 指针变量的定义、初始化及其解引用
9.2 指针变量作函数参数
9.3 进阶:函数指针及其应用
学习目标:
(1) 指针的基本概念,指针变量的定义、初始化和解引用;
(2) 指针变量作函数参数的参数传递方式,指针变量作函数参数的必要性。
(3) 内存映像,动态内存分配函数;
(4) 函数指针及其应用。
第11次课:字符数组和字符指针(4月23日)
(1) 字符指针和一维字符数组,字符串的输入输出,缓冲区溢出,缓冲区溢出攻击;
(2) 字符指针或一维字符数组做函数参数。
(3) 字符串的复制、连接、比较等基本操作;
(4) 字符串的排序、检索和匹配等算法。
第12次课:指针和数组(4月30日)
(1) 指针和数组间的关系;
(2) 指针数组,索引存储结构,字符串的物理排序与索引排序。
第13次课:结构体和共用体(5月7日)
(1) 从定长数组到动态数组,内存映像,动态内存分配函数,动态数组的程序实现;
(2) 结构体类型,共用体类型,枚举类型;
(3) 用结构体封装函数参数,向函数传递批量数据,结构体和共用体的应用实例;
(4) 抽象数据类型,从结构体到类,从面向过程到面向对象。
课前MOOC自学内容:
(1)结构体和共用体所占内存的字节数,内存对齐。
第14次课:结构体和共用体的应用(5月14日)
(1) 结构体用于对复杂静态数据结构按关键字查找和排序的函数程序实现;
(2) 数据的逻辑结构和存储结构,从静态数据结构到动态数据结构,从线性表的顺序存储到链式存储结构
课后MOOC自学内容:
(1)枚举类型及其应用。
第15次课:动态数据结构——链表(5月21日)
(1) 单向链表的创建、节点的遍历、插入、删除等基本操作及其函数程序实现
(2) 链表的应用
第16次课:其他动态数据结构——队列、栈、树和图(5月28日)
(1) 限定性线性表,栈和队列的数据访问方式,栈和队列的顺序存储与链式存储方式,栈和队列的应用实例
(2) 树和图的基本概念
MOOC自学内容:
第15周 文件I/O操作
大学计算机课程中已经学过的二进制、内存、冯诺依曼计算机基本工作原理,基本控制结构以及算法的概念和表示方法等基础知识。
高等数学中有关定积分的基础知识。
线性代数中有关矩阵运算的基础知识。
1. 面向读者的教材网站(https://book.sunner.cn)
该网站的服务对象是我们自编教材的读者,提供教材课件、例题源代码、教材勘误表等资源,便于学生浏览和下载后自学,读者也可利用该网站反馈教材使用意见和建议。
2. 作业在线测试系统(https://sse.hit.edu.cn/t)
该网站的服务对象是使用我们自编教材的读者,在我们编写的由高等教育出版社出版的《C语言程序设计(第3版)》的封底有一个刮刮卡,刮开可以获得一个免费的注册账号,登陆我们开发的C语言作业在线测试系统,在该系统中可以自主选择教材对应章编号中的习题进行自测,提交习题答案后,系统会实时显示评分,另外在习题市场中读者还可以发布题目给其他读者练习。
3. 参考教材
1)苏小红,王宇颖,孙志岗,《C语言程序设计(第4版)》,高等教育出版社,2019年8月,购书网址:京东
2)苏小红,车万翔,王甜甜,《C语言程序设计学习指导(第4版)》,高等教育出版社,2019年9月,购书网址:京东
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-16.01mingw-setup.exe,务必选择带mingw的安装包)
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定义变量得到的计算结果也可能在结果的最后一位小数上有所不同。