二级C语言模拟题10详解

二级C语言模拟题10详解
二级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)1010 || x<20 C)x>10 && <20 D)(x>10)&&(x<20)

答案: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;

min1=a[0]

min2=a[0]>a[1]?/**/ /**/

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

{if(a[i]

{min2=min1;min1=a[i];}

else if(a[i]

/**/ /**/

}

printf(“min1=%d,min2=%d\n ”,min1,min2);

getch();

}

答案:a[0]:a[1]; min2=a[i]

第一空,明显要让小的那个数给min2,填a[0]:a[1],属于条件运算符。

3.补充程序Ccon103.c ,使其实现用递归算法求平方根。求平方根的迭代公式如下:

#include

main()

{double x,y;

/**/ /**/

printf(”Please input x:\n ”);

scanf(”%lf ”,&x);

y=mysqrt(x,1.0);

printf(”The sqrt of %f=%f\n ”,x,y);

getch();

}

double mysqrt(double a,double x0)

{double x1,y;

x1=/**/ /**/

if(fabs(x1-x0)>0.00001) y=mysqrt(/**/ /**/);

else y=x1;

return(y);}

填空:double mysqrt(double,double); (x0+a/x0)/2.0; a,x1

第一空是进行函数的声明。第二空,根据求根公式填(x0+a/x0)/2.0;第三空,要把x1作为下一次的x0,填入实际参数为:a,x1。

四、编程题(共2小题,每题8分)

1.打开程序cprog101.c ,完成其中的fun()函数,该函数的功能是:根据输入的x 和n 的值,计算

()()()

21(1.0 2.0,010)1n n x f x x n n n +=≤≤<≤+,将计算结果存入数组元素a[0]中,并将该计算结果的小数部分存入a[1]中。

#include

void fun(double a[],double x,int n)

{/**/

/**/

}

void main()

{ int n;

double a[2],x;

printf (”\nPlease enter x,n:”);

scanf(”%lf,%d”,&x,&n);

while(x<1.0||x>2.0||x<0||x>15)

{ printf(”\nInvaid data (1.0<=x<=2.0,0

scanf(”%lf,%d”,&x,&n);}

fun(a,x,n);

printf (”\nResult:a[0]=%f,a[1]=%f”,a[0],a[1]);

getch();

}

答案:

a[0]=(2*n+1)*pow(x,n)/(n*(n+1));

a[1]=a[0]-(int)a[0];

a[0]直接用表达式,a[1]要取出小数部分,就用原数减去强制转换成int后的数。

2. 打开程序cprog102.c,完成其中的fun()函数,该函数的功能是:将已按升序排列好的数组a和已按降序排列好的数组b中的所有元素按降序存入数组c中。

#define N 6

#define M 9

void fun(int a[],int b[],int c[])

{ /**/

/**/

}

main()

{int a[N]={2,5,8,10,18,24},b[M]={96,88,70,36,24,18,11,10,2};

int c[N+M],n;

fun(a,b,c);

printf(”The result is:”);

for(n=0;n

getch();

}

答案:

int i,j,k=0,temp;

for(i=0;i

c[i]=a[i]; //先将a的元素搬到c

for(i=0;i

c[N+i]=b[i]; //再将b的元素搬到c

k=M+N; //c数组的长度就是M+N

for(i=0;i

for(j=i+1;j

{

if(a[i]>a[j]){temp=a[i];a[i]=a[j];a[j]=temp;} }

相关主题
相关文档
最新文档