第3章〓基本控制结构


视频讲解


3.1算法与流程基本结构

算法,广义地说,是为解决某一问题而采取的方法和步骤。计算机程序本质上是一个算法,告诉计算机确切的步骤来执行一个指定的任务。因此,算法是指一个被定义好的、计算机可施行其指示的有限步骤或次序,算法包含一系列清晰的指令,并可于有限的时间及空间内清晰地表述出来。

结构化编程方法使用规范的控制流程来组织程序的处理步骤,形成层次清晰、边界分明的结构化构造,每个构造具有单一的入口和出口,从而使程序易于理解、排错、维护和验证正确性。而流程图常用来描述程序的基本操作和控制流程,它是程序分析和过程描述的最基本方式,流程图包含的基本元素如图31所示。




图31程序流程图的基本元素


程序流程控制由3种基本结构组成: 顺序结构、分支结构和循环结构。默认按照程序的书写顺序从上往下顺序执行,即顺序结构,有时也会根据解决问题的需要,采用分支结构和循环结构。分支结构是程序根据条件判断结果选择不同向前执行的一种运行方式,循环结构则是程序根据条件判断结果向后反复执行的一种运行方式。

无论是分支结构还是循环结构,首先都要根据条件判断的结果来选择如何执行,条件判断的结果是个逻辑值,即真或假,通常用关系表达式或逻辑表达式来表示条件判断。

3.2选择结构

有许多问题有两个以上的可能解,不同的解要通过不同的解题路线得到,由于程序设计时往往难以知道要选哪一条路线,必须同时考虑各种情形,于是就会出现从原问题出发的分支结构,待程序运行时再根据具体情况选择采用哪一条解题路径。选择的依据是某一表达式的值,通常是关系表达式或逻辑表达式的值。

3.2.1选择语句if
1. 单分支语句

用if语句来表示单分支结构,其形式为: 

if (表达式)

语句





图32单分支if语句
的执行流程


其中,表达式表示执行条件,如果值为真(非0),则执行语句; 如果值为假(0),转向执行后续语句。单分支if语句的执行流程如图32所示。

例如:



if(day==6||day==7)

cout<<"Weekend\n";






先计算逻辑表达式day == 6||day == 7的值,若为真,则输出Weekend,否则就跳过该语句。

再如:



if ((a+b>c)&&(b+c>a)&&(c+a>b))

{

s = (a+b+c)/2.0;

area = sqrt(s*(s-a)*(s-b)*(s-c));

cout<<"area="<<area<<endl;

}






先计算逻辑表达式(a+b>c)&&(b+c>a)&&(c+a>b)的值,若为真,则按顺序执行花括号内的语句块,否则就跳过该语句块。

2. 双分支语句

用ifelse语句来表示双分支结构,其形式为: 

if (表达式)

语句1;

else

语句2;

其中,表达式表示执行条件,当表达式为真时,执行语句1; 否则,执行语句2。ifelse语句的执行流程如图33所示。




图33ifelse语句的执行流程



例如:



if ((a+b>c)&&(b+c>a)&&(c+a>b))

{

s = (a+b+c)/2.0;

area = sqrt(s*(s-a)*(s-b)*(s-c));

cout<<"area="<<area<<endl;

}

else

cout<<"It is not a triangle."<<endl;






先计算逻辑表达式(a+b>c)&&(b+c>a)&&(c+a>b)的值,若为真,则按顺序执行花括号内的语句块,否则就输出字符串"It is not a triangle."。

【例31】求两个整数的较大值。



#include <iostream>

using namespace std;

int main()

{

int a,b,max;

cin>>a>>b;

if (a>b) 

max=a;

else 

max=b;

cout<<"max = "<<max<<endl;

return 0; 

}






程序的运行情况及结果如下: 



3 4

max = 4






3. 多分支语句

用ifelse语句来表示多分支结构,其形式为: 

