第3章 C++程序的流程控制Word下载.docx
《第3章 C++程序的流程控制Word下载.docx》由会员分享,可在线阅读,更多相关《第3章 C++程序的流程控制Word下载.docx(27页珍藏版)》请在冰豆网上搜索。
注意空语句;
和空复合语句{}是等价的。
3.2选择控制语句
针对于不同情况采用不同的处理方式的问题,用选择结构来实现。
选择语句包含:
if语句和switch语句。
3.2.1if语句
if语句:
格式:
if(<
条件表达式>
)<
语句>
作用:
当<
为真时,执行<
,否则直接执行if语句后边的语句。
这里的<
可以是一条语句,也可以是几条语句,但对于多条语句的情况必须用{}将几条语句括起来构成复合语句,在if语句中当做一个整体处理。
if…else语句:
)
<
语句1>
else
语句2>
为假时,执行<
。
这里<
和<
可以是一条语句也可以是复合语句。
说明:
①if语句有时可以用条件表达式替代。
②if语句支持多种形式的嵌套使用,但一般嵌套层次不超过三层。
另外约定else总是与它上边最近的一个if配对。
为了防止语法或逻辑错误的发生,建议在较复杂的情形中使用花括号区分。
3.2.2switch语句
switch(<
表达式>
){
case<
常量表达式1>
:
语句序列1>
常量表达式2>
语句序列2>
…
常量表达式n>
语句序列n>
[default:
语句序列n+1>
]
}
作用:
计算<
判断它与哪个<
常量表达式>
匹配,执行第一个相匹配的<
后的语句,直到遇到break转去执行switch语句以外的语句;
如果均不匹配则执行default后定义的语句(在default省略的情形中,直接执行switch语句以外的语句)。
说明:
①switch语句中的<
的值只能是整型、字符型或枚举型表达式。
②switch语句中,case和其后的<
间必须有空格否则会产生逻辑错误。
case后的<
的值是互不相同的,且它的类型与switch后的<
的类型一致。
③通常情况下,每个case分支语句结束后都要加一个break语句来结束switch语句。
但在要表示一个范围,或描述一类对象时(如A,B,C都属于合格,D属于不合格)有可能几条case分支语句后才有一个break语句。
④switch语句与嵌套的if语句都可以用于处理多分支选择的问题。
3.3循环控制语句
对于同一个语句或同一组语句序列需要重复多次,则采用循环结构。
C++提供了三种循环控制语句:
while语句,do…while语句,for语句。
3.3.1while语句
while(<
)
判断<
是否为真,若为真则执行<
,然后重复判断,直到<
为假时跳出while循环执行其后的语句。
①这里的<
可以是单条语句也可以是复合语句。
②当<
在循环开始就不满足,则不执行while循环也就是说while循环有可能一次都不执行。
3.3.2do…while语句
do{
}while(<
);
当流程到达do后,立即执行循环体语句,然后再对条件表达式进行判断。
若<
的值为真,则重复执行循环体语句,直到<
为假时退出循环,执行do…while循环后的语句。
这种循环中<
至少执行一次,当条件在循环开始时就不满足时这种做法是危险的,所以应尽量使用while语句而避免使用do…while语句。
3.3.3for语句
for(<
表达式1>
表达式3>
可以称为初始化表达式,一般用于对循环变量进行初始化或赋初值;
可以称为条件表达式,当它的判断条件为真时,就执行循环体<
,否则终止循环,退出for循环;
可以称为修正表达式,一般用于在每次循环体执行之后,对循环变量进行修改操作。
②for循环中三个表达式可能省略一个、两个或三个都省略,但它们之间分号在三种情况下都不可以省略。
3.4跳转语句
3.4.1break语句
break;
结束当前正在执行的循环(for、while、do…while)或多路分支(switch)程序结构,转而执行这些结构后面的语句。
在循环结构中使用时,如果有多层循环,只跳出其所在的最近的循环层。
3.4.2continue语句
continue;
结束当前正在执行的这一次循环(for、while、do…while),接着执行下一次循环。
即跳过循环体中尚未执行的语句,接着进行下一次是否执行循环语句的判定。
【典型例题】
例题1:
下列程序的运行结果为__________。
#include<
iostream.h>
voidmain()
{
charc=’@’;
if(c>
='
A'
&
&
c<
Z'
)
cout<
"
是大写字母"
;
elseif(c>
a'
z'
是小写字母"
;
else
是其它字符"
}
解答:
本题主要考查if语句的嵌套使用方法。
首先判断字符变量c是否满足c>
,如果满足则输出"
否则判断c是否满足c>
否则输出"
else总是与离它最近的前一个if配对。
答案为:
是其它字符。
例题2:
已定义:
chargrade;
,若成绩为A、B、C时输出合格,成绩为D时输出不合格,其他情况提示重新输入。
要完成以上功能,则下列switch语句正确的是(
)。
(a)
switch(grade){
case
‘A’:
case
‘B’:
‘C’:
”合格”;
break;
‘D’:
”不合格”;
default:
”请重新输入:
”;
(b)
‘B’:
default:
(c)
case‘A’,‘B’,‘C’:
case‘D’:
(d)
A:
B:
C:
D:
本题主要考查switch语句的使用。
在switch语句执行过程中,找到第一个相匹配的表达式后,转去执行该case后的语句,直到遇到break语句后跳出switch语句执行其后的语句。
对于选项b,若grade的值为A则执行结果为“合格不合格请重新输入”,不满足本题的要求;
switch语句多个case分支不能简写为多个表达式之间用逗号隔开的一个case分支,选项c错误;
case后的表达式只能是整型、字符型或枚举型常量表达式,选项d中case后的A、B、C、D是变量。
a。
例题3:
找出并改正下列程序段中的错误:
(1)if(x>
0);
-------------①
y=x+1;
-------------②
else;
----------------③
y=x-1;
-------------④
(2)While(i)--------------------①
{cout<
i<
endl;
----------②
i--;
}--------------------③
(3)inti=1,sum;
--------①
while(i<
=100)
------②
{sum+=i;
-----------③
i++;
}-------------④
(4)inti=1,sum=0;
do{-----------------------②
sum+=i;
-----------------③
}while(i<
=100)------④
本题中包含了初学者在编程中容易犯的一些错误,提醒读者注意。
(1)本题考查对if语句的语法结构的掌握。
本题的错误在于在if和else后不应加分号。
将①、③句末的分号去掉。
(2)C++是大小写敏感的语言。
将①中While改为while。
(3)本题目的是完成1到100求和,结果放在sum中,但是sum在参与运算前应该首先对其赋值。
将①改为inti=1,sum=0;
(4)本题主要考查对do…while的语法结构的掌握以及与while结构进行对比区别两者在作用和语法上的不同。
将第④行while后加分号即while(i<
=100);
例题4:
循环语句for(inti=0;
=5&
!
i;
i++)cout<
执行循环次数为(
(a)1次
(b)3次
(c)5次
(d)6次
本题考查对for循环的理解以及表达式运算。
执行for循环i的初值为0,第一次循环时表达式0<
0结果为1所以执行循环体输出0;
然后i自加为1,计算表达式1<
1结果为0,所以退出循环。
例题5:
程序段:
inti,sum=0;
for(i=1;
=100;
sum+=i,i++);
与上边程序段不等价的是(
(a)intsum=0,i=1;
do{
sum+=i++;
(b)inti=1,sum=0;
=100)
{
sum+=i++;
(c)inti=1,sum=0;
while
(1)
{
if(i>
100)
break;
(d)inti,sum=0;
i++,sum+=i);
本题主要考查对各种循环结构的以及它们之间转换关系的理解。
本题中的程序段是求解1到100的和,循环结束后i的值为101,sum的值为5050。
选项a、b分别用do…while和while循环完成求解1到100的和;
选项c是永真循环,通过break语句退出循环,其作用也是求解1到100的和;
选项d中i先自加然后求和,其作用为求解2到101的和,循环结束后i的值为101,sum的值为5150。
d。
例题6:
运行下列程序的结果为
(1)____________________。
(2)___________________。
(1)
#include<
voidmain()
intx,y,cmultiple;
输入两个整数:
x>
y;
cmultiple=x;
while
(1)
if(cmultiple%y==0)break;
cmultiple+=x;
最小公倍数:
cmultiple<
输入:
24
7
(2)
intx,y,var1;
输入两个整数:
if(x<
y)var1=x,x=y,y=var1;
var1=x%y;
while(var1)
x=y;
y=var1;
var1=x%y;
最大公约数:
y<
7
本题考查理解程序的能力。
(1)中求解两个数x,y的最小公倍数思路为若x能够被y整除则x就是这两个数的最小公倍数,否则判断x的整数倍是否能被y整除,直到x的某个倍数可以被y整除,则该数即为这两个数的最小公倍数。
(2)中求解两个数x,y的最大公约数思路为用两个数中较大的数作为被除数,较小的数作为除数,如果能够整除则较小的数就是这两个数的最大公约数,否则,将较小的数作为新的被除数,将两个数的模作为除数,重复以上工作直到模为0,则这个除数就是x和y的最大公约数。
(1)最小公倍数:
168
(2)最大公约数:
1
例题7:
以下程序的功能是输出1到100之间每位数的乘积大于每位数的和的数,如对数字12有1*2<
1+2,所以不输出这个数;
对数字23有2*3>
2+3所以输出这个数。
请填空。
intnum,product=1,sum=0,n;
for(num=1;
num<
num++)
product=1;
sum=0;
________①________;
while(_____②_____)
product*=n%10;
sum+=n%10;
_______③______;
if(product>
sum)cout<
本题中变量num用于表示1到100的整数,变量product用于存放每位数的乘积,变量sum用于存放每位数的和,变量n用于存放求解每位数的中间结果。
外层for循环用于控制判断1到100的数,内层while循环用于计算每位数的积与每位数的和,if语句用于判断该数的每位数的乘积是否大于每位数的和,若满足此条件,则输出这个数。
在①处要对n赋值,最初它是num的副本而后用于存放计算每位数的中间结果;
②处为退出while循环的条件,当当前这个数的每位数都被取出,则内层循环结束;
③改变循环变量的语句,使得循环在某种情况下可以结束,这里取n除10的商,直到商为0时结束内层循环。
①n=num
②n
③n/=10
例题8:
以下程序的功能是判断一个数是否为素数。
intnum;
输入一个正整数:
_________①________;
intisprime=1;
for(inti=2;
=num-1;
i++)
if(________②________)
isprime=0;
______③______;
if(isprime)
是一个素数。
不是一个素数。
本题中变量num存放要判断的数,变量isprime用于记录该数是否为素数,当isprime为1时即该数为素数,否则为合数。
判断思路为如果num能被2到num-1的任意一个数整除则该数不是素数。
①处需要输入待判断的数,②处为判断条件,当检测到2到num-1中第一个能整除num的数时则可判断出该数不是素数,此时退出循环,故③为退出语句。
①cin>
num
②num%i==0
③break
例题9:
编写一个程序,输入一个正整数,判断它是否能被3,5,7同时整除。
参考程序如下
请输入一个正整数:
num;
if(num<
0)
输入有误!
if(num%3==0&
num%5==0&
num%7==0)
能被3、5、7同时整除。
不能被3、5、7同时整除。
例题10:
编写一个程序,让用户输入年和月,然后判断该月有多少天。
算法思想:
判断某年某月有多少天,每个月的天数有四种可能:
1、3、5、7、8、10、12月为31天,4、6、9、11月为30天,闰年的2月有29天,不是闰年则2月为28天。
因为每月的天数有多种可能,我们选择用switch语句解决本题。
程序流程是首先输入要判断的年月,然后判断该年月应有多少天,最后输出结果。
参考程序如下:
intyear,month,days,leap;
请输入年月:
year>
month;
switch(month)
case1:
case3:
case5:
case7:
case8:
case10:
case12:
days=31;
case4:
case6:
case9:
case11:
days=30;
case2:
if(year%400==0)
leap=1;
elseif(year%4==0&
year%100!
=0)
elseleap=0;
if(leap)
days=29;
else
days=28;
year<
年"
month<
月的天数为:
days<
例题11:
编写一个程序。
计算若一头母牛,它每年年初生一头小母牛,每头小母牛从出生起第四个年头开始每年也生一头小母牛,按此规律,第10年时有多少头母牛?
假设f(n)表示第n年的母牛数,已知f(0)=0,f
(1)=2,f
(2)=3,f(3)=4,推得在第n年时应有f(n-3)头母牛生育出f(n-3)头母牛,所以第n年共有f(n-1)+f(n-3)头母牛。
据此得出数学表达式:
f(n)=f(n-1)+f(n-3)。
在下边的参考程序中分别用变量sum、sum1、sum2、sum3表示f(n),f(n-1),f(n-2),f(n-3)其中n从4变化到10。
intsum1=2,sum2=3,sum3=4,sum=0,n=10;
for(inti=4;
=n;
sum=sum1+sum3;
sum1=sum2;
sum2=sum3;
sum3=sum;
第十年有"
sum<
头牛!
例题12:
计算
当通项
时停止计算。
本题主要考查学生对循环结构的运用以及对数学问题编程技巧的掌握。
本题为有规律的若干项相加,所以采用循环结构处理。
循环的条件是当
时继续运算直到这个条件不满足时就达到了题目要求的精度,则停止运算。
循环体中完成三件事,首先是求出本次(第i次)循环中的
的值,然后计算当前的e,最后完成循环变量增1的操作。
在求解本题时主要注意计算中所采用的变量的数据