第三章+C语言程序结构及控制语句.ppt_第1页
第三章+C语言程序结构及控制语句.ppt_第2页
第三章+C语言程序结构及控制语句.ppt_第3页
第三章+C语言程序结构及控制语句.ppt_第4页
第三章+C语言程序结构及控制语句.ppt_第5页
已阅读5页,还剩82页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、,第三章,C语言程序结构及控制语句,主要内容,程序的三种基本控制结构 顺序结构 选择结构 循环结构,3.1 程序的三种基本结构,常量说明 类型说明 变量说明 /*外部说明*/,局部说明,一个c程序可以有若干个源程序文件组成 一个源文件可以有若干个函数和预处理命令以及全局变量声明部分组成 一个函数有函数首部和函数体组成 函数体由数据声明和执行语句组成,例: #define PRICE 30 /*预处理命令*/ #include /*预处理命令*/ void main ( )/*函数首部*/ /*函数体,用花括号括起来*/ int num, total;/*数据申明*/ num=10;/*以下为执

2、行语句*/ total=num * PRICE; printf(total=%dn,total); ,声明部分应在可执行语句的前面,3.1 程序的三种基本控制结构,顺序结构 选择结构,顺序结构,选择结构,循环结构,3.2.1 C语言程序语句,3.2 顺序结构,表达式语句能够独立出现在程序中,而表达式则不能。 最常见的是赋值语句,x+y;,合法但无意义,赋值语句:,由赋值表达式加上一个分号构成 例:a=100 赋值表达式,值为a的值 a=100; 赋值语句 条件中不能含有赋值符号,但是赋值表达式可以包含于条件表达式中 例:if(a=b) t=a; 错误 if(a=b;)0) t=a; 错误 if

3、(a=b)0) t=a; 正确 if(a=b) t=a; ?,注意: 分号是语句必不可少的一部分。 C的说明语句也必须以分号结束。,复合语句中如果有声明部分,也应该写在可执行语句的前面。,例如: main( ) int a,b; a=b=100; float c=10.23; printf(%fn,c); printf(%d %dn,a,b); ,要特别注意: 花括号的配对 花括号的位置,.控制语句:完成一定的控制功能 1 if() else 条件语句 6 break 间断语句 2 for() 循环语句 7 switch() 开关语句 3 while()循环语句 8 goto 转向语句 4 d

4、o while();循环语句 9 return 返回语句 5 continue 继续语句,3.2.2 输入输出函数,所谓输入输出是以计算机主机为主体而言的 输出:从计算机向外部输出设备(显示器,打印机)输出数据。 输入:从输入设备(键盘,鼠标,扫描仪)向计算机输入数据。 标准输入输出函数默认的标准输入设备通常为键盘,默认的标准输出设备通常为显示器。,C语言本身不提供输入输出语句,输入和输出操作是由C函数库中的函数来实现的。例如: 字符输入函数: getchar 字符输出函数:putchar 格式输入函数: scanf 格式输出函数: printf 字符串输入函数:gets 字符串输出函数:pu

5、ts,使用系统库函数时,要用预编译命令“#include”将有关的“头文件”包括到用户源文件中。 如:在调用标准输入输出库函数时文件开头应有: #include “stdio.h” 或: #include ,头文件,1. 字符输出函数,格式: putchar( c ) 参数: c为字符(或整型)常量、变量或表达式 功能:向终端输出一个字符 返值:正常,为输出字符的代码值;出错,为EOF(-1),字符型变量整型变量,例:输出单个字符。#includevoid main()char a,b,c;a=B;b=O;c=Y;putchar(a);putchar(b);putchar(c);putchar

6、(n);,运行结果:BOY,putchar(a);putchar(n);putchar(b);putchar(n);putchar(c);putchar(n);,运行结果:B O Y,也可以输出其他转义字符,如:putchar(101) putchar() putchar(015),2. 字符输入函数,格式:getchar( ) 参数:无 功能:从键盘(或系统隐含指定的输入设备)读一字符 返值:正常,返回读取的代码值;出错,返回EOF(-1),例: 输入单个字符。#includevoid main() char c; c=getchar(); putchar(c); putchar(n);,p

