C语言研究性学习的路线
下载后可任意编辑 C语言讨论性学习的路线 现行的多数C语言教材有太多的误区,不仅不能给读者提供有效的学习线索,还常常“误导”读者,于是,“死记硬背”便成了学习C语言的唯一选择。本文以拙作《新编C语言程序设计教程》(清华大学出版社出版,博客 C语言的学习可分为四个阶段。 第一阶段 理解C语言与计算机的关系 理解计算机如何计算。 计算机由五大部件组成,C语言如何使用这五大组成部件? 计算机采纳二进制,那么正负号,小数点、字符等如何在计算机中存储?采纳不同的编码方式,计算机中的运算与数学上的运算有何异同? 在理解上述问题的基础上,能根据优先级、结合性、数据类型和序列点熟练地对C语言表达式求值,也就是能模拟计算机进行计算。 第二阶段 掌握编程方法 计算机通过连续地对表达式求值(计算)解决实际问题。 掌握逻辑运算之后,理解计算机解决问题的方法,即有条件地重复。编程的关键在于找到利用“重复”解决问题的方法。算一次加法,再算一次加法,又算一次加法,“重复加”,如1+2+3+…+100。大僧人数为1时满足条件吗?大僧人数为2时满足条件吗?大僧人数为3时满足条件吗?“重复试”,如百僧百馍问题。 遇到问题一定要先用自己的超级计算机(大脑)分析问题找出重复,再用循环把重复表达出现,这就是编程。 第三阶段 用函数组织代码 当程序由多个函数组成时,可以借助对函数封闭性的讨论来理解这一阶段遇到的问题。 递归函数是个奇迹,自然而优雅地模拟了递归算法。递归算法是更高级的重复。 第四阶段 掌握指针的用法 指针提供了使用内存中相关存储单元的另一种途径。 由于只需某类型的地址,就可使用相关存储单元,指针变量可以提高函数的执行效率。由于void型指针变量的特点,程序中的某些函数可以超越类型的限制而具有了某种通用性。 理解了指针的作用,掌握指针也并非什么难事。 C语言的知识点有: 1. C语言与计算机的关系 2. 表达式的求值 3. 逻辑运算及选择结构 4. 算法及循环结构 5. 数组的作用及准确理解 6. 函数的作用及准确理解 7. 指针的作用及准确理解 8. 其它 这几部分相辅相成,构成了一个有机的整体。分析如下: 一、C语言与计算机的关系 (-)C语言如何驱动计算机 人们利用C语言与计算机沟通,借助编译系统,计算机能够理解并执行C语言程序。C语言是使用计算机的接口。 使用计算机需了解计算机的三大基本原理,特别是二进制编码和五大组成部分。C语言与计算机的五大组成部分关系如图所示。 图1-6 C语言与计算机的联系(1-6为书中编号) 在此需特别注意“变量”这一概念。C语言中用变量标识计算机中的存储单元,使用变量就是使用计算机中的存储器。假如存储单元不能存入某类存储数据如5.5,则相关变量就不能赋值为5.5。这是变量与数学中未知数如x的本质区别。以后在学习指针变量、数组变量时,主要通过分析它们标识存储单元的特点来探求其本质特征。 C语言用函数控制计算机的输入设备和输出设备,那么C语言中的函数与数学中的函数有何异同?本质上没有区别!都是从输入到输出的映射。 不仅应注意函数在C语言中的表现形式,更重要的是明白函数与程序的关系。main函数就是程序,程序的执行过程就是main函数的执行过程。没有main函数,函数再多也不能称为程序。程序中的其它函数只有通过main函数的调用(直接或间接)才有执行的机会。借助编译系统的调试功能,不仅可以直观地观察一个“复杂”程序的执行过程,而且应明白一个道理,程序是一条语句一条语句执行的,并不神奇。 通过学习printf函数的简单使用,既能动手尝试编程,又能体会到编写程序时需要的严谨,尤其是程序的输出与代码的“绝对一致”。 重点: 1. 计算机的五大组成部分与C语言的关系。 2. 变量的概念。(存储单元的标识;分类型;先定义后使用;赋值) 3. 函数在C语言中的表现形式及重要作用。(写程序就是定义main函数) 4. 程序中#include 的作用。 5. 函数调用及printf函数的使用。 6. 编译系统的作用及VC6.0的使用。(程序的编译及调试执行) (二)二进制对计算机的制约 计算机采纳二进制意味着数据在计算机中只能以01数字串的形式存在,即数据必须以二进制形式编码。 虽然数值型数据可以方便地转化成二进制形式,但正负号和小数点位置的编码问题需要解决。同类型的数据在计算机中为何编码长度一致?固定的编码长度又会带来什么样的问题? 整数编码的难点在于为何采纳补码形式,补码的符号位为何可以参加运算,且补码加法的运算规律。 小数编码的难点在于精度,如何估算float型和double型的精度呢? 理解了数值型数据的编码规律,则C语言(或其它编程语言)中的基本数据类型也就懂了。稍有疑问就是C语言中的整型为何有许多种类呢? 整型的知识点多而散。 1. 字面量前缀表进制(0八进制0 x十六进制),后缀表示类型(l长整型u无符号整型)。 2. 输入输出时的格式字符,既有长短(l和h),又有进制(o和x)。 特别注意: 1. 用负数给无符号整型变量赋值,如unsigned long ui = -1;,或输入格式字符为无符号型时,用户却输入了一个负数,如scanf(“%uh”, -1↙。 2. printf函数输出时以格式字符所指明的类型解码变量所标识存储单元的存储内容,而不考虑相关变量的实际类型,即“我的地盘我作主”。 浮点型的知识点。 1. 字面量有小数形式和指数形式两种。 2. 格式字符f,e,E用在printf函数中(输出数据时)没有区别,但是当利用scanf函数获得用户输入的double型数据时,格式字符前面必须加附加格式说明符l。 难点: 1. 精度是指小数形式还是指数形式? 2. 计算机中0.1+0.1并不等于0.2,但是0.25+0.25却等于0.5!什么情况下有误差,什么情况没有误差? 字符型数据编码的原则就是统一标准,每个字符对应一个编号,计算机中存储这个编号(整数),因此C语言中字符型数据可以与整型数据通用。(当用整型解码时就输出编号printf(“%d“,ch);当用字符型解码时就输出字符如printf(“%c“,ch)。) 字符型的知识点。 1. ASCII码的一些特点,如小写字母和大写字母谁的编号大? 2. 回车键对应于C语言中哪个字符? 3. 字符型变量多样的初始化方法。 4. 语句short i = 9; 与char ch = ‘9 ;的区别及联系。 5. putchar函数和getchar函数的使用。 思考与探究 1. 按下5回车后,用户输入的是整数5、小数5还是字符5? 2. 用户输入多个数据时,如zzj↙,下面的代码段如何执行? { char ca, cb; ca = getchar(); cb = getchar(); printf(“%c%c”, ca, cb); } 3. 用