c语言错题集

C语言错题集示例
(第一部分:选择题)
1.若int (*p)[5];,其中,p是_______。

A: 5个指向整型变量的指针

B: 指向5个整型变量的函数指针

C: 一个指向具有5个整型元素的一维数组的指针

D: 具有5个指针元素的一维指针数组,每个元素都只能指向整型量
正确答案:C
我的答案:B
错题分析:P是一个指向具有5个整型元素的一维数组的指针

2.若x, y均定义成int型,z定义为double型,以下不合法的scanf函数调用语句是( )。

A: scanf(“%d %x, %le”, &x, &y, &z);

B: scanf(“%d *%d, %lf”, &x, &y, &z);

C: scanf(“%x %*d %o”, &x, &y);

D: scanf(“%x %o%6.2f”, &x, &y, &z);
正确答案:D
我的答案:B
错题分析:X和Y变量已定义成为int型,所以在输入的时候只能是用%d来进行输入,所以不符合

3.宏定义#define PI 3.1415926的作用是:指定用标识符PI来代替一个( )。

A: 单精度数

B: 字符串

C: 双精度数

D: 整数
正确答案:B
我的答案:C
错题分析:此题应注意所定义的为字符串

4.如果x是整型变量,则合法的形式是( )

A: &(x+5)

B: *x

C: &*x

D: &x
正确答案:D
我的答案:B
**错题分析:D选项中
和&符号相互抵消,实际意义是X**

5.若有以下定义,则不能表示a数组元素的表达式是______
int a[10]={1,2,3,4,5,6,7,8,9,10},*p=a;

A: *p

B: a[10]

C: *a

D: a[p-a]
正确答案:B
我的答案:A
错题分析:a[10]中有10个元素,但是作为元素单独表示出来的时候,他的表示形式只能是a[0]~a[9]而不能是a[10]的形式

6.设有以下语句:

struct st{int n; struct st *next;};

static struct st a[3]={5, &a[1], 7, &a[2], 9, ‘\0’},*p;

p=&a[0];

则表达式(   )的值是6

A: p++ ->n

B: p->n++

C: (*p).n++

D: ++p->n
正确答案:D
我的答案:C
++p即表示a[1]的地址,a[1]的地址即表示5+1=6

7.在下列叙述中,错误的一条是( )。

A: 主函数main中定义的变量在整个文件或程序中有效

B: 不同函数中,可以使用相同名字的变量

C: 函数中的形式参数是局部变量

D: 在一个函数内部,可在复合语句中定义变量,这些变量只在本复合语句中有效
正确答案:A
我的答案:B
错题分析:主函数main中定义的函数只在main函数中有效,而在其他函数里面没有效

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

main()

{int n[3][3], i, j;

 for(i=0;i<3;i++)

 for(j=0;j<3;j++)  n[i][j]=i+j;

 for(i=0;i<2;i++)

 for(j=0;j<2;j++)  n[i+1][j+1]+=n[i][j];

 printf("%d\n", n[i][j]);

}

A: 14

B: 0

C: 6

D: 值不确定
正确答案:C
我的答案:D

9.有如下程序:

#define N 2

#define M N+1

#define NUM 2*M+1

main()

{int i;

 for(i=1; i<=NUM; i++) printf("%d\n", i);

}

该程序中的for循环执行的次数是(        )

A: 5

B: 6

C: 7

D: 8
正确答案:B
我的答案:C
错题分析:开始定义的N值为2,M为N+1=3,NUM=2*M+1=7,在循环里面,首先是i的值为1,i<=NUm=7,所以是循环7次

  1. 已有定义int k=2,*ptrl,*ptr2;且ptr1和ptr2均已指向变量k,下面不能正确执行的赋值语句是( )

A: k=*ptr1+*ptr2

B: ptr2=k

C: ptr1=ptr2

D: k=ptr1(*ptr2)
正确答案:B
我的答案:A
错题分析:ptr1和ptr2是指针变量,k是普通变量,所以不能实现指针变量=普通变量的赋值

11.下面程序段中,for循环的执行次数是( )。

char  *s=”\ta\018bc”;

for(  ;*s!=’\0’; s++)      printf(“*”);

A: 9

B: 5

C: 6

D: 7
正确答案:C
我的答案:D
错题分析:\ta\表示一个字符,后面的018bc表示5个字符,即1+5=6

12.以下关于return语句的叙述中正确的是( )

