编程语言层出不穷,不胜枚举,能帮助我们以不变应万变的奥秘何在?答案就是“编程之魂”。传统的编程入门课,都是以教授一种语言的基本语法为主,试图通过语言来传达“编程之魂”,但这样也许你会将更多的精力用在理解语言的语法细节上,只见树木不见森林。
期望通过本课程的学习,你不只是简单地能够掌握一种语言的语法,还能理解隐含在语法背后的思想,并初步具备灵活使用这些思想进行编写程序解决实际问题的能力。如果你掌握了这些,你会发现,迈向成功的最后一步不过是选择一种合适的编程工具而已。
我们会用15周的时间来深入讲解C语言,在授课过程中,我们会注重多解释一些“为什么”以及错误程序的分析,从环环相扣的问题入手,将一些易被忽视且对高水平程序设计很重要的“点”,沿着数据结构从简单到复杂的主线逐一展开,在实例的“不断深化和提升”中引出知识点,通过对问题的举一反三和前后知识点的融会贯通,由浅入深地引导你循序渐进地编写规模逐步增大的程序。
程序设计语言数以千计,能广为流传的不过几十种,能风光三十年的更是屈指可数,其中影响最大、寿命最长的非C语言莫属。尽管Java等后起之秀呈后来居上之势,但C语言宝刀不老,仍然笑傲天下,论剑江湖,铁杆粉丝遍布世界各地。
你想加入“稀饭”的行列吗?你想从“菜鸟”升级为“程序猿”吗?那就加入我们,和我们一起踏上爱上C语言之旅吧。
上机考试,占总成绩的50%
实验大作业,占总成绩的25%(程序占15%,报告占10%)
SSE随机抽题作业,占总成绩的25%
课堂大翻转,可以赢得附加分1-10分
第1讲 数据的存储与表示
(1)软件开发的基本过程;(2)C程序的集成开发环境;(3)数据的存储与表示;(4)变量与常量;(5)赋值运算符
自学:(1)算术运算符;(2)计算变量或数据类型所占内存空间的字节数。
第2讲 数据的基本运算
(1) 优先级和结合性,自动类型转换和强制类型转换; (2)关系运算符,逻辑运算符,条件运算符
自学:数据的格式化屏幕输出,标准数学函数。
第3讲 选择控制结构
(1)分支控制方式;(2)条件语句;(3)switch语句;(4)程序测试
自学:生活中的问题,计算机问题求解方法及特点;算法的概念和描述方法,数据的格式化键盘输入。
第4讲 循环控制结构
(1)循环控制方式、循环语句;(2)嵌套循环。
自学:程序调试
第5讲 穷举和递推
(1)流程的转移控制;(2)穷举和递推。
自学:结构化程序设计的基本思想
第6讲 函数
(1)信息隐藏和函数封装;(2)函数的定义、函数原型;(3)函数调用、参数传递、函数的返回值;(4)程序的健壮性。
选学:分治法,断言与防御式编程。
自学:模块分解,自顶向下、逐步求精的模块化程序设计思想。
第7讲 递归函数
(1)递归函数,递归调用;(2)变量的作用域。
选学:变量的存储类型。
自学:代码风格。
第8讲 数组
(1)一维数组和二维数组的定义和初始化;(2)向函数传递一维数组和二维数组;(3)计算最大最小值。
自学:数组下标越界问题分析
第9讲 排序和查找
(1)常用的排序算法;(2)常用的查找算法
第10讲 指针
(1)变量的内存地址;指针的概念;(2)指针变量的定义和初始化、直接寻址与间接寻址;(3)指针变量的解引用;(4)按值传参与按地址传参;(5)用指针变量作函数参数。
选学:函数指针及其应用。
第11讲 字符串
(1)字符串常量、字符指针和字符数组;(2)用字符指针和字符数组做函数参数向函数传递字符串,字符串处理函数;(3)从函数返回字符串指针。
选学:用字符串的相关知识解释缓冲区溢出与缓冲区溢出攻击
第12讲 指针和数组
(1) 指针和一维数组间的关系;(2)指针和二维数组间的关系;(3)指针数组及其应用。
第13讲 结构体和共用体
(1)抽象数据类型,结构体,结构体变量、结构体数组、结构体指针,结构体成员的引用;(2)结构体所占内存的字节数;(3)结构体数组和结构体指针做函数参数向函数传递结构体数据。
自学:枚举类型及其应用,共用体及其应用。
第14讲 动态数据结构
(1) C程序的内存映像;(2)动态内存分配函数;(3)动态数组;(4)动态数据结构(例如单向链表)。
自学:文件操作。
第15-16讲 综合应用
参与方式:在最后一次上课前,通过在MOOC上自学文件等内容并综合运用课程所学知识,并应用自顶向下、逐步求精的模块化设计思想,在课外完成一个与众不同、有创意的综合应用程序,在课上展示和答辩,以获得附加分。学生现场讲解并演示程序6分钟,2分钟学生提问。每个小组1-3人,如果参与报名的小组数多,就采取随机抽签的方式。
评分方式:全班同学现场投票和计票,每张选票最多投2个组(投多组者按废票处理),课后按票数排序,排名第一的小组可获得10分的附加分(小组其他成员的分数在此分数基础上乘以一定的系数),排在后面的小组根据票数的递减程度依次减1-3分。只要报名参加翻转,即使票数为0,也至少能得1分
本门课程的基本内容是面向零基础的学生。进阶内容是面向有一定编程基础或者有大学计算机基础的学生,但是进阶内容不做为课程的考试内容。
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:函数指针的基类型是指它所指向的函数的返回值的类型,因此函数指针的基类型应与函数返回值的类型一致。