if(表达式1) 语句1

else if(表达式2) 语句2

else if(表达式3) 语句3

︙

else if(表达式n) 语句n

else 语句n+1

多分支语句的执行流程如图34所示。执行时先求表达式1的值,若表达式1的值为真,则执行语句1; 若表达式1的值为假,再求表达式2的值,若表达式2的值为真,则执行语句2; 若表达式2的值为假,再求表达式3的值,以此类推,若前面n个表达式的值均为假,则执行语句n+1。




图34多分支语句的执行流程



【例32】根据输入的分数情况,输出该分数对应的成绩等级。



#include <iostream>

using namespace std;

int main()

{

int score;

cin>>score;

if(score>=90)

cout<<"Grade A"<<endl;

else if(score>=80)//分数在80与90之间

cout<<"Grade B"<<endl;

else if(score>=70)	  //分数在70与80之间

cout<<"Grade C"<<endl;

else if(score>=60)  //分数在60与70之间

cout<<"Grade D"<<endl;

else		  //分数在60以下

cout<<"Grade E"<<endl;

return 0;

}






程序的运行情况及结果如下: 



86

Grade B






关于if语句的4点说明如下。

(1)  if后面的表达式可以是符合C++语法规则的任意表达式,常见的有算术表达式、关系表达式和逻辑表达式。

(2)  if语句可以是单一的语句,也可以是由花括号括起来的复合语句(或称语句块)。

(3)  if 和 else 必须配套使用,else不可单独使用。

(4)  if语句中又可以是if语句,这称为if语句的嵌套。一般形式如下: 

if(表达式1)

if(表达式2) 语句1

else 语句2

else

if(表达式3) 语句3

else 语句4

【例33】根据pH值输出水溶液的酸碱度。



#include <iostream>

using namespace std;

int main()

{

double PH;

cin>>PH;

if(PH>7)

cout<<"碱性\n";

else

if(PH<7)

cout<<"酸性\n";

else//PH的值为7

cout<<"中性\n";

}






程序的运行情况及结果如下: 



7.8

碱性






注意: if语句有不同的嵌套形式,但要注意if与else的配对关系。C++规定,else总是与它接近的if配对。

3.2.2条件运算符?: 

C++还提供了一个三目条件运算符?: 用来表示条件表达式,根据逻辑值决定表达式的值。其形式为: 

操作数1?操作数2:操作数3

执行时,先对操作数1求值,其值为非0时,表达式的值为操作数2的值,否则表达式的值为操作数3的值。

操作数1通常是用于判断的关系表达式或逻辑表达式。例如,表达式a>b?a:b的功能是取a和b中的较大值,因此例31代码可更改如下: 



#include <iostream>

using namespace std;

int main()

{

int x,y,max;

cin>>x>>y;

max = x>y?x:y;

cout<<"max = "<<max<<endl;








return 0;

}






3.2.3开关语句switch

switch语句应用于根据一个整型表达式的不同值决定程序走不同分支的情况,switch语句的形式为: 

switch(表达式)

{

case 常量表达式1: 语句1 

case 常量表达式2: 语句2 

︙

case 常量表达式n: 语句n 

default: 语句n+1 

}

其中,表达式类型为整型、字符型或枚举类型,不能为浮点型。常量表达式具有指定值,与表达式类型相同。

switch语句的执行流程如图35所示。先计算表达式的值,然后用这个值依次与case后的常量表达式的值进行比较。如果表达式的值等于某个常量表达式i的值,则执行语句i。如果语句i之后还有语句,就继续执行语句i+1至语句n+1。如果找不到与表达式的值相等的case常量,就执行default指示的语句n+1。



图35switch语句的执行流程


break语句中断一个语句的执行,即能够跳出switch语句块,转向执行语句块的后续语句,即break可以中止执行switch语句中剩下的情况判断和代码执行。break语句和default标号语句均为可选项。

