《C语言程序设计教学体会.ppt》由会员分享,可在线阅读,更多相关《C语言程序设计教学体会.ppt(29页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、C语言程序设计语言程序设计教学体会教学体会一个程序员一个程序员的的“个人体会个人体会”代码风格代码风格代码风格就是程序员的书法代码风格就是程序员的书法比书法好学得多,基本不需要特别练习比书法好学得多,基本不需要特别练习但是坏习惯一旦养成,就像书法一样难以改变但是坏习惯一旦养成,就像书法一样难以改变是最易获得和实践的软件工程规则是最易获得和实践的软件工程规则对设计程序结构、培养团队精神都大有帮助对设计程序结构、培养团队精神都大有帮助不给学生看到任何一个风格糟糕的例子不给学生看到任何一个风格糟糕的例子代码风格代码风格标识符命名标识符命名宏全部大写宏全部大写Windows风格和风格和Unix风格风格
2、VariableNamevariable_name缩进缩进“”位置的两种风位置的两种风格格用用4格格tab还是用空格还是用空格空格空格增强单行清晰度增强单行清晰度每行代码长不要超过每行代码长不要超过80空行空行自然段自然段表达式尽量简单表达式尽量简单下面程序在不同编译器可能产生不同结下面程序在不同编译器可能产生不同结果,而且可读性差果,而且可读性差a=i+i+i+;printf(%d,%d,%d,i+,i+,i+);for(i=0;i!=0&i+;);很多教科书自作聪明地创造了很多复杂很多教科书自作聪明地创造了很多复杂的题目来难为学生,就算它们的用法正的题目来难为学生,就算它们的用法正确,实践
3、中也未必用得到确,实践中也未必用得到全局变量要避免使用吗?全局变量要避免使用吗?全局变量增大了模块之间的耦合度,而全局变量增大了模块之间的耦合度,而且不利于排错,罪大恶极且不利于排错,罪大恶极这罪恶不能怪全局变量,只能怪无限制这罪恶不能怪全局变量,只能怪无限制的对全局变量的改写的对全局变量的改写不要让全局变量有复杂的数据结构不要让全局变量有复杂的数据结构一旦数据结构变了,真的大祸临头了一旦数据结构变了,真的大祸临头了最好利用最好利用static特性用函数对其进行封装特性用函数对其进行封装不要把不要把goto判处死刑判处死刑问题不是出在问题不是出在goto,而是出在对标号的滥而是出在对标号的滥用
4、用结构化程序设计中一个被忽视的原则结构化程序设计中一个被忽视的原则单入口,单出口单入口,单出口只要符合此原则,什么都可以用只要符合此原则,什么都可以用goto在处理异常流程问题时,非常好用在处理异常流程问题时,非常好用退出多重循环退出多重循环统一的错误处理统一的错误处理吓死人的指针吓死人的指针“指针指针”出现,出现,“难难”字当头字当头老师吓学生,学生再吓学生的学生老师吓学生,学生再吓学生的学生从原理上了解指针,它是那么简单从原理上了解指针,它是那么简单一个普通变量,其值是一个内存地址一个普通变量,其值是一个内存地址格守下列原则,指针使用永不出错格守下列原则,指针使用永不出错永远要清楚每个指针
5、指向了哪里永远要清楚每个指针指向了哪里永远要清楚指针指向的位置是什么永远要清楚指针指向的位置是什么指针的兄弟:数组指针的兄弟:数组不要把数组和指针分开,它们是紧密相不要把数组和指针分开,它们是紧密相连的连的数组最简单数组最简单数组名是指针,数组成员是变量数组名是指针,数组成员是变量多维数组麻烦些多维数组麻烦些关键要知道它在内存中是怎么分布的关键要知道它在内存中是怎么分布的脑细胞可贵,千万别用来背脑细胞可贵,千万别用来背算符优先级算符优先级知道先算括号足以知道先算括号足以这样方便自己,也方便他人这样方便自己,也方便他人库函数用法库函数用法会查联机帮助、手册最重要会查联机帮助、手册最重要变量占用的
6、字节数变量占用的字节数不同平台,不同编译器,可能会迥然不不同平台,不同编译器,可能会迥然不同同struct占字节数由编译参数决定占字节数由编译参数决定凡是需要字节数的地方,一律用凡是需要字节数的地方,一律用sizeof获获得得没有没有“真真”“假假”逻辑运算的结果只有整型数逻辑运算的结果只有整型数“0”和和“非非0”很多编译器给出的非很多编译器给出的非0结果是结果是1,但这是特例,但这是特例if(0)printf(“永远不会被执行永远不会被执行”);while(1)/*死循环死循环*/下列问题,要上升到阶级斗争的下列问题,要上升到阶级斗争的高度高度指针指向不明指针指向不明数组下标越界数组下标越
7、界数值运算溢出数值运算溢出除数为除数为0不检查函数的返回值不检查函数的返回值变量不初始化就使用变量不初始化就使用比较相等时用比较相等时用=,没,没用用=用用=比较两个浮点数比较两个浮点数是否相等是否相等返回局部变量的指针返回局部变量的指针malloc不不freeopen不不close它们编译不出错,运行很可能也不出错,它们编译不出错,运行很可能也不出错,但一旦出错,就让人焦头烂额但一旦出错,就让人焦头烂额危险的危险的scanfscanf简便好用简便好用不做参数类型匹配检查不做参数类型匹配检查不限制用户输入字符串长度不限制用户输入字符串长度很多黑客攻击都是从这里开始的很多黑客攻击都是从这里开始的
8、0给字符串处理带来的给字符串处理带来的危险危险假如假如0不存在,不存在,printf、strcpy、strcmp等都等都将越界访存将越界访存n族函数可以解决此问题族函数可以解决此问题处理字符串时,时刻要警惕处理字符串时,时刻要警惕0是否在其是否在其该出现的位置该出现的位置C语言三大定律语言三大定律表达式定律表达式定律任何能产生数值结果的运算、操作都可以作为表达任何能产生数值结果的运算、操作都可以作为表达式,并可以放到任何需要数值结果的地方,只要数式,并可以放到任何需要数值结果的地方,只要数值类型能够匹配值类型能够匹配常见的可以产生数值结果的运算和操作常见的可以产生数值结果的运算和操作算术、逻辑
9、、位运算等算术、逻辑、位运算等?:、&、*等等有返回值的函数有返回值的函数赋值赋值常见的需要数值的地方有:常见的需要数值的地方有:赋值赋值条件判断条件判断函数调用函数调用C语言三大定律语言三大定律类型定律类型定律任何类型都可以在任何需要类型的地方使用;用任任何类型都可以在任何需要类型的地方使用;用任何类型定义的变量都要占用内存何类型定义的变量都要占用内存已知特例已知特例函数返回值函数返回值不不能定义为数组类型能定义为数组类型函数参数定义为数组类型,此时该参数不占用内存,而是函数参数定义为数组类型,此时该参数不占用内存,而是共享函数调用者传入的数组空间共享函数调用者传入的数组空间常用类型常用类型
10、基本数据类型、指针、数组、结构基本数据类型、指针、数组、结构常见的需要类型的地方常见的需要类型的地方定义变量定义变量定义指针、数组和结构定义指针、数组和结构函数参数和返回值函数参数和返回值sizeofC语言三大定律语言三大定律参数传递定律参数传递定律函数调用时的参数传递永远都是传值调用,函数调用时的参数传递永远都是传值调用,把实参的值拷贝给形参把实参的值拷贝给形参实参:调用者提供的参数实参:调用者提供的参数形参:函数定义的参数形参:函数定义的参数基本数据类型无容置疑基本数据类型无容置疑struct也无容置疑也无容置疑指针作为参数时,把指针变量的内容(就是其指指针作为参数时,把指针变量的内容(就
11、是其指向的内存地址)做了拷贝向的内存地址)做了拷贝数组名作为参数时,把它等同于指针看待了数组名作为参数时,把它等同于指针看待了要点要点简单为美简单为美宣扬宣扬“简单为美简单为美”的科学思想,摒弃刻意的复杂的科学思想,摒弃刻意的复杂原理为纲原理为纲C语言复杂的表面都是简单的原理的外在表现语言复杂的表面都是简单的原理的外在表现人性为本人性为本计算机是人设计的,具有人性计算机是人设计的,具有人性面向应用面向应用避免避免“学是一回事,使用是另一回事学是一回事,使用是另一回事”无需背诵无需背诵该记的,用着就记住了;用不着的,背下来也会忘该记的,用着就记住了;用不着的,背下来也会忘没有绝对没有绝对Matc
12、h is best!为什么追求为什么追求“简单为美简单为美”?C语言没有权威,什么都不可信语言没有权威,什么都不可信书当然不可信,任何书都是书当然不可信,任何书都是背书更可悲背书更可悲编译器也不可信,它只是一种实现而已编译器也不可信,它只是一种实现而已不同编译器、不同平台,表现往往会大相径庭不同编译器、不同平台,表现往往会大相径庭C语言诞生的主要目标之一就是让语言诞生的主要目标之一就是让UNIX可以跨平台。我们可以跨平台。我们书写的书写的C程序也应该极力争取跨平台程序也应该极力争取跨平台有些本来就是错误的用法,在某些平台上却还可以正确运有些本来就是错误的用法,在某些平台上却还可以正确运行行AN
13、SI C也不可信也不可信这个标准本身并不完备,而且并不是所有编译器都对它这个标准本身并不完备,而且并不是所有编译器都对它100%支持支持为什么追求为什么追求“简单为美简单为美”?那我们还能信什么?那我们还能信什么?相信相信“简单简单”!最简单的用法,是被编译器支持得最好的最简单的用法,是被编译器支持得最好的“简单简单”易于理解、交流,便于维护易于理解、交流,便于维护非计算机专业需要了解非计算机专业需要了解深入的深入的“原理原理”吗?吗?只要使用只要使用C语言,就必须知道语言,就必须知道“原理原理”浮于表面的使用,是无法发挥浮于表面的使用,是无法发挥C语言的优势的语言的优势的如果他不需要知道如果
14、他不需要知道“原理原理”,肯定他不用,肯定他不用C语语言,那么就不该让他学言,那么就不该让他学C语言语言“原理原理”涉及到涉及到计算机原理计算机原理编译原理编译原理操作系统操作系统算法与数据结构算法与数据结构软件工程软件工程原理为纲原理为纲计算机原理计算机原理冯冯诺依曼机诺依曼机二进制、八进制、十六进制和十进制二进制、八进制、十六进制和十进制b、B、KB、MB、GB、TB寄存器、内存、外存的基本原理寄存器、内存、外存的基本原理流流编译原理编译原理编译、链接过程编译、链接过程预处理指令、外部变量预处理指令、外部变量函数的参数传递和局部变量定义函数的参数传递和局部变量定义栈栈原理为纲原理为纲操作系
15、统操作系统内存保护内存保护数组下标越界、野指数组下标越界、野指针针内存管理内存管理动态内存分配(堆)动态内存分配(堆)和栈和栈文件管理、进程互斥文件管理、进程互斥算法与数据结构算法与数据结构栈栈结构体结构体软件工程软件工程分析、设计、程序结分析、设计、程序结构构结构体结构体协作协作原理为纲原理为纲C语言自身的原理语言自身的原理指针的原理指针的原理数组的原理数组的原理函数调用的原理函数调用的原理内存分配的原理内存分配的原理栈和堆栈和堆了解原理,就能从根上分析出一些纷繁了解原理,就能从根上分析出一些纷繁复杂的语法规则的合理性。此外,还需复杂的语法规则的合理性。此外,还需要一点点人性要一点点人性人性
16、为本人性为本在原理基础上,在原理基础上,C语言为了让人使用方便,语言为了让人使用方便,有很多人性化的设计有很多人性化的设计比如:比如:char sz=“A String”;+-*/if-else逻辑运算逻辑运算不要让学生不要让学生“记住记住”这些,而要让他们这些,而要让他们知道这些有多么地顺乎自然知道这些有多么地顺乎自然面向应用面向应用C语言是用来实践的。能应用,比掌握一语言是用来实践的。能应用,比掌握一些生僻的用法更重要些生僻的用法更重要应用中最信奉的就是应用中最信奉的就是“简单为美简单为美”软件工程思想在应用中也非常重要软件工程思想在应用中也非常重要结果正确不能说明程序好结果正确不能说明程
17、序好无需背诵无需背诵记忆力经过漫长的记忆力经过漫长的12年中小学应试教育,已经年中小学应试教育,已经锻炼到极致了锻炼到极致了如果教学中指明要学生机械背诵什么,那么这如果教学中指明要学生机械背诵什么,那么这个教学是失败的个教学是失败的如果考卷中有需要机械背诵才能做答的题,那如果考卷中有需要机械背诵才能做答的题,那么这个考卷是失败的么这个考卷是失败的通过作业、上机,把知识自然而然地变成学生通过作业、上机,把知识自然而然地变成学生身体的一部分身体的一部分锻炼学生查资料、联机帮助和手册等的能力锻炼学生查资料、联机帮助和手册等的能力没有绝对没有绝对科学没有金科玉律,计算机科学更是如科学没有金科玉律,计算
18、机科学更是如此此在不同的环境下,相同的观点会产生不在不同的环境下,相同的观点会产生不同的效果同的效果简单为美是基本准则,但是在用简单为美是基本准则,但是在用C书写像书写像OS核心这样的代码时,效率很关键,就不能追核心这样的代码时,效率很关键,就不能追求求“简单简单”了了把选择权留给学生自己,让他们有自己把选择权留给学生自己,让他们有自己的观点的观点C语言教学最终目的语言教学最终目的让学生知道自己还远让学生知道自己还远没有没有学会学会让学生知道自己以后怎样继续学让学生知道自己以后怎样继续学让学生知道自己肯定能自己学会,并找让学生知道自己肯定能自己学会,并找到学习的乐趣与动力到学习的乐趣与动力让教师知道,自己还有不会的让教师知道,自己还有不会的