C程序的流程控制.doc
《C程序的流程控制.doc》由会员分享,可在线阅读,更多相关《C程序的流程控制.doc(20页珍藏版)》请在冰点文库上搜索。
第三章C++程序的流程控制
3.1流程控制与程序结构
在程序的所有流程控制方式中,有三种最基本的程序结构:
顺序结构
顺序结构是通过安排语句的排列顺序来决定程序流程的程序结构。
条件分支结构
条件分支结构是由特定的条件决定执行哪个语句的程序结构。
循环结构
循环结构是由特定的条件决定某个语句重复执行次数的程序结构。
3种程序结构的共同特点是只有一个入口和出口。
3.2条件分支结构
if语句
if(条件)语句1else语句2 //如果条件成立就执行语句1,否则就执行语句2
if(条件)语句1 //如果条件成立就执行语句1,否则什么也不做
注意语句的格式,基本语句以;结束,复合语句以}结束
if语句的嵌套
当if语句中的语句1或语句2本身也是if语句时,构成了嵌套的if语句。
来看下面的例子:
if(n>0)
if(a>b)z=a;
elsez=b;
表达的是 还是
if(n>0){ if(n>0){
if(a>b)z=a; if(a>b)z=a;
elsez=b; }
} elsez=b;
答案是前者。
注意:
else总是离它最近的一个if配对,如果你想表达的是后者,必须要用{}。
例3.1:
输入2个数,找出其中最大一个并显示出来。
#include
voidmain()
{
inti,j;
cout<<"请输入2个整数:
";
cin>>i>>j;
cout<<"2个数中最大的是:
";
if(i>=j)
cout<
else
cout<}
注意:
在编程中多使用cout输出提示性的文字,否则上来就用cin接收键盘输入,用户将不知所措。
例3.2:
输入3个数,找出其中最大一个并显示出来。
#include
voidmain()
{
inti,j,k;
cout<<"请输入3个整数:
";
cin>>i>>j>>k;
cout<<"3个数中最大的是:
";
if(i>=j){
if(i>=k)
cout<
else
cout<}
else{
if(j>=k)
cout<else
cout<}
}
本例的思想是将“从3个数中找出最大者”的问题转化成两个“从2个数中找出最大者”的问题。
例3.3:
输入3个数,找出其中最大一个并显示出来。
(例3.2的另解)
#include
voidmain()
{
inti,j,k;
cout<<"请输入3个整数:
";
cin>>i>>j>>k;
cout<<"3个数中最大的是:
";
if(iif(icout<
}
本例的思想是:
假设第一个变量i中的数为最大,分别用i和j、k比较,只要遇到比i大的数就存到i中,否则什么也不做,这样保证i中始终存放的是当前比较到的最大者。
这一思想很重要,请注意学习。
例3.4:
输入3个数,然后按从大到小的顺序把它们显示出来。
#include
voidmain()
{
inti,j,k,p;
cout<<"请输入3个整数:
";
cin>>i>>j>>k;
if(iif(iif(jcout<<"3个数从大到小排列:
";
cout<}
本例的思想:
用i、j、k从大到小存放三个数,其中涉及到交换两个变量的值问题。
若要交换两个变量x、y的值,不能只做简单的对换:
x=y;y=x;,这样将导致xy中都存放着原来y中的值。
假设x=2,y=3,下面作简单的对换,以实现x=3,y=2
x=y;//现在x=3
y=x;//现在y=3,最终x=3y=3
正确的做法是使用一个中间变量p
p=x;//现在p=2
x=y;//现在x=3
y=p;//现在y=2,最终x=3,y=2
思考:
不借助中间变量交换xy两个变量的值,应执行哪3个赋值语句?
例3.5:
输入工资薪金所得,计算应纳个人所得税并显示计算结果。
假定工资薪金所得扣除1000元后剩余部分为应纳税所得额,税率如下:
级数
全月应纳税所得额
税率(%)
1
不超过500元的部分
5
2
超过500元至2000元的部分
10
3
超过200元至5000元的部分
15
4
超过5000元至20000元的部分
20
5
超过20000元至40000元的部分
25
6
超过40000元至60000元的部分
30
7
超过60000元至80000元的部分
35
8
超过80000元至100000元的部分
40
9
超过100000元的部分
45
分析:
假设某人的工资是6830元,扣除1000元后应纳税额为5830,这5830元被分为4级分别计税:
级数
本级应纳税所得额
税率(%)
本级应纳税额
尚未计税的应纳税额
4
超过5000元部分:
5830-5000=830
20
166
5000
3
超过2000元部分:
5000-2000=3000
15
450
2000
2
超过500元部分:
2000-500=1500
10
150
500
1
不超过500元的部分:
500
5
25
0
合计:
5830
791
#include
voidmain()
{
doubleincome,tax=0.0;
cout<<"请输入全月工资薪金所得:
";
cin>>income;
income-=1000;
if(income>100000.0)
{
tax+=(income-100000.0)*0.45;
income=100000.0;
}
if(income>80000.0)
{
tax+=(income-80000.0)*0.40;
income=80000.0;
}
if(income>60000.0)
{
tax+=(income-60000.0)*0.35;
income=60000.0;
}
if(income>40000.0)
{
tax+=(income-40000.0)*0.30;
income=40000.0;
}
if(income>20000.0)
{
tax+=(income-20000.0)*0.25;
income=20000.0;
}
if(income>5000.0)
{
tax+=(income-5000.0)*0.20;
income=5000.0;
}
if(income>2000.0)
{
tax+=(income-2000.0)*0.15;
income=2000.0;
}
if(income>500.0)
{
tax+=(income-500.0)*0.10;
income=500.0;
}
if(income>0.0)
tax+=income*0.05;
cout<<"应纳个人所得税:
"<cout<cin.get();
cin.get();
}
if多分支结构
if(条件1)
语句1
else
if(条件2)
语句2
else
if(条件3)
语句3
...
else
if(条件n)
语句n
else
语句n+1
这是通过规范化的if嵌套所构成的条件分支结构,在这种结构中if语句嵌套在else之后。
但通常我们采用下面更简洁的格式:
if(条件1)语句1
elseif(条件2)语句2
elseif(条件3)语句3
…
elseif(条件n)语句n
else语句n+1
这种结构的工作原理:
先检测条件1,若满足就执行语句1;否则检测条件2,若满足就执行语句2;否则检测条件3,若满足就执行语句3 ...若所有条件都不满足则执行语句n+1,若没有else语句n+1就什么也不做。
注意:
这里的n个条件是互斥的,即只要满足其中一个条件则其他条件肯定不满足,也就是说多分支结构中的n+1个语句只有一个能被执行。
例3.6:
输入一个0-100分范围内的一个成绩,显示相应的等级:
90-100 优
80--89 良
70--79 中
60--69 及格
60分以下 不及格
#include
voidmain()
{
floatscore;
cout<<"请输入成绩:
";
cin>>score;
if(score<0||score>100)
cout<<"输入错误!
成绩必须在0-100分之!
"<elseif(score<60)cout<<"不及格"<elseif(score<70)cout<<"及格"<elseif(score<80)cout<<"中"<elseif(score<90)cout<<"良"<elsecout<<"优"<}
switch语句和switch多分支结构
switch语句的格式:
switch(整型表达式){
case整型常量表达式1:
语句序列1
case整型常量表达式2:
语句序列2
...
case整型常量表达式k:
语句序列k
default:
语句序列k+1
}
switch语句通过判断整型表达式的值来确定程序的去向。
若整型表达式的值与整型常量表达式1的值相同,则依次执行语句序列1开始的各个语句序列,即语句序列1,语句序列2...语句序列k+1;若整型表达式的值与整型常量表达式2的值相同,则依次执行语句序列2开始的各个语句序列,即语句序列2,语句序列3...语句序列k+1;如果整型表达式的值不等于任何列出的整型常量表达式的值,则执行从default后的语句序列k+1;如果没有default则什么也不做;在依次执行各个语句序列的过程中,若遇见break语句,则立即跳出switch分支结构。
若每个语句序列的最后一个语句都是break,则这样的switch多分支结构可以用等效的if多分支结构替代。
例3.7:
输入一个表示星期的数字(0表示星期日,1表示星期一...),显示对应的英文单词。
#include
voidmain()
{
intweekday;
cout<<"今天是星期几?
";
cin>>weekday;
switch(weekday){
case0:
cout<<"Sunday"<case1:
cout<<"Monday"<case2:
cout<<"Tuesday"<case3:
cout<<"Wednesday"<case4:
cout<<"Thursday"<case5:
cout<<"Friday"<case6:
cout<<"Saturday"<default:
cout<<"输入有误!
输入的整数应在0-6之间"<}
}
例3.8:
同例3.6,输入一个0-100分范围内的一个成绩,显示相应的等级,用switch多分支结构替代原来的if多分支结构
#include
voidmain()
{
floatscore;
cout<<"请输入成绩:
";
cin>>score;
switch(int(score)/10){
case0:
case1:
case2:
case3:
case4:
case5:
cout<<"不及格"<case6:
cout<<"及格"<case7:
cout<<"中"<case8:
cout<<"良"<case9:
case10:
cout<<"优"<default:
cout<<"输入有误!
成绩必须在0-100分之间"<}
}
3.3循环结构
for循环
for语句的格式为:
for(循环初始化;循环条件;循环参数调整) 循环体
for语句遵循先判断后执行,即如果一开始循环条件不成立,则循环体一次也不执行
看下面的例子:
for(inti=0;i<100;i+=5)cout<
051015...95
首先执行循环初始化(i=0;),然后判断循环条件(i<100)是否成立,此时i=0小于100,所以循环条件成立,执行循环体(cout<
例3.9:
输入10个数,计算并显示它们的合计。
#include
voidmain()
{
doublex,s=0;
cout<<"请输入10个数:
";
for(inti=0;i<10;i++)
{
cin>>x;
s+=x;
}
cout<<"合计:
"<
}
若输入12345678910
则程序输出:
合计:
55
注意:
本例中的变量s起到累加器的作用,所以必须初始化为0。
例3.10:
显示输出如下所示的三角形:
*
***
*****
*******
*********
***********
行号
应输出的''
应输出的*
0
5
1
1
4
3
2
3
5
3
2
7
4
1
9
5
0
11
i
5-i
i+i+1
#include
voidmain()
{
for(inti=0;i<6;i++)
{
cout<intj;
for(j=0;j<5-i;j++)cout<<'';
for(j=0;j
}
}
例3.11:
显示输出99乘法表。
#include
voidmain()
{
cout<inti;
for(i=1;i<10;i++)cout<cout<for(i=1;i<10;i++)
{
cout<(2)<
for(intj=1;j<10;j++)cout<}
}
本例中用到了setw,其功能是为下一个要输出的数据设置输出宽度,setw的说明在头文件iomanip.h中,因此要有#include,包含了iomanip.h就不必包含iostream.h了。
while循环
while语句的格式为:
while(循环条件) 循环体
while语句也遵循先判断后执行
例3.12:
求数列...的所有大于等于0.000001的数据项之和,显示输出计算的结果。
分析:
序号
分子(n)
分母(d)
1
1
2
2
1+2=3
2*2=4
3
3+2=5
2*4=8
...
...
...
i
ni
di
i+1
ni+2
2di
方法一:
#include
voidmain()
{
intn=1,d=2;
doubles=0.0,s0;
while((s0=double(n)/d)>=0.000001)
{
s+=s0;
n+=2;
d+=d;
}
cout<
}
程序中的s是累加器,必须初始化为0。
程序中用到double(n)/d,将int型变量n强制转换为double型,是应为n和d都是int型,直接n/d将是整除,余数将被丢弃。
方法二:
#include
#include
voidmain()
{
inti=1;
doubles=0.0,s0;
while((s0=(i+i-1)/pow(2,i))>=0.000001)
{
s+=s0;
i++;
}
cout<
}
例3.13:
设计函数doublepowi(doublex,intn);它计算并返回x的n次方。
#include
doublepowi(doublex,intn)
{
doublea=1;
while(n--)a*=x;
returna;
}
voidmain()
{
cout<}
程序中的a是累乘器,必须初始化为1。
例3.14:
已知sinx=,设计一个程序,输入x,通过累加所有绝对值大于等于0.000001的项来计算sinx的值,显示计算结果并对照显示调用标准函数sin的计算结果。
#include
#include
voidmain()
{
doublex;
cout<<"请输入一个弧度值:
";
cin>>x;
doublei=1.0,n=x,d=1.0,s=0,s0;
while(fabs(s0=n/d)>=0.000001)
{
s+=s0;
i++;
n*=(-x*x);
d*=(i+i-2)*(i+i-1);
}
cout<
}
由于程序中用到了标准函数fabs和sin,因此程序应把math.h包含进来
运行此程序:
请输入一个弧度值:
0.3
0.29552
0.28552
再次运行程序:
请输入一个弧度值:
33
1.0019
0.999912
你会发现,第二次运行的结果产生很大差异,若再次输入一个更大的弧度值误差就会更大,这是一个数学问题,因为sin是以2π为周期的函数,如果输入的弧度值的绝对值大于2π,则减去2π不会影响函数的值,但对于程序中的算法,却提高了累加同样多项数的精度。
改进的方法是,在cin>>x的下法插入一些语句。
#include
#include
voidmain()
{
doublex;
cout<<"请输入一个弧度值:
";
cin>>x;
constdoubledPI=2*3.1415926;
if(x>0.0)
while(x>dPI)x-=dPI;
else
while(x<-dPI)x+=dPI;
doublei=1.0,n=x,d=1.0,s=0,s0;
while(fabs(s0=n/d)>=0.000001)
{
s+=s0;
i++;
n*=(-x*x);
d*=(i+i-2)*(i+i-1);
}
cout<
}
这次再试试看!
do...while循环
do...while语句的格式为:
do循环体 while(循环条件);
do...while语句遵循先执行后判断,即使循环条件不成立,循环体也要执行一次,注意这与for、while循环的不同!
例3.15:
输入一元二次方程的系数A、B和C,计算并显示方程的解。
#include
#include
voidmain()
{
doublea,b,c;
do
{
cout<";
cin>>a>>b>>c;
}while(a==0.0);
cout<doubledelta=b*b-4*a*c;
if(delta<0.0)
cout<<"此方程没有实数解!
"<elseif(delta>0.0){
cout<<"此方程有2个不同的实数解:
";
cout<<(-b+sqrt(delta))/(a+a);
cout<<"和"<<(-b-sqrt(delta))/(a+a)<}
else{
cout<<"此方程有2个相同的实数解:
";
cout<<-b/(a+a)<}
}
程序中使用dowhile解决了输入错误的问题,也就是说只要用户误将a输入为0,程序就一直要求重新输入,直到输入的a!
=0,才能跳出dowhile循环体,继续运行下面的内容。
细心的同学会发现,以前的程序也提供了解决输入有误的方法,但是只要检查