【例34】测试switch语句的执行流程。



#include <iostream>

using namespace std; 

int main()

{

int x;

cout<<"x=";

cin>>x;

switch (x)

{

case 1: cout<<"one ";

case 2: cout<<"two ";

case 3: cout<<"three ";









default: cout<<"other ";

}

cout<<"end"<<endl; 

return 0;

}






运行程序,输入值为1,显示结果如下: 



x=1

one two three other end






若重新运行,输入值为3,显示结果如下: 



x=3

three other end






为了实现真正的选择控制,执行一个case标号语句后能跳出switch语句块,转向执行后续语句,应该使用break语句。

【例35】测试在switch语句中增加break,中断语句块。



#include <iostream>

using namespace std; 

int main()

{

int x;

cout<<"x=";

cin>>x;

switch (x)

{

case 1: cout<<"one ";break;

case 2: cout<<"two ";break;

case 3: cout<<"three ";break;

default: cout<<"other ";

}

cout<<"end"<<endl;

return 0;

}






运行程序,输入x的值为1,显示结果如下: 



x=1

one end






选择性地在case中使用break,可以实现多个case常量值执行同一个分支语句。

【例36】两个case常量值执行同一个分支语句。



#include <iostream>

using namespace std; 

int main()

{








int x;

cout<<"x=";

cin>>x;

switch (x)

{

case 1: 

case 2: cout<<"one or two ";break;

case 3: cout<<"three ";break;

default: cout<<"other ";

}

cout<<"end"<<endl;



return 0;

}






程序不管x的输入值是1还是2,都执行case 2后的语句。输入1时,程序执行显示: 



x=1

one or two end






关于switch语句需要说明以下几点。

(1) 常量表达式必须互不相同,否则就会出现矛盾而引起错误。例如: 



switch (int(x))

{

case 1: y = 1; break;

case 2: y = x; break;

case 2: y = x*x; break;//错误,case 2已经使用

case 3: y = x*x*x; break;

}






(2) 各个case和default出现的次序可以任意。在每个case分支都带有break的情况下,case的顺序不影响执行结果。

(3) switch语句也可以嵌套。

【例37】输入年份和月份,输出该月的天数。



#include <iostream>

using namespace std;



int main()

{

int year,month,days;

cout<<"year:";cin>>year;

cout<<"month:";cin>>month;

switch(month)

{

case 1:

case 3:

case 5:

case 7:

case 8:








case 10:

case 12: days = 31; break;

case 4:

case 6:

case 9:

case 11:days = 30; break;

case 2:

if((year%4 == 0)&&(year%100 != 0)||(year%400 == 0))//判断当前年是否是闰年

days = 29;

else

days = 28;

}

cout<<"days:"<<days<<endl;

return 0;

}






程序的运行情况及结果如下: 



year:2022

month:2

days:28






3.3循环结构

在一个程序中,常常需要在给定条件成立的情况下,重复地执行某些操作。C++为实现这一目的提供了3种循环语句: while语句、dowhile语句和for语句。在循环语句中,重复执行的操作叫作循环体,执行重复操作的条件称为循环条件或循环控制条件。循环体可以是单条语句、多条语句构成的语句块,甚至是空语句。

3.3.1while语句

while语句的形式为: 

while (表达式)

循环体

其中,表达式为循环控制条件,循环体用于描述重复执行的一系列操作。




图36while循环的
执行流程



while循环执行流程如图36所示。若表达式的值为真,则执行其循环体; 否则退出循环,执行while循环后边的语句。while循环又称为当型循环。


从while语句的执行流程可以看到它有以下两个特点。

(1) 若条件表达式的值一开始为假,则循环体一次也不执行。

(2) 表达式的值为真时,反复执行循环体。为了正常结束循环,循环体内应该包含使得循环条件趋向为假的语句,否则程序将会陷入死循环。

【例38】用while语句求和式s=1+2+…+100。



