《C++流程控制语句.ppt》由会员分享,可在线阅读,更多相关《C++流程控制语句.ppt(78页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第四章第四章 C+的流程控制语句的流程控制语句程序的三种基本结构程序的三种基本结构1、顺序、顺序AB2、选择、选择条件?条件?真真假假ABxy?真真假假z=xz=y3、循环、循环A当当P为真为真当型当型i+i=10i+PAYNif语句语句判断选择判断选择语句,有三种形式:语句,有三种形式:1)if(表达式)(表达式)语句语句语句语句条件条件真真假假语句语句2语句语句1条件条件真真假假2)if(表达式)(表达式)语句语句1 else 语句语句2 if(ab)coutb)couta;else coutb)a=1;b=0;else a=0;b=1;a=0b=1a=1b=0ab真真假假if(i j)i
2、+;if(ij);i+;i+ij真真假假if 总是与它上面最近的总是与它上面最近的 else 配对,如要改变,用复合语配对,如要改变,用复合语句句。注意书写格式注意书写格式,相互配对的语句要对齐。,相互配对的语句要对齐。ij真真假假i+例:输入两个实数,按代数值由小到大次序输出这两个数。例:输入两个实数,按代数值由小到大次序输出这两个数。void main(void)float a,b,t;/定义变量定义变量coutab;/给变量赋值给变量赋值 a:7,b:3 if(ab)t=a;a=b;b=t;/交换数据,用中间变量交换数据,用中间变量 coutatbendl;/输出变量输出变量bat737
3、73输出结果:输出结果:3 7嵌套的条件语句(举例说明)嵌套的条件语句(举例说明)x=100;a=10;b=20;ok1=5;ok2=0;if(ab?a:b;/求求a,b中的大者中的大者当当 a=2 b=1 ab为真,表达式的值等于为真,表达式的值等于a,max值为值为2当当 a=1 b=2 ab为假,表达式的值等于为假,表达式的值等于b,max值为值为2注意:注意:1.条件运算符的优先级比赋值运算符高条件运算符的优先级比赋值运算符高 2.x=(x=3)?x+2:x-33.2.结合方向自左至右结合方向自左至右 ab?a:cd?c:d4.3.三个表达式的类型可不同三个表达式的类型可不同 z=ab
4、?A:a+bx=5x=9,y=6,z=5;x=(x+y)%z=x%z+y%z)?1:0;coutx=xendl;x=1;y=2;z=3;x+=y+=z;couty?x+:y+)endl;y=y+z=5x=x+5=69x=0void main(void)int x=1,y=2,z=3;x+=y+=z;coutxy?y:xendl;coutxy?x+:y+endl;coutx“,”yendl;couty?x+:y+endl;couty“,”zendl;x=3;y=z=4;cout=y&y=x)?1:0endl;cout=y&y=xendl;xyz 输出输出653653666356636,66799
5、6797,934434403441执行以下程序段后,变量执行以下程序段后,变量a,b,c的值分别是:的值分别是:int x=10,y=9;int a,b,c;a=(-x=y+)?-x:+y;b=x+;c=y;x=8 y=10 a=8b=8 x=9c=10void main(void)int a=5,b=1,c=0;if(a=b+c)cout“*n”;else cout“$n”;*switch语句语句多分支选择语句。多分支选择语句。if语句只有两个分支,而实际问题中常常语句只有两个分支,而实际问题中常常需要用到多分支的选择。如,成绩分为需要用到多分支的选择。如,成绩分为A(10085)、B(84
6、70)、C(6960)、D(60以下以下)等。等。A10085YBY8470CY6960DYno passNNNN显示出错显示出错cin.get(grade);if(grade=A)cout“10085n”;else if (grade=B)cout“8470n”;else if (grade=C)cout“6960n”;else if (grade=D)cout“no passn”;else cout“errorn”;switch(表达式)表达式)case 常量表达式常量表达式1:语句:语句1 case 常量表达式常量表达式2:语句:语句2 case 常量表达式常量表达式n:语句:语句n d
7、efault:语句:语句n+1 switch(grade)case A:cout“10085n”;case B:cout“8470n”;case C:cout“6960n”;case D:cout“no passn”;default:cout“errorn”;如果如果grade为为 A,则结则结果为果为1008584706960no passerror其流程为:先计算表达式的值,然后顺序地其流程为:先计算表达式的值,然后顺序地与与case子句中所列出的各个常量进行比较,若子句中所列出的各个常量进行比较,若表达式的值与常量中的值相等,就开始进入表达式的值与常量中的值相等,就开始进入相应的相应的c
8、ase语句执行程序,语句执行程序,遇到遇到case和和default也不再进行判断,直至也不再进行判断,直至switch语句结束。语句结束。如果如果要使其在执行完相应的语句后中止执行下一要使其在执行完相应的语句后中止执行下一语句,可以在语句后加语句,可以在语句后加break。switch(grade)case A:cout“10085n”;break;case B:cout“8470n”;break;case C:cout“6960n”;break;case D:cout“no passn”;break;default:cout“errorn”;注意:注意:1、switch与与if不同,它仅能
9、判断一种逻辑关系,即不同,它仅能判断一种逻辑关系,即表达式是否表达式是否等于等于指定的常量,而指定的常量,而 if 可以计算并判断可以计算并判断各种表达式。各种表达式。2、case子句后必须为常量,常常是整型和字符型。子句后必须为常量,常常是整型和字符型。3、default可以省略,这时,不满足条件什么也不可以省略,这时,不满足条件什么也不执行。执行。4、case和和default只起标号的作用,只起标号的作用,顺序可以颠倒顺序可以颠倒,颠倒时注意后面的颠倒时注意后面的break语句。语句。5、多个、多个case语句可以共用一组程序。语句可以共用一组程序。case A:case B:case
10、C:cout“pass!n”;void main(void)int i=10;switch(i)case 9:i+;case 10:i+;case 11:i+;default:i+;cout“i=”iendl;i=11i=12i=13i=13int 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+;cout“a=“at“b=”bendl;a=1a=2 b=1a=2b=1有有3 3个整数个整数a,b,ca,b,c,由键盘输入,输出其中最大
11、的数。,由键盘输入,输出其中最大的数。while语句语句while(表达式)表达式)语句组语句组1 语句组语句组2表达式表达式语句组语句组1真真语句组语句组2假假a=3;while(a100)a=a+5;cout“a=“a;当循环语句超过一条时,要当循环语句超过一条时,要用用 将语句组组合在一起。将语句组组合在一起。求求 1+2+3+100void main(void)int i=1,sum=0;/定义变量,初始化定义变量,初始化 while(i=100)/构造循环构造循环 sum=sum+i;/循环体,多次执行循环体,多次执行 i=i+1;cout“sum=”sumendl;/输出结果输出结
12、果循环条件循环条件初值初值循环次数循环次数1234.99100101sumi0112真真33真真64真真105真真真真100真真101真真5050假假sum50500sum1i1233641005050101循环结束循环结束!实际上是将实际上是将i不停地累加到一起不停地累加到一起注意:注意:1、循环体如果为一个以上的语句,用、循环体如果为一个以上的语句,用 括起。括起。2、循环体内或表达式中必须有使循环结束的条件,、循环体内或表达式中必须有使循环结束的条件,即一定有一个循环变量。即一定有一个循环变量。3、while表达式可以成为语句,要特别小心。表达式可以成为语句,要特别小心。k=2;whil
13、e(k!=0)coutk,k-;coutendl;k循环条件循环条件输出输出输出:输出:212真真21真真10假假回车回车void main(void)int num=0;while(num=2)num+;coutnumendl;num循环条件循环条件输出输出1230真真11真真22真真33假假无无void main(void)int y=10;while(y-);cout“y=”yendl;y条件条件输出输出输出:输出:y=-1输出是什么?输出是什么?循环几次?循环几次?10真真无无9真真无无.真真无无1真真无无0假假1循环:循环:10次次k=10;while(k=0)k=k-1;cout
14、k;k10表达式表达式0输出:输出:0 x=10;while(x!=0)x-;x=10;while(x)x-;x=10;while(x-);x=10;while(-x);以下语句,循环退出时以下语句,循环退出时x为多少?为多少?x=0 x=0 x=-1x=0#includevoid main()char ch;while(cin.get(ch)&ch!=n)switch(ch-2)case 0:case 1:cout(char)(ch+4);case 2:cout(char)(ch+4);break;case 3:cout(char)(ch+3);default:cout(char)(ch+2
15、);break;coutendl;从键盘输入从键盘输入2473,则程序,则程序的输出结果是:的输出结果是:输出:输出:668977直到直到P为真为真A直到型直到型dowhile语句语句表达式表达式语句组语句组1真真语句组语句组2假假do 语句组语句组1while(表达式)(表达式);语句组语句组2求求 1+2+3+100void main(void)int i=1,sum=0;/定义变量,初始化定义变量,初始化 do /构造循环构造循环 sum=sum+i;/循环体,多次执行循环体,多次执行 i=i+1;while(i=100);cout“sum=”sum0)&(y5);cout“y=“y“,
16、”“x=”xendl;y0 x0条件条件输出:输出:y=1,x=010假假若为若为while循环,则循环,则一次也不执行循环一次也不执行循环体,输出为:体,输出为:y=0,x=0s=7;do s-=2;while(s=0);cout“s=”sendl;第一次第一次s75表达式表达式N输出:输出:s=5for语句语句for(表达式(表达式1;表达式;表达式2;表达式表达式3)语句组语句组1(循环体循环体)语句组语句组2N表达式表达式2语句组语句组1Y语句组语句组2表达式表达式1表达式表达式3for(循环变量赋初值循环变量赋初值;循环结束条件;循环结束条件;循环变量增值循环变量增值)求求 1+2+
17、3+100void main(void)int i,sum;for(i=1,sum=0;i=100;i+)sum=sum+i;cout“sum=”sumendl;void main(void)int i,sum;i=1;sum=0;while(i=100)sum=sum+i;i=i+1;cout“sum=”sumendl;注意:注意:1、当型循环,条件测试是在循环开始时进行,有可能一次、当型循环,条件测试是在循环开始时进行,有可能一次也进入不了循环体。也进入不了循环体。2、for语句中的三个表达式可以部分省略或全部省略,语句中的三个表达式可以部分省略或全部省略,但但;不能省略,不能省略,若省略
18、表达式若省略表达式2,则表示循环条件,则表示循环条件为真为真。3、for语句中三个表达式可以是任何有效的语句中三个表达式可以是任何有效的C语言表达式。语言表达式。void main(void)char i,j;for(i=a,j=z;ij;i+,j-)coutij;coutendl;次数次数ijij输出输出输出:输出:azbycx.lomnaz真真azby真真bycx真真cx真真.真真.mnmn.nm假假CR以下循环结果如何?以下循环结果如何?for(i=0,k=-1;k=1;i+,k+)cout“*n”;以下循环最多执行以下循环最多执行_次,最少执行次,最少执行_次次for(i=0,x=0;
19、ix;101循环的嵌套循环的嵌套一个循环体内又包含另一个完整的循环体,称为循一个循环体内又包含另一个完整的循环体,称为循环的嵌套。环的嵌套。注意:注意:1、循环体内有多个语句要用括起来。、循环体内有多个语句要用括起来。2、书写格式要清晰。、书写格式要清晰。for(;).for(;).void main(void)int i,j,k=0,m=0;for(i=0;i2;i+)for(j=0;j3;j+)k+;k-=j;m=i+j;cout“k=“k“,m=“mendl;ii2jjn)1、m被被n除得到余数除得到余数r(0r n)r=m%nm=6 n=4 r=m%n=6%4=2while(r=m%n
20、)m=n;n=r;最小公倍数为两数之积除以最大公约数。最小公倍数为两数之积除以最大公约数。4*6/2=122、若、若r=0,则算法结束,则算法结束,n为最大公约数,否则做为最大公约数,否则做33、mn,nr ,回到回到1m=4 n=2 r=m%n=4%2=0所以,公约数所以,公约数=2最大公约数:能同时被最大公约数:能同时被m和和n整除的最大数。整除的最大数。r=mn?n:mfor(i=1;ir;i+)if(m%i=0&n%i=0)a=i;couta;将将 12345 的每位分别打印出来。的每位分别打印出来。12345105 12345/1012341234104 1234/101231231
21、03 123/101212102 12/1011%101 1/100while(n)coutn%10=1e-5)S=S+term;term=(-1)*term*x*x/(2*n)*(2*n-1);n+;term=(-1)*term*t;前一项前一项当前项当前项旧的旧的新的新的后一项后一项(-1)前一项前一项t设通项为设通项为term,则可以写出迭代公式,则可以写出迭代公式t=x*x/(2*n)*(2*n-1)t=x*x/(2*n)*(2*n-1)第第n项项/第第n-1项:项:第一项:第一项:term=1;第一次循环:第一次循环:S=S+term;term=(-1)*term*t;第二次循环:第
22、二次循环:S=S+term;term=(-1)*term*t;这时这时左边的左边的term代表第二项,而代表第二项,而右边的右边的term为第一项。为第一项。这时这时左边的左边的term代表第三项,而代表第三项,而右边的右边的term为第二项。为第二项。term=(-1)*term*t;前一项前一项当前项当前项同样是同样是term,在循环中不断用旧的数值去推导赋值出新的,在循环中不断用旧的数值去推导赋值出新的数值。数值。S=0;term=1;n=1;/一定要赋初值一定要赋初值while(fabs(term)=1e-5)S=S+term;term=(-1)*term*x*x/(2*n)*(2*n
23、-1);n+;旧的旧的新的新的break语句和语句和continue语句语句break在在switch语句中,可以语句中,可以使流程跳过判断体使流程跳过判断体,执执行下面的程序行下面的程序。在循环体中,也可以从循环体内跳在循环体中,也可以从循环体内跳出循环体,提前结束循环出循环体,提前结束循环。for(;)cinx;if (x=123)break;当输入当输入123时,结束循环。时,结束循环。break 只能退出一层循环或只能退出一层循环或switch语句。语句。a=10;y=0;do a+=2;y+=a;cout“a=“a“,y=“y50)break;while (a=14);第一次:第一次
24、:a=12 y=12输出:输出:a=12,y=12第二次:第二次:a=16 y=28输出:输出:a=16,y=28第三次:第三次:a=16 y=44输出:输出:a=16,y=44第四次:第四次:a=16 y=60输出:输出:a=16,y=60continue:其作用为:其作用为结束本次循环结束本次循环,即跳过循环体中下面,即跳过循环体中下面尚未执行的语句,尚未执行的语句,接着进行下一次是否执行循环的判定接着进行下一次是否执行循环的判定。void main(void)int i;for(i=1;i=5;i+)if(i%2)cout“*”;else continue;cout“#”;cout“$n
25、”;ii=5i%2输出输出输出:输出:*#*#*#$1真真1*#2真真0无无3真真1*#4真真0无无5真真1*#6假假$void main(void)int i,j,x=0;for(i=0;i2;i+)x+;for(j=0;j=3;j+)if(j%2)continue;x+;x+;cout“x=“xendl;jj%2xi=0 i2 第一次第一次jj%2xi=1 i2 第二次第二次i=2 i2 结束结束输出:输出:x=80假假21真真22假假33真真3440假假61真真62假假73真真748void main(void)int k=0;char c=A;do switch(c+)case A:k
26、+;break;case B:k-;case C:k+=2;break;case D:k=k%2;continue;case E:k=k*10;break;default:k=k/3;k+;while(cG);cout“k=”kendl;c+ck输出:输出:k=4A真真B2B真真C4C真真D7D真真E1E真真F11F假假G4总结:总结:在循环体中,在循环体中,break从循环体内跳出循环体,提前从循环体内跳出循环体,提前结束循环结束循环。for(.;.;.).break;.continue:其作用为:其作用为结束本次循环结束本次循环,即跳过循环体,即跳过循环体中下面尚未执行的语句,中下面尚未执
27、行的语句,接着进行下一次是否执行接着进行下一次是否执行循环的判定循环的判定。for(.;.;.).continue;.while(.).continue;.求素数:只可以被求素数:只可以被1与自身整除的数。与自身整除的数。判断一个数判断一个数 t 是否为素数,用是否为素数,用2到到t-1循环除。循环除。for(i=2;it ;i+)if(t%i=0)break;if (i=t)cout“是素数。是素数。n”;else cout=t/2)求范围内的素数求范围内的素数(50100):for(t=50,k=0;t=100;t+)for(i=2;it ;i+)if(t%i=0)break;if (i=
28、t)coutt“;k+;if(k%5=0)coutendl;判断判断t是否是否为素数为素数保证每行输出保证每行输出5个数据个数据鸡兔共有鸡兔共有30只,脚共有只,脚共有90只,问鸡兔各有多少?只,问鸡兔各有多少?void main(void)int i;/i代表鸡,则兔为代表鸡,则兔为30-i只只 for(i=0;i=15;i+)if(2*i+4*(30-i)=90)cout“鸡鸡”iendl;cout“兔兔”30-iendl;一百万富翁一百万富翁 遇到一陌生人,陌生人找他谈一个换钱遇到一陌生人,陌生人找他谈一个换钱的计划,该计划如下:我每天给你十万元,而你第的计划,该计划如下:我每天给你十万
29、元,而你第一天只需给我一分钱,第二天我仍给你十万元,你一天只需给我一分钱,第二天我仍给你十万元,你给我两分钱,第三天我仍给你十万元,你给我四分给我两分钱,第三天我仍给你十万元,你给我四分钱,钱,.,你每天给我的钱是前一天的两倍,直到,你每天给我的钱是前一天的两倍,直到满一个月(满一个月(30天),百万富翁很高兴,欣然接受了天),百万富翁很高兴,欣然接受了这个契约。请编写程序计算陌生人给百万富翁多少这个契约。请编写程序计算陌生人给百万富翁多少钱,百万富翁给陌生人多少钱?钱,百万富翁给陌生人多少钱?利用循环语句编程,打印下列图形:利用循环语句编程,打印下列图形:*找规律:找规律:上面四行上面四行
30、行号行号空格空格星号星号131222313404 for(i=0;i0;j-)cout ;for(k=1;k=i+1;k+)cout*;coutendlendl;行号:行号:i空格:空格:4-i星号:星号:ivoid main(void)int i,j,k;for(i=0;i0;j-)cout ;for(k=1;k=i+1;k+)cout*;coutendlendl;for(i=0;i0;j-)cout*;coutendlendl;打印图形:打印图形:*行号行号空格空格星号星号031123215307行号:行号:i空格:空格:3-i星号:星号:2*i+1如果打印如果打印n行行行号:行号:0n-
31、1空格:空格:0n-1-i计算:计算:222222.2222222?累加和累加和 s0设通项为设通项为tt的初值为的初值为222=2*10+2;222=22*10+2;2222=222*10+2;t=t*10+2;所以,通项的循环表示为:所以,通项的循环表示为:前一项前一项当前项当前项循环体为:循环体为:s=s+t t=t*10+2;void main(void)int t,s;s=0;t=2;for(int i=0;i7;i+)s=s+t;t=t*10+2;coutsendl;满足以下条件三位数满足以下条件三位数n,它除以,它除以11所得到的商等于所得到的商等于n的各位数字的平方和,且其中至
32、少有两位数字相的各位数字的平方和,且其中至少有两位数字相同。同。131 131/11=11 12+32+12=11分析:分析:数字应该从数字应该从100循环到循环到999将每位数字剥出,判断其是否满足条件将每位数字剥出,判断其是否满足条件满足以下条件三位数满足以下条件三位数n,它除以,它除以11所得到的商等于所得到的商等于n的各位数字的平方和,且其中至少有两位数字相的各位数字的平方和,且其中至少有两位数字相同。同。131 131/11=11 12+32+12=11分析:分析:用用a,b,c分别代表三位数,分别代表三位数,a,b,c分别从分别从0循环到循环到9,组,组成所有可能的三位数,然后找出
33、满足条件的数来。成所有可能的三位数,然后找出满足条件的数来。求求n=1000时时的近似值的近似值分析:分析:通项:通项:s=st迭代算法:迭代算法:上次迭代上次迭代的结果的结果本次计算本次计算的结果的结果迭代结束条件:迭代结束条件:迭代迭代 1000次次注意注意s与与t的初始值的初始值n从从1开始迭代开始迭代 s=1下面程序的功能是用公式求下面程序的功能是用公式求的近似值,直到最后一项的值的近似值,直到最后一项的值小于小于10-6为止。请填空。为止。请填空。void main(void)int i=1;_ pi=0;while(i*i=10e+6)pi=_ ;i+;pi=sqrt(6.0*pi);cout“pi=”piendl;doublepi+1.0/(i*i)有有1020个西瓜,第一天卖一半多两个,以后每天卖剩下的个西瓜,第一天卖一半多两个,以后每天卖剩下的一半多两个,问几天以后能卖完?请填空。一半多两个,问几天以后能卖完?请填空。#include”stdio.h”void main(void)int day,x1,x2;day=0;x1=1020;while(_)x2=_;x1=x2;day+;cout“day=”dayendl;x1x1/2-2
限制150内