syllabus
程序设计基础与实验(C语言)
course code:B09GB002Y-04 英文名称:Fundamentals of Programming and Experiments in C course period:60 credit:3.00 course attribute:公共必修课 course lecturer:武成岗
我们选用C语言的发明者Dennis M. Ritchie所著的公认的经典著作《程序设计语言》为教材,直接接受发明者的思想。这本书除了公认的叙述精炼、思想深刻之外,还有一个重要的特色就是书中的案例几乎都来源于操作系统、编译器、库函数。
程序设计有审美意义,我们着重培养学生的鉴赏力,通过对比分析普通水平的程序与发明人设计的程序(如atoi)的差异,帮助学生体会其中的精妙。
程序设计是一门实践性很强的课程。所以,在全面讲解程序设计的基本概念、基本原理、基本方法的基础之上,特别强调培养学生实际动手设计程序(尤其是较大的、完整的程序)的能力。为此,我们以能够人机对战的五子棋程序为主线,贯穿整个的教学过程。讲授内容设置的总体原则是“零基础的学生能快速上手;有基础的学生能够吃得饱”。抛弃在黑板上写不能运行的程序,代之以全方位的真实、可运行的程序案例的讲解,边调试、边讲解。让学生直观感觉到程序的源代码与运行结果之间的关联——也就是专家委员会取得共识的“teaching by coding, learning by coding”。学生将课堂学到的程序设计知识融入到自己设计的五子棋程序中,学生非常清楚学习的每一个知识点究竟有什么用。最后以小竞赛的方式鼓励同学们探索不同的实现方案。
特别讲解C语言运行时结构,培养学生对C语言程序的透视感。为了提高学生的兴趣,专门制作了运行时结构的动画教学视频,以一个缓冲区攻击案例贯穿始终。
六年的结果证明这种教学方法效果很好。特别是我校的研究生中,我们培养的本科生不论是理论功底还是实际动手能力都明显优于其他学校的本科生。
本课程分为理论教学与五子棋程序设计实操两部分:
理论教学部分对应教材的7个章节,讲授顺序与教材编写顺序完全相同。
五子棋程序设计贯穿教学始终,具体过程是:只要讲授新的知识点,就结合到五子棋的设计中(比如:开始讲授printf函数,结合输出棋盘、棋子;讲解二维数组,结合后台棋盘、棋子、打分等数据的存储;讲授文件操作,结合记录棋谱……)。
第一章 导言
内容:全部C语言语法的精简版,补充五子棋入门、数字数组输出棋盘和棋子。
目的:初步掌握C语言的语法以及这些语法在程序设计中的用法
讲授:用21个教材中的案例程序完整版详细讲解这一章涉及的全部语法,并用集成开发环境的调试器逐步演示程序运行的详细过程。让学生直观看到程序的执行顺序,变量值的变化与程序执行的关系。此外,还将学生容易出现的错误理解,对正确的程序做修改,让学生看到错误的理解导致的程序运行的错误结果。
根据教学进展,在适当的时候加入了共4个五子棋入门程序。
- hello(1)
- hello(1)注释版
- 1-1-2 hello(2)
1-1-3 五子棋入门(1)
1-1-4 五子棋入门(2)
1-2-1 打印华氏温度与摄氏温度对照表(整数)
1-2-2 打印华氏温度与摄氏温度对照表(浮点数)
1-3-1 打印华氏温度与摄氏温度对照表(for)
1-4-1 打印华氏温度与摄氏温度对照表(define)
1-4-2 五子棋入门(3)
1-5-1 复制输入到输出(1)
1-5-2 char型数据的值与画
1-5-3 复制输入到输出 (2)
1-5-4 输入字符计数 (1)
1-5-5 输入字符计数(2)
1-5-6 计输入行数
1-5-7 计输入的行数、单词数与字符数
1-6-1 计数字、空白及其他
1-6-2 数字数组输出棋盘和棋子
1-7-1 power函数(1)
1-8-1 power函数(2)
1-8-2 power函数(2改进)
1-9-1 打印最长的输入行
1-10-1 打印最长的输入行(特别版)
1-10-2 打印最长的输入行(特别版)多文件版
第二章 类型、运算符与表达式
内容:C语言中的数据,包括常量、变量的数据类型,字符数据转为整形数据,类型的隐式转换和强制类型转换。运算符包括算术运算符、关系运算符,逻辑运算符,自增自减运算符,位运算符。各种表达式及运算符的优先级与结合性。补充试读Linux操作系统源代码(copy_page_tables)。
目的:掌握C语言中有关数据及对数据进行运算的语法以及这些语法在程序设计中的用法。
讲授:将教材中的案例程序完整化,通过分析程序将这一章的知识点融入其中。考虑到C语言发明的动机就是移植Unix操作系统,所以,最后特别补充了试读Linux操作系统源代码copy_page_tables,让学生了解所学知识在操作系统中的用途。
2-1-1 变量名
2-2-1 类型和长度
2-3-1 常量
2-3-2 字符串常量
2-4-1 声明
2-5-1 算数运算符
2-6-1 逻辑运算符
2-7-1 atoi
2-7-2 lower
2-7-3 类型转换
2-7-4 rand
2-8-1 ++ --
2-8-2 squeeze
2-8-3 strcat
2-9-1 按位运算符
2-9-2 getbits
2-10-1 赋值运算符与表达式
2-10-2 bitcount
2-11-1 条件表达式
2-12-1试读Linux操作系统源代码(copy_page_tables)
第三章 控制流
内容:形成C语言全部执行序拓扑结构的语法,包括语句及复合语句,条件分支语句,循环语句,break及continue,goto语句。补充五子棋(数组版)
目的:掌握形成程序结构的所有语法,以及这些语法在程序设计中的用法。
讲授:通过教材的11个案例程序,详细讲解了形成C语言程序结构的条件分支语句、循环语句等语句,并补充体现了分支结构的五子棋程序,并补充了体现各种条件分支及各种循环语句的操作系统内核代码getblk。
3-1-1 语句与程序块
3-2-1 if else语句
3-3-1 else if语句
3-4-1 switch
3-5-1 while for-atoi
3-5-2 while for -shellsort
3-5-3 while for -reverse
3-6-1 do while
3-7-1 break
3-7-2 continue
3-8-1 goto
3-9-1五子棋(数组版)
第四章 函数与程序结构
内容:函数的基本构成及函数的声明、定义、调用。函数的返回值类型,全局变量,局部变量,static,register,作用域,生存期,头文件,初始化,程序块结构,初始化,递归。
目的:掌握C语言中颗粒度最大的语法单元——函数及与函数相关的所有概念
讲授:通过16个教材的案例程序,详细讲解函数的所有语法及如何将程序分解为若干独立的函数。
4-1-1 函数的基本知识1
4-1-2 函数的基本知识2
4-2-1 返回非整型值的函数
4-3-1 外部变量
4-4-1 作用域规则
4-5-1 头文件
4-6-1 静态变量
4-6-2 局部静态变量
4-7-1 寄存器变量
4-8-1 程序块结构
4-9-1 初始化
4-10-1 递归
4-10-2 递归排序
4-11-1 预处理-文件包含
4-11-2 预处理-宏替换
4-11-3预处理-条件包含
4-12-1 缓冲区溢出攻击案例attack
4-12-2 教学视频1——C语言程序的运行时结构.mp4
4-12-3教学视频2——缓冲区溢出攻击原理案例.mp4
第五章 指针与数组
内容:指针与地址、指针与函数参数、指针与数组、地址算术运算、字符指针与函数、指针数组以及指向指针的指针、多维数组、指针数组的初始化、指针与多维数组、命令行参数、指向函数的指针、复杂声明。补充指向函数的指针与动态链接库,试读Linux操作系统源代码(copy_process),五子棋(人人对战版)。
目的:深刻理解、熟练掌握C语言语法中最难的概念——指针,掌握指针与函数、指针与参数、特别是指针与数组的关系。
讲授:通过18个教材中的案例程序,全方位讲解指针的概念与应用,特别着重讲解指针与数组的内在关系。
5-1-1 指针
5-2-1 指针与函数参数swap
5-2-2 指针与函数参数getint
5-3-1 指针和数组
5-4-1 地址算数运算
5-5-1 字符指针与函数 数组和指针
5-5-2 字符指针与函数 strcpy
5-5-3 字符串与函数 strcmp
5-6-1 指针数组以及指向指针的指针
5-6-2 指针的指针
5-7-1 多维数组 年月日
5-8-1 指针数组的初始化
5-9-1 指针与多维数组
5-9-2 指针与多维数组(补充)
5-10-1 命令行参数
5-11-1 指向函数的指针(1)
5-11-2 指向函数的指针(2)
5-11-3 指向函数的指针与动态链接库
5-12-1 复杂声明
5-13-1试读Linux操作系统源代码(copy_process)
5-13-2五子棋 人人对战版
第六章 struct
内容:struct的基本知识、struct与函数、struct数组、指向struct的指针、自引用struct、表查找、typedef、union、位字段。补充试读Linux操作系统源代码(union task_union、struct task_struct)。
目的:struct是C语言语法中颗粒度最大的数据类型,也是用户自定义数据类型。掌握struct数组、指向struct的指针、特别是自引用struct。
讲授:
6-1-1 struct的基本知识
6-2-1 struct与函数
6-2-2 struct与函数 判断范围
6-3-1 struct数组
6-4-1 指向struct的指针
6-5-1 自引用struct-链表
6-5-2 自引用struct-树
6-6-1 表查找
6-7-1 类型定义
6-8-1 union
6-8-2试读Linux操作系统源代码(union task_union、struct task_struct)
6-9-1 位字段
第七章 文件读写
内容:文件读写(printf等I/O操作已在前面的课堂教学过程中穿插讲解)
目的:掌握利用库函数读写文件
讲授:通过读写五子棋棋谱的案例程序讲解利用库函数读写文件。
7-1-1 文件读写操作——读写五子棋棋谱
实验课:
本课程在课堂教学过程中以讲解、分析案例程序为主,作业几乎全是程序设计,所以对学生掌握集成开发环境的能力要求很高。此外,本课程特别强调学生动手设计程序,要求学生独立完成五子棋程序的编写。根据以往的教学经验,在20周的教学时间中,前五周安排五次实验课,着重讲解集成开发环境的使用方法和技巧,特别是调试程序的技巧。最后五周,着重讲解五子棋程序设计的思路并帮助学生解决设计中遇到的难点。
章节/学时分配 | 讲课 | 习题课 | 实验课 | 上机课 | 讨论课 | 其它 |
第1课/2学时 | 2 | 2 | ||||
第2课/2学时 | 2 | 2 | ||||
第3课/2学时 | 2 | 2 | ||||
第4课/2学时 | 2 | 2 | ||||
第5课/2学时 | 2 | 2 | ||||
第6课/2学时 | 2 | |||||
第7课/2学时 | 2 | |||||
第8课/2学时 | 2 | |||||
第9课/2学时 | 2 | |||||
第10课/2学时 | 2 | |||||
第11课/2学时 | 2 | |||||
第12课/2学时 | 2 | |||||
第13课/2学时 | 2 | |||||
第14课/2学时 | 2 | |||||
第15课/2学时 | 2 | 2 | ||||
第16课/2学时 | 2 | 2 | ||||
第17课/2学时 | 2 | 2 | ||||
第18课/2学时 | 2 | 2 | ||||
第19课/2学时 | 2 | 2 | ||||
第20课/2学时 | 2(考试) |
备注:
1、实验课的20学时数确定,具体分配在第几周上课由主讲教师决定。
2、五子棋讲授时间的具体安排,由主讲教师决定。
本课程特别注意培养学生的鉴赏力和审美能力。如C语言如何仅用不到20个语句类型就能够编写操作系统、编译器、数据库等核心大型软件,如何实现极强的表现力和承载力。
通过对学生编写的atoi、malloc等函数与C语言设计者编写的同样程序对比分析,指出设计的精妙之处。
多年来的效果非常好,并得到了专家的一致好评。