#include <iostream>

using namespace std;

int main()

{

int s=0;

int i=1;//循环变量的初始化

while(i<=100)	  //循环条件

{				  //循环体

s+=i;

i++;		  //改变循环变量

}

cout<<"s=1+2+…+100="<<s<<endl; 

return 0;

}






该程序的运行情况及结果如下: 



s=1+2+…+100=5050









图37例38的执行流程


该程序的执行流程如图37所示。

该例中,变量s用来保存多项的和,其被初始化为0。变量i称为循环控制变量,其被初始化为0。表达式i<=100为循环条件表达式,当i的值使表达式为真时,不断执行循环体。要想使循环正常结束,循环条件就得为假,那么就需要不断调整i,调整语句一般应包含在循环体中,如这里的i++。显然,随着i从0不断增加到101时,循环条件的结果也会从真逐渐变为假,循环也就结束了。

总的来说,一个循环结构包括三部分: 循环的初始化、循环条件和循环体。循环开始前要对循环控制变量进行初始化,循环条件通常是包含循环控制变量的一个关系或逻辑表达式,循环体内通常包含对循环控制变量进行调整的语句,使得循环趋向终止。

3.3.2dowhile语句

dowhile语句的形式为: 

do

循环体

while (表达式);




图38dowhile循环
的执行流程



其中,循环体与表达式和while语句的含义相同,dowhile语句执行流程如图38所示。首先执行循环体, 然后计算表达式的值,若表达式的值为真,继续执行循环体,否则退出循环,执行while循环后边的语句。dowhile循环又称为直到型循环。


与while把循环条件放在循环体执行之前不同,dowhile语句把循环条件判断放在循环体执行之后。从dowhile语句的执行流程可以看到,不管循环条件是否成立,它都至少执行一次循环体。

【例39】用dowhile语句求和式s=1+2+…+100。


#include <iostream>

using namespace std;

int main()

{

int s=0;//和初始化为0

int i=1; //循环控制变量i初始化为1

do

{

s+=i; //不断累加

i++;//调整循环控制变量

}while(i<=100);//分号不能省

cout<<"s=1+2+…+100="<<s<<endl;

return 0;

}






3.3.3for语句

for语句的一般形式为: 

for (表达式1;表达式2;表达式3)

循环体




图39for语句的执行流程


表达式1通常用于循环控制变量的初始化; 表达式2是循环条件表达式即循环条件,其值为真时执行循环,为假时结束循环; 表达式3通常用于对循环控制变量进行调整,在循环体执行之后执行,也可以在此省略,放在循环体中。其中,表达式1、表达式2和表达式3都可以省略。for语句的执行流程如图39所示。

for语句的执行过程分析如下: 

(1) 求解表达式1; 

(2) 求解表达式2,若为假,则结束循环,转到(5); 

(3) 若表达式2为真,执行循环体,然后求解表达式3; 

(4) 转到(2); 

(5) 执行for语句的下一个语句。

从for语句的执行过程可以看到,它实际上等效于如下while结构: 

表达式1;

while(表达式2)

{

循环体;

表达式3;

}


【例310】用for循环求和式s=1+2+…+100。



#include <iostream>

using namespace std;

int main()

{

int s=0;

int i;

for(i=1;i<=100;i++)

s+=i;

cout<<"s=1+2+…+100="<<s<<endl;		

return 0;

}






对于for语句的使用需要说明以下几点。

(1) for语句中省略表达式时,分号不能省略。当省略全部表达式时,for仅有循环跳转功能。循环变量初始化要在for之前设置,而循环条件的判断,循环变量的修改,循环结束控制语句等都要在循环体内实现。

for(; ; ) 

语句块

等价于

while(1)

语句块

例如,求1+2+…+100可以写成: 



int s=0,i=1;

for (;;)

{

if (i>100)	 break;

s+=i;

i++;

}






