收藏 分享(赏)

c语言程序设计第四章+C程序设计初步.ppt

上传人:fmgc7290 文档编号:8629684 上传时间:2019-07-06 格式:PPT 页数:94 大小:395.50KB
下载 相关 举报
c语言程序设计第四章+C程序设计初步.ppt_第1页
第1页 / 共94页
c语言程序设计第四章+C程序设计初步.ppt_第2页
第2页 / 共94页
c语言程序设计第四章+C程序设计初步.ppt_第3页
第3页 / 共94页
c语言程序设计第四章+C程序设计初步.ppt_第4页
第4页 / 共94页
c语言程序设计第四章+C程序设计初步.ppt_第5页
第5页 / 共94页
点击查看更多>>
资源描述

1、教学目标:通过本章的学习,要求学生在掌握结构化程序设计思 想基础上,能够运用程序的三种基本结构(顺序结构、分 支结构、循环结构)设计出简单的C程序。教学重点: 基本输入输出语句; 结构化程序设计思想; 两种分支语句的格式与使用; 三种循环语句的格式与使用; 文件包含与宏定义。,教学难点: 格式化输入输出语句; Switchcase语句的格式与使用; dowhile循环与 while循环的区别; break语句与continue语句的区别; 带参数宏的定义方法与宏替换规则。教学方法:理论教学与实践教学相结合。,第4章 C程序设计初步,4.1 C语句概述 4.2基本输入输出函数 4.3结构化程序设

2、计思想 4.4 分支结构的程序设计 4.5 循环结构的程序设计 4.6 编译预处理 4.7 程序设计举例,4.1 C 语 句 概 述,C语言是函数式语言,每一个函数是由数据说明部分和执行语句部分组成。C语言中的所有语句均是执行语句,没有非执行语句。根据C语言的句法, 语句可分为单个语句,复合语句和空语句。根据结构化程序设计的三个模块大致可分为: 用于顺序结构中的表达式语句、赋值语句、函数调用语句等; 用于分支结构中的if语句、switch语句、转移语句、标号语句等;用于循环结构中的while语句、for语句、do-while语句。 另外在后两种结构中还可出现break语句、continue语句

3、、复合语句和空语句等作为其中的一部分。,(1) 逻辑上每个语句最后都必须有一个分号(;), 一个语句可分写成几行, 几个语句也可合写成一行(但不提倡, 因其不利于单步调试)。 (2) 空语句直接由分号(;)组成,常用于控制语句中必须出现语句之处,它不做任何操作,只在逻辑上起到有一个语句的作用。 (3) 复合语句由花括号 括起的若干个语句, 语法上可以看成是一个语句。复合语句中最后一个语句的分号不能省略。 如下面是一个复合语句: z=x+y; y=x/z; x=z-y; ,(4) 表达式语句是在各种表达式后加一个分号(;)形成一个语句。如赋值语句由赋值表达式加一个分号构成: x=x+y; 再如表

4、达式x+后加一个分号构成表达式语句: x+; 表达式和表达式语句的区别是表达式后无分号, 可以出现在其它语句中允许出现表达式的地方;而表达式语句后有分号, 自己独立成一个语句,不能再出现在其它语句的表达式中。 如: if(a=b)0) min=a;,(5) 控制语句有条件判断语句(if、 switch), 循环语句(for、 while、 do-while),转移语句(goto、 continue、 break、 return)。,4.2基本输入输出函数,4.2.1字符输出函数putchar() 一般调用格式:putchar(参数) 其中,参数可以是任意类型表达式,一般为算术表达式。 功能:向

5、显示器输出一个字符。 返回值:如果输出成功,返回值就是输出的字符,否则返回EOF(-1)。 如:putchar(a) /*输出字符a*/ putchar(65) /*输出ASCII码为65的字符A*/ putchar(a+2) /*输出字符c*/ putchar(n) /*输出一个换行符*/,说明: 1putchar()函数一次只能输出一个字符,即该函数有且只有一个参数。 2putchar()函数可以输出转义字符。 3在使用函数putchar()前,一定要使用文件包含:#include “stdio.h“ 或 #include 【例4.1】 #include “stdio.h“ main()

