《C++程序设计程序控制结构.ppt》由会员分享,可在线阅读,更多相关《C++程序设计程序控制结构.ppt(69页珍藏版)》请在课桌文档上搜索。
1、1,第 3章 程序控制结构,2,主 要 内 容,实现结构化程序设计的3种基本结构,即顺序结构、选择结构和循环结构,以及实现这3种结构的相关语句、3种结构程序的设计方法及条件运算符的应用。程序中语句的执行顺序称为“程序结构”。计算机程序是由若干条语句组成的语句序列。如果程序中的语句是按照书写顺序执行的,称为“顺序结构”;如果某些语句是按照当时的某个条件来决定是否执行,称为“选择结构”;如果某些语句要反复执行多次,称为“循环结构”。,3,【例3.1】输入的三条边a,b,c,求三角形面积 area=s(s-a)(s-b)(s-c),其中 s=(a+b+c)/2,3.1 顺序结构程序设计,图3.2 顺
2、序结构程序举例,程序执行时按照语句序列的书写顺序,4,源程序清单:#include using namespace std;#include void main()float s,a,b,c,area;cinabc;s=1.0/2*(a+b+c);area=sqrt(s*(s-a)*(s-b)*(s-c);coutarea=areaendl;,s,a,b,c,area,4.6,5.1,3.5,6.60,7.834539,3.5 4.6 5.1,area=7.834539,-,-,-,5,3.2 选择结构程序设计,选择结构体现了程序的判断能力。在执行过程中,依据运行时某些变量的值确定某些操作是否
3、执行,或者确定若干个操作中选择哪个操作执行,这种程序结构称为选择结构,又称为分支结构。选择结构有3种形式:单分支结构、双分支结构,多分支结构,6,3.2.1 if语句的3种形式,1单分支选择结构:if(表达式)语句;功能:计算表达式的值。如果条件为真(非0)则执行“语句”,否则不执行语句。说明:(1)其中,表达式可为任何类型,常用的是关系表达式或逻辑表达式。(2)语句可以是任何可执行语句,可以是空语句或复合语句、也可以出现内嵌简单的if 语句。,只有一条语句时可省略大括号,7,【例3.2】输入一个学生成绩,如果及格则输出“good!”,否则什么也不做。,#include using names
4、pace std;void main()float g;cing;if(g=60)coutgood!endl;,g,50,-,50,-,67,good!,-,g=60,N,Y,开始,结束,60,8,【例3.3】将两个整数a,b中的大数存入a中,小数存入b中。,算法分析:设一个中间变量temp暂存数据,其操作步骤为:(1)将a 赋给temp,语句为temp=a;(2)将b赋给a,语句为 a=b;(3)将temp赋给b(原来a 的值),语句为 b=temp;,9,void main()int a,b,temp;cinab;if(ab)temp=a;a=b;b=temp;couta=a,b=bend
5、l;,#include using namespace std;,5 9,a,b,5,9,5,9,5,temp,a=9,b=5,-,-,ab,a,b交换,N,Y,开始,结束,9 5,-,a=9,b=5,-,10,2.双分支选择结构,格式:if(表达式)语句1;else 语句2;说明:语句1和语句2可以是一条语句、复合语句或是内嵌if语句等,也可以是空语句。if-else的配对原则是:else 总是与同一层最近的尚未配对的if 语句配对。,只有一条语句时可省略大括号,11,【例3.4】输入一个英文字符,是字母则输出“YES!”,否则输出“NO!”。,12,程序清单:#include using
6、namespace std;void main()char c;cinc;if(c=a,c,YES!,s,NO!,8,8,S,-,-,-,13,程序流程多于两个分支称为多分支多分支程序结构使用嵌套的if-else语句实现。,if()if()语句1 else 语句2 else if()语句3 else 语句4,只有一条语句时可省略大括号,14,只在else分支嵌套,if()else if()语句3 else 语句4,/省略括号表示方式if(表达式)语句1;else if(表达式)语句 2;else if(表达式)语句3;.else 语句n;,15,【例3.5】求如下所示分段函数的y值。,-1 x
7、0,x=0,N,Y,y=0,结束,x0,N,Y,y=1,y=-1,开始,条件x0,else分支嵌套,16,程序清单:,#include using namespace std;void main()int x,y;cinx;if(x0)y=-1;else/else子句是与上面的if(x0)配对 if(x=0)y=0;else y=1;/else子句是与最近的if(x=0)配对 coutx=x,y=yendl;,-5,y,x,-1,x=-5,y=-1,-5,-,-,17,if(x=0)分支嵌套,18,程序清单:,#include using namespace std;void main()in
8、t x,y;cinx;if(x=0)if(x=0)y=0;else y=1;else y=-1;coutx=x,y=yendl;,-5,y,x,-1,x=-5,y=-1,-5,19,C 语言不限制嵌套层数,s170,N,输入s1,结束,s160,N,Y,开始,输出s2,s2=A,s180,s190,s2=B,s2=C,s2=D,s2=E,N,N,Y,Y,Y,【例如】将百分制成绩s1换为5分制成绩s2,可以用如if-else-if语句来完成。,20,void main()int s1;char s2;cins1;if(s160)s2=E;else if(s170)s2=D;else if(s18
9、0)s2=C;else if(s190)s2=B;else s2=A;couts2endl;,书写时要注意:if-else结构尽量缩格对齐,21,嵌套注意的一点是if和else的配对关系,if(ab)if(bc)c=a;else c=b;,if(ab)if(bc)c=a;else c=b;,if(ab)if(bc)c=a;else c=b;,?,为使程序逻辑清晰,将if和else的子句设计成复合语句(即使用 括起来),22,3.2.2 条件运算符?:,(表达式1)?(表达式2):(表达式3)功能:先计算表达式1,如果表达式1的值是非0(真),则其结果取表达式2的值,否则,取表达式3的值。例如:
10、max=(ab)?a:b;当a=3,b=4时:变量max取变量b的值,为4。,23,说明:(1)条件运算符的结合方向“自右向左”ab?a:cd?c:d 则相当于:ab?a:(cd?c:d)(2)三个表达式类型没有限制。如:x?a:b xy?1:1.5(3)条件表达式可以作函数参数,如:printf(max of%d,%d i%dn,a,b,(ab)?a:b);,24,【例3.6】输入一个英文字母,判断是否为英文大写字母,若是大写字母直接输出,否则转换成大写字母输出。#include using namespace std;void main()char ch;cinch;ch=(ch=A,25
11、,3.2.3 switch语句实现多分支选择结构,表达式,语句组1,语句组2,语句组n,语句组n+1,.,=常量 表达式1,=常量 表达式2,=常量 表达式n,其它,在多分支中选择一个分支操作,26,3.2.3 switch语句实现多分支选择结构,switch(表达式)case 常量表达式1:语句组1;break;case 常量表达式2:语句组2;break;case 常量表达式3:语句组3;break;case 常量表达式n:语句组n;break;default:语句组n+1;,27,【例3.7】输入i,根据i 的值输出信息。,#include using namespace std;voi
12、d main()int i;cini;switch(i)case 1:coutI am in case 1.endl;break;case 2:coutI am in case 2.endl;break;case 3:coutI am in case 3.endl;break;default:coutI am in case 4.endl;,i,2,2,I am in case 2.,-,-,28,break是C 语言的一种语句,其功能是中断正在执行的语句。如果省略了break语句,则执行完某个语句组后,将继续执行其后边的语句组。,void main()int i=2;switch(i)cas
13、e 1:coutI am in case 1.endl;case 2:coutI am in case 2.endl;case 3:coutI am in case 3.endl;default:coutI am in case 4.endl;,i,2,I am in case 2.,I am in case 3.,I am in default.,case后的常数可以是任意的,并不一定要从小到大排列,-,-,-,29,【例3.8】case子句的入口表达式是字符常量的程序举例。,void main()char c=x;switch(c)case a:coutI am in case a.end
14、l;break case x:coutI am in case x.endl;break case z:coutI am in case z.endl;break;default:coutI am in case a.endl;,30,【例3.9】将百分制成绩分段。,31,void main()int s;cins;switch(s/10)case 0:case 1:case 2:case 3:case 4:case 5:coutE.endl;break;case 6:coutD.endl;break;case 7:coutC.endl;break;case 8:coutB.endl;brea
15、k;case 9:default:coutA.endl;,s,35,35,E.,-,-,32,3.3 循环结构程序设计,3.3.1 当型循环程序结构 while(表达式)语句;,功能:计算表达式值,其值若为真(非0)则反复执行语句,直到表达式的值为假时为止。说明:(1)表达式可以是任何类型,常用的是关系型或逻辑型表达式。(2)重复执行的操作称为“循环体。(3)在循环体中还可以包含“循环语句”,多重循环。(4)while循环执行原则是“先判断,后执行”。,条件,N,Y,循环体,只有一条语句时可省略大括号,33,构成循环的三要素,循环当中应当有一个变量,控制循环条件的变化,叫做循环控制变量;满足三
16、个基本条件,即:有一个明确的初值 明确的终值 明确的步长值(每次变化的大小),34,【例3.10】设有变量i=0,1,2,3,4,要求输出i的5个值,每个数字间隔3个字符位下一行输出:“We are out of the loop.”。,i=0,结束,i5,N,Y,i+,开始,输出i和空格,输出We,35,程序清单:,void main()int i=0;while(i5)couti;i+;coutendl;coutWe are out of the loop.endl;,i,0,1,1,2,2,3,3,4,4,5,We are out of the loop.,-,-,-,-,-,-,-,3
17、6,注意:,例如以下循环语句的判断表达式是1,这个循环称为永真循环。while(1),循环控制变量要不发生变化,循环永远不会结束,这种循环称为“死循环”或“永真循环”。,37,【例3.11】求sum=1+2+3+100。,void main()int i=1,sum=0;/累加器的初值为0 while(i=100)/i为循环控制变量,初值1,终值100 sum=sum+i;i+;/i步长值为1 coutsumendl;,i,1,sum,0,1,2,3,3,6,4,100,5050,101,5050,#include using namespace std;,-,38,将上例改成求任意10个实数
18、的代数和,则可以将循环体改为:,i=0;while(ix;/每循环1次,输入1个x的值 sum=sum+x;i+;,39,3.3.2 直到循环程序结构,do语句;while(表达式);,条件,N,Y,循环体,功能:先执行循环体,然后计算表达式值,其值若为真(非0)则继续执行循环体,直到表达式为假时为止。,40,【例3.12】用do-while循环语句改写1+2+100,void main()int i=1,sum=0;do sum=sum+i;i+;while(i=100);coutsumendl;,i=1,sum=0,结束,i=100,N,Y,i+,开始,sum=sum+i,输出sum,10
19、0次,41,【例3.13】while和do-while循环的比较。,(1)main()(2)main()int i,sum=0;int i,sum=0;cini;cini;while(i=10)do sum=sum+i;sum=sum+i;i+;i+;while(i=10);coutsumendl;coutsumendl;,1 1sum=55 sum=55再运行一次 再运行一次11 11sum=0 sum=11,42,3.3.3 次数循环程序结构,次数循环结构如同当循环,它的特点是:设计循环时,确定了循环体执行的次数,在执行循环过程中,根据控制变量的变化使得程序完成反复操作。for(表达式1;
20、表达式2;表达式3)语句;表达式1:循环控制变量的初始化(只执行1次)。表达式2:循环判断条件,是循环的入口,若条件满足则执行循环体,否则结束循环。表达式3:改变循环控制变量操作(循环控制变量的增量),执行完循环体后,执行该语句,循环体:由“语句”部分来描述,只有一条语句时可省略大括号,43,for(表达式1;表达式2;表达式3)语句;,求解表达式1,表达式2,N,Y,求解表达式3,语句,for语句的下一条语句,44,【例3.14】将 1+2+3+100 改用for语句书写。,#include using namespace std;void main()int i,sum=0;for(i=1
21、;i=100;i+)sum+=i;coutsum=sum,i=iendl;,i,sum,0,1,1,2,3,3,100,5050,101,sum=5050,i=101,-,45,for循环的多种表现形式:,(1)for循环语句的表达式1 和表达式3 都可以是逗号表达式。例如:int i,sum;for(i=1,sum=0;i=100;i+,sum+=i)(2)表达式3也可以出现在循环体中。但格式中的“;”不能丢。int i,sum;for(i=1,sum=0;i=100;)i+;sum+=i;,46,3.3.4 循环嵌套与多重循环程序结构,在一个循环的循环体内又包含另一个循环语句,称为循环嵌套
22、结构。两层循环嵌套结构称为双层循环结构;两层以上的嵌套结构,则称为多重循环结构。,不合法,合法,47,【例3.15】设计循环嵌套结构,计算百钱买百鸡问题。公鸡5元1只,母鸡3元1只,鸡雏1元3只,100元钱买100只鸡,有多少种买法?,算法分析:将所有可能买成功的买法是:100元钱最多买20只公鸡、33只母鸡,建立以公鸡为控制变量的外循环,内嵌以母鸡为循环控制变量的循环,鸡雏z=100-公鸡数-母鸡数,如果买3种鸡用的钱数等于100,则说明购买成功。判断表达式为:x*5+y*3+(100-x-y)/3.0)=100&(z%3=0),48,#include using namespace std
23、;void main()int x,y,z;/公鸡,母鸡,小鸡 for(x=1;x=20;x+)/公鸡分别是1,2,20只 for(y=1;y=33;y+)/母鸡分别是1,2,33只 z=100-x-y;/小鸡个数 if(x*5+y*3+(100-x-y)/3)=100,外循环括号可省略,49,void main()int x,y,z;for(x=1;x=20;x+)for(y=1;y=33;y+)z=100-x-y;if(x*5+y*3+(100-x-y)/3.0)=100)coutx=x,y=y,z=zendl;,1,程序运行示意图:,x=4,y=18,z=78x=8,y=11,z=81x
24、=12,y=4,z=84,x,y,z,1,34,66,2,1,34,65,3,1,34,64,4,21,34,46,结论:外循环一次,内循环33次共循环20*33次,50,3.3.5 3种循环语句的比较,(1)for语句简洁、清晰,它将初始条件、判断条件和循环变量的在一行书写,显得直观、明了,多用于处理初值、终值和步长值都明确的问题。While语句多用于处理精确计算、利用终止标志控制循环的问题。(2)while 和do-while语句的循环控制变量初始化是在循环语句之前完成;而for语句循环变量的初始化是在for语句中的表达式1中,也可以在for语句前实现。(3)for 语句与while语句执
25、行过程相同,先判断条件后执行循环体;do-while语句执行循环体后判断循环条件,无论条件是否满足都要执行一次循环体。,51,3.4 循环体内使用break语句和continue语句,C 程序的循环体内可以设定循环中断语句提前结束循环,也可以设定结束本次循环体的操作提前进入下次循环操作3.4.1 break语句 break语句用于强制中断循环的执行,结束循环。格式是:break;功能:强制中断当前的循环,不再执行后面的循环语句而退出循环。说明:(1)此语句只能用在3条循环语句的循环体中或switch语句中,单独使用此语句无意义。(2)当break语句用于do-while、for、while循环
26、语句中时,通常总是与if语句联用。即满足if(条件)时便跳出循环。,52,【例3.16】计算半径r=1到10时的面积并输出,直到面积大于100为止。,Y,break,r=10,N,输出area,r+,area100,Y,N,r=1,结束,开始,53,程序清单:,#include using namespace std;const float PI=3.1415926;void main()int r;float area;for(r=1;r100)break;else coutarea=areaendl;,area=3.14,r,float,1,3.141593,area=12.57,5,78
27、.53982,area=28.27,area=78.54,area=50.27,6,113.0973,54,在多层循环中,break语句只向外跳一层。例如:,for(x=1;x=20;x+)/外循环体用 括起来更清晰 for(y=1;y=33;y+)/内循环体用 括起来更清晰 z=100-x-y;if(x*5+y*3+(100-x-y)*3.0=100)coutx=x,y=y,z=zendl;break;/break跳出内循环,进入外循环,55,【例3.17】从键盘上输入若干个字符,以回车换行符作为结束符号(称为终止标志),统计有效字符个数。,算法分析:(1)有效字符指第一个空格出现之前的所有
28、字符。如果没有输入空格则以回车换行符为结束符,如果输入了空格强制结束程序。(2)在程序中设一个计数器n用来统计字符出现的个数。,56,#include using namespace std;void main()int n=0;char c;while(c=getchar()!=n)if(c=)break;n+;coutnumber of charater=nendl;,n,0,1,c,2,3,4,number of charater=4,G,a,b,c,d,-,-,O,O,D,-,57,3.4.2 continue 语句,功能:continue语句用于中断本次循环,提前进入下次循环。说明:
29、(1)continue语句只用在for、while、do-while等循环体中,通常与if条件语句一 起使用,用来加速循环执行。(2)循环体中单独使用continue 语句无意义。,58,【例3.18】输出100到200间能被3整除的自然数,100=n=200,n%3!=0,输出n,N,Y,N,Y,continue;,59,#include using namespace std;void main()int n,i=0;for(n=100;n=200;n+)if(n%3!=0)continue;coutn;i+;if(i%10=0)/逢10换行 coutendl;,102,105,129,1
30、32,135,159,162,165,189,192,195,198,n,-4376,i,0,100,101,102,-,1,103,201,33,-,60,3.5 goto语句及标号语句,goto语句为无“条件转向语句”,它可以出现在程序的任何地方,实现程序流程的任意转移,即跳到某一位置去执行该位置的语句。,61,【例3.19】计算s=1+2+3+4+100,使用goto 语句实现。,#include using namespace std;void main()int i=1,s=0;loop:/此处为标号,表示重复操作的语句入口 s+=i;+i;if(i=100)goto loop;/此
31、语句为无条件转移语句 coutsendl;,62,3.6 综合举例,【例3.20】使用公式/4=1-1/3+1/5-1/7+,求值,要求精度达到其最后一项的近似值的绝对值小于10-6为止。算法分析:(1)最后一项用变量t表示,作为循环结束条件,调用系统函数求绝对值,条件表达式为:fabs(t)1e-6。(2)分母n作为循环控制变量,步值为n+=2,符号用s表示,则t=s/n.(3)p为累加器,pi=pi+t.,63,#include using namespace std;#includevoid main()int s=1;float n=1.0,t=1,pi=0;while(fabs(t)
32、1e-6)pi=pi+t;n=n+2;s=-s;t=s/n;pi=pi*4;coutpi=piendl;,/4=1-1/3+1/5-1/7+,64,【例3.21】求Fibonacci数列前20个数。这个数列有如下特点,第1,2项均为1。从第3项开始,该数是前两个数之和。,f1=1(n=1)f2=1(n=2)fn=fn-1+fn-2(n3)算法分析:(1)根据题意已知第1个数为f1=1,第2个数为f2=1。通过f1和f2求出下一对数,即新的f1和f2;计算公式是:f1=f1+f2;f2=f2+f1。已给出第1对数,只需再求9对即可。(2)只需定义f1,f2两变量,以后求出的新数覆盖旧数。,65,
33、#include using namespace std;#includevoid main()long int f1,f2;int i;f1=1,f2=1;for(i=1;i=10;i+)coutsetw(12)f1setw(12)f2endl;f1=f1+f2;f2=f2+f1;,f1=1(n=1)f2=1(n=2)fn=fn-1+fn-2(n3),f1 f2 f3 f4 f5 f6 1 1 2 3 5 8,66,【例3.22】求100至200之间的所有素数。,算法分析:如果m 为素数,m不能被2之间的任何整数整除。#include void main()int m,k,i,n=0;for(m=101;mk+1)/判断i是否超出k,如果超出k,则为素数 coutsetw(6)m;/输出数据m宽度6 n=n+1;/统计素数 if(n%10=0)coutendl;/每输出10个素数换行 coutendl;,67,习题:备用图片,68,备用,N-S流程图,N-S流程图,69,备用,