(2) 省略各表达式的for语句可以构成不同形式的循环。以下都是求1+2+…+100的等价程序。

初始化表达式是逗号表达式,省略第2个和第3个表达式: 



for(int s=0,i=1;;)

{

if(i>100)break;

s+=i;

i++;

}






省略第1个和第3个表达式: 



int s=0,i=1;

for(;i<=100;)

{








s+=i;

i++;

}






把累加计算表达式放在第3个表达式,构成逗号表达式,循环体为空语句。



for(int s=0,i=1;i<=100;s+=i,i++);






读者还可以根据需要和习惯,写出不同形式的for循环语句。

【例311】求斐波那契数列的前n项。

算法分析: 斐波那契数列形如0,1,1,2,3,5,8,13,21,…其规律是第1项a1=0,第2项a2=1。从第3项开始,每一项都等于前面两项之和。程序中可以使用三个变量a1、a2和a3进行迭代。

初始时,a1=0,a2=1,根据a1和a2的值计算第3项a3,即a3=a1+a2; 然后用a2的值替换a1的值,用a3的值替换a2的值,用a3=a1+a2求得第4项的值。如此迭代下去,可以求出斐波那契数列各项的值。



#include <iostream>

using namespace std;

int main()

{

int n,i,a1,a2,a3;

cout<<"n=";cin>>n;

a1=0; a2=1;//对第1项和第2项赋初始值

cout<<a1<<'\t'<<a2<<'\t';

for(i=3;i<=n;i++)

{

a3 = a1+a2;			  //求新一项的值

cout<<a3<<'\t';

if(i%8 == 0)		  //每输出8项换一行

cout<<endl;

a1 = a2; a2 = a3;	  //迭代

}

return 0;

}






程序的运行情况及结果如下: 



n=16

011235813

21345589144233377610






3.3.4循环结构嵌套

循环结构的嵌套,就是在一个循环语句的循环体内又包含循环语句,各种循环语句都可以相互嵌套。一层循环嵌套一层循环称为双层循环,若再嵌套一层循环称为三层循环,根据实际需要可以设计多层循环。

【例312】双层循环的实现。



#include <iostream>

using namespace std;

int main()

{

cout<<"i\tj\n";

for(int i=1;i<=3;i++)//外循环

{

cout<<i;

for(int j=1;j<=3;j++)  //内循环

cout<<"\t"<<j<<endl;

}

return 0;

}






程序的运行情况及结果如下: 



ij

1 1

2

3

2 1

2

3

3 1

2

3






双层循环的执行过程分析如下。

首先外循环的循环控制变量i被初始化为1,外循环的循环条件i<=3的结果为真,转而执行循环体。先输出1再执行内循环,内循环的循环控制变量j初始化为1,其循环条件表达式j<=3的结果为真,于是执行其循环体,输出1。然后执行j++,j变为2,循环条件依然为真,接着执行循环体,输出2。接着执行j++,j变为3,循环条件为真,接着执行循环体,输出3。再次执行j++,j变为4,循环条件为假,内循环结束。转而计算外循环的第三个表达式i++,i变为2,外循环的循环条件为真,执行其循环体,即先输出2再执行内循环。以此类推,直至外循环的循环控制变量变为4,循环条件为假,此时外循环结束。

【例313】求100以内的所有素数。

算法分析: 要判别整数m是否为素数,最直接的办法是试除法。即用2,3,…,m-1逐个去除m。若其中没有一个数能整除m,则m为素数; 否则,m不是素数。

数学上可以证明: 若所有小于或等于m的数都不能整除m,则大于m的数也一定不能整除m。因此,在判别一个数m是否为素数时,可以缩小测试范围,只需从2~m中检查是否存在m的约数。只要找到一个约数,就说明不是素数,退出测试。



#include <iostream>

#include <cmath>//求平方根的函数sqrt在头文件cmath中定义








using namespace std;

int main()

