程序流程控制课件1_第1页
程序流程控制课件1_第2页
程序流程控制课件1_第3页
程序流程控制课件1_第4页
程序流程控制课件1_第5页
已阅读5页,还剩112页未读 继续免费阅读

下载本文档

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

文档简介

程序流程控制

4.1语句4.1.1表达式语句在任意一个表达式后面加上“;”即构成表达式语句,例如:m=3;

//赋值表达式语句a+b;

//算术表达式语句z=x*y,z++;

//逗号表达式语句c=a+b;

//赋值x--;

//自减a=m>n?m:n;

//条件表达式语句a||b&&c;

//逻辑表达式语句F(a,b);

//函数调用cin>>m;

//输入cout<<n;

//输出4.1.2空语句空语句只由一个“;”构成,不执行任何操作。通常,空语句作为分支点,位于语法上需要一条语句,但又不执行任何操作的地方。

4.1.3复合语句复合语句又称为块语句,即用一对花括号{}把若干条语句组合成一条语句,{}内可以有多条语句,也可以只有一条语句,也可以没有任何语句,但复合语句在语法上相当于一条语句,形式如下:{ <语句1> <语句2>//…}注意:复合语句内的各条语句都必须以分号结尾,在“}”外不能不需要加分号。

4.2顺序结构顺序结构是最简单、最常见的一种程序控制结构。顺序结构中的语句按照书写的先后次序顺序执行,并且每个语句都会被执行到。【例4.1】计算任意两个整数之和。#include<iostream>usingnamespacestd;intmain(){intjs1,js2; //加数1,加数2intsum;

//和cout<<"请输入第1个加数:"<<endl;cin>>js1;cout<<"请输入第2个加数:"<<endl;cin>>js2;sum=js1+js2;

//和=加数1+加数2cout<<js1<<"+"<<js2<<"="<<sum<<endl;

return0;}4.3选择结构选择结构支持程序的判断与选择,使用选择语句来实现,选择语句有两种:if语句,也称为分支语句;switch语句,根据条件决定执行哪些分支语句,也称为多分支语句。

4.3.1if语句单分支if语句的一般形式如下:

if(<表达式>)

<语句>表达式称为条件表达式(一般为逻辑表达式或关系表达式),求值结果必须是整数类型、字符类型、浮点类型或双精度类型。

4.3.1if语句执行过程:先对条件表达式进行判断,若成立(值为非0),就执行语句,然后,顺序执行if结构后的下一条语句;若条件表达式不成立(为0),直接执行if结构后的下一条语句。

图4-1单分支if语句流程图

4.3.1if语句公交汽车根据到站是否有上下乘客停车或是继续行驶,可用if语句表示如下:if(有客上下车)停车;当两个数值相除时,检查分母是否为0:if(count!=0)

average=sum/count;4.3.1if语句有时,一个条件需要执行几个动作,如公司到月末,需要给许多职员发放工资,可采用复合语句,使多个语句依赖于相同的条件:

if(月末){给张三发工资;给李四发工资;给王五发工资;

//…}4.3.1if语句采用复合语句计算获利的程序片段:

if(balance>0){ interest=balance*creditRate; balance+=interest;}4.3.1if语句【例4.2】用户输入一字符,用程序判断是否为小写字母,如果是,请输出“您输入的字符是一个小写字母”。

#include<iostream>usingnamespacestd;intmain(){chara;cout<<"请输入一个字符:";cin>>a;

if(a>='a'&&a<='z') cout<<a<<“您输入的字符是一个小写字母"<<endl;return0;}4.3.2if-else语句if-else语句构造了一种二路分支选择结构,一般形式如下:if(<表达式>)

<语句1>else

<语句2>4.3.2if-else语句执行过程:先对表达式进行计算,若结果非0,则条件成立,执行语句1;若值为0,则条件不成立,执行语句2。图4-2if-else语句流程图4.3.2if-else语句【例4.3】输出a,b两个数中的较大数。#include<iostream>usingnamespacestd;intmain(){inta,b,max;cout<<"pleaseinputa,b:"<<endl;cin>>a>>b;

if(a>b) cout<<"max="<<a<<endl;elsecout<<"max="<<b<<endl;return0;}4.3.2if-else语句【例4.4】从键盘输入一整数,判断该数的奇偶。#include<iostream>usingnamespacestd;intmain(){intnum;cout<<"请输入一个整数:";cin>>num;

if((num%2)==0) //模2 cout<<num<<"是一个偶数!"<<endl;else cout<<num<<"是一个奇数!"<<endl;

return0;}4.3.3elseif