A: 一个自定义函数中必须有一条return语句

B: 一个自定义函数中可以根据不同情况设置多条return语句

C: 定义成viod类型的函数中可以有带返回值的return语句

D: 没有return语句的自定义函数在执行结束时不能返回到调用处
正确答案:B
我的答案:C
错题分析:自定义函数可以不用到return ,没有return语句的自定义函数在执行结束后能返回到调用处

13.设以下变量为int类型,则值不等于7的表达式是()

A: (x=y=6,x+y,x+1)

B: (x=6,x+y,x+1)

C: (x=6,x+1,y=6,x+y)

D: (y=6,y+1,x=y,x+1)
正确答案:C
我的答案:D
错题分析:c选项中X的值刚开始为6,再进行x+1 后变为7,再然后是Y=6,进行x+y的操作后变为13

14.若w=1,x=2,y=3,z=4,则条件表达式w<x? w:y<z? y:z的值是( )

A: 4

B: 3

C: 2

D: 1
正确答案:D
我的答案:A
错题分析:本题考察判断大小的功能,可以由题目可知,这道题是求最小值的功能,所以应返回最小值,即W
15.在下面的条件语句中(其中S1和S2标识C语言语句)一个功能上与其他三个语句不等价的是( )

A: if(a)S1;else S2

B: if(a==0)S2;else S1

C: if(a!=0)S1;else S2

D: if(a0)S1;else S2
正确答案:D
我的答案:A
**错题分析:其他三个选项都是在a
0时,返回S2的值,在a!=0的时候返回S1的值,所以D选项不正确**
16.以下不正确的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
错题分析:应该是先输入在进行判断,否则无法得知数的值,无法进行判断,这种输入方法也是不对的

  1. 若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,进行2次i+1操作后,i的值变为13
18.若有定义:int a=3,b=2,c=1;并有表达式:①a%b,②a>b>c,③b&&c+1.则表达式值相等的是( )

A: ①和②

B: ②和③

C: ①和③

D: ③和④
正确答案:C
我的答案:B
错题分析:a%b==1,a>b>c值不可知,b&&c=1的值为1,所以1和3的值均为1
20.执行下列语句后a和b的值分别为( )。

int a, b, c;

a=b=c=1;

++a|| ++b && ++c;

A: 错误 1

B: 2 2

C: 2 1

D: 1 1
正确答案:C
我的答案:B
错题分析:||符号表示前面的式子一旦为真,则不进行后面的运算,即只有a进行了+1的操作,而后面的不进行,所以b的值仍然为1
21.已知 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即为10,X=Y即为20,Y=Z即为30
22.对下述程序,正确的判断是( )

main()

{

 int x,y;

 scanf("%d,%d",&x,&y);

 if(x>y)

  x=y;y=x;

 else

  x++;y++;

 printf("%d,%d",x,y);

}

A: 有语法错误,不能通过编译

B: 若输入3和4,则输出4和5

C: 若输入4和3,则输出3和4

D: 若输入4和3,则输出4和5
正确答案:A
我的答案:B
错题分析:在对x和y 的值进行交换时,没有申请一个临时变量存放他们的值,所以有语法错误,无法通过编译
23.若有说明语句

char a[]="It is mine";      char *p=" It is mine";

则以下不正确的叙述是___________。

A: a+1表示的是字符t的地址

B: p指向另外的字符串时,字符串的长度不受限制

C: p变量中存放的地址值可以改变

D: a中只能存放10个字符
正确答案:D
我的答案:C
错题分析:a中不一定只能存放10个字符,他是未知的,根据用户输入的字符大小而定
24.
若有以下定义和语句:

int a[]={l,2,3,4,5,6,7,8,9,10},*p=a;

则值为3的表达式是_________.

A: p+=2,*(p++)

B: p+=2,*++p

C: p+=3,*p++

D: p+=2,++p
正确答案:A
我的答案:B
错题分析:P刚开始表示a[0]的值,在进行p+=2的操作后,变为了3
25.若有说明:int
p1,*p2,m=5,n;以下程序段正确的是( )

A: p1=&m;p2=&p1

B: p1=&n;scanf("%d",*p1)

C: scanf("%d",n); *p1=n

D: p1=&n; *p1=m
正确答案:D
我的答案:B
*错题分析:P1是一个指针变量,n是一个普通变量,取地址后P读取n 地址的值,表示取该地址的值,即取n的值
(第二部分:判断题)
1.C语言中的文件是一种流式文件,读写时均以字符为单位。
正确答案:yes

