1. 已知int i=0, x=1, y=0;,在下列选项中,使i的值变成1的语句是( )。 A.if( x&&y ) i++; B.if( x==y ) i++; C.if( x||y ) i++; D.if( !x ) i++; 答题: A. B. C. D. (已提交) -->参考答案:C 问题解析: |
2. 假设i=2,执行下列语句后 i 的值为( )。 switch( i ) { case 1 : i ++; case 2 : i --; case 3 : ++ i; break; case 4 : -- i; default : i ++; } A.1 B.2 C.3 D.4 答题: A. B. C. D. (已提交) -->参考答案:B 问题解析: |
3. 已知int i=0,x=0; ,在下面while语句执行时循环次数为( )。 while( !x && i< 3 ) { x++; i++; } A.1 B.2 C.3 D.4 答题: A. B. C. D. (已提交) -->参考答案:A 问题解析: |
4. 已知int i=3; ,在下面do_while 语句执行时的循环次数为( )。 do{ i--; cout<<i<<endl;}while (i!= 1); A.1 B.2 C.3 D.4 答题: A. B. C. D. (已提交) -->参考答案:B 问题解析: |
5. 答题: A. B. C. D. (已提交) -->参考答案:B 问题解析: |
6. 以下程序段形成死循环的是( )。 A.int x; for( 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 ); 答题: A. B. C. D. (已提交) -->参考答案:B 问题解析: |
7. 以下程序段形成死循环的是( )。 A.int x; for( 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 -- ); 答题: A. B. C. D. (已提交) -->参考答案:B 问题解析: |
8. 已知int x=3; ,则下面这段程序的执行结果是( )。 do cout<<(x-=2); while(!(-x)); A.0 B.1 C.30 D.无限循环 答题: A. B. C. D. (已提交) -->参考答案:B 问题解析: |
9. 在while(!a)中,!a与( )等价。 A.a==0 B.a==1 C.a!=1 D.a!=0 答题: A. B. C. D. (已提交) -->参考答案:A 问题解析: |
10. 下面这段程序的执行后,变量i的值为( )。 int i = 10; switch(i) { case 9: i+=1; case 10: i+=1; case 11: i+=1; default: i+=1; } A.10 B.11 C.12 D.13 答题: A. B. C. D. (已提交) -->参考答案:D 问题解析: |
11. 对下面这三条语句,正确的说法是( )。 (1)if(a)s1;else s2; (2)if(a==0)s2;else s1; (3)if(a!=0)s1;else s2; A.三者互相等价 B.三者互不不等价 C.只有(2)和(3)等价 D.以上说法均不对 答题: A. B. C. D. (已提交) -->参考答案:A 问题解析: |
12. 对if语句中的表达式类型,下面正确的说法是( )。 A.必须是关系表达式 B.必须是关系表达式或逻辑表达式 C.必须是关系表达式或算数表达式 D.以上说法均不对 答题: A. B. C. D. (已提交) -->参考答案:D 问题解析: |
13. while和do-while循环的主要区别是( )。 A.do-while的循环体至少执行一次。 B.while的循环控制条件比do-while严格。 C.do-while允许从外部转入循环体内。 D.do-while的循环体不能是复合语句。 答题: A. B. C. D. (已提交) -->参考答案:A 问题解析: |
14. 下面哪个不是C++的循环语句( )。 A.switch B.while C.do-while D.for 答题: A. B. C. D. (已提交) -->参考答案:A 问题解析: |
15. 下面代码中循环体的执行次数为( )。 int a=5, b=1; while(a-b) {a--;b++;} A.1 B.2 C.3 D.4 答题: A. B. C. D. (已提交) -->参考答案:B 问题解析: |
16. 下面代码执行之后,变量sum的值为( )。 int i=5, sum=0; while(i--) {sum+=i%2;} A.1 B.2 C.3 D.4 答题: A. B. C. D. (已提交) -->参考答案:B 问题解析: |
17. 下面代码的输出结果为( )。 for(int i=1;i<=10;i++) if(!(i%3)) cout<<i<<” ”; A.1 2 3 B.1 2 4 5 C.3 6 9 D. 4 5 6 答题: A. B. C. D. (已提交) -->参考答案:C 问题解析: |
18. 下面代码的输出结果为( )。 char ch= ‘A’; switch(ch) { case ‘A’: ch++; case ‘B’: ch++; case ‘C’: ch++; } cout<<ch<<endl; A.A B.B C.C D. D 答题: A. B. C. D. (已提交) -->参考答案:D 问题解析: |
19. 与 for(表达式1; 表达式2; 表达式3){循环体} 功能相同的语句为( )。 A.表达式1; while(表达式2){循环体; 表达式3;} B.表达式1; while(表达式2){表达式3; 循环体;} C.表达式1; do{循环体; 表达式3;} while(表达式2); D.表达式1; do{表达式3; 循环体;} while(表达式2); 答题: A. B. C. D. (已提交) -->参考答案:A 问题解析: |
20. 下列语句中( )是死循环。 A.int k=10; while(k=3) k=k-1; B.int k=10; while(k!=3) k=k-1; C.int k=10; while(k>3) k=k-1; D.int k=10; while(k<3) k=k-1; 答题: A. B. C. D. (已提交) -->参考答案:A 问题解析: |
思考题
1. C++中有什么形式的选择控制语句?归纳它们语法形式、应用场合。根据一个实际问题使用不同的条件语句编程。
【解答】
语句 | 使用方式 | 使用场合 |
---|---|---|
if语句 | if(表达式)语句1; else 语句2; | 需要对给定的条件进行判断,并根据判断的结果选择不同的操作。 适用于复杂的条件表达式判断。 |
switch 语句 | switch(表达式) { case 常量表达式1: 语句1; case 常量表达式2: 语句2; …… case 常量表达式n; 语句n; [default : 语句n+1;] } | 根据整型表达式的不同值决定程序分支的情况。 适用于判断表达式简单,需要多个分支处理的情况。 |
演示程序:
程序(1)
//此程序用if输出等级对应的分数段
//A->=90,B-(90,80],C-(80,70] ,D-(70,60],,E-<60
#include<iostream>
using namespace std;
int main()
{ char gd;
cout<<"Enter the grade:";
cin>>gd;
//直到输入有效等级,否则程序不继续运行
while(!((gd>='A' && gd<='E')||(gd>='a' && gd<='e')))
{ cout<<"Invalid grade! Please retry:";
cin>>gd;
}
if(gd=='A'||gd=='a') cout<<"\nScored 90-100!\n";
else if(gd=='B'||gd=='b') cout<<"\nScored 80-89!\n";
else if(gd=='C'||gd=='c') cout<<"\nScored 70-79!\n";
else if(gd=='D'||gd=='d') cout<<"\nScored 60-69!\n";
else if(gd=='E'||gd=='e') cout<<"\nScore under 60!\n";
else cout<<"Unexpect error!\n"; //防止意外错误
}
程序(2)
//此程序用switch输出等级对应的分数段
//A->=90,B-(90,80],C-(80,70] ,D-(70,60],,E-<60
#include<iostream>
using namespace std;
int main()
{ char gd;
cout<<"Enter the grade:";
cin>>gd;
//直到输入有效等级,否则程序不继续运行
while(!((gd>='A' && gd<='E')||(gd>='a' && gd<='e')))
{ cout<<"Invalid grade! Please retry:";
cin>>gd;
}
switch(gd)
{ case 'A':
case 'a': cout<<"\nScored 90-100!\n";break;
case 'B':
case 'b': cout<<"\nScored 80-89!\n";break;
case 'C':
case 'c':cout<<"\nScored 70-79!\n";break;
case 'D':
case 'd':cout<<"\nScored 60-69!\n";break;
case 'E':
case 'e':cout<<"\nScore under 60!\n";break;
default:cout<<"Unexpect error!\n";//防止意外错误
}
}
2. 什么叫循环控制?归纳比较C++中各种循环控制语句的语法、循环条件和循环结束条件的表示形式及执行流程。
【解答】
循环控制是在特定的条件下,程序重复执行一些特定动作。
语句 | 语法 | 执行流程 | 使用场合 |
---|---|---|---|
while语句 | while(表达式) 循环体; 循环条件:表达式值为非0(真) 循环结束条件:表达式值为0(假) | 程序中常用于根据条件执行操作而不需关心循环次数的情况。 先判断形式循环,条件不成立时不进入循环体。 | |
do-while语句 | do 循环体 while(表达式); 循环条件:表达式值为非0(真) 循环结束条件:表达式值为0(假) | 程序中常用于根据条件执行操作而不需关心循环次数。 后判断形式循环,至少执行1次循环体。 一般情况,while语句和do while语句可以互换使用。 | |
for 语句 | for([表达式1];[表达式2];[表达式3]) 循环体; (1)表达式1称为初始化表达式,不是循环体执行部分。 (2)表达式3称为后置表达式,作为循环体的最后一个执行表达式。(3)循环条件:表达式2值为非0(真) 循环结束条件:表达式2值为0(假) | for语句称为步长循环语句,通常用于确定循环次数的情况。 由于语句的3个表达式均可以缺省,也可以用于条件循环,即循环次数不确定的情况。 |
3. 根据一个实际问题,用不同的循环语句编程,分析其优缺点。
【解答】
略。
4. 用if语句和goto语句组织循环,改写思考题的第3小题编写的程序。分析在什么情况下可以适当使用goto语句。
【解答】
在不破坏程序基本流程控制的情况下,可以适当使用goto语句实现从语句结构内部向外的必要跳转,即按特定条件结束结构语句块的执行。
程序略。
5.有以下程序
#include<iostream>
using namespace std;
int main()
{ char c;
cin>>c;
if(c=='y'||c=='Y')
int a=1;
else
int a=0;
cout<<"a="<<a<<endl;
}
编译错误为:error C2065: 'a' : undeclared identifier,指示语句行
cout<<"a="<<a<<endl;
变量a没有定义。请分析原因,并做出修改。
【解答】
程序在if和else分支中分别声明了各自的局部变量a,而执行输出语句时,声明的变量a作用域已经结束,所以编译器认为输出语句的a没有定义。正确的程序是:
#include<iostream>
using namespace std;
int main()
{ char c;
int a;
cin>>c;
if(c=='y'||c=='Y')
a=1;
else
a=0;
cout<<"a="<<a<<endl;
}
6. 有以下程序,希望判断两个输入的整数是否相等。程序通过编译,但不能达到预期结果。请分析程序能够通过C++编译而不能得到期望结果的原因。
#include<iostream>
using namespace std;
int main()
{
int a,b;
cout<<"a: "; cin>>a;
cout<<"b: "; cin>>b;
if( a=b )
cout<<a<<"等于"<<b<<endl;
else
cout<<a<<"不等于"<<b<<endl;
}
程序运行后,输入a的值为4,b的值为9,显示结果如下:
a: 4
b: 9
9等于9
【解答】
在if语句的判断表达式(a=b)中,赋值号“=”应该是逻辑等“==”。从语法上,C++的if语句把a=b这个赋值表达式视为逻辑表达式,没有编译错误。a=b的值决定于b。若b的输入值不等于0,if作为逻辑真(true),否则作为逻辑假(false)。所以,题目中输入b的值虽然不等于a,但表达式a=b为逻辑true,执行了if语句的第1个分支。
程序设计
1.输入某学生成绩,若成绩在85分以上输出“very good”,若成绩在60分到85分之间输出“good”,若成绩低于60分输出“no good”。
【解答】
#include<iostream>
using namespace std;
int main()
{
double score;
cout << "please input score:";
cin >> score
if ( score>=85 ) cout << "Very good!" ;
else if ( score>=60 ) cout << "Good!";
else cout << "No good!";
}
2.输入三个整数,按从小到大的顺序输出它们的值。
【解答】
#include<iostream>
using namespace std;
int main()
{
int a, b, c, t;
cout << "a, b, c=";
cin >> a >> b >> c;
if(a>b) { t=a; a=b; b=t; }
if(a>c) { t=a; a=c; c=t; }
if(b>c) { t=b; b=c; c=t; }
cout<< a << '\t'<< b << '\t' << c << endl;
}
3.编程序模拟剪刀、石头和纸游戏。游戏规则为:剪刀剪纸,石头砸剪刀,纸包石头。玩游戏者从键盘上输入s(表示剪刀)或r(表示石头)或p(表示纸),要求两个游戏者交替输入,计算机给出输赢的信息。
【解答】
#include<iostream>
using namespace std;
int main()
{
char first,second;
cout << "First input( s,r or p ):";
cin >> first;
cout << "Second input( s,r or p ):";
cin >> second;
switch ( first )
{
case 's':
switch ( second )
{
case 's': cout << "Scissor ties scissor." << endl; goto end;
case 'r': cout << "Scissor is crushed by rock." << endl; goto end;
case 'p': cout << "Scissor cuts paper." << endl; goto end;
default : cout << "second input error!" << endl ; goto end;
}
case 'r':
switch ( second )
{
case 's': cout << "Rock crushes scissor." << endl; goto end;
case 'r': cout << "Rock ties rock." << endl; goto end;
case 'p': cout << "Rock is wrapped by paper." << endl; goto end;
default : cout << "second input error!" << endl; goto end;
}
case 'p':
switch ( second )
{
case 's': cout << "Paper is cut by scissor." << endl; goto end;
case 'r': cout << "Paper wraps the rock." << endl; goto end;
case 'p': cout << "Paper ties paper." << endl; goto end;
default : cout << "second input error!" << endl; goto end;
}
default : cout << "First input error!" << endl; goto end;
}
end: ;
}
4. 输入一个整数,输出该整数的所有素数因子。例如,输入120,输出为2、2、2、3和5。
【解答】
#include<iostream>
using namespace std;
int main()
{
int m,i = 2;
cout << "please input m:";
cin >> m;
while( i<=m )
if( m % i == 0 )
{ cout << i << ",";
m = m / i;
}
else i++;
}
5. 使用迭代公式xn+1=(xn+a/xn)/2(n=0,1,2,……,x0=a/2)编程序求某一正整数a的平方根。
【解答】
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
const double eps = 1e-8;
double a,x0,x;
cout << "please input a:";
cin >> a;
x0 = a / 2;
x = ( x0 + a/x0 )/2;
while( fabs( x-x0 )>eps )
{
x0 = x;
x =( x0 + a/x0 )/2;
}
cout << x << endl;
}
6. 求100到999中的水仙花数。所谓水仙花数是指一个三位数,它的每位数字的立方之和等于该数。例如,因为153=13+53+33,所以153为水仙花数。
【解答】
#include<iostream>
using namespace std;
int main()
{
int i,a,b,c;
for( i=100; i<=999; i++ )
{
a = i/100;
b = ( i-a*100 ) / 10;
c = i - a*100 - b*10;
if ( i == a*a*a + b*b*b + c*c*c )
cout << i <<endl;
}
}
7. 编一程序显示由符号组成的三角形图案。例如,程序运行后,
屏幕显示: How many lines ?
用户输入: 5
屏幕显示: What character ?
用户输入: *
则输出如下图案。
*
* * *
* * * * *
* * * * * * *
* * * * * * * * *
【解答】
#include<iostream>
using namespace std;
int main()
{
int i,j,k,n;
char ch;
cout<<"How many lines ?\n";
cin>>n;
cout<<"What character ?\n";
cin>>ch;
for( i=1; i<=n; i++ )
{
for( k=1; k<=n-i; k++ ) cout << " ";
for( j=1; j<=2*i-1; j++ ) cout << ch ;
cout << endl; }
}
8. 已知XYZ+YZZ=532,其中X,Y和Z为数字,编一程序求出X,Y和Z的值。
【解答】
#include<iostream>
using namespace std;
int main()
{
int x,y,z,i;
for( x=1; x<=9; x++ )
for( y=1; y<=9; y++ )
for( z=0; z<=9; z++ )
{ i = 100*x + 10*y + z + 100*y + 10*z + z;
if ( i == 532 )
cout<<"x="<<x<<'\t'<<"y="<<y<<'\t'<<"z="<<z<<endl;
}
}
|