语句当有多个分支选择时,可采用elseif语句,一般形式为:if(<表达式1>) <语句1>elseif(<表达式2>) <语句2> …elseif(<表达式n>)

<语句n>else

<语句n+1>4.3.3elseif

语句执行过程:依次计算if后面表达式的值,当为真时,执行对应的语句,然后,跳到整个if结构之外继续执行;如果所有的表达式均为假,则执行语句n+1,然后继续执行后续程序。图4-3elseif语句流程图4.3.3elseif

语句根据学生的考试成绩,判断其成绩等级:if(score>=90) grade='A';elseif(score>=80) grade='B';elseif(score>=70) grade='C';elseif(score>=60)

grade='D';else grade='E';4.3.3elseif

语句【例4.5】从键盘输入三角形的三条边,判断三角形种类(等边、等腰、直角或其它)。#include<iostream>usingnamespacestd;intmain(){inta,b,c;cout<<"请输入三条边长a,b,c:"<<endl;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;}4.3.4嵌套if语句C++支持if语句的嵌套,即一个if语句能够出现在另一个if语句或if-else语句里,目的是为了解决多路分支问题,其一般形式为:

形式一:if(<表达式1>)

if(<表达式2>) <语句1>

else<语句2>4.3.4嵌套if语句形式二:if(<表达式1>){

if(<表达式2>)<语句1>}else<语句2>4.3.4嵌套if语句形式三:if(<表达式1>) <语句1>else

if(<表达式2>)<语句2> else<语句3>4.3.4嵌套if语句形式四:if(<表达式1>)

if(<表达式2>) <语句1>

else <语句2>else

if(<表达式3>) <语句3>else<语句4>4.3.4嵌套if语句当程序中存在嵌套的if-else结构时,每个else都与其前面最近的if配对,由内层向外层依次处理;为了提高程序的易读性,在写if语句时,最好采用“锯齿”格式,即把子句往后缩进几列;嵌套if语句在实际使用中,形式比较灵活,注意如下三点:4.3.4嵌套if语句例如:if(z>y)if(z>x)max=z;

else max=x;elseif(y>x)max=y;无论哪种形式,整个if语句(包括else子句)只算作一条语句。4.3.4嵌套if语句【例4.6】求三个数中最大者。#include<iostream>usingnamespacestd;intmain(){floata,b,c;cout<<"Pleaseinputthreenumbers:"<<endl;cin>>a>>b>>c;if(a>b){

if(a>c) cout<<"Maximumis:"<<a<<endl;

else cout<<"Maximumis:"<<c<<endl; }else{

if(b>c) cout<<"Maximumis:"<<b<<endl;else cout<<"Maximumis:"<<c<<endl; }return0;}【例4.7】求方程ax2+bx+c=0的根。分析:因系数a、b、c的值不确定,所以分情况讨论。当a=0,b=0时,方程无解;当a=0,b≠0时,方程只有一个实根-c/b;当a≠0时,需要考虑b2-4ac的情况当b2-4ac≥0,方程有两个实根;当b2-4ac<0,方程有两个虚根。4.3.4嵌套if语句4.3.4嵌套if语句#include<iostream>#include<cmath>usingnamespacestd;intmain(){floata,b,c,disc,m,n;cout<<"pleaseinputa,b,c:";cin>>a>>b>>c;disc=b*b-4*a*c;m=-b/2*a;n=sqrt(fabs(disc))/2*a;

if(a==0)

if(b==0) cout<<"noroot!"<<endl; else cout<<"Thesinglerootis:"<<-c/b<<endl;

