第3章 基本控制结构
习题3
选择题
1.下列选项中属于C++语句的是____。
A);
B)a=17
C)i+5
D)cout<<'\n'
2.下列声明语句中没有起到定义作用的是____。
A)int count;
B)const double pi=3.14159;
C)in max(int a,int b){ return a>b ? a : b; }
D)extern long index;
3.下面程序的输出结果是____。
#include<iostream>
using namespace std;
int main()
{
int a=2,b=-1,c=2;
if(a<b)
if(b<0) c=0;
else c+=1;
cout<<c<<endl;
}
A)0
B)1
C)2
D)3
4.下列for
语句的循环次数为____。
for(int i=0,x=0;!x&&i<=5;++i);
A)
5
5
5次
B)
6
6
6次
C)
7
7
7次
D)无穷次
5.下列语句段将输出字符'*'
的个数为____。
int i=100;
while(1)
{
i--;
if(i==0) break;
cout<<'*';
}
A)
98
98
98个
B)
99
99
99个
C)
100
100
100个
D)
101
101
101个
6.下面程序的输出结果是____。
#include<iostream>
using namespace std;
int main()
{
int s;
for(int k=2;k<6;k+=2)
{
s=1;
for(int j=k;j<6;++j) s+=j;
}
cout<<s<<endl;
return 0;
}
A)9
B)1
C)11
D)10
7.下面程序的输出结果是____。
#include<iostream>
using namespace std;
int main()
{
int n=10;
while(n>7)
{
n--;
cout<<n<<',';
}
cout<<endl;
return 0;
}
A)10,9,8,
B)9,8,7,
C)10,9,8,7,
D)9,8,7,6,
8.下列关于do...while
语句的叙述中,正确的是____。
A)do...while
语句所构成的循环不能用其他语句构成的循环来代替
B)do...while
语句所构成的循环只能用break
语句跳出
C)do...while
语句所构成的循环只有在while
后面的表达式非零时才结束
D)do...while
语句所构成的循环只有在while
后面的表达式为零时才结束
9.下面程序的输出结果是____。
#include<iostream>
using namespace std;
int main()
{
int x;
for(int i=1;i<=100;++i)
{
x=i;
if(++x%2==0)
if(++x%3==0)
if(++x%7==0)
cout<<x<<',';
}
cout<<endl;
return 0;
}
A)39,81,
B)42,84,
C)26,68,
D)28,70,
10.下列关于break
语句的叙述中,不正确的是____。
A)break
语句可用在循环体中,它将使执行流程跳出本层循环体
B)break
语句可用在switch
语句中,它将使执行流程跳出当前switch
语句
C)break
语句可用在if
语句中,它将使执行流程跳出当前if
语句
D)break
语句在一层循环体中可以出现多次
填空题
1.C++语言中用于控制程序执行流程的三种基本结构是 ____ 、 ____ 、 ____ 。
2.下面语句段的输出结果是____。
int x=0,y=2,z=3;
switch(x)
{
case 0: switch(y)
{
case 1: cout<<'*'; break;
case 2: cout<<'%'; break;
}
case 1: switch(z)
{
case 1: cout<<'$'; break;
case 2: cout<<'*'; break;
default: cout<<'#';
}
}
3.下面语句段的输出结果是____。
int k=1,n=10,m=1;
while(k<=n)
{
m*=2;
n--;
}
cout<<m<<endl;
4.当执行完下面语句段后,i
的值是 ____ 、j
的值是 ____ 、k
的值是 ____。
int a=10,b,c,d,i,j,k;
b=c=d=5;
i=j=k=0;
for(;a>b;++b) i++;
while(a>++c) j++;
do { k++; } while(a>d++);
5.将下面的语句断(a)补充完整,使其和语句段(b)在功能上完全等价:
(a)
double s=0.0;
________;
int k=0;
do
{
s+=d;
________;
d=1.0/(k*(k+1));
}while(________);
(b)
double s=1.0;
for(int k=1;k<=10;++k) s+=1.0(k*(k+1));
编程题
1.编写程序,实现输入一个整数,判断其能否被
3
,
5
,
7
3,5,7
3,5,7整除,并输出以下信息之一:
(a)能同时被
3
,
5
,
7
3,5,7
3,5,7整除;
(b)能被其中两个数(要输出是哪两个数)整除;
(c)不能被
3
,
5
,
7
3,5,7
3,5,7中的任一个数整除。
2.编写程序,要求由用户输入任意三个实数,然后求出其中的最大值和最小值。
3.编写摄氏温度与华氏温度的换算程序。要求用户输入温度数值并指明该数值表示摄氏温度(C)还是华氏温度(F),程序将根据不同的输入(摄氏或华氏)进行不同的换算。例如,用户输入40.2C
,程序输出104.36F
,或用户输入104.36F
,程序输出40.2C
。
已知,换算公式为:摄氏温度
=
5
9
(
=\frac{5}{9}(
=95(华氏温度
−
32
)
-32)
−32)。
4.编写程序,求 1 − 3 + 5 − 7 + ⋯ − 99 + 101 1-3+5-7+\cdots-99+101 1−3+5−7+⋯−99+101的值
5.编写程序,根据公式
e
=
1
+
1
1
!
+
1
2
!
+
1
3
!
+
1
4
!
+
⋯
e=1+\frac{1}{1!}+\frac{1}{2!}+\frac{1}{3!}+\frac{1}{4!}+\cdots
e=1+1!1+2!1+3!1+4!1+⋯计算
e
e
e的值。要求:
(a)使用for
循环,计算到公式的前
50
50
50项。
(b)使用while
循环,直到公式最后一项的值小于
1
0
−
4
10^{-4}
10−4为止。
6.编写程序,输出从公元
1600
1600
1600年到公元
2000
2000
2000年中所有闰年的年份。要求每行输出
5
5
5个年份。判断公元年份是否为闰年的条件是:
(a)年份如能被
4
4
4整除,而不能被
100
100
100整除,则为闰年。
(b)年份如能被
400
400
400整除也是闰年。
7.编写程序,求“水仙花数”。所谓“水仙花数”是指一个三位数,其各位数字的立方和等于该数本身。例如, 153 153 153是水仙花数,因为 1 3 + 5 3 + 3 3 = 153 1^3+5^3+3^3=153 13+53+33=153。
8.编写程序,求 1000 1000 1000之内的所有“完全数”。所谓“完全数”是指一个数恰好等于其因子之和。例如, 6 6 6是完全数,因为 1 + 2 + 3 = 6 1+2+3=6 1+2+3=6。
9.使用迭代法变成求
x
=
a
x=\sqrt a
x=a。求平方根的迭代公式为:
x
n
+
1
=
1
2
(
x
n
+
a
x
n
)
x_{n+1}=\frac{1}{2}(x_n+\frac{a}{x_n})
xn+1=21(xn+xna)
10.编写程序,使用循环语句打印如下图案:
*
***
*****
*******
*****
***
*
习题参考答案
选择题
1.A
2.D
3.C
4.B
5.B
6.D
7.B
8.D
9.D
10.C
填空题
1.顺序结构、选择结构、循环结构
2.%#
3.1024
4.5
、4
、6
5.
double d=1.0
++k
k<=10
编程题
1.完整代码如下:
#include<iostream>
using namespace std;
int main(){
bool f3=0,f5=0,f7=0;
int x; scanf("%d",&x);
if(x%3==0) f3=1;
if(x%5==0) f5=1;
if(x%7==0) f7=1;
if(f3&&f5&&f7)
printf("%d能同时被3,5,7整除\n",x);
else if(!f3&&!f5&&!f7)
printf("%d不能被3,5,7中的任一个数整除\n",x);
else {
if(f3&&f5) printf("%d能被其中两个数(3,5)整除\n",x);
if(f3&&f7) printf("%d能被其中两个数(3,7)整除\n",x);
if(f5&&f7) printf("%d能被其中两个数(5,7)整除\n",x);
}
return 0;
}
2.完整代码如下:
#include<iostream>
using namespace std;
int main(){
double x,y,z;
scanf("%lf %lf %lf",&x,&y,&z);
printf("%lf\n",max(x,max(y,z)));
printf("%lf\n",min(x,min(y,z)));
return 0;
}
3.完整代码如下:
#include<iostream>
using namespace std;
int main(){
double x; char ch;
scanf("%lf%c",&x,&ch);
if(ch=='C')
cout<<9.0*x/5.0+32<<'F'<<endl;
if(ch=='F')
cout<<5.0/9.0*(x-32)<<'C'<<endl;
return 0;
}
4.完整代码如下:
#include<iostream>
using namespace std;
int main(){
int f=1,ans=0;
for(int i=1;i<=101;i+=2){
ans+=i*f;
f*=-1;
}
printf("%d",ans);
return 0;
}
5.完整代码如下:
(a)
#include<iostream>
using namespace std;
int main(){
double e=1,res=1;
for(int i=1;i<=50;++i){
res*=i;
e+=1.0/res;
}
cout<<e;
return 0;
}
(b)
#include<iostream>
using namespace std;
int main(){
double e=1,x=1;
int cnt=1;
while((1.0/x)>=0.0001){
e+=1.0/x;
x*=++cnt;
}
cout<<e;
return 0;
}
6.完整代码如下:
#include<iostream>
using namespace std;
int main(){
int cnt=0;
for(int i=1600;i<=2000;++i)
if((i%4==0 && i%100!=0) || (i%400==0)){
printf("%d ",i);
if(++cnt==5){ cnt=0; puts(""); }
}
return 0;
}
7.完整代码如下:
#include<iostream>
using namespace std;
int main(){
for(int i=1;i<=9;++i)
for(int j=0;j<=9;++j)
for(int k=0;k<=9;++k)
if(i*i*i+j*j*j+k*k*k == i*100+j*10+k)
printf("%d\n",i*100+j*10+k);
return 0;
}
8.完整代码如下:
#include<iostream>
using namespace std;
int main(){
for(int i=1;i<=1000;++i){
int res=0;
for(int j=1;j<i;++j)
if(i%j==0) res+=j;
if(res==i) printf("%d\n",i);
}
return 0;
}
9.前后两次求出的x
的差的绝对值小于
1
0
−
5
10^{-5}
10−5,完整代码如下:
#include<iostream>
#include<cmath>
using namespace std;
int main(){
double a,xnow,xpre=0;
scanf("%lf",&a);
xnow=a/2.0;
while(fabs(xnow-xpre)>=0.00001){
xpre=xnow;
xnow=1.0/2.0*(xnow+a/xnow);
}
cout<<xnow;
return 0;
}
10.完整代码如下:
#include<iostream>
using namespace std;
int main(){
for(int i=1;i<=4;++i){
for(int j=4-i;j;--j) printf(" ");
for(int j=1;j<=i*2-1;++j) printf("*");
puts("");
}
for(int i=1;i<=3;++i){
for(int j=1;j<=i;++j) printf(" ");
for(int j=1;j<=(4-i)*2-1;++j) printf("*");
puts("");
}
return 0;
}