{

int m,i,k,n=0;

for(m=2;m<=100;m++)

{

k=int(sqrt((float)m)); //函数sqrt用于返回参数m的平方根

i=2;

while(m%i&&i<=k)

i++;

if(i>k)

{

cout<<m<<'\t';

n+=1;

if(n%5==0)cout<<endl; //每输出5项换一行

}

}

return 0;

}






程序的运行结果如下: 



235711

1317192329

3137414347

5359616771

7379838997






3.4其他控制语句

当循环语句中的循环条件不满足时,就会结束循环体的执行。而在实际使用中,需要在循环条件仍旧满足的情况下,终止某次循环乃至整个循环。C++为此提供了中断循环的手段。

3.4.1break语句

break语句的形式为: 

break;

前面介绍switch语句时,曾使用过break语句,它的作用是使某个分支的执行到此结束。除此之外,break语句还可以用在循环语句中。break语句的作用是无条件地结束switch语句或循环语句,包括while、dowhile和for语句的执行,转向执行语句块的后续语句。

break语句不能用于switch语句和循环语句之外的任何结构语句中。

3.4.2continue语句

continue语句的形式为: 

continue;

continue语句用于循环体中,终止当前一次循环,不执行continue的后续语句,转向循环入口继续执行。

break语句和continue语句的执行流程如图310所示。




图310break语句和continue语句的执行流程


【例314】break语句与continue语句的测试。



#include <iostream>

using namespace std;



int main()

{

int i;

for(i=10;i<=20;i++)

{

if(i%2)

continue;

cout<<i<<" ";

}

cout<<endl;

for(i=10;i<=20;i++)

{

if(i%2)

break;

cout<<i<<" ";

}

cout<<endl;

return 0;

}






程序的运行情况及结果如下: 



10 12 14 16 18 20

10






程序中,第1个for循环输出了10~20的所有偶数,第2个for循环输出了10~20的第一个偶数。

3.5综合举例

【例315】使用公式π4=1-13+15-17+… 求π的近似值,直到最后一项的绝对值小于10-6为止。



#include <iostream>

#include <cmath>

using namespace std;

int main()

{

int i = 1,sign = 1;//i表示每一项的分母,sign表示每一项的符号

double s = 1,t = 1;//s用来求和,t表示每一项

do

{

i = i+2; //分母每次递增2

sign = -sign; //符号不断变化

t = sign * 1.0/i;

s = s+t;//把每一项累加上

}while(fabs(t)>=1e-6);

cout<<"PI = "<<4*s<<endl;

return 0;

}






程序的运行情况及结果如下: 



PI = 3.14159






【例316】求n!=1×2×…×n的值,n从键盘输入。



#include <iostream>

using namespace std;

int main()

{

int i,n;

long int t;

cout<<"n=";

cin>>n;

t = 1;

for(i=1;i<=n;i++)

t *= i;

cout<<n<<"!="<<t<<endl;

return 0;

}






程序的运行情况及结果如下: 



n=4

4!=24






【例317】已知公鸡每只5元,母鸡每只3元,小鸡每只1元。现要用100元买100只鸡,问公鸡、母鸡、小鸡各为多少?

算法分析: 这个问题采用“穷举法”来求解,即是把问题的解的各种可能组合全部罗列出来,并判断每一种可能组合是否满足给定条件,若满足给定条件就是问题的解。

设x、y和z分别表示公鸡、母鸡和小鸡的数目。由题意可知x的取值为0~19的整数,y的取值为0~33的整数,所以可以用外层循环控制x在0~19变化,内层循环控制y在0~33变化,在内层循环中对每一个x和y,求出z,并判断x、y和z是否满足条件: 5x+3y+z/3=100,若满足就输出x、y和z。



#include <iostream>

using namespace std;

int main()

