SPOC学校专有课程
2022秋高级语言程序设计—武小荷
分享
spContent=
—— 课程团队
课程概述

   对于这个地球上大多数人来说,真正的数字化革命还没有开始。在接下来的10年里,变化将无处不在,让我们一起来给这个世界编码吧!——Eric Schmidt Google执行主席      

我们会用15周的时间来深入讲解C语言,在授课过程中,我们会注重多解释一些“为什么”以及错误程序的分析,从环环相扣的问题入手,将一些易被忽视且对高水平程序设计很重要的“点”,沿着数据结构从简单到复杂的主线逐一展开,在实例的“不断深化和提升”中引出知识点,通过对问题的举一反三和前后知识点的融会贯通,由浅入深地引导你循序渐进地编写规模逐步增大的程序。

   在过去30年90%的时间里,C语言独领风骚,仅偶尔被 Java 超越,可见其魅力。C语言作为一种高级语言,其实并不高级,但正是这种“低级”给我们更多思考的机会。期望通过本课程的学习,你不只是简单地能够掌握一种语言的语法,还能理解隐含在语法背后的思想,并初步具备灵活使用这些思想进行编写程序解决实际问题的能力。如果你掌握了这些,你会发现,迈向成功的最后一步不过是选择一种合适的编程工具而已。 

   你想从“菜鸟”升级为“程序猿”吗?那就加入“稀饭”的行列,和我们一起踏上爱上C语言之旅吧。

   自2021年秋季学期起,该课程加入教育部-华为“智能基座”精品慕课建设项目,将C语言与华为资源有机结合起来,包括鲲鹏平台软件开发、华为编程实践与编程规范等。具体所在的章节如下:

1.1.2 计算的未来和未来的计算(9分半)

1.1.3 编译型语言与解释型语言及其运行差异(7分)

1.1.4 现代主流计算机指令(8分)

1.2.3 鲲鹏平台介绍——如何在华为云上申请弹性云服务器(6分)

1.2.4 鲲鹏平台介绍——远程登陆(3分半)

1.2.5 鲲鹏平台介绍——linux指令(4分)

1.2.6 鲲鹏平台介绍——运行Hello World(5分)

1.6 进阶:华为编程实践与编码规范

1.6.1 编程实践—数据类型(4分)

1.6.2 编程实践—常量(4分)

1.6.3 编程实践—变量(10分)

1.6.4 编程实践—声明与初始化(1分)


2.6 进阶:华为编程实践与编码规范

2.6.1 编程实践—表达式(4分)

2.6.2 代码风格—整数(16分)


5.7 进阶:华为编程实践与编码规范

5.7.1 编程实践—控制语句(8分半)


6.1.3 鲲鹏平台ARM处理器的函数优化(8分)

6.5 进阶:华为编程实践与编码规范

6.5.1 代码风格—命名(6分半)

6.5.2 代码风格—注释(6分)

6.5.3 代码风格—格式(17分)

6.5.4 编程实践—预处理(19分)

6.5.5 编程实践—头文件(9分半)


11.5 进阶:华为编程实践与代码风格

11.5.1 代码风格—指针和数组(10分半)

11.5.2 代码风格—字符串(5分)

11.5.3 代码风格—断言(6分)

11.5.4 代码风格—函数设计(17分)

11.5.5 代码风格—函数使用(19分)


13.4 鲲鹏多核体系与弱内存模型(17分)


15.7 进阶:华为编程实践与编码规范

15.7.1 编程规范—内存(6分)

15.7.2 编程规范—文件(3分半)

15.7.3 编程规范—其它(4分)

显示全部
授课目标

了解软件开发的基本过程和集成开发环境,具备程序测试和调试的能力;掌握多种程序设计技巧和程序调试方法,具备良好的编程素养,针对具体实际问题能够选择恰当的算法和数据结构,并综合运用所学程序设计语言、方法、技巧和常用问题求解策略设计实现程序的能力。

成绩 要求

C语言程序设计A

(一)   成绩累计方式

(1)自主式作业

由系统随机抽题的自主式作业,占总成绩的10%

学生登录面向学生自主学习的高级语言能力测试平台(SSE),自主选择知识点和难度系数,平台自动从后台的题库系统中随机抽取相应知识点和难度系数的题目给学生,学生在线上限时完成并提交代码,获得作业分。分数评定和奖惩规则如下:

