SPOC学校专有课程
2015春C语言程序设计(张羽)
分享
spContent=课程旨在使学生系统地掌握高级语言程序设计的基本知识和计算机软件设计与实现方法,提高用计算机解决实际问题的能力,为后继课程(如C++面向对象程序设计、数据结构与算法、操作系统、软件工程以及各研究方向的专业或选修课程等)的学习和解决工程问题、科学技术问题奠定扎实的基础。
—— 课程团队
课程概述

 

第1章     为什么要学C语言(1学时)

教学内容:计算机语言的分类,软件开发的基本过程;C语言的发展简史及语言的特点,C语言程序的编写、编辑、编译、链接和调试的过程;C程序的集成开发环境(Visual C++6.0Code:Blocks)简介。

重点:

1C语言的集成开发环境

2C语言程序开发的基本步骤,C语言程序的编辑、编译、链接和运行的过程。

难点:

1C语言的集成开发环境

2.冯.诺依曼机工作原理

教学要求:了解C语言的发展历程,熟悉Code::BlocksVisual C++集成开发环境,了解软件开发的基本过程,了解机器语言、汇编语言、高级语言的不同应用和特点,了解编程的基础知识。

第2章     C数据类型(1学时)

教学内容:基本数据类型变量的定义和使用方法,数值型常量,字符型常量,字符串常量,常用的运算符和表达式,不同数据类型的转换,常用的C标准数学函数,编程风格和标识符命名规则。

重点:

1.     变量的定义和赋值,使用变量的基本原则

2.     变量占内存的字节数  

难点:数值溢出的危害

教学要求:了解C语言的基本数据类型,掌握常量和变量的基本概念,掌握基本数据类型的常量的表示方法,掌握基本数据类型的变量的定义和赋值方法,以及变量的命名方法,理解运算符的优先级和结合性,了解数值溢出的危害,具备初步的程序阅读与程序仿写与改写能力。

第3章     简单的算术运算和表达式(1学时)

教学内容:常量与变量;简单的屏幕输出;基本数据类型;计算变量或数据类型所占内存空间的字节数;变量的赋值和赋值运算符;程序的开发环境(Visual C++6.0Code:Blocks)简介。

重点:

1.     1和减1运算符、强制转换运算符

2.     运算符的优先级和结合性

3.     赋值与表达式中的类型转换

4.     宏常量,const常量

5.     常用的标准数学函数

难点:

1.     1和减1运算符、强制转换运算符

2.     将数学表达式写成合法的C语言表达式

教学要求:掌握算术运算符、增1和减1运算符、强制类型转换运算符等常用运算符,了解其优先级和结合性,理解自动类型转换和强制类型转换,理解整数除法和浮点数除法的区别,理解为什么要在程序中使用宏常量或const常量,能够熟练使用常用的标准数学函数编写简单的数值运算相关的程序,具备初步的程序阅读与程序编写能力。

第4章     键盘输入与屏幕输出(1学时)

教学内容:字符常量;单个字符的输入输出;数据的格式化屏幕输出;数据的格式化键盘输入。

重点:

1.     格式化输入和输出函数

2.     整型、实型和字符型等基本数据类型数据的输入输出格式控制

难点:

1.     scanf语句的正确用法和常见错误

2.     %c格式符在使用中存在的问题

教学要求:掌握字符常量的表示方法,掌握字符输出函数putchar、字符输入函数getchar、数据的格式化输出函数printf、数据的格式化输入函数scanf的使用方法,能够熟练使用这些函数进行整型、实型和字符型等基本数据类型数据的输入和输出,具备初步的程序阅读与编写能力。

第5章     选择控制结构(2学时)

教学内容:生活中的问题求解方法,计算机问题求解的基本特点,算法的概念,算法的流程图表示方法,关系运算符和逻辑运算符,顺序、分支和循环三种基本控制结构。循环的三种控制方法(计数控制的循环,条件控制的循环,标记控制的循环),嵌套循环。流程的转移控制,结构化程序设计方法,程序的调试与排错。

重点:

1.     用流程图描述算法

2.     条件语句的三种基本形式

3.     如何用关系表达式和逻辑表达式表达一个复杂的条件,如何判断一个表达式的真假

