程序设计基础教程 C语言 教学课件 ppt 作者 杨有安 陈维 曹惠雅 徐欣欣 鲁丽 1_ 第9章 预处理和标准函数

上传人:E**** 文档编号:89366926 上传时间:2019-05-24 格式:PPT 页数:25 大小:234.50KB
返回 下载 相关 举报
程序设计基础教程 C语言  教学课件 ppt 作者  杨有安 陈维 曹惠雅 徐欣欣 鲁丽 1_ 第9章 预处理和标准函数_第1页
第1页 / 共25页
程序设计基础教程 C语言  教学课件 ppt 作者  杨有安 陈维 曹惠雅 徐欣欣 鲁丽 1_ 第9章 预处理和标准函数_第2页
第2页 / 共25页
程序设计基础教程 C语言  教学课件 ppt 作者  杨有安 陈维 曹惠雅 徐欣欣 鲁丽 1_ 第9章 预处理和标准函数_第3页
第3页 / 共25页
程序设计基础教程 C语言  教学课件 ppt 作者  杨有安 陈维 曹惠雅 徐欣欣 鲁丽 1_ 第9章 预处理和标准函数_第4页
第4页 / 共25页
程序设计基础教程 C语言  教学课件 ppt 作者  杨有安 陈维 曹惠雅 徐欣欣 鲁丽 1_ 第9章 预处理和标准函数_第5页
第5页 / 共25页
点击查看更多>>
资源描述

《程序设计基础教程 C语言 教学课件 ppt 作者 杨有安 陈维 曹惠雅 徐欣欣 鲁丽 1_ 第9章 预处理和标准函数》由会员分享,可在线阅读,更多相关《程序设计基础教程 C语言 教学课件 ppt 作者 杨有安 陈维 曹惠雅 徐欣欣 鲁丽 1_ 第9章 预处理和标准函数(25页珍藏版)》请在金锄头文库上搜索。

1、2019/5/24,程序设计基础(C语言)wh,1,第 九 章,预处理和标准函数,2019/5/24,程序设计基础(C语言)wh,2,本章内容,9.1 预处理命令 9.2 输入输出标准函数 9.3 自定义头文件设计的原则 小 结,2019/5/24,程序设计基础(C语言)wh,3,9.1 预处理命令,作用:编译之前,由编译预处理程序对源程序做一些处理,将它们转换成能由C编译程序接受的正文。 种类: 宏定义 文件包含 条件编译 格式: “#”开头 占单独书写行 以换行符结尾,2019/5/24,程序设计基础(C语言)wh,4,9.1.1 宏定义 1. 简单的宏定义 简单宏定义的一般形式为:#de

2、fine 标识符 单词串 作用域:从#define定义之后直到该宏定义所在文件结束。 说明:#define行通常放在源程序开头部分,也可以放在源程序中任何位置,但必须出现在使用符号常量之前。 例如: #define YES 1 #define NO 0 程序中用符号常量YES和NO代表1和0,在预编译时就会用1和0替换所有的YES和NO。,宏名,任意以回车换行结尾的文字,2019/5/24,程序设计基础(C语言)wh,5,注意: (1) 通常用大写字母来定义宏名,以便与变量名区别。 (2) 宏替换只是简单的字符替换,不进行任何计算和语法检查。 例如:#define X 1+2 int y=3*

3、X; 预处理时,会用字符串“1+2”来替换宏名X,因此y的值应该为3*1+2,结果为5,而不是3*(1+2)=6。 (3) 双引号括起来的字符,即使与宏名相同,也不进行替换。 例如:#define OK 1 printf(“OK“); 执行时输出的是OK,而不是1。 (4) 宏定义可以嵌套定义。 例如: #define R 2.0 #define PI 3.14 #define S PI*R*R 经预处理后,宏S将被3.14*2.0*2.0替换。,2019/5/24,程序设计基础(C语言)wh,6,2. 带参数的宏定义 带参数的宏定义的一般形式为: #define 标识符(标识符1,标识符2,