{

int x,y,z;

cout<<"公鸡:\t"<<"母鸡:\t"<<"小鸡:\t"<<endl;

for(x=0;x<=19;x++)//公鸡取值范围

for(y=0;y<=33;y++)//母鸡取值范围

{

z = 100-x-y; //小鸡数量

if((5*x+3*y+z/3.0)==100)//百钱买百鸡

cout<<x<<'\t'<<y<<'\t'<<z<<endl;

}

return 0;

}






程序的运行情况及结果如下: 



公鸡:母鸡:小鸡:

0 2575

4 1878

8 181

124 84






【例318】输入两个正整数,求出它们的最大公约数。

算法分析: 求最大公约数有不同的算法,其中速度较快的是辗转相除法。

该算法描述为: m和n为两个正整数,当m>n时,m与n的最大公约数等于n与余数r=m%n的最大公约数; 不断更新被除数与除数,那么当余数r=0时,此时的除数n就是我们要找的最大公约数。



#include <iostream>

using namespace std;

int main()

{

int m,n,a,b,r;

cout<<"输入两个正整数:"<<endl;

cout<<"m=";cin>>m;

cout<<"n=";cin>>n;

if(m>n)

{

a=m;

b=n;

}

else

{

a=n;

b=m;








}

while((r=a%b)!=0) //r表示余数

{

a=b;

b=r;

}

cout<<m<<"和"<<n<<"的最大公约数为:"<<b<<endl;

return 0;

}






运行程序,求24和18的最大公约数,运行结果如下: 



输入两个正整数:

m=24

n=18

24和18的最大公约数为:6






练习题

一、 选择题

1. 已知“int i, x, y;”下列选项中错误的是。



A. if(x==y)i++;B. if(x=y)i--;

C. if(xy)i--;D. if(x+y)i++;

2. 设有函数关系为y=-1,x<00,x=01,x>0,下面选项中能正确表示上述关系的是。


A. y = 1;

if (x>=0)

if (x==0) y = 0;

else y =-1;
B. y = 1;

if (x>=0)

if (x==0) y = 0;

else y = 1;



C. if (x<=0)

if (x<0)y = -1;

elsey = 0;

elsey = 1;

D. y = -1;

if (x<=0)

if (x<0)y = -1;

elsey = 1;


3. 假设i = 2,执行下列语句后,i的值为。



switch (i)

{

case 1: i++; 

case 2: i--; 

case 3: ++i; break;

case 4: --i; 

default: i++;

}






A.  1B. 2C. 3D. 4

4. 已知“int i = 0, x = 0;”下面while语句执行时循环次数为。



while (!x&&i<3){x++; i++;}






A.  4B. 3C. 2D. 1

5. 已知“int i = 3;”下面dowhile语句执行时循环次数为。



do {i--; cout<<i<<endl;}while(i!=1);






A.  1B. 2C. 3D. 无限

6. 下面for语句执行时循环次数为。



for(int i=0,j=5;i=j;)

{

cout<<i<<j<<endl;

i++;j--;

}






A.  0B. 5C. 10D. 无限

7. 以下为死循环的程序段是。

A.  for (int x = 0; x<3;){x++;};

B.  int k = 0;

do {++k;} while (k>=0);

C.  int a = 5; while (a){a--;};

D.  int i = 3; for(; i; i--);

8. 以下程序的输出结果是。



#include<iostream>

using namespace std;

int main()

{

int i=0,a=0;

while(i<20) 

{

for(;;)

{ if((i%10)==0) break;

else i--;

}

i+=11; 

a+=i;

}

cout<<a<<endl;

return 0;

}






A. 11B. 32C. 21D. 33

二、 填空题

1. 写出以下程序的输出结果。



#include <iostream>

using namespace std;

int main()

{

int a,b,c,d,x;

a=c=0; b=1; d=20;

if(a)d=d-10;

else if(!b)

if(!c)x=15;

elsex=25;

cout<<d<<endl;

return 0;

}






2. 写出以下程序的输出结果。