4.     switch语句,break语句在switch多路选择语句中的作用

难点:

1.     将实际问题抽象为逻辑关系和数学模型,并设计算法。

2.     条件语句的嵌套

3.     逻辑运算符的短路特性

教学要求:了解计算机问题求解和生活中问题求解方法的异同点,熟悉C语言的选择控制语句,熟练使用条件语句的三种基本形式编写单分支、双分支和多分支选择控制的程序,理解break语句在switch多路选择语句中的作用,掌握流程图等常用的算法描述方法,了解算法在问题求解中的作用,掌握基本的程序测试方法和选择测试用例的基本方法,具备初步的算法设计、程序编写和程序调试能力。

第6章     循环控制结构(4学时)

教学内容:循环控制结构;循环语句;计数控制的循环;条件控制的循环;嵌套循环;流程的转移控制(goto语句,break语句,continue语句);结构化程序设计的核心思想。

重点:

1.三种循环控制方法:计数控制的循环,条件控制的循环,标记控制的循环;

2.设计累加与累乘算法,寻找累加或累乘通项的构成规律;

3.程序测试和程序调试的基本方法;

4.结构化程序设计的基本思想。   

难点:

1.当型循环与直到型循环在流程控制上的区别和联系;

2.两种流程转移控制语句breakcontinue的区别。

3.程序调试与排错的基本方法。

教学要求:熟悉C语言的循环控制语句和流程转移控制语句,掌握循环的三种控制方法,理解break语句和continue语句在循环转移控制中的不同作用,掌握累加求和与累乘求积算法的设计方法,掌握程序调试与排错的常用技巧和基本方法,掌握结构化程序设计的基本思想,具备初步的算法设计、程序编写、程序调试和排错能力。

第7章     函数(4学时)

教学内容:分而治之与信息隐藏;函数的定义;函数调用;函数原型;向函数传递简单变量的值;从函数返回一个值;递归函数;变量的作用域与存储类型;自顶向下、逐步求精的模块化程序设计方法。

重点:

1.函数定义和调用的基本方法,函数参数传递的方式;

2.递归函数设计的基本原则和递归调用的执行过程;

3.变量的作用域与存储类型;

4.“自顶向下、逐步求精”的模块化程序设计方法。   

难点:

1.函数参数传递的方式;

2.递归调用的执行过程

3.全局变量与局部变量同名情况下的作用域

4.  静态局部变量和自动变量的差异

教学要求:了解函数封装、函数复用、分而治之和信息隐藏的基本概念,了解抽象和分治等常见的问题求解策略;掌握函数定义和调用的基本方法,掌握函数参数传递的方式,掌握函数设计的基本原则,掌握增强程序健壮性的基本方法以及防御性程序设计的基本方法;理解递归求解的概念、原理以及递归调用的执行过程,掌握递归函数设计的基本要点,了解迭代和递归方法编写程序的优缺点;理解变量的作用域与存储类型;掌握“自顶向下、逐步求精”的模块化程序设计方法,了解代码风格,养成良好的编程习惯,具备初步的编写具有一定容错性能的程序的能力,能够熟练应用调试工具和逻辑推理方法进行错误程序的调试。

第8章     数组(3学时)

教学内容:一维数组和二维数组的定义、初始化和引用;向函数传递一维数组和二维数组;常用的排序和查找算法。

重点:

1. 数组名做函数参数向函数传递一维数组和二维数组

2. 计算最大值和最小值,排序和查找算法

难点:

1. 数组名所代表的特殊意义

2. 二维数组在内存中的存储方式

3. 数组做函数参数和普通变量做函数参数的区别

教学要求:了解数组类型的特点和应用,掌握一维数组和二维数组的定义和初始化方法,了解数组下标越界给程序带来的隐患,理解数组名在C语言中所代表的特殊意义,掌握向函数传递一维数组和二维数组的方法,具备熟练应用排序、查找、求最大最小值等常用算法进行求解实际问题的能力,树立算法效率、时空代价、开发成本、维护成本和性能折中的概念,具备应用模块化程序设计思想进行数组相关的综合应用型程序设计的能力,能够熟练应用调试工具和逻辑推理方法进行错误程序的调试。

第9章     指针(3学时)