4.3.4嵌套if语句else{ if(disc>=0){ cout<<"Theroot1is:"<<m+n<<endl; cout<<"Theroot2is:"<<m-n<<endl; } else{ cout<<"Thecomplexroot1is:"<<m<<"+"<<n<<"i"<<endl; cout<<"Thecomplexroot2is:"<<m<<"-"<<n<<"i"<<endl; }}return0;}运行结果:pleaseinputa,b,c:367Thecomplexroot1is:-9+10.3923iThecomplexroot2is:-9-10.3923i4.3.5switch语句C++提供了一条多路选择语句:switch语句,也称为开关语句,它能根据某个表达式的值在多个语句中选择一个语句来执行,一般形式如下:switch(<表达式>){case<常量表达式1>:<语句1>case<常量表达式2>:<语句2>…case<常量表达式n>:<语句n>default:<语句n+1>}4.3.5switch语句switch是关键字,case和default是子句关键字,语句1,语句2,……语句n+1是由一条或多条语句组成的语句段,也可为空,即无任何语句。switch语句的执行过程:首先计算表达式的值,然后逐个与其后的常量表达式值相比较,当表达式的值与某个常量表达式的值相等时,以此作为入口,执行switch结构中该入口以后的所有语句。当遇到break时,立即结束switch语句的执行,否则,顺序执行到本switch结构的最后一条语句,即花括号中的最后一条语句。当表达式的值与所有case分支的常量表达式均不相同时,则执行default后面的语句。4.3.5switch语句使用switch语句时应注意:switch后面括号内表达式的值一般是一个整数表达式或字符表达式,与之对应,case后面应是一个整数或字符,也可以是不含变量的常量表达式;switch的执行部分是由一些case分支与一个可省略的default分支组成的复合语句,要用花括号括起来;常量表达式1~常量表达式n的值必须互不相同;每个case分支允许有多个处理语句,可以不用花括号括起来;4.3.5switch语句如果每个分支的处理语句中都有break语句,各分支的先后顺序可以变动,不会影响程序执行结果;多个case可以共用一组语句,如:…case'A':case'B':case'C':cout<<">60"<<endl;break;…default分支可以省略;switch结构可以嵌套;switch语句便于编译器进行优化。4.3.5switch语句【例4.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;}4.3.5switch语句【例4.9】依据输入的两个整数与操作符运算符,执行运算,并将结果输出,其中操作符运算符是:+、-、*、%或/之一。#include<iostream>usingnamespacestd;intmain(){intnum1,num2;charop;cout<<"pleaseinputnum1andnum2:"<<endl;cin>>num1>>num2;cout<<"pleaseinputop:"<<endl;

cin>>op;switch(op){

case'+': cout<<num1<<"+"<<num2<<"="<<num1+num2<<endl;break; case'-': cout<<num1<<"-"<<num2<<"="<<num1-num2<<endl;break; case'*': cout<<num1<<"*"<<num2<<"="<<num1*num2<<endl;break;4.3.5switch语句case'/': if(num2!=0) cout<<num1<<"/"<<num2<<"="<<num1/num2<<endl;

else cout<<"num2=0"<<endl; break; case'%': if(num2!=0) cout<<num1<<"%"<<num2<<"="<<num1%num2<<endl;

else cout<<"num2=0"<<endl; break; default: cout<<"unknownop:"<<op<<endl; } return0;}4.3.5switch语句【例4.10】输入一个字符串,统计其中元音字母(不区分大小写)的个数,以“#”作为输入结束符。#include<iostream>#include<cctype>usingnamespacestd;intmain(){charch;intaCnt=eCnt=iCnt=oCnt=uCnt=0;cout<<"请输入字符串:"<<endl;while((ch=cin.get())!='#')switch(ch){case'a': case'A': ++aCnt;break;case'e':case'E': ++eCnt;break;4.3.5switch语句

case'i': case'I': ++iCnt;break; case'o': case'O': ++oCnt;break; case'u': case'U': ++uCnt;break;}cout<<"元音字母a(A)的个数为:"<<aCnt<<endl;cout<<"元音字母e(E)的个数为:"<<eCnt<<endl;cout<<"元音字母i(I)的个数为:"<<iCnt<<endl;cout<<"元音字母o(O)的个数为:"<<oCnt<<endl;cout<<"元音字母u(U)的个数为:"<<uCnt<<endl;return0;}4.4循环结构

循环有两个基本元素:组成循环体的、要重复执行的语句或语句块。决定何时停止重复循环的循环条件。循环结构的特点:在给定条件成立时,反复执行某程序段,直到条件不成立为止。4.4循环结构循环得以进行的条件是:有循环控制变量;对控制变量赋予初始值;在每次循环过程中存在用来改变控制变量的递增/递减值;测试循环控制变量的最终条件值(用来判定循环是否应该结束)。C++提供三种循环语句:while、do-while和for循环语句,这三种循环语句可以构成多种不同形式的循环结构,在许多情况下,这三种语句又可互相代替。4.4.1while语句while语句的一般形式为:while(<表达式>)