#include <iostream>

using namespace std;

int main()

{

int i=1;

while(i<=10)

if(++i%3!=1)

continue;

else cout<<i<<endl;

return 0;

}






3. 写出以下程序的输出结果。



#include <iostream>

using namespace std;

int main()

{

int i=0,j=5;

do

{

i++;j--;

if(i>3)break;

}while(j>0);

cout<<"i="<<i<<'\t'<<"j="<<j<<endl;

return 0;

}






4. 写出以下程序的输出结果。



#include <iostream>

using namespace std;

int main()

{

int i,j;

for(i=1,j=5;i<j;i++)

{j--;}








cout<<i<<'\t'<<j<<endl;

return 0;

}






5. 写出以下程序的输出结果。



#include <iostream>

using namespace std;

int main()

{

int i,s=0;

for(i=0;i<5;i++)

switch(i)

{

case 0:s+=i;break;

case 1:s+=i;break;

case 2:s+=i;break;

default:s+=2;

}

cout<<"s="<<s<<endl;

return 0;

}






6.  写出以下程序的输出结果。



#include<iostream>

using namespace std;

int main()

{

int i;

for(i=1;i<=5;i++)

{

if(i%2) cout<<"#";

else continue;

cout<<"*";

}

cout<<"$\n";

return 0;

}






7.  写出以下程序的输出结果。



#include <iostream>

using namespace std;

int main()

{

int i,j,x=0;

for(i=0;i<=3;i++)

{

x++;

for(j=0;j<=3;j++)

{

if(j%2)continue;










x++;

}

x++;

}

cout<<"x="<<x<<endl;

return 0;

}






三、 编程题

1. 输入三角形的三条边长,判断它们能否构成三角形。若能,则判断是等边三角形、等腰三角形还是一般三角形。

2. 我国居民用电实行阶梯电价。阶梯电价是阶梯式递增电价或阶梯式累进电价的简称,是指把户均用电量设置为若干个阶梯分段或分挡定价计算费用。将居民用电量按照满足基本用电需求、正常合理用电需求和较高生活质量用电需求划分为三挡,电价实行分挡递增。总用电量=第一挡用电量+第二挡用电量+第三挡用电量。

试以如下标准根据输入的当年的用电量编程计算当年的电费: 

第一挡年用电量2160千瓦时: 每千瓦时0.558元。

第二挡年用电量2160~4800千瓦时: 每千瓦时0.608元。

第三挡年用电量4800千瓦时及以上: 每千瓦时0.858元。

3. 编写程序实现: 输入百分制成绩,把它转换成五级分制,转换公式为: 

grade级别=excellent(优秀)90~100good(良好)80~89general(中等)70~79pass(合格)60~69no pass(不合格)0~59

4. 已知XYZ+YZZ=532,其中X、Y和Z为数字,编程求出X、Y和Z。

5. 编程求1!+2!+…+15!。

6. 编程打印如下图案: 

*
***
*****
*******
*********
*******
*****
***
*

7. 在100~200中找出同时满足用3除余2,用5除余3和用7除余2的所有整数。

8. 将一个正整数分解质因数,质因数就是一个数的约数,并且是质数。例如: 输入90,输出90=2*3*3*5。

9. 输出所有的水仙花数,水仙花数是指一个三位数,其各位数字立方和等于该数本身。例如,153是一个水仙花数,因为153=13+53+33。

10. 编程输出1000之内的所有完数。所谓完数,是指它的因子之和恰好等于它本身。例如,6的因子为1,2,3,而6=1+2+3,所以6是一个完数。


11. 一球从100米高处落下,每次落地后反跳回原高度的一半,再落下。编程求它在第10次落地时,共经过多少米?第10次反弹多高?

12. 用迭代法编程求x=a。求平方根的迭代公式为: 

xn+1=12xn+axn

要求前后两次求出的x的差的绝对值小于10-7。