版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第三章程序的流程控制
——语句主讲人:侯海良通信与控制工程系第三章程序的流程控制
——语本章内容流程控制概述顺序控制选择控制循环控制无条件转移控制程序设计风格本章内容流程控制概述流程控制概述表达式构成了数据处理的基本单位。当程序中有多个表达式时,就会面临:先计算哪一个表达式根据不同的情况计算不同的表达式一个或几个表达式需要重复计算多次语句实现对程序执行流程的控制,包括:顺序控制:按书写次序执行。选择控制:根据条件选择执行。循环控制:重复执行。流程控制概述表达式构成了数据处理的基本单位。C++语句的分类C++语句的分类顺序控制按书写次序,从左到右、从上到下顺序执行。实现顺序控制的C++语句有:表达式语句复合语句空语句顺序控制按书写次序,从左到右、从上到下顺序执行。表达式语句在C++表达式的后面加上一个分号“;”就可以构成表达式语句,其格式为:<表达式>;例如:a+b*c;a>b?a:b;a++;x=a|b&c;
连续的多个表达式语句按它们的书写次序依次执行。表达式语句在C++表达式的后面加上一个分号“;”就可以构成较常使用的表达式语句赋值自增/自减函数调用输入/输出例如x=a+b;//赋值x++;//自增f(a);//函数调用cin>>a;//输入cout<<b;//输出表达式语句程序例1表达式语句程序例2例1:编写一个程序,从键盘输入一个数,计算该数的平方、立方及平方根并输出例2:编写一个程序计算a+2a+3a+…的前n项的和较常使用的表达式语句赋值表达式语句程序例1表达式语句程序例复合语句复合语句是由一对花括号括起来的一条或多条语句,又称为块(block)。语法上,复合语句可看作是一个语句。其格式为:{<语句序列>}<语句序列>中的语句可以是任何的C++语句,其中包括数据定义和声明语句。复合语句中的语句序列一般按照书写次序执行。复合语句一般作为函数体和结构语句的成分语句。复合语句复合语句是由一对花括号括起来的一条或多条语句,又称为复合语句举例{ inta,b; cin>>a>>b; intmax; if(a>=b)//选择语句 max=a; else max=b; cout<<max<<endl;}{inta,b;cin>>a>>b;intmax;max=a>b?a:b;cout<<max<<endl;}将选择语句用一个语句完成复合语句举例{ {将选择语句用一个语句完成空语句根据程序设计的需要,在程序中的某些地方有时需要加上一些空操作,以方便其它流程控制的实现。空语句的格式为: ;空语句不做任何事情,其作用是用于语法上需要一条语句的地方,而该地方又不需做任何事情。空语句常常作为结构语句的子句。
空语句根据程序设计的需要,在程序中的某些地方有时需要加上一例如:{ ...... ...gotoend;//转向下面由语句标号end标识的空语句 ...... end:;//空语句}其中,在“end:;”中,end是一个语句标号,“;”是一个空语句。再例如:inti,sum;for(sum=0,i=1;i<=100;sum+=i,i++);
其中,循环体为一条空语句例如:选择控制在程序中,常常需要根据不同的情况来从一组语句中选择一个来执行(分支),这是通过选择语句来完成的。选择语句包括:if语句switch语句选择控制在程序中,常常需要根据不同的情况来从一组语句中选择一if语句if语句(又称条件语句)是根据一个条件满足与否来决定是否执行某个语句或从两个语句中选择一个语句执行。
if语句有两种格式:if(<表达式>)<语句>if(<表达式>)<语句1>else<语句2>其中的<语句>、<语句1>、<语句2>必须是一个语句!(复合语句算一个语句。)if语句if语句(又称条件语句)是根据一个条件满足与否if语句的含义第一种格式第二种格式if语句的含义第一种格式第二种格式例3.3:从键盘输入三个整数,计算其中的最大值并将其输出#include<iostream>usingnamespacestd;intmain(){ inta,b,c,max; cout<<"请输入三个整数:"<<endl; cin>>a>>b>>c;
if(a>b) max=a; else max=b; if(c>max)max=c; cout<<"最大者为:"<<max<<endl; return0;}max=a>b?a:b;max=max>c?max:c;将选择语句其它语句替换例3.3:从键盘输入三个整数,计算其中的最大值并将其输出#i例3.4:求一元二次方程ax2+bx+c=0的实解分析:写程序不等同于做数学题目,一定要考虑清楚各种可能的情况,这样才能保证程序的健壮性。在写该程序时,由于a、b、c是由键盘输入,应该考虑情况有:(1)a=0,一元二次方程变成线性方程(2)▽<0,方程无实数解(3)▽=0,方程只有一个实数解(4)▽>0,方程有两个实数解具体程序如下:程序一求出方程所有解的程序如下:程序二例3.4:求一元二次方程ax2+bx+c=0的实解分析:写程if语句的锯齿格式为了提高程序的易读性,在写if语句时,最好采用“锯齿”格式。如格式一如果if语句嵌套层次很深,“锯齿”格式将会使得程序正文严重偏向右边,给查看程序带来困难。可以把if语句写成格式二:
格式二:if(...)...elseif(...)...elseif(...)...else...格式一:锯齿形if(...)...elseif(...)...elseif(...)...else...注意:If…else嵌套时,else与最近的if保持匹配if语句的锯齿格式为了提高程序的易读性,在写if语句时,最好例5:从键盘输入一个三角形的三条边,判断其为何种三角形
#include<iostream>usingnamespacestd;intmain(){ inta,b,c; cin>>a>>b>>c; if(a+b<=c||b+c<=a||c+a<=b) cout<<"不是三角形"; elseif(a==b&&b==c) cout<<"等边三角形"; elseif(a==b||b==c||c==a) cout<<"等腰三角形";
elseif(a*a+b*b==c*c||b*b+c*c==a*a||c*c+a*a==b*b) cout<<"直角三角形(非等腰)"; else cout<<"其它三角形"; cout<<endl; return0;}思考:如何在程序中增加判断等腰直角三角形的语句?例5:从键盘输入一个三角形的三条边,判断其为何种三角形#i方法一:
elseif(a*a+b*b==c*c||b*b+c*c==a*a||c*c+a*a==b*b){if(a==b||b==c||c==a)cout<<"等腰直角三角形";elsecout<<"直角三角形(非等腰)";}方法二:elseif(((a*a+b*b==c*c)&&(a==b))||((b*b+c*c==a*a)&&(b==c))||((c*c+a*a==b*b)&&(c==a)))
cout<<"等腰直角三角形";方法三:elseif((a*a+b*b==c*c||b*b+c*c==a*a||c*c+a*a==b*b)&&(a==b||b==c||c==a)) cout<<"等腰直角三角形";方法一:例6:从键盘输入两个表示时间的数据(时、分、秒),比较两个时间的先后次序。
时间比较存在以下可能:(1)h1>h2,时间2在前;时h1<h2,时间1在前(2)否则,m1>m2,时间2在前;m1<m2,时间1在前(3)否则,s1>s2,时间2在前;s1<s2,时间1在前(4)否则,两个时间相等。具体程序如下:程序一思考:如何在只比较一次就得出上述结果?程序二例6:从键盘输入两个表示时间的数据(时、分、秒),比较两个时多个if和if……else的选择:if……else能避免不必要的测试
例:如果score=95.if(score>=90) cout<<"优";if(score>=80&&score<90) cout<<"良";if(score>=70&&score<80) cout<<"中";if(score>=60&&score<70) cout<<"及格";if(score<60) cout<<"不及格";说明:每条语句都会运行if(score>=90) cout<<"优";elseif(score>=80&&score<90) cout<<"良";elseif(score>=70&&score<80) cout<<"中";elseif(score>=60&&score<70) cout<<"及格";else cout<<"不及格";说明:只会运行第一条if语句多个if和if……else的选择:if……else能避免不if语句的歧义问题if(<表达式1>)if(<表达式2>)<语句1>else<语句2>的含义
if(表达式1)if(表达式2)<语句1>else<语句2>
if(表达式1)if(表达式>)<语句1>else<语句2>C++规定:else子句与它前面最近的、没有else子句的if配对。因此,上面的if语句解释为:
if(表达式1)if(表达式2)<语句1>else<语句2>
若要按2来解释,则需要加上花括号(复合语句):if(表达式1){if(表达式2)<语句1>}else<语句2>if语句的歧义问题if(<表达式1>)if(<表达式switch语句程序中有时需要从两个(组)以上的语句中选择一个(组)来执行。C++提供了一条多路选择语句:switch语句(又称开关语句),它能根据某个表达式的值在多组语句中选择一组语句来执行。每一组语句的最后一个语句往往是break语句。switch语句程序中有时需要从两个(组)以上的语句中选择例7、从键盘输入一个星期的某一天(0:星期天;1:星期一;...),输出对应的英语单词(if语句实现)采用if语句实现:程序缺陷:多次对day的值进行比较书写麻烦,可读性差解决:采用switch语句实现,具体格式如下:switch(<整型表达式>){ case<整型常量表达式1>:<语句序列1>: case<整型常量表达式n>:<语句序列n> [default:<语句序列n+1>]}注意:switch中的整型表达式可以是整型、字符型和枚举型,case语句中的常量表达式也必须相比配例7、从键盘输入一个星期的某一天(0:星期天;1:星期一;.例8、从键盘输入一个星期的某一天(0:星期天;1:星期一;...),然后输出其对应的英语单词#include<iostream>usingnamespacestd;intmain(){ intday; cin>>day; switch(day) { case0:cout<<"Sunday";break; case1:cout<<"Monday";break; case2:cout<<"Tuesday";break; case3:cout<<"Wednesday";break; case4:cout<<"Thursday";break; case5:cout<<"Friday";break; case6:cout<<"Saturday";break; default:cout<<"Inputerror"; } cout<<endl; return0;}思考:如何用字符串实现上述结果?程序例8、从键盘输入一个星期的某一天(0:星期天;1:星期一;.switch语句中使用break语句在执行switch语句的某个分支时,需要用break语句结束该分支的执行。在switch语句的一个分支的执行中,如果没有break语句(最后一个分支除外),则该分支执行完后,将继续执行紧接着的下一个分支中的语句序列。C++中的switch语句比其它一些语言中的多路选择语句更具有灵活性。当若干个分支具有部分重复功能时,C++的switch语句可以节省代码量。switch语句中使用break语句在执行switch语句的switch(...){ ... case<整型常量表达式1>:A case<整型常量表达式2>:B case<整型常量表达式3>:C;break; ...}上面的语句假设A、B中没有break语句,则分支1执行A、B和C;分支2执行B和C;分支3执行C。例9:计算某年某月的天数分析:每年的1、3、5、7、8、10、12各有31天,4、6、9、11各有30天,2月闰年29天,其它年尾为28天。闰年判断:年份能被4整除不能被100整除程序switch(...)例9:计算某年某月的天数程序循环控制如何编程计算n!(n是变量)?n!=n*(n-1)*(n-2)*...*2*1表达式中不允许有“...”上面的问题需要用重复操作控制来解决:对相同的操作重复执行多次,每一次操作的数据有所不同。f=1,对i=2~n,重复执行:f=f*i;循环语句为解决重复操作提供了一种途径。循环一般由四个部分组成:循环初始化循环条件循环体下一次循环准备。循环控制如何编程计算n!(n是变量)?C++提供了三种实现重复操作的循环语句:while语句do-while语句for语句C++提供了三种实现重复操作的循环语句:while语句while语句具有如下的格式: while(<表达式>)<语句>while语句while语句具有如下的格式:用while语句求n!#include<iostream>usingnamespacestd;intmain(){ intn; cin>>n; inti=2,f=1;//循环初始化 while(i<=n)//循环条件 { f*=i; i++;//下一次循环准备 }//循环体 cout<<"factorialof"<<n<<"="<<f<<endl; return0;}用while语句求n!#include<iostream>do-while语句do-while语句的格式如下: do<语句>while(<表达式>);do-while语句do-while语句的格式如下:用do-while语句求n!#include<iostream>usingnamespacestd;intmain(){ intn; cin>>n; inti=1,f=1;//循环初始化 do//循环体 { f*=i; i++;//下一次循环的准备 }while(i<=n);//循环条件 cout<<"factorialof"<<n<<"="<<f<<endl; return0;}用do-while语句求n!#include<iostrefor语句for语句的格式如下:for(<表达式1>;<表达式2>;<表达式3>)<语句>for语句for语句的格式如下:#include<iostream>usingnamespacestd;intmain(){ intn,i,f; cin>>n; for(i=2,f=1//循环初始化 ; i<=n//循环条件 ; i++)//下一次循环准备 f*=i;//循环体 cout<<"factorialof"<<n<<"="<<f<<endl; return0;}用for语句求n!#include<iostream>用for语句求n!循环的种类计数控制的循环循环前就知道循环的次数,循环时重复执行循环体直到指定的次数事件控制的循环循环前不知道循环的次数,循环的终止是由循环体的某次执行导致循环的结束条件得到满足而引起的循环的种类计数控制的循环三种循环语句的使用原则三种循环语句在表达能力上是等价的,在解决某个具体问题时,用其中的一种可能会比其它两种更加自然。一般来说,计数控制的循环一般用for语句;事件控制的循环一般用while或do-while语句,其中,如果循环体至少要执行一次,则用do-while语句。由于for语句能清晰地表示“循环初始化”、“循环条件”以及“下一次循环准备”,因此,一些非计数控制的循环也用for语句实现。三种循环语句的使用原则三种循环语句在表达能力上是等价的,在例13:计算从键盘输入的一系列整数的和,要求首先输入整数的个数。(计数控制的循环)
#include<iostream>usingnamespacestd;intmain(){ intn; cout<<"请输入整数的个数:"; cin>>n; cout<<"请输入"<<n<<"个整数:"; intsum=0; for(inti=1;i<=n;i++) { inta; cin>>a; sum+=a; } cout<<"输入的"<<n<<"个整数的和是:"<<sum<<endl; return0;}i的作用域例13:计算从键盘输入的一系列整数的和,要求首先输入整数的个例14:计算从键盘输入的一系列整数的和,要求输入以-1结束。(事件控制的循环)#include<iostream>usingnamespacestd;intmain(){inta,sum=0; cout<<"请输入若干个整数(以-1结束):"; cin>>a; while(a!=-1) { sum+=a; cin>>a; } cout<<"输入的整数的和是:"<<sum<<endl; return0;}思考:可以用for循环实现吗?例14:计算从键盘输入的一系列整数的和,要求输入以-1结束。思考:for循环实现计算从键盘输入的一系列整数的和,要求输入以-1结束。(事件控制的循环)#include<iostream>usingnamespacestd;intmain(){inta,sum=0; cout<<"请输入若干个整数(以-1结束):"; for(cin>>a;a!=-1;cin>>a)sum+=a; cout<<"输入的整数的和是:"<<sum<<endl; return0;}思考:for循环实现计算从键盘输入的一系列整数的和,要求输入例15:从键盘接收字符,一直到输入了字符y(Y)或n(N)为止。(事件控制的循环)#include<iostream>#include<cstdlib>usingnamespacestd;intmain(){ charch;cout<<"请输入字符:"; do { cin>>ch; ch=tolower(ch); }while(ch!='y'&&ch!='n'); if(ch=='y') cout<<"Yes!\n"; else cout<<"No!\n"; return0;}例15:从键盘接收字符,一直到输入了字符y(Y)或n(N)为例16:判断键盘输入的数是否为素数方法一:用键盘输入的数n分别除以2、3…n-1,有一个数能整除,则n不是素数,否则n为素数。
程序一方法二:用键盘输入的数n分别除以2、3…sqrt(n),有一个数能整除,则n不是素数,否则n为素数。
程序二方法三:在方法二的基础上,被不能被2整除就不能被4、6、8…等整除,减少除法计算次数。
程序三例16:判断键盘输入的数是否为素数方法一:用键盘输入的数n分例17:求第n个费波那契(Fibonacci)数#include<iostream>usingnamespacestd;intmain(){ intn; cin>>n; intfib_1=0;//第一个Fibonacci数
intfib_2=1;//第二个Fibonacci数
for(inti=3;i<=n;i++) { inttemp=fib_1+fib_2;//计算新的Fibonacci数
fib_1=fib_2;//记住新的前一个Fibonacci数
fib_2=temp;//记住新的Fibonacci数 }
cout<<"第"<<n<<"个费波那契数是:"<<fib_2<<endl; return0;}例17:求第n个费波那契(Fibonacci)数#inclu循环优化问题算法的优化:减少循环次数避免在循环中重复计算不变的表达式循环优化问题算法的优化:减少循环次数#include<iostream>usingnamespacestd;intmain(){ intn; cout<<"请输入一个正整数:" cin>>n;//从键盘输入一个正整数 for(inti=2;i<n;i++)//循环:分别判断2、3、...、n-1是否为素数 { intj=2; while(j<i&&i%j!=0)//循环:分别判断i是否能被2~i-1整除 j++; if(j==i)//i是素数 cout<<i<<""; } cout<<endl; return0;}注意:1、上面的for循环中,偶数没有必要再判断它们是否为素数; 2、上面的while循环没有必要到i-1,只需要到:sqrt(i)例19:编程求出小于n的所有素数(质数)#include<iostream>例19:编程求出小于n#include<iostream>#include<cmath>usingnamespacestd;intmain(){ intn; cin>>n;//从键盘输入一个数 if(n<2)return-1; cout<<2<<",";//输出第一个素数 for(inti=3;i<n;i+=2)//循环:分别判断3、5、...、是否为素数 { intj=2; while(j<=sqrt(i)&&i%j!=0)//循环:分别判断i是否为素数 j++; if(j>sqrt(i))//i是素数 cout<<i<<","; } cout<<endl; return0;}注意:上面程序中的sqrt(i)被重复计算!例19:编程求出小于n的所有素数(质数)(续)#include<iostream>例19:编程求出小于j=2,k=sqrt(i);while(j<=k&&i%j!=0) j++;if(j>k)//i是素数。......注意:对有些循环优化,编译器能实现!......转移控制除了有条件的选择语句(if和switch)外,C++还提供了转移语句:breakcontinuegotoreturn:转移控制除了有条件的选择语句(if和switch)外,C+break语句break语句的格式: break;break语句的含义有两个:结束switch语句的某个分支的执行退出包含它的最内层循环语句(由于循环可以嵌套)在循环体中只要执行了break语句,就立即跳出(结束)循环,循环体中跟在break语句后面的语句将不再执行,程序继续执行循环之后的语句。在循环体中,break语句一般作为某个if语句的子句,用于实现进一步的循环控制。break语句break语句的格式:例如,判断i是否为素数的循环也可写成:j=2;k=sqrt(i);while(j<=k){ if(i%j==0)break;//退出循环 j++;}或for(j=2,k=sqrt(i);j<=k;j++) if(i%j==0)break;例如,判断i是否为素数的循环也可写成:continue语句continue语句的格式如下:continue;continue语句用在循环语句的循环体中,作用是:立即结束当前循环,进入下轮循环。对于while和do-while语句,continue语句将使控制转到循环条件的判断;对于for语句,continue语句将使控制转到:先计算<表达式3>,然后计算<表达式2>,并根据<表达式2>的结果决定是进入下一次循环还是结束循环。continue语句continue语句的格式如下:例21:从键盘输入一些非零整数,然后输出其中所有正数的平方根。#include<iostream>#include<cmath>usingnamespacestd;intmain(){ intn; doublesquare_root; cout<<"请输入若干整数(以0结束):"; for(cin>>n;n!=0;cin>>n) { if(n<0)continue;//准备进入下一次循环 square_root=sqrt(n); cout<<n<<"的平方根是:"<<square_root<<endl; } return0;}continue语句结束本次循环break是结束整个循环思考:continue能否用break替代例21:从键盘输入一些非零整数,然后输出其中所有正数的平方根goto语句goto语句的格式如下: goto<语句标号>;<语句标号>为标识符,其定义格式为:
<语句标号>:<语句>goto的含义是:程序转移到带有<语句标号>的语句goto语句goto语句的格式如下:用goto语句求n!#include<iostream>usingnamespacestd;intmain(){ intn; cin>>n; inti=1,f=1;loop: f*=i; i++; if(i<=n)gotoloop; cout<<"factorialof"<<n<<"="<<f<<endl; return0;}用goto语句求n!#include<iostream>在使用goto语句时,应该注意:不能用goto语句从一个函数外部转入该函数的内部(函数体),也不能用goto语句从一个函数的内部转到该函数的外部。允许用goto语句从内层复合语句转到外层复合语句或从外层复合语句转入内层复合语句。goto语句不能掠过带有初始化的变量定义。在使用goto语句时,应该注意:voidf(){ ...... gotoL1;//Error ...... while(...) { intx=0; L1:... ...... gotoL2;//Error ...... } ..... inty=10; L2:...... ......}voidf()用goto语句实现break语句的功能while(...){ ...... ...break; ......}上述程序等价于:while(...){ ...... ...gotoL; ......}L:...用goto语句实现break语句的功能while(...)while(...){ ...... ...gotoend; ...... end:;}while(...){ ...... ...continue; ......}格式:;作用:程序中需要一条不做任何事情的语句。例:intI,sum;for(sum=0,i=1;i<=100;sum+=i,i++);用空语句和goto语句实现continue语句的功能while(...)while(...)格式
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度办公室文员信息安全责任合同3篇
- 无人化农场项目可行性分析报告
- 2025年新科版九年级生物上册月考试卷
- 2025年浙教新版八年级生物下册阶段测试试卷
- 2025湖北省建筑安全员A证考试题库
- DG∕TJ 08-2162-2015 可再生能源建筑应用测试评价标准
- DG∕TJ08-2236-2017 热轧带肋高强钢筋应用技术规程
- 二零二五年度安徽省智能建筑系统集成施工合同
- 2025年鲁教版八年级数学下册阶段测试试卷
- 2025年青海建筑安全员-C证考试(专职安全员)题库及答案
- 儿科护理安全警示课件
- 2024-2025学年新疆省克孜勒苏柯尔克孜自治州三年级数学第一学期期末统考试题含解析
- 旧设备拆除合同安全责任书
- 隐患排查治理管理规定
- 2025版国家开放大学法学本科《国际私法》历年期末纸质考试总题库
- 机器人机构学基础 部分习题及答案(于靖军 )
- 教科版2022-2023学年度上学期三年级科学上册期末测试卷及答案(含八套题)
- 借条的正规模板(2024版)
- DZ/T 0430-2023 固体矿产资源储量核实报告编写规范(正式版)
- 铜排载流量表
- 文丘里式气气混合器计算表[共2页]
评论
0/150
提交评论