1)为避免期末突击完成作业,设定第2次上机考试前,1000分为个人阶段作业满分线的上限,第3次考试结束后当天,2000分为个人期末作业满分线的上限。

2)根据学生上机测试成绩柔性定制个人作业满分线,使其个人作业满分线与其上机测试总成绩成反比。个人期末作业满分线=60 – 三次上机随堂测试平均分)*100。若按此公式计算出来的满分线超过了2000分,则2000分封顶,即2000分为个人期末作业满分线的上限。

3)若未达到自己的个人期末作业满分线,则按下面公式计算个人的作业分:个人实际刷题分数 / 个人满分线 * 10分。

4)在习题市场中自主设计有创意的题目或找错题,每录用1道题或找到一个错题,可减免作业分20分(相当于降低其个人作业满分线)。

5)作业截止时间为最后一次上机考试的当天晚上。

6)第2次上机考试前,导出一次作业刷题分,根据第一次考试成绩确定是否达到指定的阶段作业满分线(1000分),计算方法:个人阶段作业满分线 =60 - 第一次上机随堂测试分)* 60。若未达到此满分线,则从作业总分中扣掉1分。

举例:假设某同学第1次考试分数为50分,则其个人的阶段作业满分线为(60-50*60=600,若第2次考试前未完成600分的sse作业,则从作业总分中扣掉1分。若第3次考试结束后,其三次上机随堂测试平均分为45分,则其个人期末作业满分线=60 – 45*100=1500,但是截止到第3次考试当天其sse作业分只有1000分,则其折合后的个人的作业分为:1000/1500*10 – 1 = 6.7 – 1 = 5.7分。

7)利用雨课堂签到或者采用其他方式签到,统计每位学生的课堂出勤率,出勤率未达到90%的同学从自主式定制作业中扣掉1分。

8)重修非免听课的学生需要重新注册账号,注册时在学号的后面加个x,练习分重新计算。

9)重修免听课的学生,因无法参与课堂的所有环节,所以没有平时成绩,仅在期末参加一次卷面笔试。

(2) 开放式项目大作业

开放式项目大作业,占总成绩的20% 

l  实验程序和实验报告的综合成绩由学生在SPOC里互评,教师对学生互评结果进行随机抽查,对于不合理的分数可以由教师重评,取代学生的互评分。

l  未在规定的截止时间内在SPOC中提交实验程序和报告,按0分计。未在规定的截止时间内在SPOC中完成指定数量的互评,扣除一定的互评分。

不做实验大作业者,即使其他项分数累计可以及格,最终的总成绩也一律按0分计。

(3) 实验上机随堂测试

实验上机随堂测试,占总成绩的60%

l  1次实验课熟悉系统环境,进行模拟考试。

l  2~4次实验课,进行实验上机随堂测试和试卷点评。三次上机实验随堂测试内容分别覆盖:累加累乘/穷举/递推/递归等问题求解算法、二维数组/排序/查找算法/字符指针、字符串/结构体/链表等内容。第1次、第2次上机实验随堂测试包含3道必做题、1道附加改错题,第3次上机实验随堂测试包含2道必做题、1道附加改错题。

l  实验上机测试结束后,每两人组成一个小组,相互分析错题原因,然后上台讲评试卷,此环节为必做环节,要求3次考试至少讲评2次,1次也不讲则从总分中扣掉1分,只讲1次扣0.5分。

l  因属于随堂测试,故缺考者不给补考机会,当次考试成绩按0分计。因病不能参加考试者,需出具医院开的病假条,按实际参加测试的次数计算平均分。

l  每次机考结束后,在班级内公示阶段成绩,如对分数有异议,可以申请复核,无论复核后分数提升还是降低,均以复核后的分数为准。

l  考试过程中的注意事项,另见发给教师的文档。

(4) 实验小班研讨(分两次课进行)

实验小班研讨,占总成绩的10%

采用生讲生评、互动研学、同伴助学的方式,分小班针对不同的实践研学主题进行互动研讨和同伴助学。

注意:本环节可以不参加,不参加本环节的学生的各项累计总分最高为90分。想冲击90分以上的学生必须参加本环节。

