第四章 程序流程控制.ppt_第1页
第四章 程序流程控制.ppt_第2页
第四章 程序流程控制.ppt_第3页
第四章 程序流程控制.ppt_第4页
第四章 程序流程控制.ppt_第5页
已阅读5页,还剩61页未读 继续免费阅读

下载本文档

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

文档简介

1、第四章 程序流程控制,程序设计是计算机科学的一个核心问题,主要还是靠人完成。结构化程序设计方法是面向过程程序设计的基本方法,C语言是一种结构化的程序设计语言,它提供了完善的结构化程序设计的各种控制结构。,结构化程序设计三原则 1. 使用三种基本控制结构(顺序、选择、循环) 2. 采用自顶向下、逐步求精的模块化程序设计方法 3. 限制goto语句的使用,4.1 结构化程序设计的概念,顺序结构,A,B,入口,出口,代码示例: printf(请输入一个大于3的整数:); scanf(%d,4.2 选择结构程序设计,C语言支持的选择结构: 1. if 语句 2. 条件表达式 3. switch 语句,

2、if语句 形式1:多分支选择 if (测试表达式1) 语句1; else if (测试表达式2) 语句2; else if (测试表达式3) 语句3; else if (测试表达式n) 语句n; else 语句n+1;,【例】猜数游戏:多分枝 #include void main() int magic=123,guess; printf(Enter your guess:); scanf(%d, ,if语句 形式2:二分支选择 if (测试表达式) 语句1; else 语句2;,【例】猜数游戏:若用户猜对了,屏幕显示“*Right*”;否则,显示“*Wrong*”。 #include voi

3、d main() int magic=123,guess; printf(Enter your guess:); scanf(%d, ,形式1: 单分支选择 if (测试表达式) 语句1;,【例】猜数游戏:若用户猜对了,屏幕显示“*Right*”,然后结束程序运行。 #include void main() int magic=123; int guess; printf(Enter your guess:); scanf(%d, ,if语句 形式1,if 语句的使用说明: (1)if语句中测试表达式的书写非常灵活,(2)if语句中出现复合语句时,一定要用花括号括住 if (测试表达式) 语句

4、序列1 else 语句序列2 ,if 语句的嵌套,(1)内层if既可以嵌套在外层的if块中,也可以嵌套在外层的else块中,其形式为: if (测试表达式1) if (测试表达式2) else else if (测试表达式3) else ,(2)else和if的配对关系:else总是与离自己最近的不带else的if配对,而与书写格式无关。,【例】在直角坐标系中有一个以原点为中心的单位圆,今任给一点(x,y),试判断该点是在单位圆内、单位圆上,还是单位圆外?若在单位圆外,那么是在x轴的上方,在x轴上,还是在x轴的下方?,#include void main() float x,y,z; scan

5、f(%f%f, ,#include void main() float x,y,z; scanf(%f%f, ,【例】 int a,b,c; scanf(“%d%d”,4.2.2 条件表达式,1. 条件运算符和条件表达式 条件运算符 ? : / 三元运算符 条件表达式 exp1?exp2:exp3,结合性为从右至左,exp1?exp2:exp3?exp4:exp5,c=(ab)?a:b),c=ab?a:b,exp1?exp2:(exp3?exp4:exp5),exp1?exp2?exp3:exp4:exp5,exp1?(exp2?exp3:exp4):exp5,小贴士 最右边的“?”总是与紧靠

6、其右的“:”匹配,2. 条件运算符的优先级和结合性 优先级仅高于赋值运算符和逗号运算符,低于其他运算符。,3. 条件表达式的使用 条件表达式常用在赋值语句中代替if-else语句。,【例】从键盘接收一个字符存放在变量c中。要求只把输入的小写字母转换成大写字母,其他字符不变,并显示是输入了小写字母还是其他字符。 #include void main() char ch,c; scanf(%c, ,4.2.3 switch语句和break语句,switch用于多分支选择,比if-else if-else语句易读、可使程序更加简明。 switch不能完全取代if-else if-else; swit

7、ch常与break联用。,switch(e) case c1: 语句1; case c2: 语句2; . case cn: 语句n; default: 语句n+1; ,/ e 是整型变量或表达式,/ c1cn是整型常量或常量表达式,1. switch语句,【例4.6】从键盘输入不同的字母,显示不同的国家名称。 #include void main() char ch; ch=getchar(); switch(ch) case a: printf(American); case b: printf(Britainn); case c: printf(Chinan); case d: print

8、f(Denmarkn); default: printf(Japann); ,break与switch联用,强迫控制立即退出switch。 防止从一个case下落到另一个case中; 防止因case和default位置的改变而影响程序的运行结果。,2. break语句,【例】 在例.6程序中加入break。 #include main() char ch; ch=getchar(); switch(ch) case a: printf(American);break; case b: printf(Britainn);break; case c: printf(Chinan);break; c

9、ase d: printf(Denmarkn);break; default: printf(Japann);break; ,switch(ch) case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: digit+; break; case : case n: case t: white+; break; default: character+; break; , 每个case中的常量或常量表达式的值应互不相同,否则会出现矛盾的结果。 如果每个case和default中都有break语句,

10、那么,case和default出现的次序不会影响程序的运行结果。 允许多个case共用一个语句序列。,3. switch和break语句的使用, 字符常数出现在case中,它们会自动转换成整型。 switch可以嵌套使用,要求内层的switch必须完全包含在外层的某个case中,允许内、外层switch的case中含有相同的常数,不会引起误会。如 switch(x) case 1: switch(y) case 0:printf(divided by zero); break; case 1: printf(It is right); break; case 2: switch只能进行相等性检

11、查,而if不但可进行相等性检查,还可以计算关系或逻辑表达式。因此,switch不能完全替代if。,【例】 从键盘输入三个数,然后按从大到小输出。,补充知识:如何产生真正的随机数 1.用rand()可产生032767范围内的随机整数 2.如果不设置随机数种子,每次产生的随机数序列都是一样的; 3.用srand(种子)可以设置随机数序列,同一个种子产生的序列相同; 4.为了让种子不同,一般用time(NULL)函数来得到一个种子数; 5. time(NULL)用于得到某个时该距离当前时刻的秒数,号外,补充知识:如何产生真正的随机数 6.rand()、srand()函数头文件为stdlib.h ti

12、me函数头文件为time.h。常见程序段: #include #include #include void main() int i; srand(time(NULL); for(i=1;i10;i+) printf(%5d,rand()%51+50); ,号外,循环结构用来进行有规律性的重复运算,可以大大缩短程序的长度。 C语言支持的循环结构: for 循环(步长型循环) while 循环(当型循环) do-while 循环(直到型循环),4.3 循环结构程序设计,循环结构前测试,入口,出口,条件,A,前导语句 while (条件) A后续语句,y,N,示例04-05:求1100自然数之和

13、示例04-06:求两个整数的最大公约数,4.3 循环结构程序设计,开始,i=100,s=s+i i=i+1,输出结果,结束,Y,N,#include void main() int i,s; i=1; s=0 while (i=100) s=s+i; i+; printf(1+2+.+100=%dn,s); ,i=1 S=0,4.3 循环结构程序设计,开始,i=100,s=s+i i=i+1,输出结果,结束,Y,N,#include void main() int i,s; i=1; s=0 while (i=100) s=s+i; i+; printf(1+2+.+100=%dn,s); ,

14、i=1 S=0,4.3 循环结构程序设计,for(i=1,s=0;i=100;s=s+i,i+);,开始,i=100,s=s+i i=i+1,输出结果,结束,Y,N,#include void main() int i,s=0; s=0 for (i=1;i=100;i+) s=s+i; printf(1+2+.+100=%dn,s); ,i=1 S=0,4.3 循环结构程序设计,开始,m%i+n%i!=0,i=i-1,输出i,结束,Y,N,#include void main() int i,m,n; printf(请输入两个整数:); scanf(%d%d,i=m,4.3 循环结构程序设计

15、,输入m,n,for?,循环结构后测试,入口,出口,条件,A,前导语句 do A while (条件); 后续语句,y,N,这个分号非常重要!,示例:求从键盘输入N个整数的平均值 示例:限制非法数据输入,4.3 循环结构程序设计,开始,x=-9999,s=s+x i=i+1,计算并输出结果,结束,Y,N,void main() int i,s,x; float aver; do printf(请输入(-9999结束)); scanf(%d, ,i=0 S=0,4.3 循环结构程序设计,输入x,这个程序有很多逻辑错误!找一下!,1. for语句的一般格式 for(表达式1;表达式2;表达式3)

16、语句; for (i=1;i10;i+=2) printf(%d ,i);,2. for语句的执行流程,for语句,【例】 将50以内的奇数在屏幕上显示出来的程序。 #include void main() int i; for (i=1;i50;i+=2) printf(%d ,i); /循环体 printf(n); , for语句是先判断后执行。就是说,如果开始时循环条件不成立,循环体一次也不被执行。例如程序段 x=10; for (y=10;y!=x;+y) printf(%d,y); 中的循环体不被执行。 可用逗号表达式实现两个或多个循环控制变量。 例如,语句 for (i=0,j=1

17、;jn 中,初始化部分和增值部分有两个变量,它们同时控制循环。这种形式经常用在数组和字符串的操作中。,3. for语句的使用注意事项, 三个表达式可以放在for语句外部。 for (i=1;i5) break; , 循环体可以是空语句。 for (i=0;i1000;+i) ; 这个程序的功能是延迟一小段时间,这一小段时间用来计算循环变量的值和判断循环是否终止。 注意防止出现“死循环”。 无休止的循环称为“死循环”。例如 main() int x=10; for(;x=10;x-) printf(“%d ”,+x); 该程序会输出无数个“11”而不能正常终止。,#include void ma

18、in() int i,n,p; scanf(%d, ,【例】编制一个求n!的程序,n的值由键盘输入。,4.3 循环结构程序设计,4. for 结构与while结构的互换 (1)for to while 将for中表达式1的语句移到while语句之前,表达式3的内容移到循环体中,删除两个分号,再将for换成while即可。 (2)while to for 将while换成for,再在条件表达式前后各加一个分号即可。,【例】自然常数e的计算公式为,计算e的近似值,要求被舍弃的首项,0.000001。,#include #include void main() int n=1; float e=0,

19、t=1.0; while (fabs(t)=1E-6) e=e+t; t=t/n; n+; printf(e=%fn,e); ,#include void main() int x,c; printf(Input an integer:); scanf(%d, ,【例】从键盘输入一个整数,把这个整数中的各位数字反序显示出来。例如,输入为1234,则输出为4321。,4.3.4 循环的嵌套,循环的嵌套是指一个循环的循环体中包含了另一个或几个循环,也称多重循环。 1. 一个二重循环的例子 【例】 打印九九乘法表。 #include void main() int i,j; for (i=1;i=9

20、;i+) for (j=1;j=9;j+) printf(%d*%d=%2d ,i,j,i*j); printf(n); ,请思考,如果要输出如下图所示的左下三角形九九乘法表,应如何修改程序?若要输出右上三角形或右下三角形九九乘法表,又应如何实现?,2. 嵌套循环的使用 内层循环必须完全包含在外层循环中,二者不能使用相同的循环变量,不能出现交叉。 循环嵌套的层数没有限制,但层数太多,可读性变差。 为了使嵌套的层次关系清晰明了,建议采用缩排格式书写程序。,4.4 转移控制语句,C语言提供的转移控制语句: break 可用在switch和循环结构中,强行结束switch或循环。 continue

21、只用在循环结构中,提前进入下一轮循环。 goto 无条件转移到指定的位置。 return 只用在子函数中,将控制返回调用段。 exit() 提供的控制转移函数,强行控制程序运行结束。,4.4.1 break语句,break语句有两种用途。一种是用在switch中,强行控制立即退出switch,第二种是用在循环中,强行控制立即退出循环。 【例】 break语句的应用示例。 #include void main() int t; for (t=0;t100;t+) printf(%d ,t); if (t=10) break; ,for(.) . switch(a) case 1: . break

22、; case 2: . . ,break的使用 1. break用在switch中,只强行退出该switch而不影响switch所在的任何循环。例如,for (.) . while (.) . if (.) break; do . if () break; . while (.); . . 不能期望用break从最内层循环一下子退出最外层循环,2. break用在循环中,只能退出它所在的那一层循环,即,示例:输入若干个数求平均值; 示例:猜数字 示例:输入一个整数,判断是否是素数; 示例:输入两个整数,求最大公约数和最小公倍数,开始,im,i=i+1,输出结果,结束,Y,N,#include

23、void main() int m,i; printf(请输入整数:); scanf(%d, ,i=2;,4.3 循环结构程序设计,输入整数m,m%i=0,Y,N,开始,r !=0,m=n n=r,输出结果,结束,Y,N,#include main() int m,n,r; printf(请输入两个整数:); scanf(%d%d, ,r=m%n,4.3 循环结构程序设计,输入两整数m,n,for (.) . if (.) . continue; . ,4.4.2 continue语句,continue语句只用在循环中,其作用是跳过其后面的语句,直接将控制转移到下一轮循环。形象地说,continue是将它后面的循环体部分“短路”,直接进入循环条件测试。,【例】continue语句的应用示例。 #include void main() int i=1; while (i=100) if (i%3!=0) i+; continue; printf(%d ,i); i+; printf(n); ,示例:将1-100中除3的倍数外的所有整数求和。,开始,i101,s=s+i i=i+1,结束,Y,N,#include main() int i,s=0; for(i=1;i=100;i+) if(i%3=0)continue; s=s+

温馨提示

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

评论

0/150

提交评论