C++基础知识——练习三(含答案解析)

一、选择题

1.已知a=4,b=6,c=8,d=9,则“(a++,b>a++&&c>d)?++d:a<b” 值为( D)。

A.9         B.6         C.8         D.0

解析:考察的三元表达式和运算符的运算规则。条件 ? 表达式1 : 表达式2 (条件成立,返回表达式1的值,否则返回表达式2的值)a++表示a=a+1,b>a++表示判断b是否b>a,然后再a+1,&&条件与符号,前面也提过当&&左边的表达式为假的情况,右边表达式不执行。

&&左边表达式a++,b>a,a++最后结果是假,也就是0。返回:后面的a<b的值,此时b=6,a=6,a<b不成立,即这个表达式结果为0。所以,选D

2.下列字符串中不能作为C++标识符使用的是( D )。

A、WHILE         B、user         C、_lvar         D、9stars

 解析:C++标识符特点:

1. 只能由字母、数字和下划线组成。
2. 第一个字符必须是字母或下划线。
3.
区分大小写。
4. 不能使用C++的关键字作为标识符。
5. 标识符的长度没有限制,但建议不要超过255个字符。
6. 可以使用驼峰命名法(Camel Case)或下划线命名法(Underscore Case)。

3.执行语句序列

int n;

cin >> n;

switch(n)

{case 1:

case 2: cout << "1";

case 3:

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

default: cout << "3";

}

时,若键盘输入1,则屏幕显示(    B   )

A、1         B、12         C、3         D、123

 解析:本题目考察对case穿透现象的掌握。case穿透:在switch语句中,如果case控制的语句体后面不写break,将出现穿透现象,在不判断下一个case值的情况下,向下运行,直到遇到break,或者整体switch语句结束。

可以利用case穿透现象完成:键盘录入星期数,输出工作日和休息日。 1-5为工作日,6-7为休息日

4.若二维数组a有m列,则在a[i][j]之前的元素个数为(  D )。

A、j*m+i         B、i*m+j         C、i*m+j-1         D、 i*m+j+1

 解析:a有m列,a[i][j]之前就有i行,m列的元素,一共是i*m,再加上a[i][j]所在那一行的j+1个元素,所以i*m+j+1个元素。

5.下面正确的字符常量是( C  )。

A.“C”         B.‘\\’’         C.‘W’         D.‘’

 解析:字符常量与字符串常量

1、字符常量是单引号引起的一个字符;字符串常量是双引号引起的若干个字符;

2、占内存不同:字符常量只占一个字节;字符串常量占若干个字节,(至少一个字符结束标志)

6.已知:int m=10; 在下列定义引用的语句中,正确的是( A  )。

A、int &x=m;         B、int y=&m;         C、int &z;         D、int &t=&m;

 解析:&放在=后面表示取地址,放在前面表示引用。

7.语句的int *p=&k定义于指针P,于这个语句等效的语句序列是(  A  ).

A、int *p; p=&k;                 B、int*p; p=k;

C、int*p; *p=&k;           D、int*p;*p=k;

解析:此题考查的是指针的赋值。题目中的语句int *p=&k; 定义了一个int类型的指针p,并将变量k的地址&k赋给指针p。所以等效语句是:int*p;p=&k;

8.设有:int a=1,b=2,c=3,d=4,m=2,n=2;执行(m=a>b)&&(n=c<d)后n的值为(B)。

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

 解析:考察&&条件与的应用,因为是&&运算,所以先看前段m=a>b,=的优先级小于>,a>b不成立,m=0(表明左边的式子整体的值就是0,并非判断m==0);在&&运算中,如果出现一边为假的情况下,结果直接为假,后面的语句不会去运算了。所以,n的值不变。

int a=1,b=2,c=3,d=4,m=0,n=2;
	cout<<(m=a<b);

测试来一下,修改m的值,和小于符号,修改后的这段程序输出:1

9.在类声明中,紧跟在“public:”后声明的成员的访问权限是(  B  ).

A、私有         B、公有         C、保护         D、默认

 解析:公有成员 (public member)        私有成员 (private member)         

protected(保护)        default(默认)

10.用C++的语言表达式表示 |x^3+log10x|的正确是(   C  )。

A.fabs(x*3+log10(x))                            B.abs(pow(x,3)+log10(x))

