第3章 控制结构
3.1 知识要点
流程控制是控制程序中语句执行的顺序。任何程序设计语言都具备流程控制的功能,而C++语言提供了比其它高级语言更丰富的流程控制语言。本章节主要介绍了程序设计中最基本三种结构:顺序、分支和循环,要求掌握以下的知识要点:
1.掌握顺序结构的编程方法。
2.掌握使用cin、cout实现数据的输入/输出。
3.学会应用字符输入/输出函数。
4.掌握scanf()函数和printf()函数的使用。
5.掌握条件语句的形式和使用。
6.掌握条件语句的嵌套。
7.掌握switch语句的形式和使用。
8.掌握for,while,do-while三种循环语句的应用。
9.掌握循环语句的嵌套。
10.掌握break、continue、goto语句。
3.2 典型例题分析与解答
1. 选择题
例题1:如果有以下语句:int a,b; char m,n; cin>>a>>b>>m>>n;则下列输入数据的方式中不正确的是( )。
A.10,20,X,Y B.1020 XY
C.10 20 X Y D.10、20、X、Y
答案:C
分析:C++语言没有专门的输入/输出语句,其输入/输出是通过输入/输出流来实现的。用cin输入时,空格和回车键均可作为输入字符之间的分隔符,逗号不能作为分隔符。字符型变量只能容纳一个字符。
例题2:以下不正确的语句是( )。
A.if(x>y);
B.if(x=y)&&(x!=0) x+=y;
C.if(x!=y)cin>>x;else cin>>y;
D.if(x<y) {x++;y++;}
答案:B
分析:if语句后面的表达式必须放在括号内“()”,且不能使用赋之值运算符。在if和else后面用花括号“{}”括起来的多个语句成为了一个复合语句。
例题3:下面程序的输出结果是( )。
#include<iostream.h>
void main()
{ int a=6,b=6;
if(a>5)
a-=1;
b+=1;
else
a+=1;
b-=1;
cout<<”a=”<<a<<endl;
cout<<”b=”<<b;
}
A.5 B.a=5 C.a=5 D.编译时出错
7 b=7 b=6
答案:D
分析:在if…else语句的中间应为单条语句或复合语句,不能为多条语句。
例题4:对while、do…while循环结构,下面说法正确的是( )。
A.只是表达形式不同
B.do…while结构中的语句至少执行一次
C.while结构中的语句至少执行一次
D.条件成立时,它们有可能一次也不执行
答案:B
分析:要知道while、do…while两种循环结构的区别在于:while循环是先判断条件是否成立,成立时才执行,而do…while是先执行再判断,它至少执行一次。
例题5:以下不正确的是( )。
A.语句for(i=0;;i++)表示无限循环 B.for(;;)表示无限循环
C.for()也表示无限循环 D.while(1)表示无限循环
答案:C
分析:for循环语句中的表达式可以省略,但分号不可省略。
例题6:下面循环体的执行次数为( )。
#include<iostream.h>
void main()
{ int a,b;
for(a=0,b=5;a<=b+1;a+=2,b--) cout<<a<<endl;
}
A.3 B.2 C.1 D.0
答案:A
分析:在for语句的表达式中使用了逗号运算符对变量a和b 进行赋初值,每次循环后改变变量a和b 的值,直到a>=b.
例题7:对中断语句的说法下面不正确的是( )。
A.用户可以指定中断的位置 B.用户可以指定转移的位置
C.break语句可以跳出本循环 D.continue语句可以结束本次循环
答案:B
分析:不论break语句还是continue语句转移的位置是根据程序默认的,不用人为的设置。
例题8:下列函数的功能是( )。
#include<iostream.h>
void main()
{ char a; int i;
cin>>a;
for(i=1;i<=10;i++)
{ if((a>=’a’)&&(a<=’z’))
a=a-i;
cout<<a;
} }
A.把a中的小写字母变成大写字母 B.把a中的小写字母变成大写字母
C.把a中的所有字母变成小写字母 D.把a中的字母变成它前面i个的字母
答案:D
分析:本题要求判断程序的功能,可以用列举法判断其gon功能,例设a=’f’,则程序结果为edcba^^^^^,本程序仅对在小写字母a~z之间的字母起作用。
2. 填空题
例题9:下面的程序实现输出x,y,z三个数中的最大值,请填入正确的内容。
#include<iostream.h>
void main()
{ int x=5,y=8,z=9, u, v;
if( (1) ) u=x;
else u=y;
if( (2) ) v=u;
else v=z;
cout<<”v=”<<v<<endl;
}
答案:(1)x>y (2) u>z
分析:本程序首先找出x和y中较大的数放入变量u中,再将u 与z 做比较,其中较大者放入变量v中,为三个数中的最大值。
例题10:有以下程序段:
int n=0;
while(n=1)n++;
while循环执行次数是_____。
答案:为无限次。
分析:要注意”=”和”= =”的区别,”=”是赋值运算符,”= =”是关系运算符“等于”。这里while(n=1)永远为1,为真值,则答案为无限次。
例题11:计算1~20之间偶数之和,请填充:
#include<iostream.h>
void main()
{ int a,b,i;
a=0;b=0;
for(i=0; (1) ;i+=2)
{ a+=i;
(2) ;
(3) ;
cout<<”偶数之和为:”<<a<<endl;
}
答案:(1)i<=20或i<21 (2)b+=i+1 (3) }
例题12:下面程序运行结束后,k的值为_____。
#include<iostream.h>
void main()
{ int i,j,k;
for(i=0,j=10;i<=j;i++,j--)
k=i+j;
count<<k;
}
答案:10。
分析:在程序中每循环一次,变量i+1,而变量j-1,i+j之和保持不变为10,直到循环结束。
例题13:下面程序是输出100以内能被7整除且个位数是4的所有整数,请填空:
#include<iostream.h>
void main()
{ int i,j;
for(i=0; (1) ;i++)
{ j=i*10+4;
if( (2) )
continue;
(3)
cout<<j<<endl;
} }
答案:(1)i<=9或i<10 (2)j%7!=0 (3)else
分析:由题目可知判断100以内的数,故i变量的终值应为:i<=9或i<10。要满足不被7整除的条件为: j%7!=0;反之不满足该条件的则要输出。
3. 改错题
例题14:下面的程序存在着语法错误,请指出并予以修改:
#include<iostream.h>
void main()
{ float x,y; //1
if(x>0); //2
x=x+y; //3
cout<<x<endl; //4
else cout<<-x; //5
}
答案:
(1)标号3语句改为 {x=x+y; 。
(2)标号4语句改为 cout<<x<endl;} 。
分析:选择结构语句的语法要求,条件表达式放在括号内,后面不加逗号。if 语句后面有多于一个语句时要加大括号“{}”,成为复合语句。
例题15:下面的程序是从键盘输入10个字符,统计出其中的数字字符的个数。
void main()
{ int i, c, n;
for(i=0,j=10,i++);
{ c=getchar( );
if(c>0 && c<9) n++
}
cout<<“n=”<<n<<endl;
}
正确程序为:
#include<iostream.h>
void main()
{ int i, c, n=0;
for(i=0;j<10;i++);
{ c=getchar( );
if(c>’0’ && c<’9’) n++;
}
cout<<“n=”<<n<<endl;
}
分析:for循环语句中三个表达式之间必须用分号分隔,括号外没有分号。if语句的条件有错,0和9作为字符常量,应加上单引号’ ’。作为统计用的变量n,初值应赋值为0。修改后的正确程序显示在右边。
4. 看程序写结果
例题16:#include<iostream.h>
void main()
{ int a,b,c,d,x;
a=c=0; b=1;d=20;
if(a) d=d-10;
else if(! b)
if(! c) ;
else x=25;
cout<<”d=”<<d<<endl;
cout<<”x=”<<x<<endl;
}
运行结果:
d=20
x=25
分析:这是一个if语句的嵌套结构,判断三个if语句的条件表达式都“假”,则执行最后一个else后面的语句“x=25”。
例题17:#include<iostream.h>
void main()
{ int x=6,y=8;
if(x++<6)
cout<<++y<<endl;
if(x>6)
cout<<- -y<<endl;
else
cout<<y++<<endl;
}
运行结果:
7
分析:程序在判断第一个条件if(x++<6)时,由于此时x的值为6所以不成立,故不做语句cout<<++y<<endl;且变量y值不变化。接着判断第二个条件if(x>6),因x值为7,条件成立,故执行语句cout<<- -y<<endl;此时y值为8,执行- -y,则输出7。
例题18: #include<iostream.h>
void main()
{ int a;
cout<<”please input a number:”;
cin>>a;
switch(a %2)
{ case 0: cout<<”a是偶数”<<endl;
default: cout<<”a是奇数”<<endl;
}
}
如果输入数为6,则输出结果为什么?
运行结果:
a 是偶数
a是奇数
分析:本题主要是要掌握多分支语句switch语句和break语句的应用。当符合条件的分支执行完毕后,如果没有遇到break语句,则继续执行下面的分支语句,而不管条件是否符合,直到遇到break语句或switch语句结束。
例题19:写出下列程序运行结果:
#include<iostream.h>
void main()
{ int i,j,m=0,n=0;
for(i=0;i<2;i++)
for(j=0;j<2;j++)
if(j>=i) m=1;n++;
cout<<m<<endl;
cout<<n;
}
对待结果:
1
1
分析:本题中二重循环的循环体语句为:if(j>=i) m=1;n++;,由于内外循环变量的变化,该语句并不被二重循环所控制,它仅执行了一次,即不论循环多少次m、n的值总为1。
例题20:写出下列程序运行结果:
#include<iostream.h>
void main()
{ int a,b;
for(a=1,b=1;a<=100;a++)
{ if(b>=10)break;
if(b%3= =1)
{ b+=3;continue;}
}
cout<<a<<endl;
cout<<b;
}
运行结果:
4
10
分析:本题是一个单循环语句,在循环体中有break和continue语句,当变量b=10时,循环结束,输出相应的变量a、b的值。
例题21:写出下列程序运行结果:
#include<iostream.h>
void main()
{ int y, a;
y=2;a=-1;
while(y--!=-1)
{ do
{ a*=y; a++; } while(y--);
}
cout<<"a= "<<a<<" y= "<<y;
}
运行结果:
a=1 y=-2
分析:y--返回2,y=1,whi1e条件为真,进入do-whilee循环;a*=y之后,a=1,a++之后,a=2;y--返问1,,y=0;再执行一 次do-while循环,a*=y之后,a=0,a++之后,a=1,y--返回0,y=-1,退出do-while循环;(y--!=-1)为假,且y=-2,退出外层的while循环。这时a=1,y=-2。
5. 编写程序
例题22:编写一个程序根据输入的三角形的三条边判断是否能组成三角形,如果可以则输出它的面积和三角形类型。
分析:本程序应采用条件结构语句。首先判断三角形的任意两边是否大于第三边,是则求出相应的三角形的面积,然后利用嵌套的选择结构语句进一步判断三角形的类型。程序如下:
#include<iostream.h>
include<math.h>
void main()
{ float a, b, c, s, area;
cin>>a>>b>>c;
if(a+b>c && b+c>a && a+c>b)
{ s=(a+b+c)/2;
area=sqrt(s*(s*(s-a)*(s-b)*(s-c));
cout<<area;
if(a= =b && b= =c)
cout<<”等边三角形”;
else if(a= =b | | a= =b | | b= =c)
cout<<”等腰三角形”;
else if((a*a + b*b= = c*c)| |(a*a + c*c= = b*b)| |(b*b + c*c = = a*a))
cout<<”直角三角形”;
else cout<<”一般三角形”;
}
else cout<<”不能组成三角形”;
}
例题23:计算1至70中是7的倍数的数值之和。
分析:采用单循环语句结构,在循环内判断数值是否能被7整除,满足条件的值累加到求和变量sum中。程序为:
#include<iostream.h>
void main()
{ int i, sum=0;
for(i=1;i<=70;i++)
if (i % 7) sum += i ;
cout<<sum<<endl;
}
例题24:求下面分数序列的前13项之和。
2/1,3/2,5/3,8/5,13/8,21/13,…
分析:采用循环结构来实现累加,循环变量表示当前的数列项数,在循环体内计算数列的第i项的值,以及前i项的累加值。数列的规律为:从第2项开始,每一项的分母是前一项的分子,分子是前一项的分子和分母之和。程序如下:
(1)用for语句实现:
#include<iostream.h>
void main()
{ float a,b,t,sum;
int i;
for(i=1;i<=13;i++)
{ a=a+b; b=a-b;
t=a/b; sum+=t;
}
cout<<”sum=”<<sum<<endl;
}
(2)用while语句实现:
#include<iostream.h>
void main()
{float a,b,t,sum; int i;
a=2;b=1;i=2;t=a/b;sum=t;
while(i<=13)
{ a=a+b; b=a-b;
t=a/b; sum+=t;
i++;
}
cout<<”sum=”<<sum<<endl;
}
(3)用do-while语句实现:
#include<iostream.h>
void main()
{ float a,b,t,sum; int i=1;
a=b =1;sum=0;
do
{ a=a+b; b=a-b;
t=a/b; sum+=t;
}while(++i<=13);
cout<<”sum=”<<sum<<endl;
}
例题25:要用0至9之间不同的三个数构成一个三位数,编写程序统计出共有多少种方法。
分析:题目要求构成的是一个三位数,可用三重循环中的三个循环变量分别表示个、十、百位,在循环中利用条件语句判断满足三个数不等的条件,并用一个独立变量加以统计。程序如下:
#include<iostream.h>
vois main()
{ int i,j,k,count=0;
for(i=1;i<=9;i++)
for(j=0;j<=9;j++)
if(i= =j) continue;
else
for(k=0;k<=9;k++)
if(k!=i && k!=j)count++;
cout<<count<<endl;
}
3.3 教材习题分析与解答
1.单项选择题
(1)putchar函数可以向终端输出一个( )。
A.整型变量表达式值 B.实型变量值
C.字符串 D.字符或字符型变量值
答案:D
(2) int k=10;
while(k=0) k=k-1;
则下面描述正确的是( )。
A.while循环执行10次 B.循环是无限循环
C.循环体语句一次也不执行 D.循环体语句执行一次
答案:C
(3)int x=0,s=0;
while(!x!=0) s+=++x;
cout<<s;
则( )。
A.运行程序段后输出0 B.运行程序段后输出1
C.程序段中的控制表达式是非法的 D.程序段执行无限次
答案:B
(4) int x=0,y=0;
while(x<15) y++,x+=++y;
cout<<y<<”,”<<x;
则运行结果为( )。
A.20,7 B.6,12 C.20,8 D.8,20
答案:D
(5) int a=1,b=2,c=2;
while(a<b<c) {t=a;a=b;b=t;c--;}
cout<<a<<”,”<<b<<”,”<<c;
运行结果为( )。
A.1,2,0 B.2,1,0 C.1,2,1 D.2,1,1
答案A
(6)int x=-1;
do
{x=x*x;}
while(!x);
下列说法正确的是( )。
A.是死循环 B.循环执行两次
C.循环执行一次 D.有语法错误
答案:C
(7)以下能正确计算1*2*3*…*10的程序段是( )。
A.do {i=1;s=1; B.do {i=1;s=0;
s=s*i; i++;} s=s*i;i++;}
while(i<=10); while(i<=10);
C. i=1;s=1; D.i=1;s=0;
do {s=s*i; do{s=s*i;
i++;} i++;}
while(i<=10); while(i<=10);
答案:C
(8)以下描述正确的是( )。
A.由于do-while循环中循环体语句只是一条可执行语句,所以循环体内不能使用复合语句
B.do-while循环由do开始,用while结束,在while(表达式)后面不能写分号
C.在do-while循环体中,一定要有能使while后面表达式的值变为零(“假”)的操作
D.do-while循环中,根据情况可以省略while
答案:C
(9)C++语言中while和do-while循环的主要区别是( )。
A.do-while的循环体至少无条件执行一次
B.while的循环控制条件比do-while的循环控制条件严格
C.do-while允许从外部转到循环体内
D.do-while的循环体不能是复合语句
答案:A
(10)下面有关for循环的正确描述是( )。
A.for循环只能用于循环次数已经确定的情况
B.for循环是先执行循环体语句,后判断表达式
C.在for循环中,不能用break语句跳出循环体
D.for循环的循环体语句中,可以包含多条语句,但必须用大括号括起来
答案:D
(11)对for(表达式1; ;表达式3)可理解为( )。
A.for(表达式1;0;表达式3) B.for(表达式1;1;表达式3)
C.for(表达式1;表达式1;表达式3) D.for(表达式1;表达式3;表达式3)
答案:B
(12)for(i=2;i= =0;) printf(“%d”,I--); 循环执行的次数是( )。
A.无限次 B.0次 C.1次 D.2次
答案:B
(13)下面程序段的运行结果为( )。
for(y=1;y<10;) y=((x=3*y,x+1),x-1);
cout<<“x=”<<x<<”y=”<<y;
A.x=27,y=27 B.x=12,y=13
C.x=15,y=14 D.x=y=27
答案:C
(14)以下不是无限循环的语句为( )。
A.for(y=0,x=1;x>++y;x=I++) I=x; B.for( ; ;x++=I);
C.while(1){x++;} D.for(I=10; ;I--) sum+=I;
答案:A
(15)下面程序的运行结果是( )。
#include<iostream.h>
viod main( )
{int i,b,k=0;
for(i=1;i<=5;i++)
{b=i%2;
while(b- - >=0) k++;}
cout<<k<<”,”<<b; }
A.3,-1 B.8,-1 C.3,0 D.8,-2
答案:D
(16)以下正确的描述是( )。
A.continue语句的作用是结束整个循环的执行
B.只能在循环体内和switch语句体内使用break语句
C.在循坏体内使用break语句或continue语句的作用相同
D.从多层循环嵌套中退出,只能使用goto语句
答案:B
(17)下面程序段( )。
for(t=1;t<=100;t++)
{cin>>x;
if(x<0) continue;
cout<<t;}
A.当x<0时整个循环结束 B.x>=0时什么也不输出
C.cout永远也不执行 D.最多允许输出100个非负整数
答案:D
(18)下面程序段( )。
x=3;
do {y=x--;
if(!y) {cout<<”x”; continue;}
cout<<”#”;} while(1<=x<=2);
A.将输出## B.将输出##*
C.是死循环 D.含有不合法的控制表达式
答案:C
(19)下面程序的运行结果是( )。
#include<iostream.h>
void main()
{int a,b;
for(a=1,b=1;a<=100;a++)
{ if(b>=20) break;
if(b%3= =1) {b+=3;continue;}
b-=5;
}
cout<<a<<endl;
}
A.7 B.8 C.9 D.10
答案:B
(20)下面程序段的运行结果是( )。
#include<iostream.h>
void main( )
{ int i,j,x=0;
for(i=0;i<2;i++)
{ x++;
for(j=0;j<=3;j++)
{ if(j%2) continue;
x++;
}
x++;
}
cout<<“x=”<<x<<endl;
}
A.x=4 B.x=8 C.x=6 D.x=12
答案:B
(21)下面程序段的运行结果是( )。
#include<iostream.h>
void main()
{int i;
for(i=1;i<=5;i++)
{if(I%2) cout<<“*”;
else continue;
cout<<“#”; }
cout<<“$/n”; }
A.*#*#*#$ B.#*#*#*$ C.*#*#$ D.#*#*$
答案:A
(22)下面程序段的运行结果是( )。
#include<iostream.h>
void main( )
{ int i,j,a=0;
for(i=0;i<2;i++)
{ for(j=0;j<4;j++)
{ if(j%2) break;
a++;
}
a++;
}
cout<<a<<endl;
}
A.4 B.5 C.6 D.7
答案:A
2.填空题:
(1)下面程序段是从键盘输入的字符中统计数字字符的个数,用换行符结束循环,
请填空。
int n=0,c;
c=getchar();
while ( c!=’/n’ )
{ if( c>=’0’&&c<=’9’ ) n++;
c=getchar( );}
(2) 1020个西瓜,第一天卖一半多两个,以后每天卖剩下的一半多两个,问几天以后能卖完?
#include<iostream.h>
main( )
{int day, x1, x2;
day=0;x1=1020;
while( x1>0 ) {x2=( x1/2-2 );x1=x2;day++;cout<<x1<<endl;}
cout<<“day=”<<day<<endl; }
(3) 运行以下程序时,从键盘键入right?回车后运行结果是( sjhiu )。
#include<stdio.h>
void main()
{char c;
while((c=getchar())!=’?’) putchar(++c);
}
(4) 运行以下程序时,从键盘输入China#,回车后运行结果是( 5 5 )。
#include<stdio.h>
#include<iostream.h>
void main()
{ int v1=0,v2=0;char ch;
while((ch=getchar())!=’#’)
switch(ch)
{case ‘a’:
case ‘h’:
default:v1++;
case ‘o’:v2++;}
cout<<v1<<v2<<endl;
}
(5)运行下面程序段后,k值为( 36 )。
k=1;n=263;
do {k*=n%10;n/=10; } while(n);
(6)下面程序段中循环体的执行次数是( 3次 )。
a=10;b=0;
do{b+=2;a-=2+b;} while(a>=0);
(7)下面程序段的运行结果为( ** )。
x=2;
do{cout<<“*”;x--; } while(!x= =0);
(8)下面程序段的运行结果是( a=-5 )。
i=1;a=0;s=1;
do {a=a+s*i;s=-s;i++; } while(I<=10);
cout<<“a=”<<a ;
(9)下面程序段的运行结果是( )。
for(a=1,i=-1;-1<=i<1;i++)
{a++;cout<<x<<y<<endl;}
分析:本题循环条件是假值,所以什么也不输出。
(10) 鸡、兔共有30只,脚共有90个,下面程序段是计算鸡兔各有多少只,x代表有多少只鸡,y代表有多少只兔子,请填空。
for(x=1;x<=29;x++)
{y=30-x;
if( 2*x+4*y= =90 ) cout<x<<’ ‘<<y;}
(11) 下面程序的功能是从3个红球、5个白球、6个黑球中任意取出8个球,且其中必须有白球,输出所有可能的方案,请填空。
#include<iostream.h>
void main()
{
int i,j,k;
cout<<“/n hong bai hei /n”;
for(i=0;i<=3;i++)
for(( j=1 );j<=5;j++)
{k=8-i-j;
if( k>0 && k<=6 )
cout<<i<<’ ‘<<j<<’ ‘<<k<<endl;
}}
(12)下面程序的功能是求出用数字0至9可以组成多少个没有重复的三位偶数,请填空。
#include<iostream.h>
void main()
{ int n=0,i,j,k;
for(i=1;i<=9;i++)
for(k=0;k<=8;( k+=2 ))
i f(k!=i)
for(j=0;j<=9;j++)
if( j!=i && j!=k ) n++;
cout<< “n=”<<n<<endl;
}
3.看程序,写结果
(1)#include<iostream.h>
void main()
{ int i=0,x=0,y=0;
do{ ++i;
if(i%2!=0) {x=x+i;i++;}
y=y+i++;
}while(i<=7);
cout<<“x=”<<x<<”y=”<<y;}
运行结果:
x=1 y=20
(2) #include<iostream.h>
void main()
{int i,t,sum=0;
for(t=i=1;i<=10; )
{sum+=t;++i;
if(i%3= =0) t=-i;
else t=i;}
cout<<“sum=”<<sum;}
运行结果:
sum=19
(3) nclude<iostream.h>
void main( )
{int i;
for(i=1;i<=5;iI++)
switch(i%2)
{case 0:i++; cout<<“#”;break;
case 1:i+=2; cout<<“*”;
default: cout<<“/n”;}}
运行果为:
*
#
(4) #include<iostream.h>
void main()
{int y=2,a=1;
while(y--!=-1)
{do {a*=y;a++; } while(y--);}
cout<<a<<y;}
运行结果 :
1 -2
(5) #include<iostream.h>
void main()
{int i,j;
for(i=4;i>=1;i--)
{for(j=1;j<=i;j++) putchar(‘#’);
for(j=1;j<=4-i;j++) putchar(‘*’);
putchar(‘/n’);}}
运行结果:
# # # #
# # # *
# # * *
# * * *
(6) #include<iostream.h>
void main()
{ int i,k=0;
for(i=1; ;i++)
{k++;
if(k%3= =0) break;
}
cout<<i<<k;
}
运行结果:
2 3
(7) #include<iostream.h>
void main( )
{int i=1;
while(i<=15)
if(++i%3!=2) continue;
else cout<<i<<’/t’;
cout<<“/n”;
}
运行结果:
2 5 8 11 14
(8) #include<iostream.h>
void main()
{int a=10,y=0;
do {a+=2;y+=a;
if(y>50) break; } while(a=14);
cout<<“a=”<<a<<” y=”<<y;
}
运行结果:
a=16 y=60
(9) #include<iostream.h>
void main()
{int i, k=19;
while(i=k-1)
{k-=3;
i f(k%5= =0) {i++;continue;}
else if(k<5) break;
i++; }
cout<<“i=”<<i<<”k=”<<k;
}
运行结果:
i=6 k=4
(10) #include<iostream.h>
void main()
{int i=5;
do {switch(i%2)
{case 4:i--;break;
case 6:i--;continue;
}
i--;i--;
cout<<i; } while(i>0);
}
运行结果:
3 1 -1
4.回答下列问题
(1)C++语言提供了哪些常用的语句?
答:C++语言提供了多个常用的语句,先列举一些如下:
1) cin>> <变量名1> >> <变量名2> >> …….
2) cout<< <变量名1> << <变量名2> <<…….
3) if(表达式) 语句1;
4) if(表达式) 语句1;
else 语句2;
5) switch(表达式)
{ case 表达式1: 语句序列1;[break;]
case 表达式2: 语句序列2;[break;]
……….
[default: 语句序列n+1;]
}
6) while(表达式) 语句;
7) do
语句;
while(表达式);
8) for(表达式1;表达式2;表达式3) 语句;
(2)条件语句的格式如何?if语句中对else子句有何规定?
答: 条件语句的格式为:
if(表达式) 语句1; 或
if(表达式) 语句1;
else 语句2;
在条件语句嵌套中,从第一个 else 子句开始,“else”总是与离它最近的尚未配对的“if”配对。
(3)开关语句的格式如何?break语句在开关语句中有何作用?
答: 开关语句的格式为:
switch(表达式)
{ case 表达式1: 语句序列1;[break;]
case 表达式2: 语句序列2;[break;]
……….
case 表达式n: 语句序列n;[break;]
[default: 语句序列n+1;]
}
break语句在开关语句中表示执行完这个分支后跳出switch语句,不再转去执行后续的情况,它保证了程序只能选择各种情况中的一种来执行。如果某个分支后没有break语句,将会继续向下一个分支的语句去执行,且不再对后面的情况常量进行判断。
(4)在开关语句中,case子句的条件有何特点?
答:在开关语句中,case子句中的条件应为常数表达式,其值一般为整数或字符常数。
(5) C++语言提供哪些循环语句?它们各自的特点是什么?它们可以相互替代吗?可以相互嵌套吗?
答:C++语言提供三种循环语句:for循环语句应用最惯犯,使用最灵活。不仅可以用于循环次数已经确定的情况,也能用于循环次数不确定、只给出循环结束条件的情况。它可以代替其他类型的循环语句。while循环语句,其特点是先判断表达式,后执行语句,在循环体中应有使循环趋于结束的语句。do-while 语句,其特点是先执行语句,后判断表达式。对同一个问题可以用while语句处理,也可以用do-while语句处理。
在循环的嵌套中,不同类型的循环可以相互嵌套。
(6)while 和do~while循环语句有什么区别吗?
答:while 和do~while循环语句的区别在于:while语句是判断表达式,后执行语句;而do-while语句是先执行语句,后判断表达式,do-while语句至少执行一次循环体语句。
(7)continue、break语句在循环中分别起到什么作用?
答:continue语句用于结束本次循环,即跳过循环体中下面尚未执行的语句,但并不跳出循环,而是控制返回循环语句的条件测试部分,继续执行循环。break语句是强制结束循环,不再进行条件的判断。
5.按下列要求编写程序
(1)有一个函数如下:
x (x<5)
y= x+6 (5<=x<15)
x-6 (x>=15)
输入x的值,计算出相应的y值。
程序为:#include<iostream.h>
void main()
{ float x,y;
cin>>x;
if(x<5) y=x;
else if(x<15) y=x+6;
else y=x-6;
cout<<"x= "<<x<<" y= "<<y<<endl;
}
(2)编程要求输入整数a和b,若a2+b2大于100,则输出a2+b2百位以上的数字,否则输出两数之和。
程序为:#include<iostream.h>
void main()
{int a,b;
cin>>a>>b;
if(a*a+b*b>100) cout<<(a*a+b*b)/100<<endl;
else cout<<a+b<<endl;
}
(3)根据π/4 =1-1/3+1/5-1/7+…求π的近似值,直到最后一项的值小于0.000001为止。
程序为:#include<iostream.h>
void main()
{ int i=1 ;
float s=1.0,pi=0;
while(1.0/i>=0.000001)
{ pi= pi+s/i; s=-s; i=i+2;
}
cout<<4*pi<<endl;
}
(4)编程输出如下图形:(例n=6)
*
*****
*********
*************
*****************
*********************
程序为:#include<iostream.h>
void main()
{int i,j,k;
for(i=1;i<=6;i++)
{ for(k=1;k<=20-2*i;k++)
cout<<' ';
for(j=1;j<=4*i-3;j++)
cout<<'*';
cout<<endl;
}
}
(5)求1!+2!+3!+…8!。
程序为:#include<iostream.h>
void main()
{int i,j=1,sum=0;
for(i=1;i<=8;i++)
{ j=j*i;
sum=sum+j;
cout<<j<<" "<<sum<<endl;
}
cout<<"1!+2!+...+8!="<<sum<<endl;
}
(6)打印出所有的“水仙花数“(它是一个三位数,其各位数字立方和等于该数本身)。
程序为:#include<iostream.h>
void main()
{int i,j,k,n;
for(i=1;i<=9;i++)
for(j=0;j<=9;j++)
for(k=0;k<=9;k++)
{ n=i*100+j*10+k;
if(n==i*i*i+j*j*j+k*k*k) cout<<n<<endl;
}
}
(7)编写一个程序,输入年、月,打印出该年份该月的天数。
程序为:#include<iostream.h>
void main()
{int year,month, days;
cin>>year>>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%400==0 || year%4==0 &&year%100!=0) days=29;
else days=28;
}
cout<<year<<"年"<<month<<"月有"<<days<<"天/n";
}
(8)输入一个自然数,输出其各因子的连乘形式,如输入12,则输出12=1*2*2*3。
程序为:#include<iostream.h>
void main()
{int n,i;
cin>>n;
cout<<n<<"=1";
i=2;
while(n>1)
{while(n%i==0)
{ cout<<"*"<<i; n=n/i;}
i++;
}
}
(9)求一个整数任意次方的最后三位数。
程序为: #include<iostream.h>
void main()
{int x,n,p=1,i;
cin>>x>>n;
for(i=1;i<=n;i++)
p=p*x%1000;
cout<<p<<endl;
}
(10)猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,发现只剩一个桃子了,求猴子第一天究竟摘了多少个桃子?
程序为:#include<iostream.h>
void main()
{ int p=1,i;
for(i=1;i<=9;i++)
p=(p+1)*2;
cout<<p<<endl;
}
3.4 补充习题
1.选择题
(1)以下程序的输出结果是( )。
#include<iostream.h>
void main()
{ int a=100,x=10,y=20,ok1=5,ok2=0;
if(x<y)
if(y!=10)
if(!ok1) a=1;
else if(ok2) a=10;
a=-1;
cou<<a<<endl;
}
A.1 B.0 C.-1 D.值不确定
(2)以下不正确的if语句形式是( ) 。
A.if(x>y && x!=y); B.if(x= =y) x+=y;
C.if(x!=y)cin>>x else cin>>y; D.if(x<y){x++;y++;}
(3)设有以下程序段,则( )。
int a=0, b=0;
while(!a!=0) b+=++a;
cout<<b;
A.程序运行后输出0 B.程序运行后输出1
C.程序执行无数次 D.循环控制条件表达式是非法的
(4)当a=1,b=3:c=5,d=4时,执行下面一段程序后x的值是( )。
if(a<b))
if(c<d) x=1;
else
if(a<c)
if(b<d) x=2;
else x=3;
else x=6;
else x=7;
A.1 B.2 C3. D.6
(5)以下for循环的循环次数是( )。
for(x=0, y=0; (y=123)&&(x<4); x++);
A.是无限循环 B.循环次数不定 C.执行4次 D.执行3次
(6)下面程序的运行结果是( )。
#include<iostream.h>
void main()
{ int x=6,y=8;
if(x++<6)
cout<<++y<<endl;
if(x>6)
cout<ßy<<endl;
else
cout<<y++<<endl; }
A.8 B.9 C. 7 D.编译不成功
(7)关于for循环语句下面不正确的是( )。.
A.在循环体中,不能改变循环控制变量
B.在执行中循环控制变量初值、终值可变
C.循环控制变量可增可减
D.循环控制变量不必在说明部分说明
(8)下列写法中等价的是( )。
A.若x=1,则while(x!=x)与while(x)
B.若x=0,则while(x!=x)与while(x)
C.若x=1,则while(x!=0)与while(!x)
D.若x=0,则while(x==0)与while(!x)
(9)执行语句for(i=0; i++<3;)后,变量i的值为( )。
A.2 B.3 C.4 D.5
(10)下面程序的运行结果是( )。
#include<iostream.h>
void main()
{ int x=10,y=10,i;
for(i=7; x>i; y-=9, ++i, x--)
cout<<x<<” “<<y<<” “;
}
A.10 1 9 2 B.9 8 7 6 C.10 9 9 0 D.10 10 9 1
(11)若int x=3;且有下面的程序片段,则输出结果为( )。
do { x-=2;
cout<<x;
}while(!(- -x));
A.1 B.3 0 C.1 2 D.死循环
(12)下面程序的运行结果是( )。
#include<iostream.h>
void main()
{ int num=0;
while(num<=2)
{ num++;
cout<<num<<endl;
}
}
A.1 B.1 C.1 D.1
2 2 2
3 3
4
(14)下列程序段不是死循环的是( )。
A.int i=100;
while(1)
{ i=i%100+1;
if(i>100) break;
}
B.for( ; ;)
C.int k=0;
do{++k;} while(k>=0);
D.int s=36;
while(s); --s;
(15)下面程序的运行结果是( )。
#include<iostream.h>
void main()
{ int a, y;
a=10; y=0;
do
{ a+=2; y+=a;
if(y>50) break;
} while(a=14);
cout<<”a=”<<a<<”y=”<<y;
}
A.a=16 y=60 B.a=15 y=50 C.a=14 y=50 D.a=14 y=60
2.填空题
(1)下面程序的运行结果是_______。
#include<iostream.h>
void main()
{ int a=2,b=3,c;
c=a;
if(a>b) c=1;
else if(a= =b) c=0;
else c=-1;
cout<<c;
}
(2)若所用变量都已正确定义,以下程序段的输出结果__________
x=y=0;
while(x<20)y++,x+=3;
cout<<”y=”<<y<<”x=”<<x;
(3)下面程序的运行结果是________。
#include<iostream.h>
void main()
{ int i, j=4;
for(i=j; i<=2*j; i++)
switch(i/j)
{ case 0:
case 1: cout<<”*”; break;
default: cout<<”#”;
}
}
(4)输入一个字母,如果它是一个大写字母,则把它变成小写字母;如果它是一个小写字母,则把它变成大写字母;其它字符不变。填入正确内容。
#include<iostream.h>
void main()
{ char ch;
cin>>ch;
if(______________) ch=ch+32;
else if(ch>=’a’ &&ch<=’z’)____________;
cout<<ch<<endl;
}
(5)读下面的程序,要使输出结果t=4,输入变量a和b应满足条件_________。
#include<iostream.h>
void main()
{ int s,t,a,b;
cin>>a>>b;
s=1;t=1;
if(a>0)s=s+1;
if(a>b)t=s+t;
else if(a= =b)t=5;
else t=2*s;
cout<<”s=”<<s<<”x=”<<x<<endl;
}
(6)从键盘输入若干个学生的成绩,统计并输出最高成绩和最低成绩,当输入负数时结束输入,完成下面的程序填空。
#include<iostream.h>
void main()
{ float mark, max, min;
________________;
max=mark;
min=mark;
while(______________)
{
if(mark>max) max=mark;
if(mark<min) min=mark;
_____________}
cout<<”max is:”<<max<<andl;
cout<<”min is:”<<min;
}
(7)下面程序的功能是计算100至1000之间有多少个数其各位数字之和是5。
#include<iostream.h>
void main()
{ int i, s, k, cout=0;
for(i=100;i<1000;i++)
{ s=0; k=i;
while(_________)
{ s=s+k%10;
k=_________;}
if(s!=5) ____________;
else count++;
}
cout<<cout;
}
(8)下面程序的功能是输出1至200之间每位数的乘积大于每位数的和的数。
#include<iostream.h>
void main()
{ int n, k=1, s=0, m;
for(n=1; n<=100; n++)
{ k=1; s=0;
_________________;
while(____________)
{ k*=m%10;
s+=m%10;
_____________;
}
if(k>s) cout<<n;
}
3. 看程序写结果
(1)#include<iostream.h>
void main()
{ int x,y,z;
x=1;y=2;z=3;
x=y--<=x||x+y1=z;
cout<<x<<y<<endl;
}
(2)#include<iostream.h>
void main()
{ int x,y,z;
if(y!=0)x=5;
cout<<x<<endl;
if(y= =0) x=4;
else x=5;
cout<<x<<endl;
x=1;
if(y<0)
if(y>0)x=4;
else x=5;
cout<<x<<endl;
}
(3)#include<iostream.h>
void main()
{ int a=2,b=7,c=5;
switch(a>0)
{ case 1:switch(b<0)
{ case 1:cout<<”@”;break;
case 2:cout<<”!”;break;
}
case 0:switch(c= =5)
{ case 0:cout<<”*”;break;
case 1:cout<<”#”;break;
default:cout<<”#”;break;
}
default:cout<<”&”;
}
}
(4)#include<iostream.h>
void main()
{ int i=1,s=3;
do
{ s+=i++;
if(s%7= =0) continue;
else ++i;
} while(s<15);
cout<<i<<endl;
}
(5)#include<iostream.h>
void main()
{ int i;
for(i=4; i<=10; i++)
{ if(i%3= =0)
continue;
cout<<i;
}
}
(6)#include<iostream.h>
void main()
{ int i, x;
for(i=1; i<100; i++)
{ x=i;
if(++x%2= =0)
if(++x%3= =0)
if(++x%7= =0)
cout<<x;
}
}
(7)#include<iostream.h>
void main()
{ int k,j,m;
for(k=5; k>=1; k- -)
{ m=0;
for(j=k; j<=5; j++)
m=m+k*j;
}
cout<<m<<endl;
}
(8)设输入为4时,程序的输出结果
#include<iostream.h>
void main()
{int i,j,n;
long sum,term;
cin>>n;
for(sum=0、i=1;i<=n;++i)
{ term=1; j=1;
do
tenn *=i;
while(++j<=i);
sum+=term;
}
cout<<"sum"<<sum;
}
(9)#include<iostream.h>
void main()
{ int a, s, n, count;
a=2;s=0;n=1;cout=1;
while(count<=7)
{ n=n*a;
s=s+n;
++count;
}
cout<<”s=”<<s;
}
(10)#include<iostream.h>
void main()
{ int x, y;
x= y= 0;
do
{ y++; x*=x;
while((x>0)&&(y>5));
cout<<”y=”<<y<<”x=”<<x;
}
5.编写程序
(1)将用户输入的24小时制时间转化为12小时制
(2)判断输入的正整数是否既是5又是7的整倍数。若是输出yes,否则输出no。
(3)求出1000以内的所有完全数(一个数如果等于它的因子之和(除自身外),则称该数为完全数,例:6=1+2+3,6为完全数)。
(4)用户从键盘输入一个正整数,将它的各位数字前后颠倒一下,并输出颠倒后的结果。
(5)求s=1+(1+2)+(1+2+3)+…….+(1+2+3+……+n)的值。
(6)编程输出十位数字与个位数字的和能被7整除,百位数字与十位数字的和能被3整除的所有3位数。
(7)计算公式的值。
(8)打印大小可以变化的菱形图案(下面菱形的大小是9
*
* * *
* * * * *
* * * * * * *
* * * * * * * * *
* * * * * * *
* * * * *
* * *
*