流程控制语句_第1页
流程控制语句_第2页
流程控制语句_第3页
流程控制语句_第4页
流程控制语句_第5页
已阅读5页,还剩111页未读 继续免费阅读

下载本文档

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

文档简介

1、第四章 流程控制语句 4.2 if 语句双分支语句 4.3 switch 语句多分支语句)4.4 for语句 (当型循环) 4.5 while 语句 (条件循环) 4.6 do-while语句 (直到型循环) 4.7 跳转语句本章主要内容: 4.1 概述 流程控制语句用来控制程序的执行过程,它包括以下三种语句: 选择:用来解决实际应用中按不同情况进行不同处理的问题.包括: if语句 和 switch语句 循环:用来解决实际应用中需要重复处理的问题. 包括: for语句、 while语句 和 do语句 跳转:用来改变顺序向下执行的正常顺序.包括:goto 、continue 、break 和 r

2、eturn语句 4.1 概述4.2 if 语句条件语句 一、if语句的简单格式三、if语句的嵌套二、if语句的双分支格式表达式语句真假一、if语句的简单分支 语句:if(表达式) 语句 表达式为任意表达式 若有多条语句,则要构成复合语句 执行:计算 表达式的值,若为真(不为0) 则执行语句;否则不执行语句例4.2.1:求x的绝对值#includevoid main()int x,absx;coutx;absx=x;if(x0) absx=-x;coutx=xendl;cout|x|=absxendl;#includeabsx=abs(x);if(x=0) absx=x;else absx=-x

3、;例4.2.2:C若为大写字母,则把它变为小写字母,否则为c本身。#includevoid main()char ch;cinch;if(ch=A&ch=Z)ch=ch+32;coutchendl;二、if语句的双分支if(表达式) 语句1else 语句2表达式语句1语句2真假入口出口 执行:若表达式的值不为0,执行语句1,否则执行语句2 语句:#includevoid main() int a,b,x; cinab; if(ab) x=a; x*=x; else x=b; coutxendl;例4.2.3:输入两个数a,b,若a 大,则输出a的平方,若b大,输出b 。 复合语句一定要加大括号

4、x=a;x*=a;嵌套的两种形式: (1) 嵌套 ifelse(2) 嵌套 else if三、if 语句的嵌套(处理多分支问题)(1) 嵌套 ifelseif(表达式1)if(表达式3)语句1;if(表达式2)else 语句2 ;else 语句3 ;else 语句4;外层内层中层 若表达式1的值为非0 ,即真,则执行中层ifelse结构;否则,执行语句4。 执行中层时,若表达式2的值为非0 ,即真,则执行内层ifelse结构;否则,执行语句3。 执行内层时,若表达式3的值为非0 ,即真,则执行语句1;否则,执行语句2。if_else 嵌套流程图if(表达式1) 语句1; else if(表达式

5、2) 语句2; else if(表达式3) 语句3; . else if(表达式n) 语句n;else 语句n+1 ; /*前面n个条件均 不成立,执行语句n+1*/(2)嵌套 else ifelse_if 嵌套流程图例4.2.4 :编写程序计算函数 x*x-4 (x=0) y = x (0 x3)解: 根据题目的三个区间,两个判断点,形成三分支,可采用三种选择结构设计。 方法1:else_if 嵌套结构设计 方法2:if_else嵌套结构设计 方法3: 三个并列的if结构设计 嵌套方法1 :else_if 嵌套结构-源程序:注:这种方法是判判断点法 各条件互相关联形成区间 要考虑条件成立与不

6、成立/X3/ 0X=3/X=0#includevoid main() int x,y; coutx; if(x3) y=x*x+4; else if(x0) y=x; else y=x*x-4; couty=yendl;方法2:if_else嵌套结构设计#includevoid main() int x,y; coutx; if (x0) if (x=3)y=x; else y=x*x+4; elsey= x*x-4; couty=yendl;注:这种方法也是判判断点法 各条件互相关联形成区间 要考虑条件成立与不成立方法3 三个并列的if 结构-源程序#includevoid main() i