(5)附加分

实验上机随堂测试获得附加题的附加分(每次测试的附加分为2分,3次实验上机随堂测试平均分超出60的部分作为附加分加到总分里)。

课程最终成绩 = 1+2+3+4+5

其中,如果(2)实验大作业为0分的话,那么总成绩也为0分。(4)和(5)两个环节不是必须项。

(二)   免作业规则

1.免自主式作业的条件

1)多次上机考试的总成绩达到满分或超过满分者,可免自主式作业,成绩按满分计;

2)参加ACM / ICPCNOI / NOIP竞赛获得省赛一、二等奖或校赛一等奖者,可免自主式作业,成绩按满分计。

2. 免实验上机随堂测试的条件

参加ACM / ICPCNOI / NOIP竞赛获得省赛一、二等奖或校赛一等奖者,可免上机测试,成绩按满分计。 

(三)   开放式实验大作业互评标准

互评过程如果有问题,可以先看网易提供的帮助文档:https://www.icourse163.org/help/help.htm#/hf?t=3

报告模版在spoc的“实验互评”里下载。

每个学生至少评5个(爱课程网站要求至少5个)。每个学生的互评分,由系统自动计算(即去掉一个最高分和一个最低分,然后取平均分)。未参与互评的同学将会被系统罚掉得分的50%,未完成5个互评作业的同学将会被系统罚掉得分的20%

若代码涉嫌抄袭或雷同,则整个大作业直接按0分计。

没有在截止时间之前提交大作业的同学,没有补救机会,大作业分数为0分。

 

综合应用包括小型信息管理系统和游戏类程序两类开放式题目,供学生自由选择,要求按照算法、数据结构和简单应用的各个知识模块进行组合应用,不同组合具有不同的难度。

1)算法和数据结构的难度——10

数据结构的起评分:

2分:数组

3分:结构体数组

4分:结构体数组 + 指针数组 / 函数指针 / 动态数组

5分:结构体数组 + 栈或队列的顺序存储结构

6分:链表等动态数据结构

在以上起评分的基础上,按以下要素累计算法加分,10分封顶。

+1分:枚举/递推/迭代/分类统计算法

+1分:排序/查找算法

+1分:文件操作

+2分:递归算法

+2分:模糊查询算法

+2分:深度优先或广度优先搜索算法

+1分:不在上述列表中的特殊算法

如发现抄袭,该项可以直接给0分,请务必在评语中指出抄了哪里的,判定抄袭必须有依据,不能毫无理由地给0分。

同学互评时,无论加分还是扣分,都要给出理由,写出评语。

 

2)程序设计质量——6

加分原则:按以下要素累计加分,6分封顶

+1分:模块化设计,模块划分合理,函数接口简洁,独立性和可复用性好 

+1分:防御式编程,健壮性好,对错误或非法输入有容错能力,函数有入口参数检查

+1分:代码规范,函数和变量命名见名知意,代码有缩进

+1分:代码有详细的注释,可读性好

+1分:用户界面友好,操作有提示 

+1分:加入了音效

+1分:增加了新颖独特的设计,程序功能设计有新意

 

扣分原则:在以上加分的基础上,按以下要素累计扣分,0分封底

-2分:程序有bug

-1分:代码可读性不好

-1分:代码健壮性不好

-1分:模块独立性不好,使用了大量全局变量

-3分:没有单独上传代码,需要让互评同学从word版报告中粘贴代码出来到IDE

如发现抄袭,该项可以直接给0分,请务必在评语中指出抄了哪里的,判定抄袭必须有依据,不能毫无理由地给0分。

同学互评时,无论加分还是扣分,都要给出理由,写出评语。

 

3)实验报告中反思内容的撰写质量——4

按以下要素累计加分, 4分封顶。若实验报告中有雷同内容,本项分数直接按0分计。

+1分:认真,格式规范

+1分:有编程中遇到的问题及分析

+1分:问题的解决过程、方法和反思内容真实可信

+1分:流程图无错误

如发现抄袭,该项可以直接给0分,请务必在评语中指出抄了哪里的,判定抄袭必须有依据,不能毫无理由地给0分。

同学互评时,无论加分还是扣分,都要给出理由,写出评语。