4、) 单词串 例如:#define sqr(x) (x)*(x) #define max(a,b) (a)(b)?(a):(b) 语句printf(“sqr(%d)=%dn“,3,sqr(3); 预编译时,此句将被替换成:printf(“sqr(%d)=%dn“,3,(3)*(3); 执行后输出sqr(3)=9。 语句printf(“max(%d,%d)=%dn“,2,3,max(2,3); 预编译时,将被替换成:rintf(“max(%d,%d)=%dn“,2,3,(2)(3)?(2):(3); 执行后输出max(2,3)=3。,2019/5/24,程序设计基础(C语言)wh,7,注意:在带参

5、数的宏定义中,如果单词串是一个含有运算符的表达式,那么单词串中的每个参数都必须用圆括号括起来,并且整个表达式也要括起来。否则替换后的内容可能和原意不同。 如将上例中sqr(x)的宏定义改为: #define sqr(x) x*x 则表达式sqr(1+2)将被替换成: sqr(1+2*1+2) 结果是5,而不是原意希望得到的9。,2019/5/24,程序设计基础(C语言)wh,8,3. 取消宏名定义 如果需要终止宏的作用域,可以使用#undef命令,取消宏名定义的形式为: #undef 标识符 要求:标识符应该是已定义过的宏名。 例如: #undef PI 表示在该命令后,PI是一个未定义的标识

6、符,不再表示3.14。,2019/5/24,程序设计基础(C语言)wh,9,9.1.2 文件包含 文件包含命令有两种形式: #include #include “文件名“ 功能:用指定文件的全部内容替换程序中该命令行,从而使指定的文件与当前源文件连成一个源文件。 程序中需要引用标准库函数时,需要在源文件开头用文件包含命令包含库函数的头文件。 例如: #include #include ,2019/5/24,程序设计基础(C语言)wh,10,文件包含两种形式的区别: 使用尖括号表示编译系统根据系统头文件存放的目录路径去搜索系统头文件,而不是在源文件目录去查找; 使用双引号则表示编译系统首先在当前

7、的源文件目录中查找,若未找到才根据系统头文件存放的目录路径去搜索系统头文件。 用户编程时可根据自己文件所在的目录来选择某一种命令形式。一般来说,系统定义的头文件通常用尖括号,用户自定义的头文件通常用双引号。,2019/5/24,程序设计基础(C语言)wh,11,9.1.3 条件编译 功能:可以按不同的条件去编译不同的程序部分,因而产生不同的目标代码文件,从而有利于程序的移植和调试。 1. 第一种形式 #ifdef 标识符 程序段1 #else 程序段2 #endif 作用:如果标识符已被#define命令定义过,则对程序段1进行编译,否则对程序段2进行编译。如果程序段2为空,可以写为: #if

8、def 标识符 程序段 #endif,2019/5/24,程序设计基础(C语言)wh,12,【例9-2】已知a1=10,a2=-3、an=3an-1+an-2,求an前10项之和。 #include #define DEBUG void main(void) int a1=10,a2=-3,i,x,sum; sum=a1+a2; for(i=3;i=10;i+) x=3*a2+a1; sum+=x; a1=a2; a2=x; #ifdef DEBUG printf(“x=%d,sum=%dn“,x,sum) ; #endif printf(“前10项和=%dn“,sum) ; ,程序运行如下:

9、 x=1,sum=8 x=0,sum=8 x=1,sum=9 x=3,sum=12 x=10,sum=22 x=33,sum=55 x=109,sum=164 x=360,sum=524 前10项和=524,2019/5/24,程序设计基础(C语言)wh,13,2. 第二种形式 #ifndef 标识符 程序段1 #else 程序段2 #endif 功能:如果标识符未被#define命令定义过,则对程序段1进行编译,否则对程序段2进行编译。,2019/5/24,程序设计基础(C语言)wh,14,3. 第三种形式 #if 常量表达式 程序段1 #else 程序段2 #endif 功能: 如常量表达

10、式的值为真(非0),则对程序段1进行编译,否则对程序段2进行编译。因此可以使程序在不同条件下,完成不同的功能。 例如:#define TEST 1 #if TEST printf(“string_test: %sn”,string_test); #endif,2019/5/24,程序设计基础(C语言)wh,15,9.2 输入输出标准函数,9.2.1格式输出函数(printf) printf函数的调用形式为: printf(格式字符串,输出项表列); 功能: 按格式字符串规定的格式输出输出项表列中的各项。 格式字符串中有两类字符:普通字符和用于转换说明的字符。普通字符按原样输出。转换说明用于说明

