易错题
错题集
1.若希望当A的值为奇数时,表达式的值为”真”,A的值为偶数时,表达式的值为”假”,则以下不能满足要求的表达式是( )。
A: A%21
B: !(A%20)
C: !(A%2)
D: A%2
标准答案:C 您的答案:D
解析:表示等价,两侧表达式相等返回1,不等返回0.就上题而言(A%2)与(A%21)返回值是相同的,而与(A%2==0)返回值相反.
2.逻辑运算符两侧运算对象的数据类型是( )。
A: 只能是0或1
B: 只能是0或非0正数
C: 只能是整型或字符型数据
D: 可以是任何类型的数据
标准答案:D 您的答案:A
解析:在C/C++中,逻辑运算符两侧运算对象的数据类型 可以是任意类型,原则为:非0即1 ”
3.设:int a=1,b=2,c=3,d=4,m=2,n=2;执行(m=a>b)&&(n=c>d)后n的值为( )
A: 1
B: 2
C: 3
D: 4
标准答案:B 您的答案:C
[解析] 本题考查逻辑与运算的运算规则。其规则是:当运算符前后两个条件表达式都满足时,其最终结果才为真。当发现第一个表达式的值为假,计算机将不再执行后面表达式的运算。
本题中;由于前一个表达式的值为“假”,所以,后面的表达式不再进行运算,因而n的值保持不变,仍为2。
4.以下不正确的if语句形式是( )。
A: if(x>y&&x!=y);
B: if(x==y) x+=y;
C: if(x!=y) scanf(“%d”,&x) else scanf(“%d”,&y)
D: if(x
标准答案:C 您的答案:D
解析:前面都还没有输入变量x和y,怎么就可以先比较了呢
5.int a=5,*p;p=&a;则p的值为5.
标准答案:N 您的答案:Y
解析:p代表的是地址, 而不是值
6.整数在存储时不会产生误差,实数在存储时也不会产生误差。
标准答案:N 您的答案:Y
7.如果strcmp(s1,s2)返回的结果为0,表示字符串s1和s2不相同。 ( )
标准答案:N 您的答案:Y
解析: strcmp函数是比较两个字符串大小,也就是求差值,如果相等,差值为0
8.指针可以赋值,给指针赋值时一定要类型相同,级别一致。
标准答案:Y 您的答案:N
9.“n是大于整数m的奇数”的C语言表达式是___________。
标准答案:
(n>m)&&(n%2==1)
您的答案:
int
n>m&&n%2!=0
10.有int x=3,y=-4,z=5;则表达式(x&&y)==(x||z)的值为___________。
标准答案:
1
您的答案:
0
解析:&&是且,||是或。x和y同时不为0时(x&&y)这个表达式的值为1,x和z至少一个不为0,(x||z)的值为1。综上1 == 1这个表达式的值为1
11.设x,i,j,k都是int变量,表达式x=(i=4,j=16,k=32)计算后,x的值为________。
标准答案:
32
您的答案:
0
解析:逗号表达式看最后一个
12 定义:double x=3.5,y=3.2;则表达式(int)x*0.5的值是_______,表达式y+=x++的值是_______。
标准答案:
1.5
6.7
您的答案:
1
7.7
13.在C语言,标识符分为三类:_____、和。
标准答案:
关键字
用户自定义标识符
预定义标识符
14.设有以下定义:
int a[4][3]={1,2,3,4,5,6,7,8,9,10,11,12};
int (*prt)[3]=a,*p=a[0];
则下列能够正确表达数组元素a[1][2]的表达式是( )。
A: *((*prt+1))
B: ((p+5))
C: (*prt+1)+2
D: ((a+1)+2)
标准答案:D 您的答案:C
15.若有说明:char language[]={“FORTRAN”,”BASIC”,”PASCAL”,”JAVA”,”C”};
则表达式language[1]>*language[3]比较的是______________。
A: 字符F和字符P
B: 字符串BASIC和字符串JAVA
C: 字符B和字符J
D: 字符串FORTRAN和字符串PASCAL
标准答案:C 您的答案:B
16.若int (*p)[5];,其中,p是_______。
A: 5个指向整型变量的指针
B: 指向5个整型变量的函数指针
C: 一个指向具有5个整型元素的一维数组的指针
D: 具有5个指针元素的一维指针数组,每个元素都只能指向整型量
标准答案:C 您的答案:D
17.下面不能正确进行字符串赋值操作的是( )。
A: char s[6]={“ABCDE”};
B: char s[5]={‘A’,'B’,'C’,'D’,'E’};
C: char *s;s=”ABCDE”;
D: char *s; scanf(“%s”,s);
标准答案:B 您的答案:A
答案解析
[命题目的] 考查了一维字符数组的定义和初始化。[解题要点] 选项A)和B)定义的数组空间太小,至少应该为6个字符的长度才可以。选项D)中的指针 s未赋初值,所以指向―个不确定的地址,因而不能用 scanf输入数据到这一指针所指向的地址中。[考点链接] 通过赋初值的方式给一维字符数组赋字符串。
18.下面程序段的运行结果是__________。
char *s=“abcde”;
s+=2; printf(“%s”,s);
A: cde
B: 字符’c’
C: 字符’c’的地址
D: 无确定的输出结果
标准答案:A 您的答案:C
19.神奇的小明最近发明一种牛逼的"缩骨大法",他定义如果某个字符后面跟一个数字就表示有几个这样的字符,更多说明看下面的例子.利用这种方法小明就可以少写很多字了.那么现在就让你来还原字符串被小明改写前的样子吧!
输入格式:
每行一串字符. 数据处理到文件结束.
输出格式:
输出改写前的字符,对于每个例子只占一行.
输入样例:
在这里给出一组输入。例如:
a2b3c
a1bcd
输出样例:
在这里给出相应的输出。例如:
aabbbc
abcd
提示:
字符串长度小于100, 只包括数字和小写字母,数字只会出现在字母后面,并且数字大于0 小于10
代码
#include<stdio.h>
int main(){
char s[100];
int i,j;
while(gets(s)){
for(i=0;s[i]!=’\0’;i++){
if(s[i]>=‘a’&&s[i]<=‘z’){
printf("%c",s[i]);
}else {//‘3’ ascii 51
for(j=0;j<s[i]-49;j++){
printf("%c",s[i-1]);
}
}
}
printf("\n");
}
return 0;
}
20./*
求3个整数中的最大偶数。
输入格式:
输入3个整数a,b,c(在int型范围)。 有多个测试数据,处理到输入结束。
输出格式:
每行一个偶数,输出内容为a,b,c中的最大偶数。若没有偶数,则输出0。
输入样例:
在这里给出一组输入。例如:
1 2 3
1 3 5
4 6 100
9 -4 1
9 5 0
输出样例:
在这里给出相应的输出。例如:
2
0
100
-4
0
*/
#include<stdio.h>
int main(){
int i,a[3],max;
while(EOF!=scanf("%d%d%d",&a[0],&a[1],&a[2])){
max=-1;
for(i=0;i<3;i++){
if(a[i]%20){
if(max-1 || a[i]>a[max]){
max=i;
}
}
}
if(max==-1){
printf(“0\n”);
}else printf("%d\n",a[max]);
}
return 0;
}
21./*
给定两个整型数组,本题要求找出不是两者共有的元素。
输入格式:
输入分别在两行中给出两个整型数组,每行先给出正整数N(≤20),随后是N个整数,其间以空格分隔。
输出格式:
在一行中按照数字给出的顺序输出不是两数组共有的元素,数字间以空格分隔,但行末不得有多余的空格。题目保证至少存在一个这样的数字。同一数字不重复输出。
输入样例:
10 3 -5 2 8 0 3 5 -15 9 100
11 6 4 8 2 6 -5 9 0 100 8 1
输出样例:
3 5 -15 6 4 1
*/
#include <stdio.h>
int has(int a,int b[],int n){
int i;
for(i=0;i<n;i++){
if(a==b[i]){
return 1;
}
}
return 0;
}
int main(){
int i;
int a[20],b[20],c[40];
int an,bn,cn=0;
//输入部分
scanf("%d",&an);
for(i=0;i<an;++i){
scanf("%d",&a[i]);
}
scanf("%d",&bn);
for(i=0;i<bn;++i){
scanf("%d",&b[i]);
}
//看a数组里的元素,是否在b数组里面
for(i=0;i<an;++i){
//如果既不在b数组,又不在c数组,就放到c数组里面
if(has(a[i],b,bn)==0&&has(a[i],c,cn)==0){
c[cn++]=a[i];
//cn++;
}
}
//看b数组里的元素,是否在a数组里面
for(i=0;i<bn;++i){
//如果既不在a数组,又不在c数组,就放到c数组里面
if(has(b[i],a,an)==0&&has(b[i],c,cn)==0){
c[cn++]=b[i];
//cn++;
}
}
//输出结果
for(i=0;i<cn-1;++i){
printf("%d “,c[i]);
}
printf(”%d",c[i]);
return 0;
}
22./*
编程求出含有10个元素的一维数组中的最大值和次最大值。
输入格式:
在一行中输入10个用空格间隔的整数,数据之间只能各用1个空格间隔。
输出格式:
在一行中按照“max=最大值,cmax=次大值”的格式输出结果,最大值和次大值均原样输出,没有列宽控制。
输入样例:
5 6 2 1 4 3 10 0 2 7
输出样例:
max=10,cmax=7
*/
#include <stdio.h>
int main(){
int a[10];
int i,max,cmax;
//输入
for(i=0;i<10;i++){
scanf("%d",&a[i]);
}
//遍历数组
cmax=-1;//假设没有次大值
max=0;//假设第一个元素最大
for(i=1;i<10;++i){//从第二个元素开始
//如果比最大值大
if(a[i]>a[max]){
cmax=max;
max=i;
}
//如果cmax还没有标记,或者元素比次大值要大
else if(cmax==-1||a[i]>a[cmax]){
cmax=i;
}
}
//输出
printf(“max=%d,cmax=%d”,a[max],a[cmax]);
return 0;
}
23./*
本题要求两个给定正整数的最大公约数和最小公倍数。
输入格式:
输入在一行中给出两个正整数M和N(≤1000)。
输出格式:
在一行中顺序输出M和N的最大公约数和最小公倍数,两数字间以1空格分隔。
输入样例:
511 292
输出样例:
73 2044
鸣谢安阳师范学院段晓云老师和软件工程五班李富龙同学补充测试数据!
*/
#include <stdio.h>
//辗转相除法求最大公约数
int y(int m,int n){
int t;
//如果m<n,交换,确保m为较大的那个数
if(m<n){
t=m;
m=n;
n=t;
}
//如果m%n!=0,辗转相除
while(m%n!=0){
t=m%n;
m=n;
n=t;
}
//如果m%n==0,那么n就是最大公约数
return n;
}
int b(int m,int n){
return m*n/y(m,n);
}
int main(){
int m,n;
scanf("%d %d",&m,&n);
printf("%d %d",y(m,n),b(m,n));
}
24./*
分数可以表示为分子/分母的形式。编写一个程序,要求用户输入一个分数,然后将其约分为最简分式。最简分式是指分子和分母不具有可以约分的成分了。如6/12可以被约分为1/2。当分子大于分母时,不需要表达为整数又分数的形式,即11/8还是11/8;而当分子分母相等时,仍然表达为1/1的分数形式。
输入格式:
输入在一行中给出一个分数,分子和分母中间以斜杠/分隔,如:12/34表示34分之12。分子和分母都是正整数(不包含0,如果不清楚正整数的定义的话)。
提示:在scanf的格式字符串中加入/,让scanf来处理这个斜杠。
输出格式:
在一行中输出这个分数对应的最简分式,格式与输入的相同,即采用分子/分母的形式表示分数。如 5/6表示6分之5。
输入样例:
66/120
输出样例:
11/20
*/
#include <stdio.h>
//辗转相除法求最大公约数
int y(int m,int n){
int t;
//如果m<n,交换,确保m为较大的那个数
if(m<n){
t=m;
m=n;
n=t;
}
//如果m%n!=0,辗转相除
while(m%n!=0){
t=m%n;
m=n;
n=t;
}
//如果m%n==0,那么n就是最大公约数
return n;
}
int main(){
int fz,fm,max=0;
scanf("%d/%d",&fz,&fm);
while(max!=1){
//约分
max=y(fz,fm);
fz=fz/max;
fm=fm/max;
}
printf("%d/%d",fz,fm);
return 0;
}
25./*
本题目要求编写程序统计一行字符中单词的个数。所谓“单词”是指连续不含空格的字符串,各单词之间用空格分隔,空格数可以是多个。
输入格式:
输入给出一行字符。
输出格式:
在一行中输出单词个数。
输入样例:
Let’s go to room 209.
输出样例:
5
*/
#include <stdio.h>
int main(){
char s[1000];
int i,count,flag;
//输入字符串
gets(s);
//遍历字符串
count=0;//初始化变量
flag=1;//标记count是否该加一,flag为1时,
//表示count要+1,为0时,表示count不加
for(i=0;s[i]!=0;i++){
if(s[i]’ '){
//遇到空格后,将flag标记为1,以便之后再遇到字母,count就会+1
flag=1;
}
//如果遇到字母,并且flag为1,count+1
else{
if(flag){//if(flag1)
count++;
flag=0;//flag置为0,接下来再遇到字母,count不加
}
}
}
//输出结果
printf("%d",count);
return 0;
}
下一篇: Python的C扩展源码编译不太易