教学内容:变量的内存地址;指针变量的定义和初始化;间接寻址运算符;按值调用与按地址调用;用指针变量作函数参数;函数指针。

重点:

1. 用指针变量与用普通变量作函数参数的区别,指针变量做函数参数;

2. 函数指针做函数参数。

难点:

1.正确理解内存地址和指针的概念,指针数据类型和其他数据类型的区别,直接寻址和间接寻址的区别,按值调用与按地址调用的区别;

2. 正确理解函数指针的概念,并定义指向函数的指针。

教学要求:掌握指针数据类型和其他数据类型的异同点,理解变量的内存地址,掌握指针变量的定义和初始化方法,了解使用指针变量的注意事项和基本原则,理解按值调用与按地址调用的区别,掌握用指针变量作函数参数编写程序的基本方法和应用场合,了解函数指针及其应用,具备应用模块化程序设计思想进行指针相关的综合应用型程序设计的能力,能够熟练应用调试工具和逻辑推理方法进行错误程序的调试。

第10章  字符串(3学时)

教学内容:字符串常量;字符串指针;字符串的存储、访问和输入输出;字符串处理函数;向函数传递字符串;从函数返回字符串指针;const类型限定符;缓冲区溢出攻击

重点:

1.字符串的输入和输出

2.  向函数传递字符串

3 通过字符串处理函数,或字符数组和字符指针对字符串进行字符串处理操作

难点:

1.从函数返回一个字符串指针

2.安全的字符串处理方法

3. 缓冲区溢出攻击

教学要求:掌握字符串的表示、存储和输入输出方法,了解字符串复制、字符串连接、字符串比较、计算字符串长度等常用的字符串处理函数,掌握用字符数组或字符指针作函数参数编写程序的基本方法和应用场合,了解什么是缓冲区溢出攻击以及安全的字符串输入方法,具备应用模块化程序设计思想进行字符串相关的综合应用型程序设计的能力,能够熟练应用调试工具和逻辑推理方法进行错误程序的调试。

第11章  指针和数组(3学时)

教学内容:指针和一维数组间的关系;指针和二维数组间的关系;指针数组,用指针数组表示多个字符串;C程序的内存映像,动态内存分配函数,长度可变的一维数组和二维数组,常见的内存错误。

重点:

1.指针与一维数组间的关系以及指针与二维数组间的关系

2.用指针做函数参数向函数传递一维数组和二维数组的基本方法

3. 常用的动态内存分配函数

难点:

1.正确理解二维数组的行指针和列指针的概念

2.指向数组的指针与指针数组的区别

3. 长度可变的动态数组

4. 命令行参数

教学要求:理解指针与一维数组间的关系以及指针与二维数组间的关系,掌握向函数传递一维数组和二维数组的基本方法,了解常用的动态内存分配函数以及长度可变的动态数组的设计方法和应用场合,了解内存泄漏、野指针等常见的内存错误及其对策,具备应用模块化程序设计思想并利用较为复杂的数据结构进行综合应用型程序设计的能力,能够熟练应用调试工具和逻辑推理方法进行错误程序的调试。

第12章  结构体和共用体(2学时)

教学内容:结构体类型;typedef 定义数据类型;结构体变量、结构体数组、结构体指针的定义、初始化和成员的引用;向函数传递结构体数据;共用体类型;枚举类型;动态数据结构,单向链表,堆栈。

重点:

1. 结构体类型、共用体类型的声明方法

2. 结构体变量和结构体数组的定义、初始化和引用方法,结构体指针的定义、初始化和解引用方法

2. 向函数传递结构体变量和结构体数组,结构体指针作函数参数

难点:

1. 计算结构体、共用体占用内存的字节数

2. 动态数据结构,单向链表的基本操作

教学要求:理解什么是抽象数据类型,了解结构体和共用体类型的特点和应用场合,掌握结构体类型、共用体类型、枚举类型的声明方法,以及结构体变量、结构体数组、结构体指针的定义和初始化方法,掌握结构体和共用体所占内存的字节数的计算方法,掌握向函数传递结构体变量、结构体数组、结构体指针的基本方法,了解动态数据结构的概念,以及静态数据结构与动态数据结构的不同特点,了解单向链表的基本操作方法,了解定长数组、动态数组和动态链表三种数据结构的优缺点,具备应用模块化程序设计思想进行结构体和共用体相关的综合应用型程序设计的能力,能够熟练应用调试工具和逻辑推理方法进行错误程序的调试。