C.fabs(pow(x,3.0)+log10(x))         D.abs(pow(x,3.0)+log10(x))

 解析:查看数学函数,加入头文件#include<cmath>,可以使用pow()函数,pow(10,x),即代表10的x次方,对数函数,格式是log底数(x),如果没设底数,及只有log,那就是以e为底。函数fabs的作用是求浮点数x的绝对值;函数abs的作用是求x的绝对值。fabs函数原型:double fabs(double x);abs函数原型:int fabs(int x)。fabs函数参数:参数x是一个浮点数;abs函数参数:参数x是一个整数。

11.以下不正确的是(   C  )。

A.语句for(i=0;;i++)表示无限循环         B.for(;;)表示无限循环

C.for()也表示无限循环                               D.while(1)表示无限循环

  解析:

1.for语句的表达式1可以为空,表达式1可以放在循环语句外初始化.

int i=0;
for( ;i<100;i++)
{
cout<<i<<endl;
}

2.for语句的表达式3可以为空,表达式3可以放在循环语句块中

int i;
for(i=0;i<100;)
{
cout<<i<<endl;
i++;
}

3.for语句的表达式2可以为空,像while循环一样,需要用到break语句退出循环

int i;
for(i=0; ;i++)
{
if(i>=100)
break;
cout<<i<<endl;
}

4.但是for(;;)格式不能错误。

 12.下列程序的功能是(  D  )。

#include <iostream>

using namespace std;

int 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个的字母

解析:

  1. 程序首先通过cin >> a;从标准输入读取一个字符并存储在变量a中。

  2. 然后程序进入一个for循环,该循环将执行10次(i从1递增到10)。

  3. 在循环内部,程序检查a是否是一个小写字母(即是否在'a''z'之间)。如果是小写字母,则将a减去i

  4. 接着,程序输出修改后的a

重要的是要注意,由于a在每次循环迭代中都被修改,并且没有重新从输入读取,因此后续的输出将是基于前一次修改后的a值。这导致a的值随着i的增加而逐渐减小,从而实现了将字母变成它前面i个字母的效果。

二、填空题

1、若有定义int m=5,y=2;则计算表达式y+=y-=m*=y后的y值是【-16】。

解析:计算优先级从右到左边:

因为初始m=5,y=2;

m*=y         //m=5*2=10, y=2
y-=m         //y=2-10=-8, m=10
y+=y         //y=-8+(-8)=-16, m=10

所以,y=-16,m=10


2、 若s是int型变量,且s=6,则表达式s%2+(s+1)%2的值为【1】。

解析:原表达式=6%2+(6+1)%2=0+1=1。%是取模运算,相当于是求x/y的余数


3、若有定义:char c=‘\010’;则变量c中包含的字符个数为【1】。

解析:char类型的变量只能存放一个字符; '\010'是某个字符的ASII码。


4、已知字母a的ASCII码为十进制数97,且设ch为字符型变量,则表达式ch=‘a’+‘8’-‘3’的值为【f】。

解析:a的ASCII码为十进制数97,8、3 的ASCII码,分别为十进制数 56、51。'a'+'8'-'3'等价于a+5,因为ch是字符型变量,所以ch的值为'a'+5='f'


4、有定义int a;则“a是偶数”的表达式是【a%2==0】 。

解析:a是偶数那对2取余则为零。

 三、程序填空题

1.下面程序的功能是用"辗转相除法"求两个正整数的最大公约数。请填空。

#include <iostream>

using namespace std;
int main()
{int r,m,n;
cin>>m>>n;
if(m<n)
【1】;
r=m%n;
while(r)
{m=n;n=r;【2】;   }
cout<<n<<endl;
}

答案:【   r=m;m=n;n=r  】【   r= m%n   】

解析:【1】处的if函数,将m n按照大小排序,大的数据放在m变量里,小的数据放在n变量里。【2】辗转相除法,即:两个数相除,若能除尽,则较小的那个数为最大公约数;若除不尽,则用余数替代掉较大的那个数,继续两个数相除、取余,直到能够除尽,此时较小的数即为最大公约数。

比如:现在要求这两个数 32,26的最大公约数,解法如下:

32/26=1...6  (此行除数26作下一行的被除数,余数作为除数)

26/6=4...2  (此行同理)

6/2=3...0  (此处余数为零,意味着最大公约数就是2)

反复把一个式子中的除数当作被除数去除余数,直到最后余数等于0。

最大公约数就是最后那个式子的除数,本例就是2。

2.输入10个数,使用选择排序,按升序排序。
#include <iostream>
using namespace std;
int main()
{
int a[10];
int i,j,t,k;
cout<<“Input 10 number:”<<endl;
for(i=0;i<10;i++)
【  1 】
for(j=0;j<9;j++) //共进行九轮比较
{
k=j;
for(i=j+1;i<10;i++) //每轮中找出最小值下标
if(a[i]<a[k]);
t=a[j];
【 2 】 //每轮中的最小值与a[j]交换
a[k]=t;
}
cout<<“the sorted numbers:”<<endl;
for(i=0; 【  3 】;i++)
cout<<a[i]<<" ";
cout<<endl;
return 0;
}

