错题集

这篇博客整理了关于C语言的一些常见错误,包括数组、指针、语句理解等多个方面的问题,并提供了详细的解析和正确答案。例如,指针与数组的关系、下标变量的使用、数据类型的转换等知识点,旨在帮助读者更好地理解和掌握C语言。

错题集

一、判断题
1.数组定义中,数组名后是用方括号括起来的常量表达式,不能用圆括号。
T F
评测结果:答案错误
正确答案:T

2.对于已正确定义的二维数组a, *(a[i]+j)与a[i][j]的含义相同。
T F
评测结果:答案错误
正确答案:T
【解析】两种不同的写法,本质都是取那个地址存在的值

3.在C语言中能逐个地使用下标变量,也能一次引用整个数组。
T F
评测结果:答案错误
正确答案:F

4.假设有定义如下: int array[10]; 则该语句定义了一个数组array。其中array的类型是整型指针(即: int *)。
T F
评测结果:答案错误
正确答案:F

5.一维数组定义的一般形式如下,其中的类型名指定数组变量的类型。
类型名 数组名[数组长度];
T F
评测结果:答案错误
正确答案:F
【解析】类型说明符 数组名 [常量表达式];

6.对于定义int a[5];可以通过语句scanf("%d",a);输入全部元素的值。
T F
评测结果:答案错误
正确答案:F

7.指针可以加上或减去一个int型数,也可以加上一个指针。
标准答案:N 我的答案:Y

8.两个指针在任何情况下相减都是有意义的。
标准答案:Y 您的答案:N

9.C语言的基本组成单位是语句 ( )
标准答案:N 您的答案:Y
C语言的基本组成单位是函数

10.C 语言中的变量名不区分大小写。 ( )
标准答案:N 您的答案:Y

11.C语言中,在进行混合运算时,数据类型由高级向低级转换。
标准答案:N 您的答案:Y
【分析】应该是低级向高级转化
char --> short --> int --> long --> unsigned long --> float --> double
系统这样处理会避免数据精度的丢失

12.C 语言中在字符型变量可以存放一个字符串。 ( )
标准答案:N 您的答案:Y
【分析】char类型在内存中占一个字节,只能存放一个字符,如果要存放多个,就要用字符数组或字符串。

13.C语言中,关键字及编译预处理命令用小写字母书写。
标准答案:Y 您的答案:N

14.int (*p)[4]它表示p是一个指针数组,它包含4个指针变量元素。 (1分)
T F
正确答案:F
【分析】int (*p)[4]这儿的p是一个指针变量,它指向的是含4个元素的一维数组

15.结构体成员的类型必须是基本数据类型。 (1分)
T F
正确答案:F
【分析】不是必须,也可以是自定义类型
二、选择题
1。对于定义 char str[] = “abc\000def\n”(注:其中0为数字零),求字符串str的长度len和数组str的大小size,len和size分别是:
A. 12 ,13
B. 3 ,11
C. 3 ,9
D. 3 ,4
评测结果:答案错误
正确答案:C
【解析】字符串长度是指字符串所含的字符个数,但不包括最后的’\0’,’\n’是转义字符,要包括在其中。

2.若有定义char str[]={“Python”, “SQL”, “JAVA”, “PHP”, “C++”}; 则表达式str[1] > *str[3]比较的是:
A. 字符P和字符J
B. 字符串SQL和字符串PHP
C. 字符串Python和字符串JAVA
D. 字符S和字符P
评测结果:答案错误
正确答案:D
【分析】str[1]和str[3]比较的是这两个字符串的第一个字符

3.如果变量定义如下,则正确的语句是( )。
int i, j, tab[3][4];