6、char a,b,c;a=o;b=u;c=t;putchar(a); putchar(b);putchar(c); putchar(n);putchar(65);putchar(t);putchar(B);putchar(a-10); ,运行结果: outABe (代表空格),4.2.2字符输入函数getchar()一般调用格式:getchar() 功能:从键盘读入一个字符。 返回值:如果读入成功,返回值就是读入的字符,否则返回EOF(-1)。 说明: 1getchar()函数一次只能接收一个字符,即使从键盘输入多个字符,也只接收第一个。空格和转义字符都作为有效字符接收。 2接收的字符可以赋给

7、字符型变量或整型变量,也可以不赋给任何变量,作为表达式的一部分。,3getchar()函数是无参函数。 4从键盘上输入的字符不能带单引号,输入以回车结束。 5在使用函数getchar()前,一定要使用文件包含:#include “stdio.h“ 或 #include 【例4.2】 #include “stdio.h“ main() char ch1,ch2,ch3;ch1=getchar(); ch2=getchar()ch3=getchar(); putchar(ch1);putchar(ch2); putchar(ch3); ,在运行时,若从键盘上输入: CG 则第一个getchar()

8、接收的是C, 第二个getchar()接收的是回车, 第三个getchar()接收的是G。 输出结果为: C (输出ch1的值) G (输出ch3的值),4.2.3格式输出函数printf() 一般调用格式:printf(“格式控制字符串“,输出表列) 功能:按指定格式向显示器输出数据。 返回值:输出成功,返回输出字节数;否则返回EOF(-1)。 输出表列:是要输出的数据,可以没有,有两个或两个以上时,用逗号(,)分隔。输出表列中的输出项可以是常量,可以是变量,也可以是表达式。 格式控制字符串:由普通字符和格式说明两部分组成。普通字符,即需要原样输出的字符,包括转义字符;格式说明是以%开始,以

9、一个格式字符结束,中间可以插入附加格式说明符,它的作用是将输出的数据转换为指定的格式输出,其一般形式为:%附加格式说明符格式字符,printf()函数的格式字符和常用的附加格式说明符分别见表4-1和表4-2。 表4-1 printf()函数格式字符,按%f格式输出实型数据时, 整数部分全部输出, 小数部分保留六位。 在Turbo C中,按%e格式输出实型数据时,输出占十一位,其中整数部分占一位, 小数部分占五位,指数部分占四位,小数点占一位。 如:printf(“%f“,123.4);的输出结果为:123.400000printf(“%e“,123.4);的输出结果为:1.23400e+02,

10、表4-2 printf()函数常用的附加格式说明符,【例4.3】 main() char ch =A; int a=1234;float b=123.4562222; printf(“ch=%cn“,ch);/* 输出:ch=A*/printf(“ch=%3cn“,ch);/* 输出:ch=A */printf(“a=%6dn“,a);/* 输出:a=1234*/printf(“a=%2dn“,a);/* 输出:a=1234*/printf(“a=%#on“,a);/* 输出:a=02322*/printf(“a=%#xn“,a);/* 输出:a=0x4d2*/printf(“b=%fn“,b

11、);/* 输出:b=123.456223*/printf(“b=%8.2lfn“,b);/* 输出:b=123.46*/printf(“b=%-8.2fn“,b);/* 输出:b=123.46*/,printf(“b=%.2fn“,b);/* 输出:b=123.46*/ printf(“b=%en“,b);/* 输出:b=1.23456e+02*/ printf(“b=%8.2en“,b);/* 输出:b=1.2e+02*/ printf(“b=%-8.2len“,b);/* 输出:b=1.2e+02 */ printf(“b=%.2en“,b);/* 输出:b=1.2e+02*/ print