答案:【 cin>>a[i]; 】【 a[j]=a[k];】【 i<10 】

解析:【1】处用户输入10个数,在for循环里,cin>>a[i];【2】处借助临时变量t交换a[i]和a[k]的值;【3】用for循环输出排好序的10个数。

四、阅读程序写结果

1.#include <iostream>
using namespace std;
int main()
{
int i=1;
do{
i++;
cout<<++i<<” ”;
if(i==7) break;
}while(i==3);
}

请写出输出结果。
关键字:循环结构
答案:3 5

解析:do{……}while语句先执行命令,在判断i==3,每次循环打印i+2后的值,i初始值等于1,一次循环后,打印3;判断while(i==3)成立,执行第二次循环后,打印5;判断while(i==3)不成立,结束循环。

 2.#include <iostream>
using namespace std;
void main()
{
int i,n,d[10]={1,2,3,4,5,6,7,8,9,10};
i=n=1;
while(i<10)
{
if(n==1)
i+=4;
else
i-=2;
if(i<10)
cout<<d[i]<<" ";
n=1-n;
}
}
请写出输出结果。
关键字:数组与指针
答案:6 4 8 6 10 8

解析:while循环,带入变量的值,进行计算即可。

第一次循环 i=1 n=1--------i=i+4=5, 打印d[i]=d[5]=6, n=1-n=1-1=0;

第二次循环 i=5 n=0--------i=i-2=3, 打印d[i]=d[3]=4, n=1-n=1-0=1;

第三次循环 i=3 n=1--------i=i+4=7, 打印d[i]=d[7]=8, n=1-n=1-1=0;

第四次循环 i=7 n=0--------i=i-2=5, 打印d[i]=d[5]=6, n=1-n=1-0=1;

第五次循环 i=5 n=1--------i=i+4=9, 打印d[i]=d[9]=10, n=1-n=1-1=0;

第六次循环 i=9 n=0--------i=i-2=7, 打印d[i]=d[7]=8, n=1-n=1-0=1;

第七次循环 i=7 n=1--------i=i+4=11,此时i<10不成立,不打印;

i=11,i<10不成立,循环到此结束。

3.#include <iostream>
using namespace std;
int sum(int n)
{int c=0;
do{ c+=n%10; n/=10; } while(n);
return c;
}
int main()
{
cout<<sum(1234)<<‘\t’<<sum(4567)<<endl;
}
请写出输出结果。
关键字:函数
答案:10 22

解析:do{……}while循环语句,带入变量的值进入计算即可。注意:先执行在判断条件

sum(1234)

第一次循环:n=1234,c=0------------c+=n%10,c=c+n%10=4, n/=10, n=n/10=123;while(n)为真

第二次循环:n=123,c=4------------c+=n%10,c=c+n%10=7, n/=10, n=n/10=12;while(n)为真

第三次循环:n=12,c=7------------c+=n%10,c=c+n%10=9, n/=10, n=n/10=1;while(n)为真

第四次循环:n=1,c=9------------c+=n%10,c=c+n%10=10, n/=10, n=n/10=0;while(n)为假

return c,c=10;

其实通过上面的循环,已经发现,sum()函数的功能就是求数位上数字之和,所以sum(4567) =22      输出结果10 22  (’\t'是转义字符空格)

4.#include <iostream>
using namespace std;
void main()
{
int x,y,z;
x=2/47;
y=2/47.0;
z=int(2/4.0*7);
cout<<“x=”<<x<<" y=“<<y<<” z="<<z<<endl;
}
请写出输出结果。

答案:x=0 y=0 z=3

解析:

1.x = 2/47;

这里 2 和 47 都是整数,执行整数除法,结果是 0,所以 x 的值为 0

2.y = 2/47.0; 

这里,尽管 2/47.0 的计算结果是浮点数 0.0425531914893617(或类似的近似值),但由于 y 是 int 类型,这个浮点数会被转换为整数。在C++中,将浮点数转换为整数会丢弃小数部分,因此 y 的值将会是 0

3.z = int(2/4.0*7);

首先,2/4.0 的结果是浮点数 0.5。然后乘以 7 得到 3.5。最后,int() 函数将浮点数 3.5 转换为整数,结果是 3。因此,z 的值为 3

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值