A. tab[0][ ] = 0;
B. tab[ ][3] = 3;
C. tab = 100;
**D.

 for(i = 1; i <= 3; i++){
   for(j = 1; i <= 4; j++){
       scanf(%d ”, &a[i][j];
   }
}**

E.

for(i = 0; i < 3; i++){
  for(j = 0; j < 4; j++){     
       printf("%4d", tab[i][j]); 
     }
     printf("\n");        
 }

评测结果:答案错误
正确答案:E

3.若有条件表达式 (exp)?a++:b–,则以下表达式中能完全等价于表达式(exp)的是( )。
A: (exp0)
B: (exp!=0)
C: (exp
1)
D: (exp!=1)
标准答案:B 我的答案:C
【分析】exp 是一个变量。这个条件表达式的意思是,如果(exp)为真,则执行a++,否则执行b–。而只要变量exp的值不为0(也就是false),(exp)都为真(true)。比如exp2或者exp-1,(exp)都为真。所以(exp)等价于(exp!=0),也就是使用 (exp!=0)?a++:b-- 程序也能达到同样的效果。所以选B。

4.请阅读以下程序:

main()
{
   int a=5,b=0,c=0;
   if(a=b+c) printf(***\n”);
   else      printf(“$$$\n”);
}

以上程序( )。
A: 有语法错不能通过编译
B: 可以通过编译但不能通过连接
C: 输出***
D: 输出$$$
标准答案:D 我的答案:A
【解析】解答本题时,先判断if语句,因为 a=b+c不成立,则执行else语句。

5.在下面的条件语句中(其中S1和S2标识C语言语句)一个功能上与其他三个语句不等价的是()
A: if(a)S1;else S2
B: if(a0)S2;else S1
C: if(a!=0)S1;else S2
D: if(a
==0)S1;else S2
标准答案:D 我的答案:C

6.设: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 我的答案:A
【分析】因为是&&运算,所以先看前段.m=a>b,=的优
先级小于>,a>b不成立,m=0;在&&运算中,如果
出现一边为假的情况下,结果直接为假,后面的
语句不会去运算了.

7.以下程序的输出结果是( )。

main()
{int x=2,y=-1,z=2;
 if(x<y)
   if(y<0) z=0;
   else    z+=1;
 printf(%d\n”,z);
}

A: 3
B: 2
C: 1
D: 0
标准答案:B 我的答案:D
【分析】关键是看else与哪个if配对;由于else最靠近第二个if,所以是与第二个if配对的(就近原则),也就是第一个if没有else,从整个程序来说,先判断第一个if语句,因为x>y,所以不执行第一个if里面的所有语句(也就是不执行这两个语句:if(y<0) z=0; else z+=1;),也就是z没有变,依旧是2.

8.若希望当A的值为奇数时,表达式的值为”真”,A的值为偶数时,表达式的值为”假”,则以下不能满足要求的表达式是( )。
A: A%21 
B: !(A%2
0)
C: !(A%2)
D: A%2
标准答案:C 我的答案:B

9.已知x=43, ch=‘A’, y=0;则表达式(x>=y&&ch<‘B’&&!y)的值是( )。
A: 0
B: 语法错
C: 1
D: “假”
标准答案:C 我的答案:A
【 分析】C语言不提供逻辑数据真和假,在进行逻辑运算时则把非零作为真,把零作为假,所以表达式!y的运算结果是1

10.若int i=10;执行下列程序后,变量i的正确结果是( )
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
标准答案:D 您的答案:B
【 原因】 i=10; 进入开关语句,符合 case 10: i++; i 变 11.
由于没有 break; 语句, 所以 并不跳出去,而 继续下走,遇到 case 11,
符合 case 11:i++; 进入 case 11, i 变 12.
由于没有 break; 语句, 所以 并不跳出去,而 继续下走,遇到 default:
符合 default:,进入 default:i++; i 变 13。
.到达 开关语句终了。 所以 答案是 D) 13.

11.逻辑运算符两侧运算对象的数据类型是( )。
A: 只能是0或1
B: 只能是0或非0正数
C: 只能是整型或字符型数据
D: 可以是任何类型的数据
标准答案:D 您的答案:A

12.以下程序的输出结果是( )。

main()
{int a=100,x=10,y=20,ok1=5,ok2=0;
 if(x<y)
   if(y!=10)
      if(!ok1)
         a=1;
      else
         if(ok2) a=10;
 a=-1;
 printf(%d\n”,a);
}

A: 1
B: 10
C: -1
D: 值不确定
标准答案:C 您的答案:B
【分析】(1)if是条件,if()里面是判别,当里面为真,也就是值为1的话就执行,否则不执行,你ok1=5,那么在条件语句里值就为1,(真)如果为0的话就是假,!是逻辑非,ok1=5(在if里就是1,意为真),!ok1意思就是ok1=0(在if里就是假)所以不执行
(2)ok2是0,所以,这个if不成立,这个if没有else所以不执行a=10,跳出if,就会执行到a=-1,然后,a就等于-1
话说回来,即使上面对a赋值了,最后又给a赋值-1就覆盖 了之前的值,a依然等于-1