第13章  文件操作(2学时)

教学内容:流和文件的概念,文本文件和二进制文件,文件的顺序读/写,文件的随机读/写。

重点:

1.文件的打开和关闭

2.文件的顺序读写和随机读写  

难点:

1.理解流,从文件操作理解流的基本操作

2.理解文本文件和二进制文件的区别

教学要求:了解文本文件和二进制文件的区别,掌握文件的基本操作方法,例如文件的打开,文件的关闭,从文件中读字符或字符串,向文件中写字符或字符串,按格式读写文件,按数据块读写文件、随机读写文件等,具备应用模块化程序设计思想进行文件相关的综合应用型程序设计的能力。


显示全部
成绩 要求

评分方案:

单元测验(单选题,每周3分,15周合计45分);单元作业(编程题在线测试题,3-12周每周3分,10周合计30分);课堂讨论活跃度(10分);期末考试(单选题)15分。


证书:

设置“合格”(达到60分以上)、"优秀"(达到80分以上)两档标准,由任课教师签发课程结业证书,其中成绩“优秀”者将颁发优秀证书。


课程大纲
预备知识

本门课程的基本内容是面向零基础的学生。进阶内容是面向有一定编程基础或者有大学计算机基础的学生,但是进阶内容不做为课程的考试内容。

参考资料

1.  面向读者的教材网站(https://book.sunner.cn) 

该网站的服务对象是我们自编教材的读者,提供教材课件、例题源代码、教材勘误表等资源,便于学生浏览和下载后自学,读者也可利用该网站反馈教材使用意见和建议。


2.  作业在线测试系统(https://sse.hit.edu.cn/t)

该网站的服务对象是使用我们自编教材的读者,在我们编写的由高等教育出版社出版的《C语言程序设计(第2版)》的封底有一个刮刮卡,刮开可以获得一个免费的注册账号,登陆我们开发的C语言作业在线测试系统,在该系统中可以自主选择教材对应章编号中的习题进行自测,提交习题答案后,系统会实时显示评分,另外在习题市场中读者还可以发布题目给其他读者练习。


3. 参考教材

1)苏小红,王宇颖,孙志岗,《C语言程序设计(第2版)》,高等教育出版社,2013年8月,购书网址:亚马逊

2)苏小红,车万翔,王甜甜,《C语言程序设计学习指导(第2版)》,高等教育出版社,2013年9月,购书网址:亚马逊

3)苏小红,孙志岗,陈惠鹏,《C语言大学实用教程(第3版)》,电子工业出版社,2012年6月,购书网址:亚马逊

4)苏小红,孙志岗等,《C语言大学实用教程学习指导(第3版)》,电子工业出版社,2012年6月,购书网址:亚马逊

5)苏小红等,《程序设计基础》,高等教育出版社,待出版


4.相关链接

爱课程国家精品资源共享课:https://www.icourses.cn/coursestatic/course_3153.html

相关MOOC课程:程序设计基础:https://www.icourse163.org/course/hit/0809HIT004B#/info


常见问题

Q:本门课程面向的授课群体是什么?没有任何基础能学习本课程吗?

A:本门课程的基本内容是面向零基础的学生。进阶内容是面向有一定编程基础或者大学计算机基础的学生,但是进阶内容不做为课程考试内容。


Q:本课程与其他课程在授课内容和讲授方法上有何不同?

A:在授课过程中,我们会注重解释“为什么”,揭示知识点背后的原理和思想,适时引入错误程序的分析、测试与调试,将一些易被忽视且对高水平程序设计很重要的“点”逐一展现给你,沿着数据结构从简单到复杂的主线展开,将软件工程相关的思想和方法渗透其中,从紧密结合实际的问题出发,在一个实例的“不断深化和提升”中逐步引出相关知识点,通过对问题的举一反三和前后知识点的融会贯通,由浅入深地启发引导你循序渐进地编程,让你在不知不觉中逐步加深对程序设计方法的了解和掌握。期望通过这样的设计,你在学完以后,不只是简单地掌握了C语言的语法,还能够理解隐藏在语法背后的思想,并初步具备灵活使用这些思想进行编程的能力。


