错题集

错题集

1.设有以下语句:
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指向结构体数组的第一个元素(它的值是5)

    • p->n的意思就是对其值执行自增操作,且为前置自增,因此为6。

2.学生成绩统计

输入10个学生5门课程的成绩,分别用函数实现下列的功能:
(1)计算每一个学生的平均分;
(2)计算每一门课程的平均分;
(3)找出所有50个分数中最高的分数所对应的学生和课程;

输入
共有5行,每一行有10个用空格隔开的实数,表示某门课程所有10个学生的成绩,学生的编号顺序为从0至9,课程的编号顺序为从0至4。
保证所有成绩不小于0且不大于100,且所有分数中最高的分数是唯一的。
输出
第一行输出10个实数,分别表示每一个学生的平均分,每个实数后输出一个空格。
第二行输出5个实数,分别表示每一门课程的平均分,每个实数后输出一个空格。
第三行输出所有50个分数中最高的分数以及对应的学生编号和课程编号,用空格隔开。
所有的实数输出在小数点后保留2位小数,并请注意行尾输出换行。
样例输入
60.4 84.6 83.3 84.9 91.7 97.2 94.8 73.5 89.6 64.6
77.0 61.4 92.8 68.2 79.6 64.9 90.0 99.4 68.3 74.4
63.8 86.0 99.0 61.5 62.9 63.8 74.2 87.1 97.1 98.9
74.5 77.2 87.7 95.4 78.7 99.1 76.6 82.9 70.3 78.9
67.0 98.1 93.2 83.3 76.7 66.6 91.4 97.1 62.5 88.7
样例输出
68.54 81.46 91.20 78.66 77.92 78.32 85.40 88.00 77.56 81.10
82.46 77.60 79.43 82.13 82.46
99.40 1 7

#include <stdio.h>
#include <math.h>
void aver_stu(int t[][5]); //定义学生平均分函数
void aver_course(int t[][5]); //定义课程平均分函数
void high(int t[][5]); //定义最高分函数
void vari(int t[][5]); //定义方差函数
int main()
{
int stu[10][5];
int i, j;
for (i=0; i<10; i++)
for (j=0; j<5; j++)
scanf("%d", &stu[i][j]); //输入10个学生各5门课的成绩
aver_stu(stu); //调用学生平均分函数
aver_course(stu); //调用课程平均分函数
high(stu); //调用最高分函数
vari(stu); //调用方差函数
return 0;
}
//学生平均分函数
void aver_stu(int t[][5])
{
int i, j;
float k, ave;
for (i=0; i<10; i++){
for (j=0, k=0.0; j<5; j++)
k+=t[i][j];
ave=k/5;
printf(“No.%d student average is %f\n”, i+1, ave);
}
}
//课程平均分函数
void aver_course(int t[][5])
{
int i, j;
float k, ave;
for (j=0; j<5; j++){
for (i=0, k=0.0; i<10; i++)
k+=t[i][j];
ave=k/10;
printf(“No.%d course average is %f\n”, i+1, ave);
}
}
//最高分函数
void high(int t[][5])
{
int i, j, h, stu, cour;
for (i=0, h=0, stu=0, cour=0; i<10; i++){
for (j=0, j<5; j++)
if (t[i][j]>h){
h=t[i][j];
stu=i+1;
cour=j+1;
}
}
printf(“The highest score is %d, from No.%d student & No.%d course\n”, h, stu, cour);
}
//方差函数
void vari(int t[][5])
{
int i, j, k, m;
float temp[10], var, x1, x2;
for (i=0, m=0; i<10; i++, m++){
for (j=0, k=0; j<5; j++)
k+=t[i][j];
temp[m]=k/5;
}
for (i=m=x1=x2=0; i<10; i++){
x1+=pow(temp[i], 2);
x2+=temp[i];
}
var=x1/10-pow(x2/10, 2);
printf(“The variance is %f\n”, var);
}

若有定义:int x, y; char a, b, c; 并有以下输入数据(此处代表回车,∪代表空格):
1∪2
A∪B∪C
则能给x赋整数1,给y赋整数2,给a赋字符A,给b赋字符B,给c赋字符C的正确程序段是( )。

A: scanf(“x=%d, y=%d”, &x, &y); a=getchar( ); b=getchar( ); c=getchar( );
B: scanf(“%d %d”, &x, &y); a=getchar( ); b=getchar( ); c=getchar( );
C: scanf(“%d%d%c%c%c”, &x, &y, &a, &b, &c);
D: scanf(“%d%d%c%c%c%c%c%c”, &x, &y, &a, &a, &b, &b, &c, &c);

标准答案:D 我的答案:C

解析:A要输入x=1<空格>y+2<回车>A<回车>B<回车>C<回车>
B要输入1<空格>2<回车>A<回车>B<回车>C<回车>
C与D都是空格,但区别是C中给a赋了A,给b赋了空格,给c赋了B;
只有D才能达到题目要求。

