C语言研究性学习的路线(8)

C语言研究性学习的路线

现行的多数C语言教材有太多的误区,不仅不能给读者提供有效的学习线索,还常常“误导”读者,于是,“死记硬背”便成了学习C语言的唯一选择。本文以拙作《新编C语言程序设计教程》(清华大学出版社出版,配套视频zeq126.56.com)为基础,探讨了C语言的研究性学习。

C语言的知识点有:

1.         C语言与计算机的关系

2.         表达式的求值

3.         逻辑运算及选择结构

4.         算法及循环结构

5.         数组的作用及准确理解

6.         函数的作用及准确理解

7.         指针的作用及准确理解

8.         自定义数据类型及文件

这几部分相辅相成,构成了一个有机的整体。分析如下:

八、其他

预处理

源文件通常由命令如include和C语言语句两部分组成。程序编译时源文件会由称为“预处理器”的程序先进行处理,被处理过的源文件中只有C语言语句了。预处理器只能进行简单的如查找替换似的“文本操作”。预处理命令的主要作用是方便程序的编写。

(-)程序编译

理解程序编译的过程。注意链接阶段的主要任务是处理具有文件作用域的标识符在多个源文件中的使用问题。

通过“如何在不暴露函数源代码的前提下提供函数的功能”的思考加深对程序编译的理解。

(二)宏定义