<语句>表达式是循环条件,语句为循环体,当循环条件满足时执行,语句既可以是单语句,也可以是复合语句,若是单语句,可以省略构成复合语句的花括号。4.4.1while语句在执行while语句时,首先计算表达式的值,当值为真(非0)时,执行循环体语句,然后重复上述过程,直到循环条件表达式的值为假(0)时,循环结束,程序控制转至while循环语句的下一语句,while语句的流程如下:图4-4while语句流程图4.4.1while语句使用while语句应注意以下几点:“先判断,后执行”,如果循环条件表达式的值一开始就为假(0),则循环体一次也不执行,但循环条件表达式是一定要执行的;while语句中的循环条件表达式一般是关系表达式或逻辑表达式,只要表达式的值为真(非0)即可继续循环;循环体可由一条或多条语句组成,由多条语句组成时,须用花括号括起来,组成复合语句;为使循环最终能够结束,不产生死循环,每执行一次循环体,循环条件表达式的值应趋于“0”变化。4.4.1while语句【例4.11】求自然数1~100之和。#include<iostream>usingnamespacestd;intmain(){inti,sum;i=1;sum=0;while(i<=100){ sum+=i; i++;}cout<<"1+2+3+…+100="<<sum<<endl;return0;}4.4.1while语句循环次数ii<=100sum+=i;第1次111第2次213第3次316第4次4110第5次5115第6次6121…………第100次10015050第101次1010不执行表4-1while循环语句的执行过程4.4.1while语句【例4.12】输入n个数,输出最大的一个数。#include<iostream>usingnamespacestd;intmain(){intn,i,num,max;i=1;cout<<"pleaseinputn:"<<endl;cin>>n;cout<<"pleaseinput"<<n<<"number:"<<endl;cin>>num;while(i<n){ cin>>num; if(num>max) max=num;

i++; }cout<<"Themaxis:"<<max<<endl;

return0;}4.4.2do-while语句do-while语句的一般形式为:do{ <语句>}while(<表达式>);其中,语句为循环体,同样,这里语句既可以是单语句,也可以是复合语句。表达式是循环条件。do-while语句首先执行循环体一次,再判别表达式的值,若为真(非0)则继续循环,否则终止循环。4.4.2do-while语句do-while语句和while语句的区别在于前者是先执行后判断,至少要执行一次循环体,而后者是先判断后执行,如果条件不满足,则循环体一次也不执行。do-while语句可以组成多重循环,也可以和while语句相互嵌套;while语句和do-while语句可以相互替代,相互替换时,要注意修改循环控制条件。4.4.2do-while语句do-while语句的流程如下:图4-5do-while语句流程图4.4.2do-while语句比较以下两段代码,前者使用while语句,后者使用do-while语句,分析变量a的值。代码段一:inta=0;while(a>0){

a--;}代码段二:

inta=0;do

{

a--;}while(a>0);4.4.2do-while语句【例4.13】求自然数1~100之和,要求使用do-while语句实现。#include<iostream>usingnamespacestd;intmain(){

inti,sum;i=1;sum=0;do{

sum+=i; i++;}while(i<=100);cout<<"1+2+3+…+100="<<sum<<endl;return0;}4.4.2do-while语句【例4.14】找出1~100之间的整数中,是3的倍数或5的倍数这样的数的个数。#include<iostream>usingnamespacestd;intmain(){intsum=0,n=1;//sum为统计结果,n为循环控制变量do{ if(n%3==0||n%5==0) sum++; n++; }while(n<=100);cout<<"Thetotalnumberis:"<<sum<<endl;return0;}4.4.3for语句for语句是C++所提供的功能更强,使用更为广泛的一种循环语句。其一般形式为:for(<表达式1>;<表达式2>;<表达式3>)

<语句>表达式1:用于设定控制循环次数的变量,即循环控制变量的初值。表达式2:作为条件,判断循环是否能继续进行。通常是关系表达式或逻辑表达式。表达式3:用于修改循环控制变量的值。多数情况下为自增/自减表达式。4.4.3for语句for语句的执行过程:首先计算表达式1的值,为循环控制变量赋初值;再计算表达式2的值,若值为真(非0)则执行循环体一次,否则跳出循环,执行for循环后的语句;再计算表达式3的值,转回第2步重复执行,直到表达式2的值为假时,退出循环;4.4.3for语句在整个for语句执行过程中,表达式1只计算一次,表达式2和表达式3则可能计算多次,循环体可能多次执行,也可能一次都不执行。for语句的执行流程如下所示:

图4-6for语句流程图4.4.3for语句【例4.15】计算某班40名学生的C++课程平均成绩。#include<iostream>usingnamespacestd;intmain(){floataverage,sum,score;sum=0;for(inti=0;i<40;i++){ cin>>score; sum+=score; }average=sum/40;cout<<"Theaveragescoreis:"<<average<<endl;