4.在C语言中,数字029是一个()

A: 八进制数
B: 十六进制数
C: 十进制数
D: 非法数

标准答案:D 我的答案:A

D非法数 //0开头表示8进制,但8进制没有字符9的.

5.下面有关for循环的正确描述是( )。

A: for循环只能用于循环次数已经确定的情况
B: for循环是先执行循环的循环体语句,后判断表达式
C: 在for循环中,不能用break语句跳出循环体
D: for循环的循环体语句中,可以包含多条语句,但必须用花括号括起来

标准答案:D 我的答案:B

解析:
A,B,C都错,for循环不仅能用于循环次数已经确定的情况,还可以用于循环次数不确定而只给出循环结束条件的情况。还有一个D选项。D、for循环的循环体语句中,可以包含多条语句,但必须用花括号括起来正确。

6.设有以下程序段
int x=0,s=0;
while(!x!=0) s+=++x;
printf("%d",s);
则( )。

A: 运行程序段后输出0
B: 运行程序段后输出1
C: 程序段中的控制表达式是非法的
D: 程序段执行无限次

标准答案:B 我的答案:D

解析:
语句while(!x!=0)s+=++x;循环的条件是!x!=0,非x不等于零,这个X的值只有0,能够满足。所以语句只有X=0时,才实现。接着进入内部循环,s+=++x,执行后s=1,x=1。x=1,时不满足!x!=0,跳出循环,打印s,程序结束。

7.设有如下定义:
struct sk
{int a; float b;} data, *p;
若有p=&data,则对data中的成员a的正确引用是( )。

A: (*p).data.a 
B: (*p).a 
C: p->data.a 
D: p.data.a

标准答案:B 我的答案:C

解析:
指针方面的知识,首先p是一个指针,(*p)则表示指向地址p的对象,用对象访问域就如此表示:(*p).a。

8.若有以下定义,则不能表示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 我的答案:C

解析:
A. *p —表示取p指针指向的单元的值,即表示取数组a的首个元素a[0]的值
C. *a ----数组名a中保存的是数组的首地址,*是取单元中的值,*a就是取数组首地址中单元中a[0]的值
D. a[p-a] — p指向的是数组a,因为p中与a同数据相同都是数组a的首地址, 而p-a就等于0,因此 a[p-a]就相当于a[0]
B. a[10] —因为数组a一共10个元素,从0开始计数,即a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],正好10个,根本没有a[10],所以a[10]就是不能表达这个数组元素的 。

9.以下程序的输出结果是( )。
fun(int k)
{if(k>0) fun(k-1);
printf("%d", k);
}
main( )
{int w=5;
fun(w);
}

A: 54321 
B: 012345 
C: 12345
D: 543210

标准答案:B 我的答案:A

解析:
结果是D,原因就是执行了6次fun()函数w=5执行fun(5)5进去执行if调用fun(4)再执行if调用fun(3)。。。。。到fun(o)时输出0;执行完fun(0)再执行fun(1)输出1.。。。直到执行fun(5)输出5。

10.下面程序段中,for循环的执行次数是( )。
char *s=”\ta\018bc”;
for( ;s!=’\0’; s++) printf(“”);

A: 9
B: 5
C: 6
D: 7

标准答案:C 我的答案:B

解析:
\t a \018 b c \0 共6次

11.以下程序的输出结果为( )。
main()
{
int a=2, b=-1, c=2;
if(a<b)
if(b<0) c=0;
else c++;
printf(“%d\n”,c);
}

A: 0
B: 1
C: 2
D: 3

标准答案:C 我的答案:D

解析:

a > b 不进入if(b<0) c=0; else c++; 直接输出2。

12.变量a所占内存字节数是( )。
union U
{char st[4];
int i;
long l;
};
struct A
{int c;
union U u;
}a;

A: 4
B: 5
C: 6
D: 8

标准答案:D 我的答案:B

解析:
共用体表示几个变量共用一个内存位置,在不同的时间保存不同的数据类型和不同长度的变量。在union中,所有的共用体成员共用一个空间,并且同一时间只能储存其中一个成员变量的值。
当一个共用体被声明时, 编译程序自动地产生一个变量, 其长度为联合中最大的变量长度的整数倍。
int c 4个字节 加上 union U u 4个字节
union U { char st[4]; int i;long 1;}; 中 三个都是4个字节 所以共同占用4个字节。

13.“==”表示关系运算符等于, “=”表示赋值运算符。 ( )

标准答案:Y 我的答案:N

解析:略

14.C语言共用体类型变量在程序运行期间只有一个成员驻留在内存中

标准答案:Y 我的答案:N

解析:只有一个在内存中。在结构体中才是全部成员都在内存中。

