版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
程序的流程控制
—语句主要内容流程控制概述顺序执行选择执行循环执行无条件转移程序设计风格与结构化程序设计流程控制概述
程序=算法
+数据结构用计算机来解决实际问题除了要把反映问题本质的数据描述出来之外,还要对这些数据的加工处理过程(算法)进行描述。表达式构成了数据处理的基本单位。当程序中有多个表达式需要计算时,就会面临:有的表达式要先计算,有的要后计算(有先后次序)根据不同的情况计算不同的表达式一个或几个表达式需要重复计算多次(每次用到的数据有所不同)上述情况属于程序的流程控制,对程序流程的描述称作为算法。程序流程图在设计大型、复杂程序的流程控制时,为了便于设计和理解,往往在编制程序前先用某种不依赖于具体程序设计语言的抽象形式来对程序的流程进行描述;然后再用某种编程语言来写出相应的程序代码。其中,程序流程图就是一种描述程序流程的抽象形式。判断N(>2)是否为素数(质数)的程序流程图本课程是程序设计基础,所涉及的问题都不是很复杂。在进行程序流程设计时没有采用流程图,而是在对问题进行分析和给出基本解决思路的基础上,直接写出带有详细注释的程序代码。在程序中,流程控制是用语句来实现的,它指定了表达式的计算次序。流程控制语句包括:顺序执行语句:按书写次序依次执行。选择执行语句:根据条件选择某些语句执行。循环执行语句:重复执行某些语句直到某个条件不满足为止。无条件转移语句:无条件转移到程序中某个语句执行。从语法上,语句又可以分成:简单语句:语句中不包含其它语句。结构语句:语句中包含其它语句(子句)。语句C++语句的分类其中,复合语句、选择语句、循环语句属于结构语句,其它是简单语句。顺序执行一般来说,语句按书写次序顺序执行。从左到右、从上到下执行次序可被某些语句改变!以下C++语句一般不改变程序的执行次序:表达式语句复合语句空语句
表达式语句在C++表达式的后面加上一个分号“;”就可以构成表达式语句,其格式为:
<表达式>;例如:a+b*c;a>b?a:b;a++;x=a+b;一个表达式语句执行完后将执行紧接在后面的下一个语句。较常使用的表达式语句语句执行必须留下一些“痕迹”!x+y;//没有意义!常用的表达式语句:赋值自增/自减输入/输出无返回值的函数调用,等等例如x=a+b;//赋值x++;//自增cin>>a;//输入cout<<b;//输出f(a);//无返回值的函数调用空语句根据程序设计的需要,在程序中的某些地方有时需要加上一些空操作,以方便其它流程控制的实现。在C++中,空操作用空语句来表示,其格式为:
;空语句的作用是用于语法上需要一条语句的地方,而该地方又不需做任何事情。例如:if(a>b);//空语句elsec=a;复合语句可以把一个或多个语句用一对花括号括起来构成复合语句,又称为块(block),其格式为:
{<语句序列>}<语句序列>中的语句可以是任何的C++语句,其中包括数据定义和声明语句。例如,下面就是一个复合语句:{ inta,b;//变量定义
cin>>a>>b; intmax;//变量定义 max=(a>=b)?a:b; cout<<max<<endl;}语法上,复合语句是一个语句(结构语句),在只能出现一个语句的地方,如果需要写多个语句,则可把它们组织成一个复合语句。复合语句一般作为其它结构语句(如选择语句和循环语句)的子句(成分语句)或作为函数体。例如:if(a>b){x=a;
y=b;}else{x=b;
y=a;}下面的语句不符合C++语言的语法:if(a>b)
x=a;
y=b;elsex=b;
y=a;再例如,函数体要求是个复合语句#include<iostream>//对使用的C++标准库中的程序实体进行声明usingnamespacestd;//指定使用标准库的名空间std。intmain()//主函数{ doubler; cout<<"请输入圆的半径:";
cin>>r; doublearea,circumference;
area=r*r*3.14;
circumference=2*r*3.14;
cout<<"面积等于"<<area<<endl;
cout<<"周长等于"<<circumference
<<endl; return0;}选择执行在程序中,常常需要根据不同的情况来从一组语句中选择一个来执行(分支),这是通过选择语句来完成的。C++的选择语句包括:if语句switch语句语法上,选择语句属于结构语句。if语句if语句(又称条件语句)是根据一个条件满足与否来决定是否执行某个语句或从两个语句中选择一个语句执行。if语句有两种格式:if(<表达式>)<语句>if(<表达式>)
<语句1>else<语句2>其中,<表达式>可以是任意的C++表达式,通常为关系或逻辑表达式,表示条件;<语句>、<语句1>、<语句2>可以是任意的C++语句,但必须是一个语句!(复合语句算一个语句)if语句的含义(1)if(<表达式>)<语句>(2)if(<表达式>)<语句1>else<语句2>例:从键盘输入三个整数,计算其中的最大值并将其输出#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;}if语句的锯齿格式为了提高程序的易读性,在写if语句时,最好采用“锯齿”格式,即把成分语句往后缩进几列。当if语句的else子句也是if语句时,为了减少文本的缩进量,可以把下面左边的if语句按右边的格式来书写:
if(...)...elseif(...)...elseif(...)...elseif(...)...else...if(...)...else
if(...)
...
else
if(...)
...
else
if(...)
...
else
...例子:从键盘输入一个三角形的三条边,判断其为何种三角形
#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;}避免不必要的测试把分数转成"优"、"良"、"中"、"及格"以及"不及格"输出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<<"不及格";上述的流程控制效率不高!例如,当score为95时,上述程序中的每个if语句的条件都要测试一遍,程序效率不高!if语句的歧义问题下面的if语句的含义是什么?
if(<表达式1>)if(<表达式2>)<语句1>else<语句2>它有两种解释:if(<表达式1>)if(<表达式2>)<语句1>else<语句2>if(<表达式1>)if(<表达式2>)<语句1>
else<语句2>C++规定:else子句与它前面最近的、没有else子句的if配对。因此,上面的if语句解释为:if(<表达式1>)if(<表达式2>)<语句1>else<语句2>
若要按2来解释,则需要加上花括号(复合语句):if(<表达式1>){if(<表达式2>)<语句1>}
else<语句2>下面程序的结果是什么?doubleaverage;average=100.0;if(average>=60.0) if(average<70.0) cout<<"MarginalPASS";else cout<<"FAIL";输出:FAIL结论:程序的含义不受程序书写格式的影响,完全由语法决定!switch语句程序中有时需要从两个(组)以上的语句中选择一个(组)来执行。虽然用嵌套的if语句能够实现,但不简洁。C++提供了一条多路选择语句:switch语句(又称开关语句),它能根据某个表达式的值在多组语句中选择一组语句来执行。switch语句的格式为:switch(<整型表达式>){ case<整型常量表达式1>:<语句序列1>
case<整型常量表达式2>:<语句序列2>:
case<整型常量表达式n>:<语句序列n> [default:<语句序列n+1>]
//可以省略}
<语句序列i>由零个或多个语句构成。<语句序列i>的最后一个语句往往是break语句。switch语句的含义是:先计算<整型表达式>的值然后执行某个与该值相等的case分支中的语句序列,直到break结束如果没有与该值相等的case分支,则执行default分支的语句序列。如果没有default分支,则什么也不做。例子、从键盘输入一个星期的某一天(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;}switch语句中使用break语句在执行switch语句的某个分支时,需要用break语句结束该分支的执行。在switch语句的一个分支的执行中,如果没有break语句(最后一个分支除外),则该分支执行完后,将继续执行紧接着的下一个分支中的语句序列。#include<iostream>usingnamespacestd;intmain(){ intday; cin>>day; switch(day) { case0:cout<<"Sunday";break; case1:cout<<"Monday";break; case2:cout<<"Tuesday"; case3:cout<<"Wednesday";break; case4:cout<<"Thursday";break; case5:cout<<"Friday";break; case6:cout<<"Saturday";break; default:cout<<"Inputerror"; } cout<<endl; return0;}输入:2输出:?TuesdayWednesday用break来显式地结束分支的执行,这为编程带来了灵活性:如果几个分支要使用相同的代码,可以把这几个分支写在一起,除了最后一个分支要加break,其它分支不要加break。例:计算某年某月的天数。#include<iostream>usingnamespacestd;intmain(){ intyear,month,days; cout<<"请输入年:";cin>>year;
cout<<"请输入月:";cin>>month; switch(month)
{ case1:case3:case5:case7:case8:case10:case12:
days=31;
break;
case4:case6:case9:case11: days=30; break;
case2: if(year%400==0||(year%4==0&&year%100!=0)) days=29; else days=28; } cout<<year<<"年"<<month<<"月的天数是:"<<days<<endl; return0;}循环(重复)执行如何编程计算n!?n!=n*(n-1)*(n-2)*...*2*1表达式中不允许有“...”没有简单的计算公式如何编程计算整数n的所有因子?计算机问题求解的基本方法迭代法对待解问题先指定一个近似的初始解,然后按照某种规则基于这个初始解计算出下一个近似解;基于下一个近似解计算出再下一个近似解;......,这样逐步向目标逼近,直到某个条件满足后得到最终解。穷举法对“所有可能”的解逐一去验证它是否满足指定的条件,满足条件则它是一个解,否则它不是解。计算机问题求解的迭代法和穷举法常常通过循环(重复)操作来实现:对相同的操作重复执行多次,每一次操作的数据有所不同。求n!f=1,对i=2~n,重复执行下面的操作:f=f*i;(或,f*=i;)cout<<f<<endl;求n的所有因子cout<<1<<','<<n;对i=2~n-1,重复执行下面的操作:if(n%i==0)cout<<','<<i<<endl;循环的基本要素循环一般由四个部分组成:循环初始化:为重复执行的语句提供初始数据循环条件:描述重复操作需要满足的条件循环体:描述要重复执行的操作下一次循环准备:为下一次循环更新数据(它常常会隐式地包含在循环体中),包括:重复操作需要的数据循环条件判断所需要的数据循环语句C++提供了三种实现重复操作的语句(称为循环语句):while语句do-while语句for语句语法上,循环语句属于结构语句。while语句格式:
while(<表达式>)<语句><表达式>表示循环条件,可以为任意表达式,一般为关系或逻辑表达式<语句>为循环体,可以是任意的一个C++语句(包括结构语句)含义:用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;}do-while语句格式:
do
<语句>
while
(<表达式>);<表达式>表示循环条件,可以为任意表达式,一般为关系或逻辑表达式<语句>循环体,可以是任意的一个C++语句(包括结构语句)含义:用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;}为什么i从1而不是2开始?for语句格式:for(<表达式1>;<表达式2>;<表达式3>)<语句><表达式1>为任意表达式,一般为赋值表达式,表示循环初始化<表达式2>为任意表达式,一般为关系或逻辑表达式,表示循环条件<表达式3>为任意表达式,一般为自增/自减的算术表达式,表示下一次循环的准备<语句>可以是任意一个C++语句(包括结构语句),表示循环体含义:#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!在for语句中,<表达式1>、<表达式2>和<表达式3>均可以省略。<表达式1>省略表示for语句本身不便提供循环初始化,这时,循环初始化在for语句之前进行;<表达式2>省略表示true或1,这时,一定要在循环体中判断循环条件并以某种其它方式(如:通过break语句)退出循环;<表达式3>省略表示for语句未显式给出下一次循环准备,该项工作一定是在循环体中给出的。i=2,f=1;//循环初始化for(;//省略表达式1
i<=n//循环条件
;)//省略表达式3{ f*=i; i++;//下一次循环准备}
//循环体它已经退化成while语句了!<表达式1>可以是带有初始化的变量定义,例如: for(inti=1;i<=10;i++)<语句>i的有效范围?C++国际标准规定,i只能在定义它的循环语句中使用,出了循环不能使用i。有的C++实现允许出了循环也能使用i(如vc++6.0)“死循环”在循环体或for语句的<表达式3>中一定要有能改变循环条件中操作数值的操作,并逐步使得循环条件有不满足的趋势,否则将会出现“死循环”:循环永远结束不了!例如,下面就是一个死循环: inti=2,f=1;
while(i<=n)
{ f*=i;
//忘了写:i++;
}循环的种类计数控制的循环循环前就知道循环的次数,循环时重复执行循环体直到指定的次数。循环的执行次数不依赖于循环体的执行结果。用于计数的变量称为“循环控制变量”。事件控制的循环循环前不知道循环的次数,循环的终止是由循环体的某次执行导致循环的结束条件得到满足而引起的。循环的执行次数要依赖于循环体的执行结果,因此,循环控制有时会复杂一些。三种循环语句的使用原则三种循环语句在表达能力上是等价的,但在解决某个具体问题时,用其中的一种可能会比其它两种更加自然。一般来说,计数控制的循环一般用for语句。事件控制的循环一般用while或do-while语句,其中,如果循环体至少要执行一次,则用do-while语句。由于for语句能清晰地表示“循环初始化”、“循环条件”以及“下一次循环准备”,因此,一些非计数控制的循环也常用for语句实现。例:计算从键盘输入的一系列整数的和,要求:首先输入整数的个数。(计数控制的循环)
#include<iostream>usingnamespacestd;intmain(){ intn; cout<<"请输入整数的个数:"; cin>>n; cout<<"请输入"<<n<<"个整数:"; intsum=0; for(inti=1;i<=n;i++)//i是循环控制变量 { inta; cin>>a; sum+=a; } cout<<"输入的"<<n<<"个整数的和是:"<<sum<<endl; return0;}例:计算从键盘输入的一系列整数的和,要求输入以0结束。(事件控制的循环)#include<iostream>usingnamespacestd;intmain(){inta,sum=0; cout<<"请输入若干个整数(以0结束):"; cin>>a; while(a!=0) { sum+=a; cin>>a; } cout<<"输入的整数的和是:"<<sum<<endl; return0;}例:从键盘接收字符,一直到输入了字符y(Y)或n(N)为止。(事件控制的循环)#include<iostream>#include<cctype>usingnamespacestd;intmain(){ charch; do { cout<<"请输入Yes或No(y/n):"; cin>>ch; ch=tolower(ch);//如果ch是大写字母,则转成小写字母。 }while(ch!='y'&&ch!='n'); if(ch=='y') ...... else ...... return0;}基于循环的程序设计举例循环是一个使用非常频繁的程序设计技术,一个程序如果没有循环,则该程序一般做不了太复杂的事情,往往是循环操作使得程序变得复杂和功能强大起来。对初学者而言,程序设计往往是一件很困难的工作,尤其是在如何发现和组织循环方面。例:求第n个费波那契(Fibonacci)数//1,1,2,3,5,8,13,...#include<iostream>usingnamespacestd;intmain(){ intn; cin>>n; intfib_1=1;//第一个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;}fib_2=fib_1+fib_2;//计算和记住新的Fibonacci数fib_1=fib_2-fib_1;//记住前一个Fibonacci数用牛顿迭代法求计算的牛顿迭代公式为:取x0为a(任何值都可以,但影响收敛速度!),依次计算x1、x2、...,直到:|xn+1-xn|<ε(ε为一个很小的数,可设为10-6)时为止,xn+1即为的值。#include<iostream>#include<cmath>usingnamespacestd;intmain(){ constdoubleEPS=1e-6;//一个很小的数
doublea,x1,x2;//x1和x2分别用于存储最新算出的两个值 cout<<"请输入一个数:"; cin>>a; x1=a;//第一个值取a x2=(2*x1+a/(x1*x1))/3;//计算第二个值
while(fabs(x2-x1)>=EPS) {x1=x2;//记住前一个值
x2=(2*x1+a/(x1*x1))/3;//计算新的值
} cout<<a<<"的立方根是:"<<x2<<endl; return0;}上面程序中,“x2=(2*x1+a/(x1*x1))/3;”写了两次,容易造成不一致错误!#include<iostream>#include<cmath>usingnamespacestd;intmain(){ constdoubleEPS=1e-6;//一个很小的数
doublea,x1,x2;//x1和x2分别用于存储最新算出的两个值 cout<<"请输入一个数:"; cin>>a; x2=a;//第一个值取a
do {x1=x2;//记住前一个值
x2=(2*x1+a/(x1*x1))/3;//计算新的值
}while(fabs(x2-x1)>=EPS); cout<<a<<"的立方根是:"<<x2<<endl; return0;}循环优化问题算法的优化:减少循环次数避免在循环中重复计算不变的表达式#include<iostream>usingnamespacestd;intmain(){ intn; cout<<"请输入一个正整数:" cin>>n;//从键盘输入一个正整数 inti=2; while(i<n&&n%i!=0)//循环:分别判断n是否能被2~n-1整除
i++; if(i==n)//n是素数
cout<<n<<"是素数"<<endl;
elsecout<<n<<"不是素数"<<endl; return0;}注意:上面的while循环中i没有必要到n-1,只需要到:
例:编程判断n是否为素数(穷举法)#include<iostream>#include<cmath>usingnamespacestd;intmain(){ intn; cout<<"请输入一个正整数:" cin>>n;//从键盘输入一个正整数 inti=2; while(i<=(int)sqrt((double)n)&&n%i!=0)
i++; if(i>
(int)sqrt((double)n))//n是素数
cout<<n<<"是素数"<<endl;
elsecout<<n<<"不是素数"<<endl; return0;}sqrt()
为C++的一个库函数,它有三个版本:floatsqrt(float);doublesqrt(double);longdoublesqrt(longdouble);注意:上面程序中的sqrt(n)被重复计算!#include<iostream>#include<cmath>usingnamespacestd;intmain(){ intn; cout<<"请输入一个正整数:" cin>>n;//从键盘输入一个正整数 inti=2,k=(int)sqrt((double)n);//循环前计算好sqrt(n) while(i<=k&&n%i!=0)
i++; if(i>
k)//n是素数
cout<<n<<"是素数"<<endl;
elsecout<<n<<"不是素数"<<endl; return0;}这个优化编译器能自动实现!循环可以嵌套:循环体内还可以包含循环#include<iostream>#include<cmath>usingnamespacestd;intmain(){ intn; cout<<"请输入一个正整数:" cin>>n;//从键盘输入一个正整数
for(inti=2;i<n;i++)//循环:分别判断i=2、3、...、n-1是否为素数
{ intj=2,k=(int)sqrt((double)i);
while(j<=k&&i%j!=0)
j++;
if(j>k)//i是素数
cout<<i<<""; } cout<<endl; return0;}注意:上面的for循环中,偶数没有必要再判断它们是否为素数。例:编程求出小于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,k=(int)sqrt((double)i); while(j<=k&&i%j!=0)
j++; if(j>k)//i是素数
cout<<i<<","; } cout<<endl; return0;}例:“百元买百鸡”问题我国古代数学家张丘建在《算经》一书中曾提出过著名的“百钱买百鸡”问题:鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一;百钱买百鸡,则翁、母、雏各几何?用100元钱买100只鸡:公鸡5元1只母鸡3元1只小鸡1元3只(必须整3只买!)有几种买法?(公鸡、母鸡、小鸡各几只?)问题抽象:用roosters、hens、chickens分别表示公鸡、母鸡和小鸡的数量,尝试下面所有可能的值:0≤roosters≤1000≤hens≤1000≤chickens≤100如果它们满足下面的条件:roosters+hens+chickens=100(只)chickens%3=0roosters*5+hens*3+chickens/3=100(元)则它们是一个解。程序如下:constintMONEY_TOTAL=100;//钱的总数:100元constintNUM_TOTAL=100;//鸡的总数:100只......cout<<"“百元买百鸡”问题所有可能的解如下:\n";
for(intr=0;r<=NUM_TOTAL;r++)//r:公鸡的数量{for(inth=0;h<=NUM_TOTAL;h++)//h:母鸡的数量{for(intc=0;c<=NUM_TOTAL;c++)//c:小鸡的数量{//这里能获得r、h和c的所有可能的值if(r+h+c==NUM_TOTAL&&c%3==0
&&r*5+h*3+c/3==MONEY_TOTAL)
{cout<<"公鸡"<<r<<"只,";
cout<<"母鸡"<<h<<"只,";
cout<<"小鸡"<<c<<"只\n";
}
}
}}......优化:公鸡数量r最多只能有“MONEY_TOTAL/5”只公鸡数量r确定后,母鸡数量h最多只能有“(MONEY_TOTAL-r*5)/3”只公鸡和母鸡数量r和h确定后,小鸡的数量c就固定了“NUM_TOTAL-r-h”constintMONEY_TOTAL=100;constintNUM_TOTAL=100;......cout<<"“百元买百鸡”问题所有可能的解如下:\n";
for(int
r=0;r<=MONEY_TOTAL/5;r++){for(inth=0;h<=(MONEY_TOTAL-r*5)/3;h++){int
c=NUM_TOTAL-r-h;if(c%3==0&&r*5+h*3+c/3==MONEY_TOTAL){cout<<"公鸡"<<r<<"只,";cout<<"母鸡"<<h<<"只,";cout<<"小鸡"<<c<<"只\n";}}}......无条件转移控制除了有条件的选择语句(if和switch)外,C++还提供了无条件的转移语句:gotobreakcontinuereturngoto语句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语句时,应该注意:不能用goto语句从一个函数外部转入该函数的内部(函数体),也不能用goto语句从一个函数的内部转到该函数的外部。允许用goto语句从内层复合语句转到外层复合语句或从外层复合语句转入内层复合语句。goto语句不能掠过带有初始化的变量定义。intmain(){ ...... gotoL1;//OK ...... {...... L1:... ...... gotoL2;//OK ......
}
L2:...
......}intmain(){ ...... gotoL1;//Error ...... intx=0;//带有初始化的变量定义 L1:... ...... gotoL1;//OK ......}虽然,只要有goto语句和if语句,所有的循环语句都可以不要了。用goto语句来实现循环有时会更加方便和高效。但是,goto语句太灵活,使用不当会使得程序的结构不好,容易出错,也不利于维护!goto语句有时也会导致程序效率下降!goto语句属于非结构化的无条件转移控制,为了给程序设计带来一些灵活性,C++还提供两个半结构化的无条件转移控制:break语句continue语句break语句break语句的格式:
break;
break语句的使用场合和含义有两个:在switch语句中,结束switch语句的某个分支的执行。在循环体中,立即跳出(结束)循环,循环体中跟在break语句后面的语句将不再执行,程序继续执行循环之后的语句。在循环体中,break语句一般作为某个if语句的子句。用goto语句解释break语句的功能while(...){ ...... if(...)break; ......}上述程序等价于:while(...){ ...... if(...)gotoL; ......}L:...对于多重循环,内层循环语句循环体中的break语句只能用于结束内层循环语句的执行。while(...)//外层循环{...for(...)//内层循环{...... ...break;//转到紧接在for循环语句后面的语句
...... ...gotoL;//转到标号为L的语句处,即退出while循环}......}L:......对于事件控制的循环,循环条件有时比较复杂,这时,可以在循环条件表达式中给出主要的循环控制描述,而在循环体中进行特殊情况的循环控制。例如,判断n是否为素数的循环也可写成:inti=2,k=sqrt((double)n);while(i<=k){ if(n%i==0)break;//退出循环
i++;}if(i>k)//n是素数。等价于:inti=2,k=sqrt((double)n);while(i<=k&&n%i!=0)i++;if(i>k)//n是素数。continue语句continue语句的格式如下:
continue;continue语句只能用在循环语句的循环体中,其含义是:立即结束当前循环,准备进入下一次循环。对于while和do-while语句,continue语句将使控制转到循环条件的判断;对于for语句,continue语句将使控
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 员工试用期转正工作总结15篇
- 2025年昆明市官渡区云南大学附属中学星耀学校招聘备考题库附答案详解
- 人民警察基本级执法资格考试题型及答案
- 2025国考国家税务总局滁州市南谯区税务局面试试题及答案解析
- 2025年广州市民政局直属事业单位第一次公开招聘工作人员25人备考题库及一套答案详解
- 三亚市公安局招聘下属事业单位工作人员考试真题2024
- 2024年鞍山海城市教育局毕业生招聘考试真题
- 《CB 1153-1993金属波形膨胀节》专题研究报告
- 2025广西北海银滩开发投资股份有限公司招聘2人考试核心题库及答案解析
- “梦工场”招商银行大连分行2026寒假实习生招聘备考笔试题库及答案解析
- SJG 162 – 2024城市地下空间防涝技术导则
- GB/T 20424-2025重有色金属精矿产品中有害元素的限量规范
- 七年级下学期历史必背知识清单(填空版)
- 《cGMP信号通路》课件
- 2022年全国森林、草原、湿地调查监测技术规程-附录
- 2022-2024年江苏中考英语试题汇编:任务型阅读填空和阅读回答问题(教师)
- 《市场营销专业申报》课件
- 19计科机器学习学习通超星期末考试答案章节答案2024年
- 全国职业院校技能大赛赛项规程(高职)农产品质量安全检测
- 广东开放大学2024年秋《国家安全概论(S)(本专)》形成性考核作业参考答案
- DB51∕T 3179-2024 杵针技术操作规范
评论
0/150
提交评论