7、nt x,y; coutx; if (x3) y=x*x+4; if (x0&x=3) y=x; if (x=0) y=x*x-4; couty=yendl;注:这种方法是判区间法。 若改为”0 x3时,运行程序,看结果如何?例4.2.5:输入年份,判断是否为闰年,若是,回答“Yes”,否则回答“No”。什么样的年份是闰年? 能被4整除,不能被100整除,是闰年 能被4整除,也能被100整除:不是闰年 能被4整除,也能被100整除,还能被400整除: 是闰年year被4整除year被100整除year被400整除真假No假Yes真假No真Yes#includevoid main() int y

8、ear; coutyear;if(year%4=0) if ( year%100=0) if( year%400=0) coutYesendl; else coutNoendl; /不能被400整除/ else coutYesendl; /不能被100整除/else coutNoendl; /不能被4整除/或:if ( year % 4 ) /*不能被4整除*/coutNoendl; else if ( year %100 ) /*不能被100整除*/coutYesendl; else if ( year % 400 ) /*不能被400整除*/coutNoendl; else coutYes

9、endl; 返回也用一个逻辑表达式包含所有条件:#includevoid main() int year;coutyear;if (year%4=0 & year%100!=0)|(year%400=0) coutYesendl;else coutNo N;cout N;cout x; switch 通常与break语句联用:break用于中断或结束语句(只能用在switch语句和循环语句中)例4.3.1:输入成绩,若:90 100 :A 70 89 :B 60 69 :C 60 :Dbreak语句:#includevoid main() int cj; cincj; switch (cj/1

10、0) case 10:case 9:coutnA; case 8: case 7:coutnB; case 6:coutnC; default:coutnDn; break;break;运行:不加”break”和加”break”的区别!break;98ABCD不加break98A加break#include#includevoid main()float score;coutscore;if (score100)cout输入数据有误!endl;exit(1);程序举例(P85例4-3-2)switch (int (score)/10) case 9:case 10: coutscore:优en

11、dl;break;case 8:case 7: coutscore:良endl;break;case 6: coutscore:及格endl;break;default: coutscore:不及格endl;break;程序举例(P85例4-3-2)程序举例(p85例4-3-1)#includevoid main()int weekday;coutweekday;switch(weekday) case 0: coutSundayendl;break; case 1:coutMondayendl;break; case 2: coutTuesdayendl;break; case 3:cout

12、Wednesdayendl;break; 程序举例(p85例4-3-1) case 4: coutThursdayendl;break; case 5:coutFridayendl;break; case 6: coutSaturdayendl;break; default:coutInput error!endl;break; 程序举例(P86 程序4-3-3)#include#include#includevoid main()char mark;int x,y,z;bool b=false; srand(time(0);/ srand(time(0);/初始化系统中的随机数序列 x=ra

13、nd()%50+1;程序举例P86 程序4-3-3y=rand()%10+1;coutmark;coutxmarkyz;switch (mark) case +: if (z=x+y) b=true;break;case -: if (z=x-y) b=true;break;case *: if (z=x*y) b=true;break;程序举例P86 程序4-3-3case /: if (z=x/y) b=true;break;case %: if (z=x%y) b=true;break;default: cout运算符输入错!endl;exit(1);if (b) coutright!e