(四)   主题研讨评分规则

1.     研讨主题确定方法

将教师出的研讨题目和向学生征集的研讨题目给学生投票确定若干个热点话题,分若干小组研讨。每个主题限制人数,保证每个主题的小组数均衡,并且各自投票。

推荐的研讨主题为:

(1) 字符串快速匹配算法

(2) 贪心算法

(3) 动态规划算法

(4) 迷宫地图自动生成算法

(5) 数独题目自动生成算法

(6) 数独题目自动求解算法

(7) 扫雷游戏中的算法

(8) 最短路径算法及应用

(9) 程序员的职业道德和工程伦理

2.     学生小组构成及其研讨主题确定

学生自愿组合成3-5人的小组(以4人一组为宜),每个小组抽签决定研讨主题及研讨顺序,每个主题以3-4组为宜,设计抽签的票,1-11-21-31-42-12-22-32-4等,抽签决定,不满意的私下自行交换。研讨前,小组长负责将本小组的研讨主题、研讨内容、小组成员分工、小组成员排序等信息发给老师或助教。

3.     讲解流程、方法与要求

在每个主题中,按照事先抽签的标号顺序进行讲解。各小组组长负责提前三天把主题内容、抽签标号、组长、小组成员分工,小组成员排序发给助教。

讲解要求:

(1) 方法分析是否透彻,方法归纳总结和对比是否到位

(2) 能否用最通俗的语言把方法讲明白(不仅是自己明白,更要给大家讲明白)

(3) 回答提问是否准确无误

4.     讲解和提问的注意事项

(1) ppt讲解为主,无需现场运行程序,可提前把程序的运行结果粘贴到ppt中。

(2) 主要是讲解决该问题有哪些方法,核心思想是什么?每一类方法的优缺点、难点、适用背景是什么?有哪些具体的实际应用?等等,建议把不同类方法的结果分析总结或对比一下,将不同方法、不同测试数据的结果放到一个表格中对比,最后给出结论。

(3) 每个小组现场讲解时间由教师根据班级的小组人数自行确定,通常在5分钟左右,同学现场提问1-2分钟。(讲解时间和回答提问的时间,各班根据人数自行规定)

(4) 第一个小组讲完,第二个小组上台准备,第三个小组必须提问,其他小组也可提问。依此类推,倒数第二个小组讲完,第一个小组必须提问,最后一个小组讲完,第二个小组必须提问。没有完成提问的小组,全组成员每人扣1分!

5.     评分方法

小组组内评分标准:

两人小组组内成员总分为8分,三人小组组内成员总分为12分,4人小组组内成员总分为16分,5人小组组内成员总分为18分。组内成员的分数分配由小组长根据组内成员的贡献大小来分配。鼓励3-4人一个小组。分配的基本原则如下:

(1)     上台主讲的同学,可以根据表现情况按5分、4分来分配。非主讲成员不能给5分。

(2)     参与回答问题并提问的同学,可以根据表现情况按5分、4分来分配。

(3)     仅参与回答问题的同学,可以根据回答问题的表现情况按4分、3分来分配。

(4)     仅参与提问的同学,可以按3分来分配。

(5)     既没有参与主讲、也没参与提问和回答问题的同学,最多给2分。

(6)     教师对参与讲解和回答问题的同学现场拍照,进行备份。

组内分数确定后请务必告知任课教师或助教。

组间评分方法待研讨当天现场公布。

个人实验小班研讨得分=小组组间得分+个人小组组内得分,满分10分。

 


显示全部
课程大纲
预备知识

本门课程的基本内容是面向零基础的学生。

进阶内容是面向有一定编程基础或学过本平台的“程序设计基础”MOOC课程(https://www.icourse163.org/course/HIT-56001)的学生,但是进阶内容不做为课程的考试内容。



参考资料

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://zhidao.baidu.com/link?url=T8WrKoa6dHXfZdTIOFex4uWais6SaTY2VbmNnLyKL77fb62LdzxrdJxBT_-UVf48AA9Z14K8l_nyueKFxD_q4Rh3BH0UMZvx5Kvxjx8o1MG重新设置编译器和调试器。

安装软件的完整步骤可参考: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定义变量得到的计算结果也可能在结果的最后一位小数上有所不同。



显示全部