return0;}4.4.3for语句【例4.16】求自然数1~100之和,要求使用for语句实现。#include<iostream>usingnamespacestd;intmain(){intsum;sum=0;for(inti=1;i<=100;i++) sum+=i;cout<<"1+2+3+…+100="<<sum<<endl;return0;}4.4.3for语句程序中,for语句中的表达式3为i++,作用是改变循环变量的值。for语句与while语句可以相互替换,for语句可改成如下的while语句:<表达式1>while(<表达式2>){ <语句> <表达式3>}4.4.3for语句for语句在使用时需要注意如下几点:for语句中的各表达式都可省略,但分号间隔符不能少。如:for(;表达式2;表达式3)省去了表达式1,for(表达式1;;表达式3)省去了表达式2,for(表达式1;表达式2;)省去了表达式3,for(;;)省去了全部表达式。在循环变量已赋初值时,可省去表达式1,若省去表达式2或表达式3,将可能造成死循环,这时应在循环体内设法结束循环。4.4.3for语句例4.16中求1~100自然数之和的程序,可改写为如下等价形式:形式一:intsum=0;inti=1;for(;i<=100;i++) sum+=i;for语句中省去了表达式1,循环变量的初值在for语句之前由i=1;

语句设置。4.4.3for语句形式二:intsum=0;inti=1;for(;i<=100;) sum+=i++;for语句中省去了表达式1和表达式3,循环变量的设置在for语句之前完成,循环变量的修改在循环体内的sum+=i++;语句中执行。4.4.3for语句形式三:intsum=0;inti=1;for(;;){ sum+=i++;

if(i==101) break;}for语句的表达式全部省去,由循环体中的语句实现循环变量的递增修改和循环条件的判断。4.4.3for语句形式四:intsum=0;for(inti=1;i<=100;sum+=i,i++);循环体是空语句,本应在循环体中执行的累加在表达式3中完成了,注意空语句后分号不可少,否则将把后面的cout语句当成循环体来执行。反之,若循环体非空时,不能在表达式括号后加分号,这样,编译器会认为循环体是空语句。4.4.3for语句for语句可与while、do-while语句相互嵌套,构成多重循环,以下都是合法的嵌套。形式一:for(){ …

while() {…} …}4.4.3for语句形式二:do{

…for()

{…}

…}while();形式三:while(){

for()

{…}

…}形式四:for(){

for() {…}}4.4.3for语句【例4.17】编程求出小于n的所有素数。分析:对小于n的所有数进行测试:for(inti=2;i<n;i++){

//测试i是否为素数; //若i为素数则输出i;}测试i是否为素数方法是:用2,3,…,i-1这些数逐个去除i,只要被其中一个数整除,则i就不是素数。4.4.3for语句#include<iostream>#include<cmath>usingnamespacestd;intmain(){ intn; cout<<"请输入一个正整数:"<<endl; 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;}4.4.3for语句【例4.18】打印如下九九乘法表。1*1=11*2=22*2=41*3=32*3=63*3=91*4=42*4=83*4=124*4=161*5=52*5=103*5=154*5=205*5=251*6=62*6=123*6=184*6=245*6=306*6=361*7=72*7=143*7=214*7=285*7=356*7=427*7=491*8=82*8=163*8=244*8=325*8=406*8=487*8=568*8=641*9=92*9=183*9=274*9=365*9=456*9=547*9=638*9=729*9=814.4.3for语句分析:九九乘法表共有九行,第i行上有i个式子,用二重for循环完成,外层for循环控制共输出九行;内层for循环控制每行的输出。for(inti=1;i<=9;i++){

for(intj=1;j<=i;j++)

//{打印第i行上的第j个式子;} //换行;}4.4.3for语句#include<iostream>usingnamespacestd;intmain(){ for(inti=1;i<=9;i++){ for(intj=1;j<=i;j++) cout<<j<<"*"<<i<<"="<<i*j<<""; cout<<endl; }

return0;}4.4.3for语句三种循环控制语句小结:while、do-while、for循环语句,三者语句形式不同,相互之间有一定的区别,但主要结构都是由循环控制条件和循环体构成。从表达能力上讲,三种循环语句是等价的,它们之间可以互相替代;while、do-while循环一般采用标志式循环(循环次数未知),for循环采用的大多数为计数式循环(循环次数已知)。4.4.3for语句如果循环前能确定循环的步数(计数控制的循环),或者下一次循环准备比较明确,则用for语句,即for一般用于循环次数可预知的重复控制;如果是由事件控制的循环,一般使用while或do-while语句,如果循环至少执行一次,则使用do-while语句;for语句直观地表示出:循环初始化、循环结束条件以及下一次循环准备,而且循环控制均在循环顶部统一表示,结构性比较好,很多情况下都采用for语句。4.5流程转向语句4.5.1break语句break语句的格式:break;break语句的作用:结束switch语句的某个分支的执行;退出包含它的最内层循环语句(循环嵌套的情形),即循环体中只要执行了break语句,就立即结束当前(本层)循环,循环体中跟在break语句后面的语句将不再执行,程序继续执行循环之后的语句;在循环体中,break语句一般作为某个if语句的子句,用于实现进一步的循环控制。4.5.1break语句【例4.19】商店售货提供折扣,购货金额数量越大,折扣越大,标准为(m:购货金额,d:折扣率):m<250(元) d=0%250≤m<500 d=5%500≤m<1000 d=7.5%1000≤m<2000 d=10%m≥2000 d=15%从键盘输入购货金额,计算实付金额。4.5.1break语句分析:首先应找出购货金额与折扣率之间对应关系变化的规律。从题意可知,当购货金额m每变化250元或250元的倍数时,折扣率就会变化。用m/250来表示折扣率的分档情况,见下表。mc=m/250dm<25000%250≤m<50015%500≤m<10002,37.5%1000≤m<20004,5,6,710%m≥2000815%商店打折售货分档情况表根据购货金额确定好折扣率后,再计算出实付金额。4.5.1break语句#include<iostream>usingnamespacestd;intmain(){intm,c;floatd,f;cout<<"inputm:";cin>>m;if(m>=2000)c=8;elsec=m/250;switch(c){