14、ndl;else couterror!endl;程序补充知识srand(time(0) 和rand()它们分别怎样用,又怎么区别srand(time(0);/先设置种子rand();/然后产生随机数srand是种下随机种子数,你每回种下的种子不一样,用rand得到的随机数就不一样。为了每回种下一个不一样的种子,所以就选用time(0),time(0)是得到当前时间值(因为每时每刻时间是不一样的了)。注:time函数原型包含在系统头文件time.h或ctime中,它返回从1970年1月1日零时算起至当前时间为止的总秒数。应用举例p87例4-3-1例4-3-1 编写一个程序,要求把从键盘上输入的一

15、个015的整数转换为一位十六进制数输出。#include#includevoid main()int x;coutx;if (x15) cout输入数据不正确!n;exit(1);应用举例p87例4-3-1switch (x) case 10:coutA;break; case 11:coutB;break; case 12:coutC;break; case 13:coutD;break; case 14:coutE;break; case 15:coutF;break;default:coutchar(x+48);break; /48为数字0的/ASCII码coutendl;分支(选择)结

16、构小结1、if语句的简单分支2、if语句的双分支:if -else3、if的嵌套4、switch 语句的使用返回4.4 4.6 循环结构一、 for 语句*二、 while语句*三、 do - while 语句*主要学习语句的执行过程、使用方法循环:重复执行一段语句语句 格式for( 表达式1;表达式2;表达式3)语句表达式2语句表达式1表达式3表达式1:作为初始化先执行表达式1的值;再执行表达式2,如果值为真,执行语句,再执行表达式3,重复;如果表达式2的值为假,退出循环,继续执行下面的语句。 执行情况真假表达式2:作为循环控制,是循环条件表达式3:每次都要做 ,改变循环变量4.4 for语

17、句(计数式型循环)for(循环变量赋初值;循环条件;循环变量增值)语句for (s=0,i=1;i=100;i+)s+=i;注意: 这三个表达式都可以忽略,但分号 不能省 for(;) 不能构成死循环,死循环可用ctrl+c强行中止。for循环最常见格式:死循环举例#include#includevoid main()int n,i;cinn;for (i=2;in;i+)int temp=int(sqrt(n)+1e-5);for (i=2;itemp)coutnYesn;else coutnNon;例4.4.1:求n!(n的值由键盘输入)#includevoid main()int n;d

18、ouble s=1.0;coutn;for(int i=1;i=n;i+)s*=i;coutn!=sendl;例4.4.2:输入一个数,判断是否为素数#includevoid main()int n,i;cinn;for (i=2;in;i+)if (n%i=0) break;if (i=n)coutnYesn;else coutnNon;#include#includevoid main()int n,i;cinn;int temp=int(sqrt(n)+1e-5);for (i=2;itemp)coutnYesn;else coutnNon;例4.4.2程序优化:循环次数可以减少,详见p

19、94(例4-4-4)例4-4-4循环嵌套内循环外循环 嵌套不能有交叉 在循环嵌套中,break语句只能退出一层循环。例4.4.3 打印出100到200之间的素数#includevoid main()int i , j;for ( i=100 ; i=200 ; i+ ) for(j=2;j=i) coutt i;程序优化:循环次数可以减少,详见94(例4-4-4)例4-4-4例4.4.4 打印乘法表。1*1=12*1=2 2*2=43*1=3 3*2=6 3*3=94*1=4 4*2=8 4*3=12 4*4=165*1=5 5*2=10 5*3=15 5*4=20 5*5=256*1=6 6

20、*2=12 6*3=18 6*4=24 6*5=30 6*6=367*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=498*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=649*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81#includevoid main()int i,j;for(i=1;i=9;i+)coutn;for(j=1;j=i;j+) /*循环嵌套*/ couti*j=i*jt; 例4.4.4 打印乘法表。双重for

21、循环的执行过程:例4.4.5 求1!+2!+3!+5!#includevoid main() int i,j; long int s=0,m; for(i=1;i=5;i+) m=1; for(j=1;j=i;j+) m*=j; s+=m; coutsendl; m=1;s=0;当 i=5当j=im*=j;j+;s+=m;i+;coutsendl;#include 10 s=0; void main() 20 for(i=1;i=3;i+) int i,j; 30 m=1; long int m,s; 40 for(j=1;j=i;j+) 50 m*=j; 60 s+=m; 70 coutse

22、ndl; 102030405060m=1s=0i=1j=1m =1*1s= 0+ 1i=2j=1m=1m =1*1j=2m =1*2s= 1+ 2i=3j=1j=2j=4m=1m =1*1m =1*2m =2*3s= 3+ 670s= 9i=4外走一内走遍j=2j=3j=3#includevoid main() int i,j,n,m; long s=0,t; cinnm; for (i=1;i=n;i+) t=1; for (j=1;j=m;j+) t*=i*2-1; / t*=(i*2-1); s+= t; coutsn;例4.4.6 1m+3 m +5 m +7 m +.返回程序举例(p

23、90程序4-4-1)#includevoid main() int i,n;double p=1;coutn;for (i=1;i=n;i+) p*=i;coutn!=pendl;程序举例(p90程序4-4-2)#include#includevoid main() int n,x,max,min;coutn;for (;n=0;) coutn;cout从键盘上输入nx;max=min=x;for (;-n;)cinx;if (xmax) max=x;if (xmin) min=x;coutmax:maxendl;coutmin:minendl;程序举例(p90程序4-4-3)#include

24、void main() for (int a=0,b=1;b100;)couta b ;a=a+b;b=a+b;coutendl;couta b endl;程序举例(p91程序4-4-4)#includeconst int M=4, N=5;void main()int i,j,s=0;for (i=1;i=M;i+)for(j=1;j=N;j+)s+=i*j;coutsendl;应用举例(p92例4-4-1)例4-4-1 编一程序计算1+22+42+62+502的值。#includevoid main()int i,s=1;for (i=2;i=50;i+=2) s+=i*i;couts=s

25、endl;应用举例(p93例4-4-2) 例4-4-2 已知一组实验数据为3.62、2.93、3.16、3.73、2.86、3.40、2.86、3.07、3.29、3.24,编一程序分别求出它们的平均值、方差和均方差,要求每一结果只保留两位小数。应用举例(p93例4-4-2)#include#includeconst int N=10; /N等于待处理数据的个数void main()double x,s1,s2;s1=s2=0;cout从键盘上输入N个实验数据:n;for(int i=1;ix;s1+=x;s2+=x*x;double v,f,t;v=s1/N;f=s2/N-v*v;t=sqr

26、t(f);v=floor(v*100)/100; /使结果保留两位小数f=floor(f*100)/100; /使结果保留两位小数t=floor(t*100)/100; /使结果保留两位小数cout平均值:vendl;cout方 差:fendl;cout均方差:tendl;应用举例(p94例4-4-3) 例4-4-3 由勾股定理可知,在一个直角三角形中,两条直角边a和b与斜边c的关系为a2+b2=c2,编一程序求出每条直角边均不大于30的所有整数组解。#include#includeconst int N=30;void main()int a,b;double c;应用举例(p94例4-4-

27、3)for(a=1;a=N;a+)for(b=a+1;b=N;b+) c=sqrt(a*a+b*b); /求出斜边的长度if(fabs(c-int(c)1e-5) /若斜边同为整数/则输出 cout (a,b,c),;coutendl;应用举例(p94例4-4-4)例4-4-4 编一程序打印出299的所有素数。#include#includevoid main()int i,n;cout299之间的所有素数: 2 ;应用举例(p94例4-4-4)for(n=3;n=99;n+=2) int temp=int(sqrt(n)+1e-5);for(i=2;itemp) coutn ;coutn;例

28、4.4.2格式:while(表达式) 语句执行过程:先求表达式的值,判断为真为假, 若为真,则执行语句;否则退出循环。真假表达式语句假注意:语句:一个语句,复合语句,空语句表达式后面不能有分号4.5 while 语句(条件循环)例4.5.1:求1+2+3+100的和#includevoid main() int s,i; s=0; / s为累加和 i=1; / i为循环控制变量 while ( i=100 ) / 循环条件 s+=i ; i+; coutsendl; #include void main() int s,i;10: s=0; 20: i=1; 30: while ( i=4 )

29、 40: s+=i ;50: i+; 60: coutsendl; s=0循环过程如下:102040305060i=1s=0+1i=21s=1+2i=311i=4s=3+30s=6+4i=5s=101例4.5.2: 编程求 的近似值, 公式 /4 1-1/3+1/5-1/7+1/9-#include #include void main( ) int s; float n,t,pi; s=1;n=1;t=1;pi=0; while ( fabs(t)1e-6 ) pi=pi+t;n=n+2; s=-s;t=s/n; pi=4*pi; coutpi=pin;分析:题目仍可以看成是累加求和不同的是

30、, 相加的每一项正负相间, 公式是无穷的, 所以我们规定当相加项的绝对值小于等于0.000001(即106 )时停止计算tpins11-13-1/31010.671/551返回程序举例(p97例4-5-1) 分别统计出从键盘上输入的所有正整数中小于60和大于等于60的数据个数,然后显示出来。#includevoid main() int x,c1=0,c2=0; cinx; while(x=0) /当输入一个负数时结束循环 if (xx; coutc1 c2endl;程序举例(p97例4-5-2)采用辗转相除法求出两个正整数的最大公约数。#includevoid main() int a,b;

31、 coutab; while(a=0 | b=0 ) coutab; while(b) int r=a%b; a=b;b=r; coutaendl;程序举例(p98例4-5-3)随机产生出10个10199之间的素数并显示出来。#include#include#includevoid main()int i=10,a;while(i0)a=rand()%190+10;int j, k=int(sqrt(a)+1e-5);for (j=2;jk) couta ;i-;coutendl;应用举例(p99例4-5-1) 例4-5-1 编一程序求出满足不等式的最小n值。用while循环编写的程序如下:#

32、includevoid main() int i=0; double s=0; while (s5) s+=double(1)/+i; coutn=iendl;应用举例(p99例4-5-1)用for循环编写的程序如下:#includevoid main() int i; double s=0; for (i=1;s5;i+) s+=1.0/i; coutn=i-1endl; /此i-1的值为所求的n值应用举例(p99例4-5-2)例4-5-2 有一家企业,若年产值平均增长率分别按2%、4%、6%、20%计算,问分别需要经过多少年能够使年产值翻一番。分析: 假定把当年的年产值定为1个单位,则翻一

33、番后就应变为2。设年产值平均增长率为x,经过的年数为n,n年后的产值为y,则求y的计算公式为:应用举例(p99例4-5-2)#includevoid main() double x,y; int n; for (x=0.02;x0.21;x+=0.02) /*终值为0.20,考虑到数据运算精度,使用时做好增加半个步长值*/应用举例(p99例4-5-2)n=0;y=1; while (y2) n+; y*=1+x; coutx*100% n yendl; 应用举例(p100例4-5-3)例4-5-3 一家商场采用打折促销活动,具体做法是:购物满100元送30元购物券,用购物券购物同用人民币购物一

34、样遵循上述原则。若一个顾客一次购物花销x元,则最终能够得到几折优惠。 分析:花销x元得到的购物券为(int(x)/100)*30,假定这个值仍以x保存,则再购价值为x的物品后,同样又可以得到由上述公式计算出来的购物券,直到x为0时止。应用举例(p100例4-5-3)#include#include/此行可以省略#includevoid main() double x,a,s; coutx;应用举例(p100例4-5-3)while (x=0) cout0):;cinx; a=x;s=0; while (x) s+=x; x=int(x)/100*30; couta s floor(a/s*10

35、0+0.5)/100endl;注:x=int(x)/100*30;/这里计算的是x,不是s格式do 语句while (表达式)执行情况:先执行语句,再计算表达式的值,若非0,再执行语句;否则退出循环,执行下面的语句真表达式语句假 do后若有多条语句,需使用复合语句语句至少被执行一次,不同于while语句注意4.6 do-while语句(直到型循环); while 语句与do-while语句(求1到100的累加和)#includevoid main() int s,i; s=0; cini; while ( i=100 ) s+=i ; i+; couts;#includevoid main()