13.已知 int x=10, y=20, z=30; 以下语句执行后x, y, z的值是( )。
if(x>y)
z=x;x=y;y=z;
A: x=10,y=20,z=30 
B: x=20,y=30,z=30
C: x=20,y=30,z=10 
D: x=20,y=30,z=20
标准答案:B 我的答案:A
【 分析】判断语句执行体里只有一个句子,即z=x,因为没有大括号.x=10,y=20,所以判断条件不符合,因此if语句不执行.接着执行下面的语句,x=y,此时x=y=20,y=20,z=30;再执行下一条,y=z,此时y=z=30,x=20,z=30,因此选B

14.若int (*p)[5];,其中,p是_______。
A: 5个指向整型变量的指针
B: 指向5个整型变量的函数指针
C: 一个指向具有5个整型元素的一维数组的指针
D: 具有5个指针元素的一维指针数组,每个元素都只能指向整型量
标准答案:C 我的答案:A

15.根据声明int a[10], *p=a; ,下列表达式错误的是( )。
A. a[9]
B. p[5]
C. a++
D. p++
我的答案:B 正确答案:C
【分析】
(p+5),也就是a[5],这个题应该是a++错了,数组名a代表的是地址没错,但这个时候a是个常量,++运算符可不能让常量自动加1,只能是变量,所以错了。
16.以下结构类型可用来构造链表的是()。
A. struct aa{ int a;int * b;};
B. struct bb{ int a;bb * b;};
C. struct cc{ int * a;cc b;};
D. struct dd{ int * a;aa b;};
我的答案:D 正确答案:B
【分析】必须有一个成员是指向结构的指针,只有B符合条件

17.若有函数max(a,b),为了让函数指针变量p指向函数max,正确的赋值方式是( )。
A. p=max;
B. *p=max;
C. p=max(a,b);
D. *p=max(a,b);
我的答案:B 正确答案:C

三、填空题
1.定义:double x=3.5,y=3.2;则表达式(int)x0.5的值是_______,表达式y+=x++的值是_______。
标准答案:1.5 6.7 我的答案:2 8.4
【分析】第一个表达式 (int)x
0.5 根据运算法则 先运算(int)x ,再乘以0.5,所以返回的是double类型的值 1.5,后面一个 先运算x++ 在加上 y 即 3.2+1+3.5=6.7

2.以下程序的输出结果是( )

main()
{
 int k=1,n=263;
 do{k*=n%10;n/=10;}while(n);
 printf("%d\n",k);
}         

标准答案:36 我的答案:3
【 分析】
循环次数 k值 n值
1 k=1*(263%10)=13=3 n=263/10=26
2 k=3
(26%10)=36=18 n=26/10=2
3 k=18
(2%10)=18*2=36 n=2/10=0
此时n已经等于0,while(n)为假了,无法继续循环。所以运行结果是输出k的值36

3.以下程序的输出结果是________

main( )
{
 int a=10,y=0; 
 do{a+=2;y+=a;
 if(y>50)break;} while(a=14); 
 printf("a=%dy=%d\n",a,y); 
}    

标准答案:a=16y=60 我的答案:1212

4.在C程序中,指针变量能够赋 地址 值或 ___________ 值。
标准答案:NULL&!@空 我的答案:空值

5.若两个指针变量指向同一个数组的不同元素,则可以进行减法运算和____运算。
标准答案:赋值&!@关系 您的答案:加法

6.存放某个指针的地址值的变量称为指向指针的指针,即__________.
标准答案:二级指针 您的答案:指针变量

7.下面程序段是把从终端读入的一行字符作为字符串放在字符数组中,然后输出。请填空。

#include<stdio.h>
main( )
{
 int i;
 char s[80],*p;
 for(i =0;i<79;i++)
 {
  s[i]=getchar( );
  if(s[i]=='\n')
   break;
 }
 s[i]=  ;
 p=s;
 while(*p)
  putchar(*p++);
}

标准答案:’\0’ 您的答案:*p

四、编程题
1.循环移动 得分: 0 / 10
输入两个正整数 nm (1<m<n<=10),再输入 n 个整数,将这些数排成一行,向右循环移动 m 个位置(从右边移出的数再从左边移入),最后输出移动后的n个整数。
要求定义并调用函数 mov(x,n,m) 实现上述循环移动的功能,函数形参x的类型是整型指针,形参n和m的类型是int,函数的类型是void。
输出格式:数据之间以空格分隔,最后一个数据集后面没有空格
输入输出示例:括号内为说明