12、f(“str=%sn“,“china“);/*输出:china*/ printf(“str=%8.3sn“,“china“);/*输出:chi*/ printf(“str=%-6.3sn“,“china“);/*输出:chi*/ printf(“str=%.6sn“,“china“);/*输出:china*/ ,说明 1.格式说明与输出项从左向右一一对应,两者的个数可以不相同,若输出项个数多于格式说明个数,输出项右边多出的部分不被输出,若格式说明个数多于输出项个数,格式控制字符串中右边多出的格式说明部分将输出与其类型对应的随机值。如:printf(“%d %d “,1,2,3); /*输出结果

13、为1 2*/printf(“%d %d %d“,1,2); /*输出结果为1 2 随机值*/ 2.在格式控制字符串中,两个连续的%只输出一个%。如:printf(“%f%“,1.0/6); /* 输出结果为0.166666% */ 3格式说明与输出的数据类型要匹配,否则得到的输出结果可能不是原值 。,【例4.4】 main() int a=-1,b=10; float c=3.14; printf(“a=%dn“,a); /*输出:a=-1*/ printf(“a=%un“,a); /*输出:a=65535*/ printf(“a=%on“,a); /*输出:a=-177777*/ print

14、f(“a=%xn“,a); /*输出:a=ffff*/ printf(“b=%d c=%.2fn“,b,c);/* 输出:b=10 c=3.14*/ printf(“b=%.2f c=%dn“,b,c);/* 输出:b=0.00 c=16393*/ ,4.2.4格式输入函数scanf() 一般调用格式:scanf(“格式控制字符串“,地址表列) 功能:按指定的格式从键盘读入数据,并存入地址表列指定的内存单元中。 返回值:返回输入数据个数。 地址表列:是由若干个地址组成的表列,可以是变量的地址或字符串的地址,C 语言中变量的地址通过取地址运算符“&”得到,表示形式为:&变量名,如变量a的地址为&

15、a。 格式控制字符串:同printf()函数类似,是由普通字符和格式说明组成。普通字符,即需原样输入的字符,包括转义字符。格式说明同printf()函数相似。scanf()函数格式字符和常用的附加格式说明符见表4-3和表4-4。,表4-3 scanf()函数格式字符,表4-4 scanf()函数常用附加格式说明符,【例4.5】 #include “stdio.h“ main() char ch1,ch2,ch3;int a,b;unsigned c;double x,y;,scanf(“%c%c%c“,/* 输出:a=1234 ch1=w x=12.00*/ ,说明: 1格式控制字符串中的普通