2.若有以下说明和语句:
struct Student

{

 int num;

 int age;

}stu,*p;

p=&stu;

则可以用*p.age引用stu中成员age
正确答案:yes

3.用typedef可以增加新类型
正确答案:No

4.指向数组元素的指针只可指向数组的首元素。
正确答案:No

第三部分–填空题
1.存放某个指针的地址值的变量称为指向指针的指针,即__________.
正确答案:二级指针
我的答案:无
*错题分析:对指针理解不透彻所致出错。

2.在int *pa[5];中,pa是一个具有5个元素的指针数组,每个元素是一个________指针。
正确答案:整形
我的答案:一维
**错题分析:对指针没能有正确的理解,导致不能很好地理解题目所表达的意思。

第四部分–编程题
一. 所谓完数就是该数恰好等于除自身外的因子之和。例如:6=1+2+3,其中1、2、3为6的因子。本题要求编写程序,找出任意两正整数m和n之间的所有完数。
输入格式:
输入在一行中给出2个正整数m和n(1<m≤n≤10000),中间以空格分隔。
输出格式:
逐行输出给定范围内每个完数的因子累加形式的分解式,每个完数占一行,格式为“完数 = 因子1 + 因子2 + … + 因子k”,其中完数和因子均按递增顺序给出。若区间内没有完数,则输出“None”。
输入样例:
2 30
输出样例:
6 = 1 + 2 + 3
28 = 1 + 2 + 4 + 7 + 14
代码如下:
#include<stdio.h>int isWanshu(int x);int main(){ int m,n,i; scanf("%d %d",&m,&n); for(i=m;i<=n;i++) { //if i is wanshu //printf wanshu and yinzi if(isWanshu(i)){ printf("\n"); m=0; } }//这里找完区间内所有的完数 //如果区间内没有完数,则输出none if(m!=0) { printf(“None”); }
}int isWanshu(int x){ int sum=0; int i,a[100],n=0; for(i=1;i<=x/2;i++) { if(x%i0)//if it is yinzi { //lei jia sum+=i; a[n++]=i; } }//循环结束,意味着sum为所有因子的和 //判断sum是否和x相等 if(sumx)//如果x是完数 { //输出完数 printf("%d = “,x); //输出因子 //因子存在a数组里面,即输出数组元素 for(i=0;i<n-1;i++) { printf(”%d + “,a[i]); } printf(”%d",a[i]); return 1; }else { return 0; }}

二. 本题要求编写程序,先将输入的一系列整数中的最小值与第一个数交换,然后将最大值与最后一个数交换,最后输出交换后的序列。
注意:题目保证最大和最小值都是唯一的。
输入格式:
输入在第一行中给出一个正整数N(≤10),第二行给出N个整数,数字间以空格分隔。
输出格式:
在一行中顺序输出交换后的序列,每个整数后跟一个空格。
输入样例:
5
8 2 5 1 4

输出样例:
1 2 5 4 8
方法一:
#include<stdio.h>int main(){ int n,i,a[11],min,max,t; scanf("%d",&n); for(i=0;i<n;i++) { scanf("%d",&a[i]); } min=0;//计算最小值 for(i=0;i<n;i++){ if(a[min]>a[i]) { min=i; } } t=a[min];//交换最小值和第一个数 a[min]=a[0]; a[0]=t; max=0;//计算最大值 for(i=0;i<n;i++) { if(a[max]<a[i]) { max=i; } } t=a[max];//交换最大值和最后一个数 a[max]=a[n-1]; a[n-1]=t; for(i=0;i<n;i++){ printf("%d “,a[i]); }}
方法二:
#include<stdio.h>
int findmin(int a[],int size,int type){
int min,i;
min=0;//计算最小值
for(i=0;i<size;i++){
if(type){
if(a[min]>a[i])
{
min=i;
}
}
else
{
if(a[min]<a[i])
{
min=i;
}
}
}
return min;
}
int main()
{
int n,i,a[11],min,max,t;
scanf(”%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
min = findmin(a,n,1);
t=a[min];//交换最小值和第一个数
a[min]=a[0];
a[0]=t;
max=findmin(a,n,0);
t=a[max];//交换最大值和最后一个数
a[max]=a[n-1];
a[n-1]=t;
for(i=0;i<n;i++){
printf("%d ",a[i]);
}
}
三.

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值