在C语言中,错误的常数是()

A: 1E+0.0
B: 5
C: 0xaf
D: 0L

标准答案:A 我的答案:D

解析:
A 是错误的,其中的E相当于10次方,0.0为指数,但是指数是不能为小数的.
B 是对的,.5相当与0.5,C语言中默认小数点前没有数字,就是0.
C 0x的意思为af是16进制数,顺便说一下8进制数前需要加一个0表示.
D 0L的意思为0是Long int型的整数,L是一种类型

16.对于语句:f=(3.0,4.0,5.0),(2.0,1.0,0.0);的判断中,正确的是()

A: 语法错误
B: f为5.0
C: f为0.0
D: f为2.0

标准答案:B 您的答案:C

解析:
是5.0
应该先运行括号里的
即:
f=(5.0),(0.0)
/括号(优先级最高)里的是逗号表达式,最后一个值即是逗号表达式的值/
然后是赋值表达式,即:
f=5/赋值表达式优先级高于逗号表达式/

17.有以下程序,从第一列开始输入数据2473(代表一个回车符),则程序的输出结果为( )。
#include<stdio.h>
main()
{int c;
while((c=getchar())!=’\n’)
{switch(c-‘2’)
{case 0:
case 1:putchar(c+4);
case 2:putchar(c+4);break;
case 3:putchar(c+3);
default:putchar(c+2);break;
}
}
printf("\n");
}

A: 668977
B: 668966
C: 6677877
D: 6688766

标准答案:A 您的答案: D

解析:

本题执行过程为:输入c=‘2’,c-‘2’=0,首先匹配case0,依次输出6,6,后执行break语句,跳出分支结构;输入c=‘4’,c-‘2’=2,匹配case2,输出8,执行break语句,跳出分支结构;输入c=‘7’,c-‘2’=5,匹配default,输出9,执行break语句,跳出分支结构;输入c=‘3’,c-‘2’=1,匹配case1,依次输出7,7,执行break语句,跳出分支结构。输入回车,结束循环。即668977。

18.设char **s;,以下正确的表达式是( )。

A: s=“computer”;
B: *s=“computer”;
C: **s=“computer”;
D: *s=‘c’;

标准答案:B 我的答案:D

解析:
**s为指针数组,*s存的是指针,即“computer”的首地址。

19.若有说明: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

解析:
数组从零开始,*language[1]为”BASIC”,*language[3]为”JAVA”。

20.以下程序的输出结果是( )。
#define M(x, y, z) x*y+z
main()
{int a=1, b=2, c=3;
printf("%d\n", M(a+b, b+c, c+a));
}

A: 19
B: 17
C: 15
D: 12

标准答案:D 我的答案:A

解析:
M(a+b, b+c, c+a)=a+bb+c+c+a=1+22+3+3+1=12,注意xy+z而不是(x)(y)+z。

21.以下正确的叙述是_______________。

A: C语言允许main函数带形参,且带形参个数和形参名均可由用户指定
B: C语言允许main函数带形参,形参名只能是argc和argv
C: 当main函数带有形参时,传给形参的值只能从命令行中得到
D: 若有说明:main(int argc,char *argv),则形参argc的值必须大于1

标准答案:C 我的答案:B

解析:
C语言通常允许main()函数带有两个参数,可由用户自己命令,但类型是固定的。第一个参数是整型,第二个参数是一个指向字符型指针数组的指针或一个基本类型为字符型的指针数组,此时传给形参的值只能从命令行中得到。

22.以下程序的输出结果是( )。
#define SUB(x, y) (x)*y
main()
{int a=3, b=4;
printf("%d\n", SUB(a++, b++));
}

A: 12
B: 15
C: 16
D: 20

标准答案:A 我的答案:C

解析:
a++,b++均为sub后再加,即3*4后a++变为a=4,b++变为b=5。

23.下面程序的输出结果是( )。
main()
{
int x, y, z;
x=0;y=z=-1;
x+=-z—y;
printf(“x=%d\n”,x);
}

A: x=4
B: x=0
C: x=2 
D: x=3

标准答案:C 您的答案:D

解析:x=0-(-1–)-(-1),x=2。

24.执行语句 y=10;x=y++; 的结果是( )。

A: x=10,y=10 
B: x=11,y=11
C: x=10,y=11
D: x=11,y=10

标准答案:C 我的答案:A

解析:
++为计算后加,即x=y=10,y=y+1。

25.下列程序的输出结果是16.00,请填空。
main()
{ int a=9, b=2;
float x= __________, y=1.1,z;
z=a/2+b*x/y+1/2;(1/2=0,a/2=4)
printf(“%5.2f\n”, z );
}

标准答案:
6.6

您的答案:

解析:16=9/2+2x/1.1+1/2,16=4+0+2x/1.1,x=6.6。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值