Q:我想考二级,学完这个课程可以考吗? 

A:二级考试题考查语言的语法细节较多,所以能否通过二级考试,要看你的应试水平如何。本课侧重于讲解程序设计的方法以及错误程序的排错方法,更关注实战能力,因此应该说本课程对学生的要求是高于二级考试的要求的。


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 ssave project<invalid path> maybe the file is write-protected 呢?

A:codeblocks要求软件安装的目录最好不要带空格或汉字,不要按默认设置安装到program file目录下,卸载后再选择安装到根目录下试试。更多注意事项,参见高等教育出版社的《C语言程序设计学习指导(第2版)》

 

Q:在高级语言,比如说C语言中,我们要赋一个很大很大的数(超过了所有数据类型的取值范围),那要怎么办呢?

A:用数组或链表的方式来存储大数,并制定相应的运算规则。以数组为例,一个元素存储数据的一位,数据的位数就是数组元素的个数,链表存储就是一个节点代表一位。高等教育出版社出版的《C语言程序设计学习指导(第2版)》中给出了一个用数组实现的计算50位阶乘的例子。

 

Q:计算机有16位和32位之分,在某些情况下的计算可能会发生数值溢出。数值溢出是因为计算的数值太大导致的,但是为什么我们的电脑里的自带计算器可以计算很大很大的数却不会发生问题呢?

A:先说“计算机有16位和32位之分”的问题,计算机字长代表了计算机进行一次整数运算所能直接处理的二进制数据的位数。字长越长,计算机运算速度就越快,运算精度越高,内存容量越大,性能就越强(因支持的指令多)。32位计算机的运算速度高于16位计算机,是因为32位计算机一次可进行32位的运算,而16位计算机每次只能进行16位的运算,所以它必须将较大的数拆分成16位的量才能计算,这就造成了其速度变慢。

高级语言中引入了数据类型的概念才会出现数值溢出,因为不同的数据类型所占内存的字节数及其取值范围是不同的并且是有限的,当向某种类型的变量赋以超出该类型取值范围的数值时,就会产生数值溢出。当程序从高位计算机向低位计算机移植(例如从64位系统移植到32位系统)时,很可能出现溢出问题。做无符号整数减法时,如果被减数小于减数,也会发生溢出。

 

Q:c语言的头文件有何用处?不同的头文件有何区别?

A:include 文件包含命令是把尖括号<>或引号""内指定的文件包含到本程序中来,成为本程序的一部分。被包含的文件通常是由系统提供的,其扩展名为.h,因此也称为头文件。C语言的头文件中包括了各个标准库函数的函数原型。在程序中调用一个库函数时,必须包含该函数原型所在的头文件。""是在编译器指定的目录(目录名通常为include)中查找这个头文件,而<>是先在源文件当前所在的目录中查找,找不到就在系统指定的目录中找.

 

Q:怎样判断一个函数需不需要返回值?

A:C语言中函数可以通过return返回一个值,是一个便利条件,因为它确实在很多情况下可以为我们提供便利,尽管有些函数看似无需返回值,但其实为什么还要将其设计成有返回值就是为了要利用这个便利条件。例如,scanf(),printf(),strcpy(),strcat()等其实都是有返回值的,而这个返回值还确实很有用。以scanf()为例,它返回的是正确读入的数据个数,如果出错则返回0值,这样我们就可以通过测试scanf()的返回值来判断用户是否正确读入了数据,而strcpy(str1,str2)返回的是str1指针,即拷贝后的字符串的地址,这样就可以将strcpy函数调用用在链式操作中了。

 

Q:函数和指针的联系是什么?
A:指针可以做函数参数的类型,也可以做函数返回值的类型,还可以让指针指向一个函数(即函数指针)。

 

Q:定义指向函数的指针时,指针类型是与函数返回值一致呢,还是与函数参数的类型一致?

A:函数指针的基类型是指它所指向的函数的返回值的类型,因此函数指针的基类型应与函数返回值的类型一致。


显示全部