4.5.1break语句

case0: d=0;break;

case1: d=5;break; case2:

case3: d=7.5;break;

case4: case5:

case6:

case7: d=10;break; case8: d=15;break; } f=m*(1–d/100); cout<<"f="<<f<<endl;

rerurn0;}4.5.1break语句注意:对于嵌套的循环语句,break语句只能跳出当前(本层)循环语句,即从内层循环跳到外层循环,要退出外层循环还要在外层循环中使用break,例如:

inti=0,sum=0;while(i<5){

for(intj=0;j<5;j++){ sum+=i+j; if(j==i)

break;

}

i++;}4.5.2continue语句continue语句的格式:continue;continue语句只能用在循环语句的循环体中,表示立即结束本次循环,准备进入下一次循环。对于while和do-while语句,continue语句将使控制转到循环条件的判断;对于for语句,continue语句将使控制转到:先计算表达式3,然后计算表达式2,并根据表达式2的计算结果来决定是进入下一次循环还是结束循环。4.5.2continue语句【例4.20】输入10个整数,统计其中正数的个数及正数的和。#include<iostream>usingnamespacestd;intmain(){inta,num=0,sum=0; cout<<"pleaseinput10integer:";for(inti=1;i<=10;i++){ cin>>a; if(a<=0) continue;//若a为负数则转向for语句中表达式3执行

num++;//若a为正数则num加1,将a累加到sum中

sum+=a;}cout<<"正数个数:"<<num<<'\t'<<"正数之和:"<<sum<<endl;return0;}注意:continue语句不能在循环语句之外单独使用,用在嵌套循环语句中时,只对当前循环起作用。4.5.2continue语句continue语句和break语句的区别是:continue语句只结束本次循环,而break语句则是结束整个循环,不再进行条件判断。

【例4.21】输出100~200之间不能被3整除的数。#include<iostream>usingnamespacestd;intmain(){for(intn=100;n<=200;n++){if(n%3==0) continue; cout<<n<<'\t'; }

return0;}运行结果:100101103104…1992004.5.3goto语句goto语句的作用是改变程序的流程,无条件地转移到指定语句标号的语句处去执行。goto语句的格式:goto<语句标号>;语句标号定义格式为:<语句标号>:<语句>4.5.3goto语句LOOP:sum+=i++;if(i<=100)

goto

LOOP;语句标号标识语句在程序中的位置,常常作为转移语句(goto语句)的转移目标,语句标号可用除整数以外的标识符来表示,语句标号可以直接使用,不必先声明后使用,例如:4.5.3goto语句【例4.22】求sum=1+2+3+4+…+n,n由键盘输入。分析:可用if语句和goto语句构成循环结构来完成。#include<iostream>usingnamespacestd;intmain(){inti,n,sum;cout<<"pleaseinputaninteger:";cin>>n;sum=0;i=1;loop:sum=sum+i;

4.5.3goto语句

i++;if(i<=n)gotoloop;cout<<"sum="<<sum<<endl;return0;}运行结果:pleaseinputaninteger:6sum=214.5.3goto语句goto语句的几点说明:可从条件语句或循环语句里面转移到条件语句或循环语句外面,但不允许从条件语句或循环语句外面转移到条件语句或循环语句里面;不能用goto语句转移到其它函数中;属于非结构化的转向控制语句,非结构化语句的缺点是:使程序的静态结构和动态结构不一致、程序的可读性下降、容易出错(结构化程序中的每一个结构都应是单入口/单出口,goto语句会破坏这个规则),因此,结构化程序设计不提倡用goto语句;4.5.3goto语句一般用来与if语句一起构成循环结构;优点是灵活、高效,主要用于跳出多重循环。例如:for(intm=1;m<10;m++)

