程序结构和程序控制语句.docx
《程序结构和程序控制语句.docx》由会员分享,可在线阅读,更多相关《程序结构和程序控制语句.docx(32页珍藏版)》请在冰豆网上搜索。
程序结构和程序控制语句
C++的语句类型
C++程序的组成:
一个C++程序可以由若干个源程序文件组成,一个源程序文件可以有若干个函数和编译预处理命令组成,一个函数由函数说明部分和函数执行部分组成,函数执行部分由数据定义和若干个执行语句组成。
语句是组成程序的基本单元。
C++语言的语句可以分成以下六大类:
(1)说明语句:
对变量、符号常量、数据类型的定义性说明
例如:
inta,b,c;//定义整型变量a、b、c
①仅向编译系统提供说明信息,在程序执行期间并不执行任何操作。
如,定义变量语句inta,b,c;是告诉编译系统为变量a、b、c各分配4个字节的存储空间用于存放变量的值。
程序执行时,该语句就不起任何作用了。
②说明语句可出现在函数内、外,允许出现语句的任何地方。
(2)控制语句:
能改变程序执行顺序完成控制功能的语句。
C++中控制语句主要有:
(3)函数和流对象调用语句:
函数调用语句又一次函数调用加一个分号构成一个语句,如:
【例1】分析下面程序的功能:
#include
usingnamespacestd;
intmax(inta,intb)//自定义函数
{if(a>b)returna;
elsereturnb;
在一次函数调用后加上一个分号所构成的语句称为函数调用语句。
其一般格式为:
<函数名>(实参);例如:
m=max(a,b);该语句实现将max(a,b)的返回值赋给变量m。
}
intmain()
{inta,b,m;
cout<<"Inputa,b:
";
cin>>a>>b;
m=max(a,b);//函数调用语句
cout<<"max="<system("pause");
return0;
}
(4)表达式语句:
由一个表达式后加一个分号构成一个语句。
例如:
由一个赋值表达式加一个分号构成一个赋值表达式语句:
y=x*x+2*x;
注意:
i=i+1//是一个赋值表达式
i=i+1;//是一个赋值语句
(5)空语句:
;只有一个分号所构成的语句称为空语句。
下面就是一个空语句:
;
空语句什么也不做,它将在特殊的时候是有用的,讲循环时再细讲。
(6)复合语句(语句块):
用{}将若干语句括起来构成的语句。
“{}”后不再需要分号。
复合语句主要用于控制语句中。
例如:
{t=a;a=b;b=t;}//实现a,b数值的交换。
程序的三种基本结构即顺序结构、分支结构和循环结构,都是通过语句来实现的。
1.顺序结构:
按语句顺序依次执行的结构称为顺序结构。
2.分支结构
(1)两路分支:
在两种可能的操作中按条件选取一个执行的结构称为分支结构。
(2)多路分支:
在多种可能的操作中按条件选取一个执行的结构称为分支结构,
3.循环结构:
在人们所要处理的问题中常常遇到需要反复执行某一操作的情况,计算机实现这一操作的程序就要用到循环结构。
循环结构有两种形式,即当型循环结构和直到型循环结构。
分支语句
分支语句用于实现分支程序设计。
分支程序有两路分支结构和多路分支结构,两路分支结构可用if语句实现,多路分支结构可以用嵌套的if语句或switch语句实现。
1.if语句的三种形式
(1)单选条件语句
语句格式:
if(<表达式>)<语句>
执行过程:
当表达式的值为非0(真)时,执行语句,
否则不执行语句。
说明:
①表达式必须用“()”括起来;
②语句只能是单个语句或复合语句。
(2)两选条件语句
语句格式:
if(<表达式>)
<语句1>
else
<语句2>
执行过程:
当表达式的值为非0(真)时,执行语句1,
否则执行语句2。
(3)多选条件语句
多选条件语句的格式为:
if(<表达式1>)<语句1>
elseif(<表达式2>)<语句2>
elseif(<表达式2>)<语句3>
......
elseif(<表达式n-1>)<语句n-1>
else<语句n>
【例2】输入两个整数a和b,用单选条件语句实现输出其中较大的一个数。
程序流程图如右图所示。
程序如下:
#include
usingnamespacestd;
intmain()
{
inta,b,max;
cout<<"Inputa,b:
";
cin>>a>>b;
max=a;
if(b>max)max=b;
cout<<"max="<system("pause");
return0;
}
程序执行后屏幕显示:
Inputa,b:
38
max=8
【例3】输入两个整数a和b,用两选条件语句实现输出其中较大的一个数。
程序流程图如右图所示,程序代码如下:
#include
usingnamespacestd;
intmain()
{
inta,b,max;
cout<<"Inputa,b:
";
cin>>a>>b;
if(a>b)max=a;
elsemax=b;
cout<<"max="<system("pause");
return0;
}
程序执行后提示:
Inputa,b:
38
max=8
【例4】已知下列分段函数,要求编一程序,输入x,输出相应的y的值。
分段函数
程序流程图如右图所示。
程序代码如下:
#include
usingnamespacestd;
intmain()
{
floatx,y;
cout<<"请输入一个实数x=";
cin>>x;
if(x<0)y=x+1;
elseif(x<10)y=x*x-5;
elsey=x*x*x;
cout<<"y="<system("pause");
return0;
}
程序执行后提示:
请输入一个实数x=3
y=4
2.if语句的嵌套
在if语句中又包含一个或多个if语句称为if语句的嵌套。
其一般格式为:
if(<表达式1>)
if(<表达式2>)
<语句1>
else
注意:
else总是与其前面最近的
还没有配对的if进行配对.
<语句2>
else
if(<表达式3>)
<语句3>
else
<语句4>
【例5】使用if语句嵌套的方法实现【例4】
程序流程图及程序代码如下:
#include
usingnamespacestd;
intmain()
{
floatx,y;
cout<<"请输入一个实数x=";
cin>>x;
if(x>=0)
if(x>=10)
y=x*x*x;
else
y=x*x-5;
else
y=x+1;
cout<<"y="<system("pause");
return0;
}
程序执行后提示:
请输入一个实数x=-3
y=-2
注意:
在该程序中,内层的if语句嵌套在外层的if语句的if部分。
C++规定if语句嵌套使用时,else与if的的配对关系是:
else总是与其前面最近的还没有配对的if进行配对。
例如:
如果要改变这种约定,则应该用花括号构成复合语句。
例如:
if(<表达式1>)
{if(<表达式2>)<语句1>}
else
<语句2>
【例6】求三个整数a、b、c中的最大者,a、b、c由键盘输入。
(自行完成)
程序执行后提示:
请输入三个整数a,b,c:
145
a,b,c中最大的数max=5
#include
usingnamespacestd;
intmain()
{
inta,b,c,max;
cout<<"请输入三个整数a,b,c:
";
cin>>a>>b>>c;
if(a>b)
if(a>c)max=a;
elsemax=c;
else
if(b>c)max=b;
elsemax=c;
cout<<"a,b,c中最大的数max="<system("pause");
return0;
}
2.switch语句(开关语句):
实现多路分支程序。
执行过程:
将条件表达式的值与case后常量值比较,若相等就执行此case后语句,完后再执行下一个case语句,最后执行default后的语句。
语句格式
switch(<条件表达式>)
{
case<常量表达式1>:
〔<语句1>〕
case<常量表达式2>:
〔<语句2>〕
......
case<常量表达式n-1>:
〔<语句n-1>〕
〔default:
<语句n>〕
}
说明:
(1)条件表达式与常量表达式只能是整型或字符型表达式;
(2)每个case后面的常量表达式的值必须互不相同;
(3)一个case后可有多个语句(不必用花括号),也可以没有任何语句。
注意:
在执行switch语句的过程中,每当执行完一个case后面的语句后,程序会不加判断地自动执行下一个case后面的语句。
每个case后面的常量表达式只起语句标号的作用,是switch语句中执行各语句的入口,并不在此进行条件判断
【例7】输入0~6的整数,将其转换成对应的星期几。
程序代码如下:
#include
usingnamespacestd;
intmain()
{inta;
cout<<"请输入一个0-6的整数(分别对应周日至周六):
";
cin>>a;
switch(a)
{
case0:
cout<<"Sunday\n";
case1:
cout<<"Monday\n";
case2:
cout<<"Tuesday\n";
case3:
cout<<"Wednesday\n";
case4:
cout<<"Thursday\n";
在本例中,若运行程序时输入4,则执行结果为:
Thursday
Friday
Saturday
Inputdataerror
case5:
cout<<"Friday\n";
case6:
cout<<"Saturday\n";
default:
cout<<"Inputdataerror.\n";
}
system("pause");
return0;
}
程序执行后发现结果并不是我们希望的,而要想实现我们的要求,就应该在执行完指定的一个case分支后,使程序跳出switch语句,即终止switch语句的执行,而这操作可用break语句来实现。
3.break语句:
中止当前语句的执行,并跳转到下一条语句处执行。
语句格式:
break;
若将上例程序中switch语句的内嵌代码改写如下,请分析结果;
case0:
cout<<"TodayisSunday\n";break;
case1:
cout<<"TodayisMonday\n";break;
case2:
cout<<"TodayisTuesday\n";break;
case3:
cout<<"TodayisWednesday\n";break;
case4:
cout<<"TodayisThursday\n";break;
case5:
cout<<"TodayisFriday\n";break;
case6:
cout<<"TodayisSaturday\n";break;
default:
cout<<"Inputdataerror.\n";
注意:
从开关语句的执行过程可知,任一开关语句均可用条件语句来实现,但并不是任何条件语句均可用开关语句来实现,这是由于开关语句限定了表达式的取值类型,而条件语句中的条件表达式可取任意类型的值。
【例8】商店打折售货。
购货金额数量越大,折扣越大。
具体标准如下(m:
购货金额,d:
折扣率)。
要求从键盘上输入购货金额,计算并输出实付的金额。
#include
usingnamespacestd;
intmain()
{intm,c;
floatd,f;
cout<<"Inputm:
";
cin>>m;
if(m>=2000)c=8;
m
c=m/250
d
m<250
0
0%
250≤m<500
1
5%
500≤m<1000
2,3
7.5%
1000≤m<2000
4,5,6,7
10%
m≥2000
8
15%
elsec=m/250;
switch(c)
{case0:
d=0;break;
case1:
d=5;break;
case2:
case3:
d=7.5;break;
根据购货金额确定好折扣率后,再计算出实付金额。
case4:
case5:
case6:
程序执行后提示:
Inputm:
500
f=462.5
case7:
d=10;break;
case8:
d=15;break;
}
f=m*(1-d/100.0);
cout<<"f="<system("pause");
return0;
}
【例9】2005年修改后的《中华人民共和国个人所得税法》规定,个人所得,应纳个人所得税。
具体办法是,每月收入总和扣除1600元后的金额为应缴纳所得税额,应纳税所得额不超过500元的税率为5%,超过500元至2000元的部分税率为10%,超过2000元至5000元的部分税率为15%, 超过5000元至20000元的部分税率为20%超过20000元至40000元的部分税率为25%,超过40000元至60000元的部分税率为30%,超过60000元至80000元的部分税率为35%,超过80000元至100000元的部分税率为40%,超过100000元的部分税率为45%。
现要求编写程序,从键盘上输入某人本月的总收入,输出应缴纳的税额。
(要求学生自行完成)
循环语句(共三种,即while,do…while和for)
在人们所要处理的问题中常常遇到需要反复执行某一操作的情况。
被重复执行的程序段为循环程序,实现循环结构的语句称为循环语句。
在C++中,循环语句有while语句、do…while语句和for语句。
1.while语句
(1)作用:
实现“当型”循环结构。
即当条件成
立时冲复执行while语句中的内嵌语句。
(2)格式:
while(<表达式>)
语句
执行流程图如右图所示
相关说明:
①上述格式中的<表达式>称为循环条件表达式,
一般为关系表达式或逻辑表达式,必须用“()”括起来;
②语句称为循环体,也称While的内嵌语句,可以是单个或复合语句。
(3)执行过程:
先计算表达式的值,当表达式值非0时重复执行指定的语句;当表达式值为0时结束循环。
【例10】:
求从键盘上输入一个正整数n,计算S=1+2+3+4+……+n,并输出到屏幕上。
分析:
由于n可能是不断变化的,因而计算S值的程序不可能依次列出1~n个数,要完成以上的累加求和运算,可设两个整型变量sum和i,sum存放累加的和,i从1变化到n,并按下列步骤进行操作:
(1)给sum赋值0,i赋值1;//循环初始化
(2)令sum=sum+i,i=i+1;//循环体与循环修改
(3)若i≤n,则重复执行步骤
(2);//判断循环是否结束
(4)输出sum的值。
//结束处理
在以上步骤中,步骤
(2)和步骤(3)是需要重复执行的操作,其工作流程如下图所示。
这种重复执行的操作可由程序中的循环结构来完成。
下面用while语句来实现。
说明:
(1)while语句是先判断表达式i≤n是否成立,
若条件成立,则将sum加i后赋给sum及i增加1;
若条件不成立,则不执行相应语句,退出循环。
(2)当表达式的值一开始不成立,语句一次也不执行。
如当输入n为0时,i≤n不成立,语句sum=sum+i;和i++;一次也不执行。
(3)在循环体中必须有不断修改循环条件的语句,能使循环最终结束而不形成“死循环”。
如i++;语句,使i不断加1,直到大于n为止。
【例10】:
求从键盘上输入一个正整数n,计算S=1+2+3+4+……+n,并输出到屏幕上。
程序代码和程序流程图如下:
#include
usingnamespacestd;
intmain()
{
inti,n,sum;
cout<<"请输入一个正整数n=";
cin>>n;
sum=0;
i=1;
while(i<=n)
{sum=sum+i;
i++;
}
cout<<"sum="<system("pause");
return0;
}
【例11】用while语句计算T=n!
(n!
=1×2×3×4…×n)。
程序代码和程序流程图如下(用while语句):
#include
usingnamespacestd;
intmain()
{
inti,n,mult;
cout<<"请输入一个正整数n=";
cin>>n;
mult=1;
i=1;
while(i<=n)
{mult=mult*i;
i++;
}
cout<<"mult="<system("pause");
return0;
}
2.do…while语句
(1)作用:
实现“直到型”循环结构。
即重复执
行while语句中的内嵌语句直到条件不成立时停止。
(2)格式:
do
<语句>
while(<表达式>);
注意:
这里的语句与表达式跟上面讲到的while语句当中的意义完全相同,只是while语句是先判断条件再执行循环体语句,而在do…while语句的执行过程是:
先执行语句,然后计算表达式的值,当表达式值非0时重复执行语句;直到表达式值为0才结束循环。
【例12】用do…while语句实现【例10】
程序流程图及程序代码如下:
#include
usingnamespacestd;
intmain()
{
inti,n,sum;
cout<<"请输入一个正整数n=";
cin>>n;
sum=0;
i=1;
do
{sum=sum+i;
i++;
}
while(i<=n);
cout<<"1到"<system("pause");
return0;
}
说明:
(1)do…while语句是先执行sum=sum+i;和i++;语句,后判断表达式i≤n是否成立。
若条件成立,则继续执行循环体;若条件不成立,则不执行相应语句,退出循环。
(2)即使表达式的值一开始就不成立,语句仍要执行一次。
如当输入n为0时,i≤n不成立,但语句sum=sum+i;和i++;也要执行一次。
(3)在循环体中要能不断修改循环条件的语句,最终能使循环结束,否则会形成“死循环”。
【例13】用do…while语句实现【例11】。
(要求学生自行完成程序流程图并调试程序)
3.for语句
for语句的一般格式为:
for(<表达式1>;<表达式2>;<表达式3>)<语句>
说明:
(1)表达式1称为循环初始化表达式,通常为循环变量赋初值;
(2)表达式2称为循环条件表达式,通常是关系表达式或逻辑表达式作循环结束条件;
(3)表达式3称为循环增量表达式,通常为赋值表达式,简单情况下为循环变量增量。
(4)语句部分为循环体,它可以是单个或复合语句。
for语句的执行过程
(1)计算表达式1的值;
(2)计算表达式2的值,
若表达式2的值为非0(“真”)时,则转到(3);
若表达式2的值为0(“假”)时,则结束循环;
(3)执行循环体语句;
(4)计算表达式3的值,返回
(2)继续执行。
for语句的执行过程如右图所示。
3.for语句可以和下列while语句等效:
<表达式1>;
while(<表达式2>)
{
<语句>
<表达式3>;
}
【例14】用for语句实现【例10】
#include
usingnamespacestd;
intmain()
{
inti,n,sum;
cout<<"请输入一个正整数n=";
cin>>n;
sum=0;
for(i=1;i<=n;i++)sum=sum+i;
cout<<"1到"<system("pause");
return0;
}
在上例中,表达式1:
i=1完成对循环变量i的初始化赋值工作,使i的初值为1;
表达式2:
i<=n判断循环变量i的值是否小于或等于n,若不成立则结束循环;
若成立则执行sum=sum+i;语句,再执行表达式3;
表达式3:
i++,使用循环变量i加1。
转表达式2继续判断i<=n是否成立。
说明:
(1)for语句中的三个表达式都可省略,但其中的两个分号不能省略;
(2)若表达式1省略,则应在for语句之前给循环变量赋初值。
例如:
i=1;for(;i<=n;i++)sum=sum+i;
(3)若表达式2省略,则不判断循环条件,循环无终止地进行下去,形成“死循环”,即认为表达式2始终为真,因此表达式2通常不能省略;
(4)若表达式3省略,则在循环体中应有能不断修改循环条件的语句。
例如:
for(i=1;i<=n;){sum=sum+i;i++;}
(5)若省略表达式1和表达式3,只有表达式2,即只给出循环条件。
例如:
i=1;for(;i<=n;){sum=sum+i;i++;}
此时,for语句和while语句完全相同。
上述语句相当于:
i=1;while(i<=n){sum=sum+i;i++;}
(6)表达式1和表达式3可以是一个简单的表达式,也可以是其它表达式,当然可以是逗号表达式,即用逗号“,”隔开的多个简单表达式,它们的运算顺序是从左到右顺序进行。
例如:
for(sum=0,i=1;i<=n;i++)sum=sum+i;
由此可见,用for语句比用while语句书写更简洁。
【例15】用for语句【例11】(学生自行完成)
核心代码就一句话:
for(t=1.0,i=1;i<=n;i++)t=t*i;
【例16】分析下列程序的执行过程,