11、数据输出格式。 转换说明的形式为:%域宽转换字符 例如:%d,%5.2f,2019/5/24,程序设计基础(C语言)wh,16,printf的转换字符,2019/5/24,程序设计基础(C语言)wh,17,printf域宽说明字符,2019/5/24,程序设计基础(C语言)wh,18,【例9-3】转换字符及域宽说明示例。 #include void main(void) int i=97; printf(“%d,%o,%x,%cn“,i,i,i,i); printf(“%d,%-4d,%04d,%+04d,%.5dn“,i,i,i,i,i); 程序运行如下: 97, 141, 61, a 97

12、, 97 , 0097, +097, 00097,2019/5/24,程序设计基础(C语言)wh,19,9.2.2格式输入函数(scanf) scanf函数的调用形式为:scanf (格式字符串,输入项地址表列); 功能:按格式字符串规定的格式,在键盘上输入各输入项的数据,并依次赋给各输入项。 scanf函数中的格式字符串的构成与printf函数的基本相同,但要注意: (1) 空格、制表符将被忽略,其是分隔符。 (2) 非%的普通字符,需要输入同样的字符与之匹配。 (3) 在%与转换字符之间可以有下列选项: *,使对应的输入数据不赋给相应变量; m,指定输入数据宽度; h、l或L,指出参数所指

13、变量类型。,2019/5/24,程序设计基础(C语言)wh,20,常见的scanf转换字符,2019/5/24,程序设计基础(C语言)wh,21,通常在scanf函数的格式字符串中不包含非%普通字符,此时输入数据遇到下列三种情况表示结束: (1) 从第一个非空字符开始,遇空格、Tab键或回车结束; (2) 遇宽度结束; (3) 遇非法输入结束。 若在格式字符串中出现了非%普通字符,则表示在输入时应在相应的位置输入同样的字符。 【例9-5】输入数据示例。 #include void main(void) int i, j,k; scanf(“%d,%d,%d“, ,2019/5/24,程序设计基

14、础(C语言)wh,22,9.3 自定义头文件设计的原则,在编写较大的程序时常常用到大量的变量和宏定义,这些内容都和程序放在一个源文件中,使得文件的长度加大,不仅增加程序的阅读难度,而且容易出现失误。此时,程序员可以将多个文件共用的符号常量定义和宏定义等单独组成一个头文件,然后在其他需要这些定义和说明的源文件中用文件包含命令包含该头文件。,2019/5/24,程序设计基础(C语言)wh,23,自定义头文件的设计应遵循以下原则: (1) 用途一致。头文件中的各个功能应该属于同一类问题,例如,stdio.h接口中的函数都是用于输入和输出的,而math.h中的函数则都是与数学计算和处理有关的。 (2)

15、 操作简单。头文件中的各个函数应尽量方便用户程序的调用,将各个函数功能的实现细节尽可能地隐藏起来。 (3) 功能充足。在设计头文件前应该对设计问题进行深入广泛的调查研究和需求分析,以便保证有足够完善的功能,其功能具有一定的普遍性,以满足各类用户的需求。 (4) 性能稳定。在设计头文件的时候,应该对每个函数的功能进行严格地测试,以确保各函数功能的实现不会受到任何特殊因素的影响。,2019/5/24,程序设计基础(C语言)wh,24,小 结,预处理功能是语言特有的功能,它是在对源程序正式编译前由预处理程序完成的。程序员在程序中用预处理命令来调用这些功能。预处理命令包括宏定义、文件包含和条件编译。使用预处理功能便于程序的修改、阅读、移植和调试,也便于实现模块化程序设计。C标准函数库提供了丰富的标准库函数,有关输入输出的标准函数,它们都在头文件“stdio.h”中定义,用户可以根据需要按规定的格式调用其中的函数来完成相应的功能,而不需要自己编写函数。,2019/5/24,程序设计基础(C语言)wh,25,THE END!,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号