输入样例:
5 3            (n=5,m=3)
1 2 3 4 5      (5个整数)
输出样例:
After move: 3 4 5 1 2
#include <stdio.h>
void mov(int *x, int n, int m);//函数声明
int main(void)
{
   	int i, m, n;
   	int a[80];
 	scanf("%d%d", &n, &m);
	for(i = 0; i < n; i++)//循环输入n个整数
	scanf("%d", &a[i]);
	mov( a, n, m);//调用mov函数
	printf("After move: ");
	for(i = 0; i < n; i++)
	printf("%d ", a[i]);
	printf("\n");
}
void mov(int *x, int n, int m)
{
   	int i,j,t;
   	for (i=0;i<m;i++)
   {
      	t=x[n-1];
     	for (j=n-1;j>0;j--) x[j]=x[j-1];
      	x[0]=t;
   }
}

2.数组循环右移
本题要求实现一个对数组进行循环右移的简单函数:一个数组a中存有n(>0)个整数,将每个整数循环向右移m(≥0)个位置,即将a中的数据由(a​0 a​1​​ ⋯a​n−1)变换为(an−m​​ ⋯a​n−1​​ a​0​​ a​1​​ ⋯a​n−m−1​​ )(最后m个数循环移至最前面的m个位置)。
函数接口定义:int ArrayShift( int a[], int n, int m );
其中a[]是用户传入的数组;n是数组的大小m是右移的位数。函数ArrayShift须将循环右移后的数组仍然存在a[]中。

输入样例:
6 2
1 2 3 4 5 6
输出样例:
5 6 1 2 3 4
#include <stdio.h>
#define MAXN 10
int ArrayShift( int a[],int n,int m );
int main()
{
    int a[MAXN],n,m;
    int i;
    scanf("%d %d",&n,&m);
    for (i=0;i<n;i++) scanf("%d",&a[i]);
    ArrayShift(a, n, m);
    for (i=0;i<n;i++){
        if (i != 0) printf(" ");
        printf("%d", a[i]);
    }
    printf("\n");
    return 0;
}

int ArrayShift( int a[], int n, int m )
{
	int i;
	if(!(m%n))
	{/*记住优先级单目高于双目所以 !m%n 是错的*/	
		return 0;//如果 m 为 n 的倍数不操作 
	}
	else if(m%n)
	{
		m%=n;
	}
	int b[MAXN]={0};
	for(i=0;i<m;++i)
	{
		b[m-i-1]=a[n-1-i];//先把右侧被挤出的存起来,存在数组b的相应位置,存b[0]~b[m-1]; 	
	}
	for(i=0;i<n-m;++i)
	{
		b[i+m]=a[i];//把左侧要向右移动的存到数组b的相应位置	
		//若 a[i+m]=a[i];右边数组用到之前自己改变自己元素了 ,所以错了. 
	}
	for(i=0;i<n;++i)
	{
		a[i]=b[i];//把b里正确的顺序赋给a 
	}	
}

3.小明的缩骨大法
神奇的小明最近发明一种牛逼的"缩骨大法",他定义如果某个字符后面跟一个数字就表示有几个这样的字符,更多说明看下面的例子.利用这种方法小明就可以少写很多字了.那么现在就让你来还原字符串被小明改写前的样子吧!
输入格式:
每行一串字符. 数据处理到文件结束.
输出格式:
输出改写前的字符,对于每个例子只占一行.

输入样例:
a2b3c
a1bcd
输出样例:
aabbbc
abcd

提示:字符串长度小于100, 只包括数字和小写字母,数字只会出现在字母后面,并且数字大于0 小于10

#include<stdio.h>
int main()
{
    char s[100];
    int i,j;
    while(gets(s))//可以实现连续输入多组数据,Ctrl+z结束
    {
        for(i=0;s[i]!='\0';i++)
        {
            if(s[i]>='a'&&s[i]<='z')
            {
                printf("%c",s[i]);
            }
            else
            {
                for(j=0;j<s[i]-49;j++)
                {
                    printf("%c",s[i-1]);
                }
            }
        }
		printf("\n");
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值