36、 int s,i; s=0; cini; do s+=i ; i+; while ( i=100 ); couts;输入:101输出:0输出:101输入:101 例4.6.1 把从键盘上输入的一个正整数按数字位的相反次序输出。#includevoid main()int num,rem;coutnum;do rem=num%10;num/=10;cout0);coutendl;程序举例(p102 程序4-6-1) 程序4-6-1 根据从键盘上输入的NM个整数,统计出3060范围内的整数个数,最后输出统计结果。程序举例(p102 程序4-6-1)#includeconst int NM=10;v

37、oid main() int x,n=1,c=0; do cinx; if (x=30 & x=60) c+; while(n+NM); coutc=cendl;程序举例(p103 程序4-6-2) 程序4-6-2 把从键盘上输入的一个大于等于3的整数分解为质因子的乘积。#includevoid main() int x; coutx;while (x=2);程序举例(p103 程序4-6-2)int i=2; do while(x%i=0) couti ; x/=i; i+; while(i=x); coutendl;请输入一个整数,若小于3则重输:62 3输出结果:应用举例(p103 例4

38、-6-1) 例4-6-1 编一程序把从键盘上输入的一个十进制正整数转换为对应的十六进制数字串输出。#includevoid trans(int x)/此函数得到的十六进制数字串是按照从低位到高位的次序排列的int rem; /用于保存整余数do rem=x%16;x=x/16;if (rem10) coutchar(rem+0);应用举例(p103 例4-6-1)else switch(rem) case 10:coutA;break; case 11:coutB;break;case 12:coutC;break; case 13:coutD;break;case 14:coutE;brea

