二级C语言模拟题10详解
一、选择题
1.C语言中,复合语句的构成是将一系列语句置于()。
A)begin与end之间B)一对圆括号”()”之间
C)一对圆括号”{}”之间D) 一对圆括号”[]”之间
答案:C,复合语句要放在{}之间
2.C语言的字符型数据在内存中的存储形式是()。
A)原码B)补码C)反码D)ASCII码
答案:D,字符数据存储格式为ASCII码
3.下面关于C语言变量的叙述中,错误的是()。
A)可以用const关键字定义变量B)在C程序中,SUM和sum是不同的变量
C)变量名必须由字母或下划线开头D)变量的类型确定了变量的取值范围
答案:A,const关键字表示常量,只能定义常量,不能定义变量。
4.若有定义:int i=3,k;则语句k=(i--)+(i--);运行后k的值是()。
A)4 B)5 C)6 D)7
答案:C,两个i—都是3,最后答案就是6
5.若已定义:int a=5;float b=63.72;以下语句中能输出正确值的是( )。
A)printf(“%d %d”,a,b); B)printf(”%d %.2f”,a,b);
C)printf(”%.2f %.2f”,a,b); D)printf(”%.2f %d”,a,b);
答案:B,注意到b是浮点型数据,不能用%d,AD就错了,而a是整形数据,不能用%f,C就错了,所以选B。
6. C语言中,能正确表示条件10 A)10 答案:D,重要考点,记住要用逻辑与 7. 在下列运算符中,优先级最高的运算符是 ( ). A)<= B)!= C)! D)|| 答案:C,单目运算符优先级最高。 8. 下面关于switch语句的叙述中,错误的是()。 A)case后面的表达式可以是关系表达式 B)switch语句是多分支选择语句 C)每一个case后面的值必须互不相同,否则会出现互相矛盾的现象 D)在执行一个case分支后,可用一个break语句使流程跳出switch语句 答案:A,case后面只能是int或char型数据,不能是表达式。 9.以下程序段执行后变量sum的值为()。 int i,j=1,sum=0; for(i=1;i<=3;i++) {sum+=j; j++;} A)5 B)3 C)6 D)4 答案:C,1+2+3=6 10.下面关于数组的叙述中,正确的是()。 A)数组必须先定义,然后使用B)定义数组时,可不加类型说明符 C)定义数组后,可通过赋值运算符”=”对该数组名直接赋值D)在数据类型中,数组属基本类型答案:A,所有数据类型都需要先定义后使用。B错,要加类型,C错,定义数组后,不能用赋值语句对数组名赋值。D错,数组属于构造类型。 11.以下程序段运行后s的值是()。 int a[3][3]={1,2,3,4,5,1,2,3,4}; int i,,j,s=1; for(i=1;i<3;i++) for(j=i+1;j<3;j++) s*=a[i][j]; A)1 B)120 C)24 D)480 原题目有错。答案:A,i=1时,j从2到2,i=2时,进不了循环体了,所以s*=a[i][j]只执行了一次,就是s*=a[1][2],所以答案是1 12.已有定义:char str[15]={”university”},str2[15];则以下语句中正确的是()。 A)str2=str1; B)str2=”college”; C)scanf(”%s”,&str2); D)printf(”%s”,str1); 答案D,A错,str2是数组名,属于地址常量,不能赋值的,B错,一样的,str2不能赋值。C不需要& 13. 下面程序的输出结果是()。 fun(int x,int y) {int z; z=(x return (z);} main() { int a=10,b=6; printf(“%d\n”,fun(a,b)); } A)4 B)16 C)10 D)6 答案:A,直接运行即可。x 14.下面程序的输出结果是() #define ADD(x) x+x main() {int m=1,n=2,k; k=ADD(m+n)*3; printf(”%d”,k);} A)9 B)10 C)12 D)18 答案:B,这种题目最保险的办法就是直接运行。注意宏展开不能合并,不加括号,所以ADD(m+n)*3就是1+2+1+2*3,所以最后答案是10 15.若有定义int a[2][3],*p=a;,则以下不能表示数组元素a[1][2]的是()。 A)*(a[1]+2) B)*(p[1]+2) C)p[5] D)*(p+5) 答案:B,注意到p是一维指针,B中对p的操作属于对二维指针的操作。 16.下面程序段的运行结果是() int x[]={2,3,4,5,6,7},*p=x; int i,s=0; for(i=1;i<6;i+=2) s+=*(p+i); printf(”%d”,s); A)27 B)25 C)12 D)15 答案:D,直接运行即可,注意这题中i是加2,所以一次循环后要往后跳两个单元。 17.设有如下语句: struct student { int num; int age; }; struct student stu[3]={{101,18},{102,21},{103,19}}; struct student *p=stu; 则下面表达式的值为102的是()。 A)(p++)-->num B)(p++)-->age C)(*p).age D) (*++p).num 答案:D,++p已经向后移动一个单位了,所以输出应该是第二个节点的num,也就是102 18. 若有如下定义, struct link {int data; struct link *next; }*head,*p; 并已建立如下图所示的链表结构,指针p 和q 分别指向图中所示结点: p q … 则不能将指针q 所指的结点连接到链表末尾的程序段是( )。 A )q->next=NULL;p=p->next;p->next=q; B )p=p->next;q->next=p->next;p->next=q; C )p=p->next;q->next=p;p->next=q; D )p=(*p).next;(*q).next=(*p).next;(*p).next=q; 答案C ,注意到C 中的q->next=p;p->next=q;表示q 指向p ,p 又指向q ,就变成了一个环,不是插入节点了。 19.若有以下类型说明,则( )是正确的叙述。 typedef union {charstr[2]; int i; }sp; A )sp 是一个共用体变量 B )sp 是一个共用体类型名 C )union sp 是共用体类型名 D )typedef union 是共用体类型名 答案:B ,A 错,sp 是共用体类型名,不是共用体变量名,C 错,sp 才是共用体类型名。 20.对下面程序正确的描述是( )。 #include main() {int i; FILE *fp; if((fp=fopen(“test.dat ”,”rb+”))!=NULL) {i=fgetc(fp);i=i+1;} fseek(fp,0,SEEK_SET); fputc(i,fp); fclose(fp); } A) 将文件中第一个字节的内容加1并重新写入到第一个字节 B) 将文件中第一个字节的内容加1并写入到第二个字节中 C) 以只读方式打开文本文件test.dat D) 以只读方式打开二进制文件test.dat 答案:A ,核心代码: if((fp=fopen(“test.dat ”,”rb+”))!=NULL) {i=fgetc(fp);i=i+1;} 这里面有i 的增加,所以就是把第一个字节加一,然后后面有fputc(i,fp),就是写一个字节进去,所以选A 。 二、改错题(共2小题,每题10分) 1.程序cmody101.c ,其功能是求计算如下所示的数学表达式: 2222.3 5.6 2.3 5.6 2.3 5.68.28.28.2 a a b b c c s a b c -+-+-+=+-+++ 如:输入a,b,c三个值:6,3,2 则输出:s=2.16 #include #define F(x) (x*x-2.3*x+5.6)/(x+8.2) void main() {/**/ float a,b,c; /**/ printf(”\nPlease input a,b,c”); /**/ scanf(”%f,%f,%f”,a,b,c);/**/ /**/ s=F(a,b,c); /**/ printf(”\ns=%.2f\n”,s); getch(); } 答案:float a,b,c,s; scanf(“%f,%f,%f”,&a,&b,&c); s=F(a)+F(b)+F(c);第一处错,少了变量s 的定义,第二处错,注意到scanf输入列表为地址列表,要用&,第三处错,注意到F(x)这个宏只有一个入口参数,应该改成:s=F(a)+F(b)+F(c) 2.程序cmody102.c其功能是实现打印出所有的“水仙花数”。所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。 #include void main() {int f,s,t,n; printf(”\n The list is: \n”); for(n=100;n<1000;n++) {f=n%10; s=(n%100)/10; /**/ t=n%100; /**/ /**/ if(t*t*t+s*s*s+f*f*f=n)/**/ printf(”%d ”,n); getch(); } 答案:t=n/100; if(t*t*t+s*s*s+f*f*f==n) 第一处错,要注意数据隔离的做法:t=n/100%10表示百位,所以要改,第二处,注意相等要用== 三、填空题(共3小题,每题8分) 1.补充程序Ccon101.c,该程序的功能是计算三个学生的总成绩和平均成绩,其中三个学生的成绩存储在一个结构体数组中。 main() {struct stu {char name[10]; float score;}; /**/ /**/ stu[3]={”Mary”,76,”John”,85,”Tom”,81}; int i=0; float total=0,aver=0; while(i<3) {total=total+ /**/ /**/; i++;} aver=total/3 printf(”\ntotal=%.2f,aver=%.2f”,total,aver); getch(); } 答案:struct stu stu[i].score 第一空,填struct stu ,定义一个结构体数组,第二处填stu[i].score ,表示把所有成绩加在一起。 2.补充程序Ccon102.c ,该程序的功能是找出数组中的最小数min1和次最小数min2。 main() {int i,a[10]={9,26,35,8,6,19,69,3,5,95}; int min1,min2; i=0;