16、字符必须原样输入。如例中的 scanf(“a=%,b=%“,/*输入:A*/,字符A送给变量ch1,空格送给变量ch2,回车送给变量ch3。 4数据输入以回车结束,回车将存储在键盘缓冲区中,下次用scanf()之前,必须将其取出,否则将得不到正确的输入。如例2.17中使用的getchar();就是完成此功能。 5输入数据时不能指定精度。如例中的scanf(“%lf,%lf“,/*输入:1234w12h.234*/ 变量a的值为1234,变量ch1的值为w,变量x的值为12.00。 遇空格数据输入结束,用scanf()函数不能输入含有空格的字符串。,4.3 结构化程序设计思想,4.3.1 程序的

17、质量标准,一个好的程序在满足运行结果正确的基本条件之后,首先要有良好的结构,使程序清晰易懂。在此前提之下,才考虑使其运行速度尽可能的快, 运行时所占内存应尽量压缩至合理的范围。也就是说,现在的程序质量标准易读性好是第一位的,其次才是效率。因为从根本上说,只有程序具有了良好的结构,才易于设计和维护,减少软件成本,从整体来说才是真正提高了效率。,4.3.2 结构化程序设计方法,(1) 一个大的程序开发应当采取“自顶向下, 逐步细化, 模块化”的方法。 (2) 任何程序均由具有良好特性的三种基本模块(顺序, 分支,循环)“堆积”搭成,即由基本小单元顺序组成一个大结构,从而避免了使用goto语句的缺点

18、。,4.3.3 结构化程序的标准,(1) 程序符合“清晰第一,效率第二”的质量标准。 (2) 具有良好的特性。 只有一个入口。 只有一个出口(有些分支结构很容易写成多个出口)。 无死语句(永远执行不到的语句). 没有死循环(永远执行不完的无终止的循环)。,4.3.4程序的三种基本结构,1. 顺序结构,图 4.1 顺序结构,由一系列顺序执行的操作(语句)组成, 是一种线性结构。,2. 分支结构,图 4.2 分支结构,3. 循环结构,图 4.3 当型循环结构,图 4.4 直到型循环结构,4.4分支结构程序设计,2.4.1 if语句if语句有以下四种格式:单分支格式、双分支格式、多分支格式和嵌套格式

19、。1单分支格式: 一般形式为: if(表达式) 语句语句执行过程:先计算if后面的表达式,若结果为真(非0),执行后面的语句;若结果为假(0),不执行该语句。其流程图见图4.5。,图4.5,【例4.6】输入一个整型数,输出该数的绝对值。 main() int a,; scanf(“%d“, 运行结果: -3 3,2双分支格式 一般形式为: if(表达式) 语句1 else 语句2 执行过程:先计算if后面的表达式,若结果为真 (非0),则执行语句1;否则执行语句2。其流程图见4.6。,图4.6,【例4.7】输入两个整型数,将平方值较大者输出。 main() int a,b,max; scanf

20、(“%d%d“, 运行结果: 2 -3 -3,3多分支格式 一般形式为:if(表达式1) 语句1 else if(表达式2) 语句2 else if(表达式3) 语句3 else if(表达式n) 语句 n else 语句 m,执行过程:先计算表达式1,若表达式1的结果为真(非0), 执行语句1,否则计算表达式2,若表达式2的结果为真, 执行语句2,以此类推,若n个表达式的结果都为假(0), 则执行语句m。其流程图见图4.7。,由执行过程可知,n+1个语句只有一个被执行,若n个表达式 的值都为假,则执行语句m,否则执行第一个表达式值为真 (非0)的后面的语句。,图4.7,【例4.8】输入一个百

21、分制成绩,输出其对应的等级。 (90100为A,8099为B,7079为C,6069为D,059为E) main() int x; char y;scanf(“%d“, 运行结果:88y=B,4嵌套格式 if语句可以嵌套,即在一个if语句中又可以包含一个或多个if语句,一般形式为:if(表达式1)if(表达式2) 语句1else 语句2elseif(表达式3) 语句3else 语句4 在缺省花括号的情况下,if和else的配对关系是:从最内层开始,else总是与它上面最近的并且没有和其他else配对的if配对。,【例4.9】已知函数y=编写程序,输入x,输出y值。 main() float x

22、; int y;scanf(“%f“, 运行结果: -2 x=-2.000000 y=-1,使用if 语句时应注意以下几点: if后面圆括号内的表达式可以为任意类型,但一般为关达式或逻辑表达式。 if和else后面的语句可以是任意语句。 if(x)与if(x!=0)等价。 if(!x)与if(x= =0)等价。,4.2 switchcase语句 虽然用if语句可以解决多分支问题,但如果分支较多,嵌套的层次就多,会使程序冗长、可读性降低。C语言提供了专门用于处理多分支情况的语句switchcase语句,其一般形式为: switch(表达式) case 常量表达式1:语句1 break; case

23、 常量表达式2:语句2 break; case 常量表达式n:语句n break; default :语句n+1; break; ,swichcase语句的执行过程:首先计算switch后面圆括号中表达式的值,然后用其结果依次与各case后面的常量表达式的值进行比较,若相等,执行该case后面的语句,执行时,如果遇到语句break;,就退出switchcase语句,转至花括号的下方,否则顺序往下执行。若与各case后面常量表达式的值都不相等,则执行default后面的语句。,【例4.10】用swichcase语句实现例4.8。 main() int a;char y;scanf(“%d“, ,

24、运行结果: 88 y=B,说明: switch后面的圆括号后不能加分号。 switch后面圆括号内表达式的值必须为整型、字符型或枚举型。 各case后面常量表达式的值必须为整型、字符型或枚举型。 各case后面常量表达式的值必须互不相同。 若每个case和default后面的语句都以break语句结束,则各个case和default位置可以互换。 case后面的语句可以是任何语句,也可以为空,但default的后面不能为空。若为复合语句,则花括号可以省略。, 若某个case后面的常量表达式的值与switch后面圆括号内表达式的值相等,就执行该case后面的语句,执行完后若没有遇到break语句

25、,不再进行判断,接着执行下一个case后面的语句。若想执行完某一语句后退出,必须在语句最后加上break语句。 多个case可以共用一组语句。如例2.22中的程序段: case 10:y=A;break; case 9:y=A;break; 可以改为: case 10: case 9:y=A;break; switchcase语句可以嵌套,即一个switchcase语句中又含有switchcase语句。,【例4.11】 main() int x,y,a=0,b=0;scanf(“%d%d“, ,运行结果: 1 0 a=1,b=2,4.5循环结构程序设计,循环语句 C语言中有三种循环语句:whi

26、le语句、dowhile语句和for语句。它们都是在条件成立时反复执行某个程序段,这个反复被执行的程序段称为循环体,循环体是否被继续执行要依据某个条件,这个条件称为循环条件。,4.5.1while语句 while语句的一般形式为:while(表达式)循环体 其中,表达式可以是任意类型,一般为关系表达式或逻辑表达式,其值为循环条件。循环体可以是任何语句。,while语句的执行过程为: 1计算while后面圆括号中表达式的值,若其结果为非0,转2;否则转3。 2执行循环体,转1。3退出循环,执行循环体下面的语句。 其流程图见图4.8。while语句的特点:先判断表达式,后执行循环体。,图4.8,【

27、例4.12】从键盘上输入十个小于100的整数,输出偶数的个数和偶数和。 main() int i,n=0,sum=0,a;i=1;/* 循环变量赋初值 */while(i=10)/*循环条件为 i=10*/scanf(“%d“, 运行结果: 1 2 3 4 5 6 7 8 9 10 n=5 sum=30,说明: 由于while语句是先判断表达式,后执行循环体,所以循 环体有可能一次也不执行。 循环体可以是任何语句。如果循环体不是空语句,不能在while后面的圆括号后加分号(;)。 在循环体中要有使循环趋于结束的语句。,4.5.2 do while语句 do while语句的一般形式为:do 循

28、环体while(表达式); 其中,表达式可以是任意类型,一般循环体表达式为关系表达 式或逻辑表达式,其值为循环条件。循环体可以是任意语句。 do while语句的执行过程为: 1执行循环体,转2。 2计算while后面圆括号中表达式的 值,若其结果为非0,转1;否则转3。 3退出循环,执行循环体下面的语句。 其流程图见图4.9。图4.9 do while语句的特点:先执行循环体,后判断表达式。,【例4.13】计算整数n的值,使1+2+3+n刚好大于或等于500。 main() int n=0,sum;sum=0;/*循环变量赋初值*/don+;sum+=n;/*循环变量增值,使sum趋于500

29、*/while(sum500);/*循环条件为:sum500*/printf(“n=%d sum=%dn“,n,sum); 运行结果: n=32 sum=528 说明: dowhile语句最后的分号(;)不可少,否则将出现语法错误。 循环体中要有使循环趋于结束的语句。 由于dowhile语句是先执行循环体,后判断表达式,所以循环 体至少执行一次。,4.5.3 for语句 for语句的一般形式为: for(表达式1;表达式2;表达式3)循环体 其中,循环体可以是任意语句。三个表达式可以是任意类型, 一般来说,表达式1用于给某些变量赋初值,表达式2用来 说明循环条件,表达式3用来修正某些变量的值。

30、 for语句的执行过程为: 1计算表达式1,转2。 2计算表达式2,若其值为非0,转3;否则转5。 3执行循环体,转4。 4计算表达式3,转2。 5退出循环,执行循环体下面的语句。,其流程图见图4.10。for语句的特点:先判断表达式,后执行循环体。,【4.14】计算1100之间的整数和。 main() int i,sum; sum=0; for(i=1;i=100;i+) sum+=i; printf(“sum=%dn“,sum); 运行结果: sum=5050 在for语句中,表达式1和表达式3经常使用逗号表达式,用于简化程序,提高程序运行效率,这也是逗号表达式的主要用途。如例中的程序段:

31、 sum=0; for(i=1;i=100;i+) sum+=i; 可以改写成: for(i=1,sum=0;i=100;sum+=i,i+);,在for语句中,在分号(;)必须保留的前提条件下,三个表达式的任何一个都可以省略,因此for语句又有如下省略形式: 1for(;表达式2;表达式3) 循环体 表达式1省略。此时应在for语句之前给变量赋初值。如例中的程序段:for(i=1;i=100;i+) sum+=i 可以改写成: i=1;for(;i=100;i+) sum+=i; 2for(表达式1;表达式2;) 循环体 表达式3省略。此时应在循环体中修正循环变量。如例中的程序段:for(i

32、=1;i=100;i+) sum+=i; 可以改写成:for(i=1;i=100;) sum+=i;i+;,3for(表达式1; ;表达式3) 循环体 表达式2省略。此时认为表达式2的值始终为真,如果循环体中不包含break语句或goto语句,这时的循环无法终止,是死循环。如例中的程序段:for(i=1;i100) break; sum+=i; 4for(;表达式2;) 循环体 表达式1和表达式3同时省略。此时应在for语句之前给变量赋初值,在循环体中修正循环变量。如例中的程序段: for(i=1;i=100;i+) sum+=i; 可以改写成: i=1;for(;i=100;) sum+=i

33、;i+; 这种情况完全等同于while语句。,5for(; ;表达式3) 循环体 表达式1和表达式2同时省略。此时应在for语句之前给变量赋初值,在循环体中用break语句或goto语句退出循环。如例中的程序段: for(i=1;i100) break; sum+=i; 6for(表达式1; ;) 循环体 表达式2和表达式3同时省略。此时应在循环体中修正循环变量,在循环体中用break语句或goto语句退出循环。如例2.26中的程序段: for(i=1;i100) break; ,7for(; ;) 循环体 三个表达式同时省略。此时相当于:while(1) 循环体。应在for语句之前给变量赋初

34、值,在循环体中修正循环变量,在循环体中用break语句或goto语句退出循环。如例2.26中的程序段: for(i=1;i100) break; 说明: 若循环体不是空语句,不能在for语句的圆括号后加分号(;)。 表达式1或表达式2省略时,其后的分号不能省略,并且不能用其他符号代替。 要有使循环趋于结束的语句。,4.5.4循环语句的嵌套 一种循环语句的循环体中又有循环语句,称为循环的嵌套。三种循环语句可以互相嵌套,并且可以嵌套多层。 【例4.15】输出九九表。 main() int i,j;for(i=1;i=9;i+)for(j=1;j=i;j+)printf(“%d*%d=%-3d“,j

35、,i,i*j);printf(“n“);,运行结果: 1*1=1 1*2=2 2*2=4 1*3=3 2*3=6 3*3=9 1*4=4 2*4=8 3*4=12 4*4=16 1*5=5 2*5=10 3*5=15 4*5=20 5*5=25 1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36 1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=641*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54

36、7*9=63 8*9=72 9*9=81,4.5.5 break语句和continue语句 1break语句 break语句的一般形式为:break; break语句的功能:用于switchcase语句时,退出switchcase 语句,程序转至switchcase语句下面的语句;用于循环语句 时,退出循环体,程序转至循环体下面的语句。 【例4.16】判断输入的正整数是否为素数,如果是素数,输出 Yes,否则输出No。,main() int m,i;scanf(“m=%d“, 运行结果: m=23 Yes,2continue语句 continue语句的一般形式为:continue; conti

37、nue语句的功能:结束本次循环,跳过循环体中尚未执行的部分,进行下一次是否执行循环的判断。在while语句和dowhile语句中,continue把程序控制转到while后面的表达式处,在for语句中continue把程序控制转到表达式3处。,说明: break语句只能用于循环体和switchcase语句中。continue只能用于循环体中。 用于循环体时,break语句将整个循环终止,continue语句只是结束本次循环。 在循环嵌套的情况下使用break语句时,仅仅退出包含break语句的最内层的那个循环语句的循环体;在switchcase语句嵌套的情况下使用break语句,仅仅退出包含b

38、reak语句的最内层的switchcase语句。,【例4.17】计算1100之间分别能够被2、4、8整除的整数个数。 main() int i,n2=0,n4=0,n8=0;for(i=1;i=100;i+) if(i%2)continue;/*转至i+处*/n2+;if(i%4)continue; /*转至i+处*/n4+;if(i%8)continue; /*转至i+处*/n8+; printf(“n2=%d n4=%d n8=%dn“,n2,n4,n8); 运行结果:n2=50 n4=25 n8=12,4.5.6 goto语句 goto语句为无条件转移语句,其一般形式为:goto 语句标

39、号; 其中,语句标号是一种标识符,在goto语句所在的函数中必须存在,并且其后必须跟一个冒号(:),冒号的后面可以为空,也可以是任何语句。 goto语句的功能:无条件地将程序控制转至语句标号处。 goto语句的用途:一是与if语句一起实现循环;二是从循环嵌套的内层循环跳到外层循环外。,说明: 语句标号代表程序的入口地址,使用goto语句只能实现在同一个函数内跳转,可以向前跳转,也可以向后跳转,但不能实现从一个函数跳转到其他函数。, 只能从循环嵌套的内循环跳转到外循环,不能从外循环跳转到内循环。 goto语句使程序流程无规律,可读性差,不符合结构化原则,一般不宜采用,只有在不得已时才使用。 【例

40、4.18】输入一组数,以0结束,求该组数据绝对值之和。 main() int a,sum=0;loop1: /*语句标号*/scanf(“%d“, ,运行结果 1 2 -3 4 -5 sum=15,4.6编译预处理 编译预处理是C语言编译系统的一个组成部分。所谓的编译预处理就是在对C源程序编译之前做一些处理,生成扩展的C源程序。C语言允许在程序中使用三种编译预处理命令,即宏定义、文件包含和条件编译。为了与C语言中的语句相区别,编译预处理命令以“#”开头。 4.6.1 宏定义 1不带参数的宏定义不带参数宏定义的一般形式为: #define 宏名 宏体 其中,#define是宏定义命令,宏名是一个

41、标识符,宏体是一 个字符序列。,功能:用指定的宏名(标识符)代替宏体(字符序列)。 如例2.1中的宏定义:#define PI 3.1415926 该宏定义的作用是用指定的标识符PI来代替其后面的字符序列3.1415926,这样,在后续程序中凡是用到3.1415926这个字符序列的地方,都可用PI来代替(见例2.1)。由此看出,宏定义能用一个简单的标识符代替一个冗长的字符序列,以便于程序的书写、阅读和修改。 在编译预处理时,编译程序将所有的宏名替换成其对应的宏体,用宏体替换宏名的过程称为宏展开,也叫宏替换。如:例2.1中的程序,宏替换完成后将变成:,main() float r,l,s,v;s

42、canf(“%f“, 说明: 宏名一般用大写,以便于阅读程序,但这并非规定,也可用小写。 在宏定义中,宏名的两侧至少各有一个空格。 宏定义不是C语句,不能在行尾加分号,如果加了分号,在预处理时连分号一起替换,并且一个宏定义要独占一行。 宏定义的位置任意,但一般放在函数外。, 取消宏定义的命令是#undef,其一般形式为:#undef 标示符 宏名的作用域为宏定义命令之后到本源文件结束,或遇到#undef。 在程序中,若宏名用双引号括起来,在宏替换时不进行替换。 宏定义可以嵌套,即在一个宏定义的宏体中可以含有前面宏定义中的宏名。在宏定义嵌套时,应使用必要的圆括号,否则有可能得不到所需的结果。 宏

43、替换只是进行简单的字符替换,不作语法检查。 在一个源文件中可以对一个宏名多次定义,新的宏定义出现,就是对前面宏定义的取消。,【例4.19】 #define N 4/*后面不能带分号*/ #define M N+3 /*宏定义嵌套,后面不能带分号*/ main() int a;a=M*N; /*宏替换后为:a=4+3*4;*/ printf(“N=%d,M=%d,“,N,M); /*“N=%d,M=%d,“中N和M不被替换。宏替换后为: printf(“N=%d,M=%d,“,4,4+3);*/printf(“M*N=%dn“,a); /*M和N不被替换*/#undef M /*取消宏定义,M不

44、再代表N+3*/#define M (N+3) /*重新宏定义,M代表(N+3)*/a=M*N; /* 宏替换后为:a=(4+3)*4;*/printf(“N=%d,M=%d,“,N,M); /*“N=%d,M=%d,“中N和M不被替换。宏替换后为: printf(“N=%d,M=%d,“,4,(4+3);*/printf(“M*N=%dn“,a); /*M和N不被替换*/ ,运行结果: N=4,M=7,M*N=16N=4,M=7,M*N=28,2带参数的宏定义 带参数宏定义的一般形式为:#define 宏名(形参表列) 宏体 其中,#define是宏定义命令,宏名是一个标识符,形参表列是用逗

45、号隔开的一个标识符序列,序列中的每个标识符都称为形式参数,简称形参。宏体是包含形参的一个字符序列。 如:#define s(a,b) ab?a:b s是宏名,a、b是形参,ab?a:b是宏体。 在程序中使用带参数宏的一般形式为:宏名(实参表列); 其中,实参表列是用逗号隔开的常量、变量或表达式。 如:s(3,4);,编译预处理时,用宏体中的字符序列从左向右替换,如果不是形参,则保留,如果是形参,则用程序语句中相应的实参替换,这个过程叫宏展开,也叫宏替换。 如: s(3,4);宏替换后为:34?3:4; 在使用带参数的宏定义时,应注意以下几点: 定义带参数的宏时,宏名和右边的圆括号“(”之间不能

46、加空格,否则,就成了不带参数的宏定义。如有下列宏定义:#define s (a,b) ab?a:b 则宏名为s,宏体为 (a,b) ab?a:b 为了正确进行替换,一般将宏体和各形参都加上圆括号。 若实参是表达式,宏展开之前不求解表达式,宏展开之后求解。,【例4.20】 #define X 3 /*不带参数的宏定义*/ #define Y 4 /*不带参数的宏定义*/ #define M(a,b) ab?a:b /*带参数的宏定义*/ main() int val,x,y;scanf(“%d%d“, /*M不被替换*/#undef M(a,b) /*取消宏定义*/,#define M(a,b)

47、 (a)(b)?(a):(b) /*重新宏定义*/val=M(x+3,y+4)*M(x+3,y+4); /* 实参为表达式,宏展开后为: val=(x+3)(y+4)? (x+3):(y+4)* (x+3)(y+4)? (x+3):(y+4) */printf(“M=%dn“,val); /*M不被替换*/ 运行结果 3 4 M=4,M=4,M=6,M=64,4.6.2 文件包含 文件包含的一般格式为:#include “文件名“ 或#include 其中,#include是文件包含命令,文件名是被包含文件的文件名。功能:一个源文件将另一个源文件的内容全部包含进来。 处理过程:编译预处理时,用被包含文件的内容取代该文件包含命令,编译时,再对“包含”后的文件作为一个源文件进行编译。,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报