如何定义宏展开时不出现错误的宏。(#define ABS(x) ((x)>0?(x):(-x)有问题吗?)

参数化宏与函数有何本质上的区别。(一个属于预处理,一个属于C语言(有类型检查,有执行函数体的过程)。正因为是简单的替换,宏可以超越类型,如可以定义一个求某数绝对值的宏,而不必考虑此数为整数还是小数。

(三)文件包含

掌握文件包含常见的两种形式的不同之处。

理解头文件的内容为何不要包含函数的定义。

(四)条件编译

条件编译命令在什么时候执行?

理解条件编译命令的作用。(用于解决同一个头文件被多次包含的问题。用于编写可移植的代码。)

用户自定义数据类型

数据类型是具有相同特征的一类数据的抽象,用于在程序中定义变量。变量标识了内存中的一块存储单元,通常存放了属于某数据类型的一个具体值。

用户只能通过对已有数据类型的限定、组合来定义新的数据类型。

用户自定义数据类型数也用于定义变量。

10.1结构型

重点:

1.  结构型有什么作用?(把描述同一个对象的分散的数据集中起来便于使用。)

2.  定义结构型时需注意什么?(结构型的名称包括struct关键字;花括号外面有分号。)

3.  如何使用结构型?(先定义一个结构型,再用结构型定义变量。)

4.  结构型与数组有何异同?(同为构造型,因此相应的变量都包含多个变量。不同之处结构型变量中的各个变量类型可以不同,而数组元素的类型相同。结构型变量中可以有数组成员,而可以用数组定义多个结构型变量。)

5.  结构型成员变量的引用。(通过成员操作符.(如stu.name);利用指针变量通过间接引用操作符,(如(*pstu).name),此时也可用简洁的指向成员操作符(如pstu->name)。)

6.  通过例10-2复数及其运算,体会结构型变量作形参的特点。(传值,但常用指针变量提高效率 。)

7.  在定义结构型时,成员变量中为何可包含一个指向自身的指针类型?它有什么作用?(因为无论什么类型的指针变量,其存储单元的长度都是固定的。多个包含了指向自身类型的结构型变量可以连接起来,串成一串,这样一来,变量之间也就有了逻辑上的先后顺序。)

8.  通过例10-3体会链表的用法。(有头结点的链表。)

9.  通过例10-4体会循环链表的用法。(有头指针的链表。)

难点:

1.  数据类型与变量的关系。

2.  结构型的使用。

3.  结构型与数组的异同。

4.  数组与链表的异同。

5.  例10-4的理解。

10.2联合型

重点:

1.  联合型与结构型的异同。

2.  联合型的使用。

10.3枚举型

重点:

1.  枚举型的作用。(1.一组整数的别名。2.程序的可读性。)

2.  枚举型与整数的关系。

难点:

1.  理解枚举型对程序的影响。(极大地提高了程序的可读性。)

10.4为自定义类型定义别名

重点:

1.  typedef究竟定义了什么数据类型的别名?

(去掉typedef关键字,相关语句变成了变量定义语句,该变量是什么类型,则typedef语句就定义了什么类型的别名。)

 

文件

文件用于在外存中长期保存程序中的数据。为了提高数据的存取效率,C语言使用缓冲文件系统。C程序中用FILE结构型变量标识文件。

根据存储数据的编码格式,文件分为文本文件和二进制文件。文本文件便于查看其中的数据而多用于分享信息,而二进制文件与程序中数据的编码格式相同。特别注意C语言的文本文件与Windows下的文本文件的差异。此外,计算机中只能存储二进制字符串,要正确理解所谓的文本文件和二进制文件。

数据既可存储于文本文件中,也可存储于二进制文件中。存储于文本文件中的数据在程序中使用时可能需要进行必要的编码转换。

文件只有先打开才能在程序中使用。文件的打开方式有“只读”、“只写”和“追加”三种。可以按“文本格式”也可按“二进制格式”打开文件,两者的本质区别在于是否自动进行’\n’与’\r’’\n’的互换。

常用的文件读写函数中,最简单但最容易出错的是fputc函数和fgetc函数。它们以字节为单位操作文件中的数据,加之受到putchar函数和getchar函数的影响,经常把它们与字符联系到一起。

首先,它们只是以字节为单位,如果文件是“文本格式”的,则似乎可以说它们用于存取字符数据,但是当文件为“二进制格式”时,它们依然可以用于处理数据,如复制文件内容,可见仅仅认为它们用于存取字符数据是片面的。

其次,它们的参数和返回值类型为整型,这就意味着它们在处理数据时会有数据的截取和扩充的操作。由例11-4可知,把fgetc函数的返回值定义为整型可以避免读出8个1的数据与返回值EOF相混淆的情况出现。

理解文件何时处于文件结束状态可以避免例11-3中feof函数的误用。

fprintf函数先把程序中的二进制格式数据转换成“字符串”,然后再存储到相关文件中。它的用法与printf函数极其类似,printf函数完成转换工作后把相关字符串输出到屏幕上,由此可见,与printf函数相连的输出设备只显示字符数据。fscanf函数把文件中的字符串数据转换成程序中使用的二进制格式数据,功能与scanf极其类似,scanf函数把用户通过输入设备输入的字符串数据转换成程序中使用的二进制格式数据,由此可见,与scanf函数相连的输入设备仅能接收字符数据。

fwrite函数和fread函数以“任意”的字节长度为单位处理文件中的数据。

当把输入输出设备抽象成设备文件后,输入输出函数与文件操作函数也就没有本质上的区别了。

通过fseek函数“手动”设置文件的当前位置指针的位置,可以实现文件的随机读写。使用既可读又可写的文件似乎比较酷,但实际上不仅效率不高而且极易出错,并非是最佳选择。

11.1 C语言文件概述

重点:

1.  理解文件的作用。(外存管理数据的单位。)

2.  C语言中文件的特点。(字节的序列;使用缓冲文件系统;一个文件对应一个FILE型结构变量。)

难点:

对文件的理解。

11.2 文件的打开与关闭

重点:

1.  文本文件与二进制文件的理解。(编码格式)

2.  文本文件与二进制文件的特点。

3.  Windows中的文本文件与C语言中的文本文件有何不同?

4.  通过fopen函数的参数体会文件在C程序中的使用特点。(只写或只读)

5.  体会文件中当前位置指针的作用。

6.  以文本文件格式和二进制文件格式打开同一个文件时有何区别?

7.  为何不再使用的文件需要关闭?

难点:

1.  文件中的数据与C程序中的数据有何对应关系?

2.  文本文件与二进制文件有何区别?

11.3文件读写

重点:

1.  fputc函数和fgetc函数的功能。(以字节为单位进行数据处理。)

2.  fputc函数和fgetc函数的参数为整型意味着什么?(处理数据时会发生数据的截取和扩充操作。)

3.  windows记事本程序创建的文档能在C程序中打开说明了什么?(程序之间可以通过文件共享数据。)

4.  如何理解文件结束状态?

5.  通过例11-3的学习,加深对文件结束状态的理解,避免feof函数的误用。

6.  通过例11-4的学习,加深对fputc函数和fgetc函数的理解,并能区分EOF和feof函数在表示文件结束时的区别。

7.  比较printf函数和fprintf函数的功能。

8.  比较scanf函数和fscanf函数的功能。

9.  fwrite函数和fread函数的作用。(以任意长度的字节为单位处理数据。)

难点:

1.  fputc函数和fgetc函数是字符处理函数吗?

2.  feof函数的使用。

3.  EOF和feof函数在表示文件结束时的区别。

4.  fprintf函数和fscanf函数的使用。

5.  分析三类文件读写函数的特点。

11.4标准设备文件

重点:

1.  把设备抽象成文件有何好处?(可以屏蔽不同设备之间的细节。)

2.  何谓标准设备文件?

3.  通过标准设备文件,分析输入输出函数与文件读写函数的联系。

难点:

通过文件操作函数fprintf和fscanf与输入输出函数printf和scanf的比较,体会标准设备文件与普通设备文件的异同。

11.5文件随机读写

重点:

1.  文件的当前位置指针有何作用?(指示文件操作的起始位置。)

2.  fseek函数的作用。

3.  既可读又可写的文件在读写操作切换时需注意什么?

 

位运算

位运算是指按二进制位进行的运算。通常只能低级语言才支持位运算。

位运算的重点不在于运算结果为何值,而偏重于运算后各位的状态。

学习位运算的关键在于理解位操作符的作用。

重点:

1.利用按位与操作符&可以很容易地在不影响其它位的前提下,将一个整数的某位设置为0。

2.利用按位或操作符|可以很容易地在不影响其它位的前提下,将一个整数的某位设置为1。

3.利用按位异或操作符^可以很容易地在不影响其它位的前提下,将一个整数的某位翻转(0变1,1变0)。

4.利用取反操作符~可以很容易地将一个整数的所有位翻转。

5.左移操作符可用于快速地将一个整数扩大2倍、4倍……。在位运算中,它常用于构造操作数。

6.右移操作符分为逻辑右移和算术右移。在位运算中,它也常用于构造操作数。

7.理解C语言中位段的作用。
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值