一、选择题
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个的字母
解析:
程序首先通过
cin >> a;
从标准输入读取一个字符并存储在变量a
中。然后程序进入一个
for
循环,该循环将执行10次(i
从1递增到10)。在循环内部,程序检查
a
是否是一个小写字母(即是否在'a'
和'z'
之间)。如果是小写字母,则将a
减去i
。接着,程序输出修改后的
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
。