for(intn=1;n<10;n++) if(m*n==50)

gotoEND;//输出两个小于10且乘积为50的正整数END:cout<<m<<","<<n<<endl; 4.6编译预处理【例4.23】输入两个整数a和b,调用函数max()求两数最大值。//filemain.cpp#include<iostream>//包含输入/输出头文件iostream#include"filemax.h"//

包含自定义头文件filemax.husingnamespacestd;intmain(){ inta,b; cout<<"Inputa,b:"; cin>>a>>b; cout<<"max="<<max(a,b)<<endl; return0;}4.6编译预处理在C++中,常用的编译预处理命令有:文件包含命令宏定义命令条件编译命令所有预处理命令在程序中都以“#”开头,一般放在源程序的开头处,编译预处理命令单独占一行,该行上不能再有预处理命令和语句。预处理命令一行写不下,可以续行,但需要加续行符(\)。预处理命令实际上是编译命令,它不是语句,一般不需要用(;)结束。上例中,#include<iostream>称为“编译预处理命令”。在C++中,程序被正常编译之前,对源程序中的预处理命令作处理的过程称为编译预处理。4.6.1文件包含命令将另一个头文件(.h)内容包含到本源文件中称为文件包含,文件包含命令格式如下:#include<文件名>

或#include"文件名"文件包含命令的功能是将“文件名”所指的文件内容读入到当前文件中,作为当前文件的一个组成部分,即用文件内容替代该#include命令。在#include命令中,文件名可以用双引号或尖括号括起来,其中,尖括号指示编译器到存放C++库函数头文件的目录中查找要包含的文件,用于调用库函数头文件。双引号指示编译器先在用户当前目录中找要包含的文件,若找不到再查找库函数的头文件目录,用于调用自定义头文件。

4.6.1文件包含命令例如:源程序文件file1.cpp中有文件包含命令:#include"file2.h",则编译预处理程序将file2.h文件的全部内容复制并插入到file1.cpp文件中的#include"file2.h"命令处,即file2.h被包含到file1.cpp中,然后将包含file2.h后的file1.cpp文件作为源程序文件来处理。图4-7文件包含命令4.6.1文件包含命令现将例4.23补充完整,头文件filemax.h的内容为:intmax(intx,inty){

return(x>y?x:y);}编译预处理后,源文件filemain.cpp的内容如下:#include<iostream>usingnamespacestd;intmax(intx,inty){return(x>y?x:y);}intmain(){inta,b;cout<<"Inputa,b:";cin>>a>>b;cout<<"max="<<max(a,b)<<endl;return0;}4.6.1文件包含命令说明:#include只能指定一个被包含文件,如果要包含多个文件,则要用多个#include命令;文件包含是可以嵌套的。例如:file1.cpp中有命令:#include"file2.h"file2.h中有命令:#include"file3.h"相当于:file1.cpp中有命令:#include"file2.h"#include"file3.h“根据需要,文件包含命令可出现在源程序中的任何位置:源程序的开头、中间或者末尾,通常,将文件包含命令放在源程序文件开始部分。

4.6.2宏定义用指定的标识符来代表一个字符串称为宏定义,该标识符被称为宏名,被定义的字符串称为替换文本。宏定义分为无参数的宏定义和带参数的宏定义两种。

无参数的宏定义命令格式:#define<宏名>字符串其中,define是关键字,<宏名>是一个标识符,字符串是任意的字符序列。例如:#definePI3.1415926#defineN20#defineMAXSIZE100#defineEPS1.0e-84.6.2宏定义一个标识符被宏定义后,该标识符就是一个宏名。这时,在程序的代码中出现的宏名,在编译时,首先将宏名用被定义的字符串替换,这个过程称为宏替换,替换后才继续进行编译。例如:#definePROMPT"Areais"作用是将宏名PROMPT定义为字符串“Areais”。若程序中有如下语句:cout<<PROMPT;则用"Areais"代替宏名PROMPT,即变成:cout<<"Areais";4.6.2宏定义【例4.24】求圆的周长、面积及圆球的体积。#include<iostream>usingnamespacestd;#definePI3.14159//无参数宏定义命令将宏名PI定义为实数3.14159intmain(){floatr,l,s,v;cout<<"Inputradious:";cin>>r;l=2.0*PI*r; s=PI*r*r;//宏替换:用3.14159代替PI,s=3.14159*r*rv=4.0/3.0*PI*r*r*r;cout<<"Perimeter="<<l<<endl;cout<<"Area="<<s<<endl;cout<<"Volume="<<v<<endl;