39、k; case 15:coutF;break;while(x!=0);coutendl;应用举例(p103 例4-6-1)void main()int d;coutd;while(d0);trans(d);应用举例(p103 例4-6-1)#includevoid trans(int x)/此函数得到的十六进制数字串是按照从低位到高位的次序排列的char a10;int i=0,rem;do rem=x%16;x=x/16;if (rem0) couta-i;coutendl;void main()int d;coutd;while(d=0)2.精度:= |Xi+1-Xi|1.0e-33.所求

40、的根: 满足精度的Xn1.设两个变量来实现xi和 xi+1:例:x1和x2 迭代初值:x=-0.52. 设两个变量来实现f(xi)和f( xi):例:y1和 y23. 迭代的规律:x=x1 y1=f(x1) y2=f(x1) x2=x1-y1/y2 判断|x2-x1|=10-3? 是,x2为所求的根;否则x2 x1,再迭代,直到满足条件。程序见下页。算法实现:#include#includedouble Newton(double x)/x可以为任何值double x1,x2,y1,y2;x2=x;/给x2赋初值为xdo x1=x2;y1=exp(x1)+3*x1-2; /y1=f(x1)y2

41、=exp(x1)+3; /y2=f(x1)x2=x1-y1/y2;while(fabs(x2-x1)0.001);return x2;void main()double x;coutx;x=int(Newton(x)*1000)/1000.0;/保留运算结果的3位小数coutroot:xendl;三种循环语句的比较:for和 while语句是先判断循环条件再执行循环体,而do循环是先执行循环体,然后再判断,依次反复进行下去,直到循环条件的值为假时止,所以,for和 while的循环体可能一次也不执行;而do语句的循环体至少执行一次。 一般情况下,它们之间可以相互转换,编程时可 以任选使用,通常使用for循环较简单。 在任一种循环的循环体内都可以使用break语 句使之终止循环的执行,使用continue语句结束一次循环体的执行。循环结构小结一、 for 语句*二、 while语

温馨提示

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

评论

0/150

提交评论