7、utchar(getchar();,printf(“%c”,getchar();,getchar只能接受一个字符 getchar函数需要交互输入,接收到输入字符之后才继续执行程序 连续使用getchar函数时,要注意字符的输入形式 ,例如执行如下程序段:,char ch1,ch2; ch1=getchar( ); ch2=getchar( );,必须连续输入两个字符,中间不能有其它字符。 如果有空格,空格也会被作为输入字符接收,格式:printf(格式字符串,输出表列) 功能:按指定格式向终端输出若干任意类型的数据 返值:正常,返回输出字节数;出错,返回EOF(-1),3. 格式化输出函数 1

8、.printf函数,输出表列:要输出的数据(可以没有,多个时以“,”分隔) 格式字符串:用双引号括起来的字符串,包含两种信息 格式说明: %修饰符格式字符 ,用于指定输出格式 普通字符或转义序列:原样输出,通常用作输出提示信息 格式说明符与输出表列中的输出项一一对应,printf (c=%d+%d=%dn, a, b, a+b );,格式说明:指定输出3个十进制整型数,分别为变量 a、b、ab的值,普通字符:照原样输出,相当于占位符,先计算,2.格式字符 print格式字符,printf 附加格式字符 (修饰符),int a=123,b=12345; printf(“%4d,%4dn”,a,b

9、);,输出结果: 123,12345,long int a=135790; printf(“%ld,%8ldn”,a,a);,输出结果: 135790,135790,int a=-1; printf(“%d,%o,%8o,%xn”,a,a,a,a);,输出结果: -1,177777,177777,ffff,-1的内存分配情况,例:无符号数据的输出。#includevoid main()unsigned int a=65535;int b=-2;printf(“a=%d,%o,%x,%un”,a,a,a,a);printf(“b=%d,%o,%x,%un”,b,b,b,b);,运行结果:a=-1

10、,177777,ffff,65535b=-2,177776,fffe,65534,例: 输出实数时的有效位数。#include void main() float x,y;x=111111.111;y=222222.222; printf(“%f”,x+y);,运行结果:333333.328125,例:输出双精度数时的有效位数。#include void main() double x,y; x=1111111111111.111111111; y=2222222222222.222222222;printf(“%f”,x+y);,运行结果:3333333333333.333010,双精度一般

11、有效位数为16位,给出小数6位。但总共有效数字超过16位后的数字是无效的,所以,这里只有3位有效数字,例: 输出实数时指定小数位数。#include void main()float f=123.456;printf(“%f %10f %10.2f %.2f %-10.2fn”,f,f,f,f,f);,运行结果:123.456001123.456001123.46123.46123.46,例: printf(“%e”,123.456); 所输出的实数共占13列宽度。 (注:不同系统的规定略有不同),输出: 2列 6列(小数默认) 5列(指数),若f=123.456,则: printf(“%e

12、%10e %10.2e %.2e %-10.2e”,f,f,f,f,f);,输出: 1.234560e+002 1.234560e+002 1.23e+002 1.23e+002 1.23e+002 13列 13列 10列 9列 10列,若f=123.468,则: printf(“%f %10e %g”,f,f,f);,输出: 123.468002 1.234680e+002 123.468 10列 13列 10列,例:字符数据的输出。#includevoid main()char c=a;int i=97;printf(“%c,%dn”,c,c);printf(“%c,%dn”,i,i);,

13、运行结果:a,97a,97,在0255之内均可,例:字符串的输出。#includevoid main()printf(“%3s,%7.2s,%.4s,%-5.3sn”,“CHINA”,“CHINA”,“CHINA”,“CHINA);,4. scanf函数,地址表:若干变量地址(或字符串首地址),常用取地址符scanf(“%d%d%d”,scanf格式字符,scanf附加格式说明符,例如: %mf输入m位数(域宽) %*d忽略输入的一个整型数,对float和double型指整数位数+小数点 +小数位数,例 scanf(“%4d%2d%2d”, 输入 19991015 则1999yy, 10 mm

14、, 15 dd,例 scanf(“%3c%2c”, 输入 abcde 则ac1, d c2,例 scanf(“%3d%*4d%f”, 输入 12345678765.43 则123k, 8765.43f,例 scanf(“%2d%*3d%2d”, 输入 1234567 则12a, 67b,使用scanf函数时应注意的问题 : (1)scanf函数中的“格式控制”后面应当是变量地址,而不应是变量名。 (2)如果在“格式控制”字符串中除了格式说明以外还有其他字符,则在输入数据时在对应位置应原样输入这些字符。 (3)输入分隔符的指定 一般以空格、TAB或回车键作为分隔符 其它字符做分隔符:格式串中两个

15、格式符间字符,例 scanf(“%d%o%x”, 输入 123 123 123 输出 a=123,b=83,c=291,例 scanf(“%d:%d:%d”, 输入 12:30:45 则12 h, 30 m, 45 s,例 scanf(“%d,%d”, char ch; scanf(“%d”, 执行:123 输出:x=123,ch=10,例 int x; char ch; scanf(“%d”, 执行:123 输出:x=123,ch=10,例 int x; char ch; scanf(“%d”,例 int x; char ch; scanf(“%d”,例 int x; char ch; sc

16、anf(“%d”,3.3 选择结构 3.3.1 if语句 1.单分支if语句: 格式:if (expression) statement 执行过程:,2.双分支if语句: 格式:if (expression) statement1 else statement2 执行过程:,例:if (xy) printf(“%d”,x);,例:if (xy) max=x; else max=y;,分号不能少,但这两行是一个语句!,后面没有分号!,else必须与if配套使用!,例3.5 输入三个数x,y,z,把这三个数由小到大输出。,if xy 将x和y对换 if xz 将x和z对换 if yz 将y和z对换

17、,#include main() int x,y,z,t; scanf(“%d%d%d”, ,3.多分支if语句: 格式: 执行过程:,if ( expr1 ) statement1 else if (expr2 ) statement2 else if (expr3 ) statement3 . else statementn ,例:if (salary1000) index=0.4; else if (salary800) index=0.3; else if (salary600) index=0.2; else if (salary400) index=0.1; else index=

18、0;,例3.5 输入三个数x,y,z,把这三个数由小到大输出。 用多分支if语句怎么实现?,#include main() long int i; int bonus1,bonus2,bonus4,bonus6,bonus10,bonus; scanf(%ld,例3.7 企业发放的奖金是根据利润提成的。利润低于或等于10万元时奖金可提10%;利润高于10万元低于20万元时,低于10万元的部分按10%提成,高于10万元的部分可提成7.5%;20万元到40万元之间时,高于20万元的部分可提成5%;40万元到60万元之间的部分可提成3%;60万元到100万元之间时,高于60万元的部分,可提成1.5%

19、,高于100万元时,超过100万元的部分按1%提成。从键盘输入当月利润,求应发奖金总数。,if(i=100000) bonus=i*0.1; else if(i=200000) bonus=bonus1+(i-100000)*0.075; else if(i=400000) bonus=bonus2+(i-200000)*0.05; else if(i=600000) bonus=bonus4+(i-400000)*0.03; else if(i=1000000) bonus=bonus6+(i-600000)*0.015; else bonus=bonus10+(i-1000000)*0.0

20、1; printf(bonus=%d,bonus); ,说明: if后面的表达式类型任意,一般为逻辑或关系表达式 if(x) if(x!=0) if(!x) if(x=0) 语句可以是复合语句,例 考虑下面程序的输出结果: #include main() int x,y; scanf(“%d,%d”, ,Compile Error!,如:if(a=b,if语句可以嵌套:,-1 (x0) 算法1: 算法1: 输入x 输入x 若x0,则y=1 若x=0,则y=0 输出y 若x0,则y=1 输出y,#include void main() int x,y; scanf(“%d”, ,上例中的程序段有

21、四种写法,请判断哪个是正确的? 程序1: 程序2: if(x=0) y=-1; if(x0) y=1; else else y=0; if(x=0) y=0; else y=-1; else y=1; 程序3: 程序4: y=-1; y=0; if(x!=0) if(x=0) if(x0) y=1; if(x0) y=1; else y=0; else y=-1;,正 确,正 确,错 误,错 误,if else 配对原则:缺省 时,else总是和它上面离它最近的未配对的if配对,例: if (a=b) if(b=c) printf(“a=b=c”); else printf(“a!=b”);,

22、修改: if (a=b) if(b=c) printf(“a=b=c”); else printf(“a!=b”);,实现if else 正确配对的方法:加 ,3.3.2 switch语句 一般形式: 执行过程:,switch( 表达式) case E1: 语句组 1; break; case E2: 语句组 2; break; . case En: 语句组 n; break; default: 语句组 ; break; ,任意类型,常量表达式,值互不相同,可不加大括号,说明: 各case和default出现的次序不影响执行结果 “case En”起到语句标号作用,必须用break跳出 swi

23、tch可嵌套 多个case可共用一组执行语句,如: case A: case B: case C: printf(“score60n”); break; .,例 switch(score) case 5: printf(“Very good!”); case 4: printf(“Good!”); case 3: printf(“Pass!”); case 2: printf(“Fail!”); default : printf(“data error!”); ,运行结果:score为5时,输出: Very good! Good! Pass! Fail! data error!,例 void

24、main() int x=1,y=0,a=0,b=0; switch(x) case 1: switch(y) case 0: a+; break; case 1: b+; break; case 2: a+;b+; break; case 3: a+;b+; printf(“na=%d,b=%d”,a,b); ,运行结果:a=2,b=1,例3.8 分析以下程序在输入5时的执行结果。,#include main() int n; printf(输入星期序号:); scanf(%d, ,例3.9编程根据选择进行相应的工资记录操作。,#include main() int select; prin

25、tf(n 请输入您的选择(19):); scanf(%d, ,3.4 循环结构,什么是循环? 为什么要使用循环?,3.4.1 while语句 一般形式:,while(表达式) 循环体语句;,一般形式:,是一条语句!,多于一条怎么办?,特点:先判断表达式,后执行循环体 说明: 循环体有可能一次也不执行 循环体可为任意类型语句 下列情况,退出while循环: 条件表达式不成立(值为零) 循环体内遇break,return,goto 无限循环(死循环): while(1) 循环体;,#include main() int day,x1,x2; day=9; x2=1; while(day0) x1=

26、(x2+1)*2;/*第一天的桃子数是第2天桃子数加1后的2倍*/ x2=x1; day-; printf(the total is %dn,x1);,例3.10 猴子吃桃问题。猴子第一天朝霞若干个桃子,当即吃了一半,还不过瘾,又多吃了一个,第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上只剩下一个桃子了。求第一天摘了多少个桃子。,#include main() int i,sum=0; i=1; while(i=300) sum=sum+i; i=i+2; printf(%dn,sum); ,例3.11 求0300以内的奇数之和。,3.

27、4.2 do-while语句 一般形式:,do 循环体语句; while(表达式);,执行流程:,特点:先执行循环体,后判断表达式 说明: 至少执行一次循环体 dowhile可转化成while结构,#include main() int day,x1,x2; day=9; x2=1; do x1=(x2+1)*2;/*第一天的桃子数是第2天桃子数加1后的2倍*/ x2=x1; day-; while(day0); printf(the total is %dn,x1); ,例3.12 用dowhile语句改写例3.10。,例3.13 采用dowhile语句改写例3.11。,#include m

28、ain() int i,sum=0; i=1; do sum=sum+i; i=i+2; while(i=300); printf(%dn,sum); ,While与 dowhile的循环体一样时结果也一样。 dowhile宜于实现典型的“直到型”循环。,3.4.3 for语句 一般形式:,for(expr1 ; expr2 ; expr3) 循环体语句;,执行过程:,for语句一般应用形式:,for(循环变量赋初值;循环条件;循环变量增值) 循环体语句; ,for语句中expr1, expr2 ,expr3 类型任意,都可省略,但分号“;”不可省 无限循环: for(;),相当于while(

29、1) for语句可以转换成while结构,expr1; while(expr2) 循环体语句; expr3; ,for(;i=100;i+) sum=sum+i;,for(i=1;i+) sum=sum+i;,for(i=1;i=100;) sum=sum+i;i+,for(;i=100;) sum=sum+i;i+,for(;) 语句,for(sum=0,i=1;i=100;i+) sum=sum+i;,for(i=0,j=100;i=j;i+,j-) k=j+i;,for(i=1;i=100;i+,i+) sum=sum+i;,for(i=0;(c=getchar()!=n;i+=c) ;

30、,for(;(c=getchar()!=n;) printf(“%c”,c);,#include main() int day,x1,x2; day=9; x2=1; for(day=9;day0;day-) x1=(x2+1)*2;/*第一天的桃子数是第2天桃子数加1后的2倍*/ x2=x1; printf(the total is %dn,x1); ,例3.14 用for语句改写例3.10。,#include main() int i,sum=0; for (i=1;i=300;i+=2) sum+=i; printf(%dn,sum); ,例3.15 用for语句改写例3.11。,#in

31、clude main() float sn=100.0,hn=sn/2; int n; for(n=2;n=10;n+) sn=sn+2*hn;/*第n次落地时共经过的米数*/ hn=hn/2; /*第n次反跳高度*/ printf(the total of road is %fn,sn); printf(the tenth is %f metern,hn); ,例3.16 一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?,3.4.4 break语句和continue语句 1. break语句 功能:在循环语句和switc

32、h语句中,终止并跳出循环体或开关体 说明: break只能终止并跳出最近一层的结构 break不能用于循环语句和switch语句之外的任何其它语句之中,2. continue语句 功能:结束本次循环,跳过尚未执行的语句,进行下一次是否执行循环体的判断 仅用于循环语句中,2. continue语句 功能:结束本次循环,跳过尚未执行的语句,进行下一次是否执行循环体的判断 仅用于循环语句中,例6.5 把100200之间的不能被3整除的数输出。 #include void main()int n; for (n=100;n=200;n+) if (n%3=0) continue; printf(%d

33、,n); ,说明:当n能被3整除时,执行continue语句,结束本次循环(即跳过printf函数语句),只有n不能被3整除时才执行printf函数。,例3.17 求调和级数中第多少项的值大于15。 调和级数第n项的形式为:,#include main() int n; float sum; sum=0.0; n=1; for(; ; ) sum=sum+1.0/n; if (sum15) break; n+; printf(n=%dn,n); ,例3.18 验证哥德巴赫猜想:任意一个不小于6的偶数总能表示成两个素数之和。,#include #include math.h main() int

34、 a,b,c,d; scanf(%d, ,3.4.5 循环的嵌套 三种循环可互相嵌套,层数不限 外层循环可包含两个以上内循环,但不能相互交叉 嵌套循环的跳转禁止: 从外层跳入内层 跳入同层的另一循环 向上跳转,(1) while() while() . ,(7) for( ; ;) do while(); while() . ,(2) do do while( ); . while( );,(4) while() do while( ); . ,(3) for(;) for(;) . ,(5) for(;) while() . ,(6) do for(;) . while(),例3.19 求2

35、00以内的全部素数。,#include main() int m,n,i,prime; i=0; for(m=2;m=200;m+) prime=1; for(n=2;nm;n+) if (m%n=0) prime=0; if(prime) printf(%5d,m); i+; if(i%3=0) printf(n); if(i%3!=0) printf(n); ,例3.20 编程:输入正整数k,在屏幕上输出高为k的等腰三角形图。,#include main() int i,j,k; printf(k:); scanf(%d, ,例3.21 编程:输出从2n(n由用户输入)中的所有素数。,#i

36、nclude #include /*包括sqrt()函数声明*/ main() int n, m, ss, i, j, num=1; printf(n:); scanf(%d, ,运行结果: n:30 从2到30 的所有素数如下: 2 3 5 7 11 13 17 19 23 29,3.4.6 goto语句 goto语句一般格式:,goto 语句标号; . 标号:语句;,功能:无条件转向语句 说明: 标号是合法标识符,不能是整数 标号只能出现在goto所在函数内但不在其所在循环体内,且唯一 标号只能加在可执行语句前面 限制使用goto语句 用途: 与if构成循环 从循环体内跳转到循环体外,例3.22 用goto语句改写例3.10。,#inc

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论