return0;}运行结果:Inputradious:6.5Perimeter=40.8407Area=132.732Volume=1150.354.6.2宏定义一般在使用宏定义时应该注意以下几点:宏名一般习惯用大写字母,以便与变量名相区别;宏替换仅作替换不作正确性检查;宏定义命令不是C++语句,不必在行末加分号;宏定义可出现在程序中的任何位置。通常,将宏定义放在源程序文件开始部分。宏名的作用域为从宏定义开始到该源程序文件结束;可用#undef命令终止宏名的作用域,格式为:#undef宏名4.6.2宏定义例如:#defineN100main(){…}#undefNf(){ …}在进行宏定义时,可以引用已定义的宏名,即宏名可以层层替换。4.6.2宏定义【例4.25】求圆的周长、面积及圆球的体积。#include<iostream>usingnamespacestd;#definePI3.14159#defineR10.0#defineL2*PI*R#defineSPI*R*R#defineV4.0/3.0*PI*R*R*Rintmain(){ cout<<"L="<<L<<endl; cout<<"S="<<S<<endl; cout<<"V="<<V<<endl;

return0;}运行结果:L=62.8318S=314.159V=4188.794.6.2宏定义对程序中用双引号括起的“宏名”不进行替换,双引号括起的“宏名”其实是字符串常量,即不会替换字符串常量中的宏名;不支持宏名重定义,在同一个作用域内,同一个宏名不能定义两次或两次以上;宏定义与定义变量的含义不同,只作字符替换,不分配内存空间。4.6.2宏定义带参数的宏定义命令格式:#define宏名(<参数表>)字符串宏名是标识符,<参数表>中的参数为形参列表,可以有一个或多个参数,参数之间以逗号分隔,这些形参在程序中将被实参替换。字符串是被替换用的字符序列。如果有带实参的宏名,则按#define命令行中指定的字符串进行替换,并用实参替换形参,这个过程称为“宏调用”。例如:#defineADD(x,y)x+y如果在程序中有如下语句:sum=ADD(3,4);则被替换为:sum=3+4;4.6.2宏定义【例4.26】求圆的周长、面积及圆球的体积。#include<iostream>usingnamespacestd;#definePI3.14159#defineL(r)2.0*PI*r//定义带参数宏名L(r),其中r为形参#defineS(r)PI*r*r#defineV(r)4.0/3.0*PI*r*r*rintmain(){floatradius;cout<<"Inputradius:";cin>>radius;cout<<"L="<<L(radius)<<endl;//宏调用后为cout<<"L="<<2.0*3.14159*radius<<endl;cout<<"S="<<S(radius)<<endl;cout<<"V="<<V(radius)<<endl;

return0;}4.6.2宏定义注意点:若宏调用中的实参为表达式,则在宏定义中应用括号将形参括起来。例如:使用带参数的宏定义求圆面积时,宏定义为:#defineS(r)3.14159*r*r若程序中有宏调用语句:area=S(a+b);

//实参为表达式a+b则替换成:area=3.14159*a+b*a+b;

//可能并非程序员原意所以宏定义应改为:#defineS(r)3.14159*(r)*(r)此时形参替换成:area=3.14159*(a+b)*(a+b);

//正确4.6.2宏定义宏名与括号间不能有空格,否则将空格后的全部字符都作为无参数宏所定义的字符串。例如:#defineS(r)3.14159*r*r认为S是不带参数的宏定义,代表字符串“(r)3.14159*r*r”。若程序中有:area=S(a);则替换成:area=(r)3.14159*r*r(a);

//错误4.6.2宏定义带参数的宏和函数的区别:定义形式不一样。宏定义中只给出形式参数,而不要指明每一个形式参数的类型。在函数定义时,必须指定每一个形式参数的类型。函数调用时,要求实参和形参的类型一致,而宏调用时不存在类型问题;函数调用是在程序运行时进行的,分配临时的内存单元;宏调用则是在程序编译时进行的,并不分配内存单元,不进行值的传递处理;函数调用时,先求实参表达式的值,然后将值代入形参;而宏调用时只是用实参文本替换形参;宏展开后源程序膨胀,相应地,编译生成的二进制可执行文件体积也会变大;函数调用不存在这个问题。

4.6.3条件编译一般情况下,源程序中所有的行都参加编译。但是有时希望对其中的一部分内容只在满足一定条件才进行编译;有时希望当满足某条件时对一组语句进行编译,而当条件不满足时,则编译另一组语句,即对源程序的一部分内容指定编译条件,这就是“条件编译”。4.6.3条件编译条件编译命令有三种格式:格式1:#ifdef<标识符

温馨提示

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

评论

0/150

提交评论