全国计算机二级c语言考试真题详细解答系列一9.docx

上传人:b****6 文档编号:8080550 上传时间:2023-01-28 格式:DOCX 页数:21 大小:37.27KB
下载 相关 举报
全国计算机二级c语言考试真题详细解答系列一9.docx_第1页
第1页 / 共21页
全国计算机二级c语言考试真题详细解答系列一9.docx_第2页
第2页 / 共21页
全国计算机二级c语言考试真题详细解答系列一9.docx_第3页
第3页 / 共21页
全国计算机二级c语言考试真题详细解答系列一9.docx_第4页
第4页 / 共21页
全国计算机二级c语言考试真题详细解答系列一9.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

全国计算机二级c语言考试真题详细解答系列一9.docx

《全国计算机二级c语言考试真题详细解答系列一9.docx》由会员分享,可在线阅读,更多相关《全国计算机二级c语言考试真题详细解答系列一9.docx(21页珍藏版)》请在冰豆网上搜索。

全国计算机二级c语言考试真题详细解答系列一9.docx

全国计算机二级c语言考试真题详细解答系列一9

2009年9月全国计算机等级考试二级C语言笔试试题

一、选择题(

(1)—(10)、(21)—(40)每题2分,(11)—(20)每题1分,共70分)

(1)下列数据结构中,属于非线性结构的是(C)

A)循环队列    B)带链队列    C)二叉树    D)带链栈

(2)下列数据结果中,能够按照“先进后出”原则存取数据的是(B)

A)循环队列    B)栈    C)队列    D)二叉树

(3)对于循环队列,下列叙述中正确的是(D)

A)队头指针是固定不变的

B)队头指针一定大于队尾指针

C)队头指针一定小于队尾指针

D)队头指针可以大于队尾指针,也可以小于队尾指针

(4)算法的空间复杂度是指(A)

A)算法在执行过程中所需要的计算机存储空间

B)算法所处理的数据量

C)算法程序中的语句或指令条数

D)算法在执行过程中所需要的临时工作单元数

(5)软件设计中划分模块的一个准则是(B)

A)低聚低耦合

B)高聚低耦合

C)低聚高耦合

D)高聚高耦合

(6)下列选项中不属于结构化程序设计原则的是(A)

A)可封装

D)自顶向下

C)模块化

D)逐步求精

(7)软件详细设计产生的图如下:

 

该图是(C)

A)N-S图

B)PAD图

C)程序流程图

D)E-R图

(8)数据库管理系统是(B)

A)操作系统的一部分

B)在操作系统支持下的系统软件

C)一种编译系统

D)一种操作系统

(9)在E-R图中,用来表示实体联系的图形是(C)

A)椭圆图

B)矩形

C)菱形

D)三角形

(10)有三个关系R,S和T如下:

 

   

其中关系T由关系R和S通过某种操作得到,该操作为(D)

A)    选择

B)     投影

C)    交

D)    并

(11)以下叙述中正确的是

    A)程序设计的任务就是编写程序代码并上机调试

    B)程序设计的任务就是确定所用数据结构

    C)程序设计的任务就是确定所用算法

    D)以上三种说法都不完整

解析:

选D。

原文见高教版二级教程P2,程序设计的任务包括A、B、c及相关文档。

 

(12)以下选项中,能用作用户标识符的是

A)void

B)8_8

C)_0_

D)unsigned

解析:

选C。

标识符由字母或下划线开头,关键字不能用作标识符。

   A、D为关键字,B以数字开头,所以都是错误的。

 

(13)阅读以下程序

    #include

    main()

    {intcase;floatprintF;

      printf(“请输入2个数:

”);

      scanf(“%d%f”,&case,&pjrintF);

      printf(“%d%f\n”,case,printF);

    }

    该程序编译时产生错误,其出错原因是

    A)定义语句出错,case是关键字,不能用作用户自定义标识符

    B)定义语句出错,printF不能用作用户自定义标识符

    C)定义语句无错,scanf不能作为输入函数使用

    D)定义语句无错,printf不能输出case的值

解析:

选A。

case是关键字,关键字不能用作标识符。

C语言关键字见教材附录。

(注:

标识符区分大小写,printf是关键字,可用作标识符,当然printF也可以)

 

(14)表达式:

(int)((double)9/2)-(9)%2的值是

    A)0      B)3      C)4      D)5

解析:

选B。

考点为运算符的优先级。

 括号>强制类型转换int>乘除>加减

 (int)((double)9/2)一(9)%2=(int)(9.0/2)-(9)%2=(int)(4.5)-1=3

 

(15)若有定义语句:

intx=10;,则表达式x-=x+x的值为

    A)-20    B)-10    C)0    D)10

解析:

选B。

考点为复合的赋值运算符。

(注意x+x作为一个整体)

   x-=x+x→x=x-(x+x)→x=-x=-10

 

 

(16)有以下程序

    #include

    main()

    {inta=1,b=0;

      printf(“%d,”,b=a+b);

      printf(“%d\n”,a=2*b);

    }

    程序运行后的输出结果是

    A)0,0      B)1,0      C)3,2      D)1,2

解析:

选D。

考点为赋值表达式的使用,赋值表达式的值和变量的值是一样的。

   printf在输出赋值表达式的值时,先赋值再输出。

   b=a+b=l+0=1   a=2*b=2

 

17)设有定义:

inta=1,b=2,c=3;,以下语句中执行效果与其它三个不同的是

    A)if(a>b)c=a,a=b,b=c;

    B)if(a>b){c=a,a=b,b=c;}

    C)if(a>b)c=a;a=b;b=c;

    D)if(a>b){c=a;a=b;b=c;}

解析:

选C。

考点为if句和逗号表达式的使用。

逗号运算符也称为顺序求值运算符,依次执行逗号表达式中的每个表选式。

逗号表达式是一个整体,复合语句也是一个整体,当a>b时,A、B、D中if后的语句可以作为整体被执行,把a、b的值交换。

C的等价语句形式为:

  if(a>b)  c=a;

   a=b;b=c;   不能实现a、b的值交换。

 

(18)有以下程序

    #include

    main()

    {intc=0,k;

      for(k=1;k<3;k++)

      switch(k)

      {default:

c+=k

        case2:

c++;break;

        case4:

c+=2;break;

      }

      printf(“%d\n”,c);

    }

    程序运行后的输出结果是

    A)3      B)5      C)7      D)9

解析:

选A。

考点为switch语句的使用。

switch语句中case和default的顺序可以任意,不影响程序结果。

switch语句在循环中被执行2次。

k=l时, c+=k  c=0+1=1   无break,继续执行

c++  c=2   有break,终止switch

 k=2时,c++ c=3       有break,终止switch,循环结束,输出c。

   

 

(19)以下程序段中,与语句:

k=a>b?

(b>c?

1:

0):

0;功能相同的是

    A)if((a>b)&&(b>c))k=1;

       elsek=0;

    B)if((a>b)||(b>c)k=1;

       elsek=0;

    C)if(a<=b)k=0;

       elseif(b<=c)k=1;

    D)if(a>b)k=1;

       elseif(b>c)k=1;

        elsek=0;

解析:

选A。

考点为条件表达式的使用。

语句的功能为:

 a>b且b>c时,k=l

 a>b且b<=e时,k=0

 a<=b时,k=0

符合语句功能的只有A。

 

20)有以下程序

    #include

    main()

    {chars[]={“012xy”};inti,n=0;

     for(i=0;s[i]!

=0;i++)

       if(s[i]>=’a’&&s[i]<=’z’)n++;

     printf(“%d\n”,n);

    }

    程序运行后的输出结果是

    A)0      B)2      C)3      D)5

解析:

选B。

考点为字符数组的使用。

C语言用字符数组存放字符串,用\O作为结束标志。

(\0是ASCII码值为0的字符,也即数值0)程序的功能为统计字符数组s中小写字符的个数,n为计数器。

 

(21)有以下程序

    #include

    main()

    {intn=2,k=0;

      while(k++&&n++>2);

      printf(“%d%d\n”,k,n);

    }

    程序运行后的输出结果是

    A)02      B)13      C)57      D)12

解析:

选D。

考点为while语句的使用。

该while(k++&&n++>2);的循环体为空语句,所以程序是输出退出while循环后k、n的值。

k++为先使用k的值再增1。

先使用k的值,k=0,逻辑与结果为。

,第一次执行while循环时条件就不成立,直接退出循环,k的值增1,n的值没有任何改变。

 

(22)有以下定义语句,编译时会出现编译错误的是

    A)chara=’a’;

    B)chara=’\n’;

    C)chara=’aa’;

    D)chara=’\x2d’;

解析:

选C。

考点为字符型变量的赋值和基本概念。

字符型为单引号括起的一个字符。

A为标准的字符型赋值方法,

B为把一个转义字符赋值给字符变量,也是正确的。

C为单引号括起的两个字符,不符合字符型定义。

D表面看上去是错误的,其实是正确的,也是一个转义字符。

‘/x2d’表示ASCII码值为16进制数2d的字符,即‘-’号。

 

(23)有以下程序

#include

main()

{charc1,c2;

 c1=’A’+’8’-‘4’;

 c2=’A’+’8’-‘5’;

 printf(“%c,%d\n”,c1,c2);

}

已知字母A的ASCII码为65,程序运行后的输出结果是

    A)E,68      B)D,69      C)E,D      D)输出无定值

解析:

选A。

考点为字符型数据的使用和基本知识。

字符型数据在存中存放的是字符的ASCII码值,可以作为整型数据来处理。

英文字符和数字在ASCII码表中是按顺序排列的。

 c1=‘A’+‘8'-‘4’=‘A’+‘4’=E              c2=‘A’+‘8’-‘5’=‘A’+3=‘D’

 

(24)有以下程序

    #include

    voidfun(intp)

    {intd=2;

      p=d++;printf(“%d”,p);}

    main()

    {inta=1;

     fun(a);printf(“%d\n”,a);}

    程序运行后的输出结果是

    A)32      B)12      C)21      D)22

解析:

选C。

考点为函数参数的传递。

c语言中函数参数的传递是值传递,是把实参的值传给形参,是单向传递,形参的改变不会影响到实参的值。

程序中,把实参a的值传给形参p,p=1,然后p=d++,再次赋值后p=2.输出p的值2。

返回到主程序中,输出a的值1。

(形参p的改变不会影响到实参a的值,a的值仍为1)

 

(25)以下函数findmax拟实现在数组中查找最大值并作为函数值返回,但程序中有错导致不能实现预定功能

#defineMIN-2147483647

    intfindmax(intx[],intn)

    {inti,max;

      for(i=0;i

      {max=MIN;

        if(max

      returnmax;

    }

    造成错误的原因是

    A)定义语句inti,max;中max未赋初值

    B)赋值语句max=MIN;中,不应给max赋MIN值

    C)语句if(max

    D)赋值语句max=MIN;放错了位置

解析:

选D。

考点为求最大值的算法。

max=MIN.不应该放在循环,而应该放到for循环的前面。

先让max取最小的整数,这样第1次循环时max就可以取得第1个数组元素的值,然后在循环中把后面的数组元素依次和max比较,让max取大值。

 

(26)有以下程序

    #include

    main()

    {intm=1,n=2,*p=&m,*q=&n,*r;

      r=p;p=q;q=r;

      printf(“%d,%d,%d,%d\n”,m,n,*p,*q);

    }

    程序运行后的输出结果是

    A)1,2,1,2      B)1,2,2,1      C)2,1,2,1      D)2,1,1,2

 解析:

选B。

考点为指针的基本概念。

p、q为指针,初始化时p指向m,q指向n。

执行r=p;p:

q;q:

r;后,p和q的值交换,从而p指向n,q指向m。

指针的改变不会影响m、n的值,最后*p和*q的值为n、m的值。

 

(27)若有定义语句:

inta[4][10],*p,*q[4];且0≤i<4,则错误的赋值是

    A)p=a

    B)q[i]=a[i]

    C)p=a[i]

    D)p=&a[2][1]

解析:

选A。

考点为指向二维数组的指针的用法。

 p为基类型为int的指针,指向一个整型数据,也就可咀指向一个数组元素,所以D正确。

 a是二维数组名,存放二维数组的首地址,但二维数组名是一个行指针,其基类型为具有10个元素的一维数组。

所以A错误,二者基类型不一致(p+1指向下一个元素,而a+l指向二维数组的下一行)。

如果p定义为int(*p)[10],才可以赋值p=a。

在C语言中,二维数组a[4][10]可以看做是由4个元素组成的一维数组,这4个元素为a[0]、a[l]、a[2]、a[3],而其中每个元素又是由10个元素组成的维数组。

 在这里,a[i]也是一个数组名,可以表示一维数组的首地址,但a[i]是一个列指针,基类型为int.指向一维数组的第1个元素。

同时,指针数组q的每个数组元素q[i]的基类型也为int,所以p、a[i]、q[i]的基类型一致,选项B、C是正确的。

 

(28)有以下程序

    #include

    #include

    main()

    {charstr[][20]={“One*World”,“One*Dream!

”},*p=str[1];

      printf(“%d,”,strlen(p));printf(“%s\n”,p);

    }

    程序运行后的输出结果是

    A)9,One*World

    B)9,One*Dream

    C)10,One*Dream

    D)10,One*World

解析:

选C。

考点为二维字符数组的使用和strlen()函数的使用。

初始化p=str[l]后,p指向第二个字符串“One*Dream!

”。

strlen()函数计算字符串的长度时不包括结束标志,所以strlen(p)=10。

 

(29)有以下程序

    #include

    main()

    {inta[]={2,3,5,4},i;

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

      switch(i%2)

      {case0:

switch(a[i]%2)

             {case0:

a[i]++;break;

              case1:

a[i]--;

             }break;

        case1:

a[i[=0;

}

for(i=0;i<4;i++)printf(“%d”,a[i]);printf(“\n”);

}

    A)3344

    B)2050

    C)3040

    D)0304

解析:

选C。

考点为switch语句。

外部switch语句在循环中被执行4次。

i=0时,执行case0. 部switch语句也执行case0, a[i]++   a[0]=3  

i=1时,执行case1,a[l]=0 排除法,只有C正确。

i=2时,执行case0. 部switch语句执行case1. a[i]--   a[2]=4

i=3时,执行case1,a[3]=0 最后依次输出为:

3040

 

(30)有以下程序

    #include

#include

    main()

{chara[10]=”abcd”;

 printf(“%d,%d\n”,strlen(a),sizeof(a));

}

程序运行后的输出结果是

    A)7,4       B)4,10       C)8,8       D)10,10

解析:

选B。

考点为strlen()函数和sizeof()运算符的使用。

   strlen()函数计算字符串的长度时,遇到结束标志为止,且长度不包括结束标

志,所以strlen(a)=4,排除法选B。

   sizeof()运算符的操作数可以是类型名或变量名、数组名等,当操作数是数组名时,其结果是数组的总字节数,所咀sizeof(a)=10。

 

(31)下面是有关C语言字符数组的描述,其中错误的是

    A)不可以用赋值语句给字符数组名赋字符串

    B)可以用输入语句把字符串整体输入给字符数组

    C)字符数组中的容不一定是字符串

    D)字符数组只能存放字符串

解析:

选D。

考点为字符数组的使用。

字符数组名是数组首地址,是常量,不能被重新赋值,所以A正确。

可以用scanf(“%s”,str)对字符串整体输入,str可以是字符数组名或者字符指针,所以B正确。

C和D说法对立,必定有一个正确,用排除法A、B选项根本不用看。

字符数组的所有元素可以只存放普通字符,不存放结束标志。

所以D错误。

 

(32)下列函数的功能是

    fun(char*a,char*b)

    {while((*b=*a)!

=’\0’){a++,b++;}}

    A)将a所指字符串赋给b所指空间

    B)使指针b指向a所指字符串

    C)将a所指字符串和b所指字符串进行比较

    D)检查a和b所指字符串中是否有’\0’

 解析:

选A。

考点为指针的概念及while循环。

While循环条件为:

(*b=*a)!

='\0’,执行时先把指针a所指向的字符赋给指针b所在存单元,如果该字符不是结束标志“\0”,执行循环体a++;b++;,指针a、b分别指向下一个字符单元。

再判断循环条件,如果成立,继续把指针a所指向的字符赋给指针b所在存单元,直到遇到结束标志为止。

所以正确答案为A。

 

(33)设有以下函数

      voidfun(intn,char*s){……}

    则下面对函数指针的定义和赋值均是正确的是

    A)void(*pf)();pf=fun;

    B)viod*pf();pf=fun;

    C)void*pf();*pf=fun;

    D)void(*pf)(int,char);pf=&fun;

解析:

选A。

考点为指向函数的指针的用法。

函数名代表函数的入口地址。

指向函数的指针应该定义为void(*pf)()。

如果定义为void*pf(),则表示函数pf返回值为一个基类型为void的指针。

综上,所以正确答案为A。

 

(34)有以下程序

    #include

    intf(intn);

    main()

    {inta=3,s;

      s=f(a);s=s+f(a);printf(“%d\n”,s);

    }

    intf(intn)

    {staticinta=1;

      n+=a++;

      returnn;

    }

    程序运行以后的输出结果是

    A)7       B)8       C)9       D)10

解析:

选C.考点为静态局部变量的使用。

   主函数和f函数中的a都为局部变量,作用域都在本函数之,互不影响。

f函数中的a为静态局部变量,占用固定的存单元,下一次调用时仍可保留上次调用时的值。

也就是说,如果多次调用f函数,a的定义只在第一次调用时有效,从第二次调用开始,a的定义相当于不存在,直接使用a的值。

主函数中调用了2次f(a),第一次调用,s=f(a)=f(3) f函数:

n=3 a=l   n=n+(a++)=4 a=2 返回n,主函数s=4。

第二次调用,s=s+f(a)=4+f(3)(a值为主函数中的a值) f函数n=3 a=2   n=n+(a++)=5 a=3 返回n,主函数s=4+f(3)=4+5=9 最后输出s的值为9。

 

(35)有以下程序

    #include

    #definef(x)x*x*x

    main()

    {inta=3,s,t;

      s=f(a+1);t=f((a+1));

      printf(“%d,%d\n’,s,t);

    }

    程序运行后的输出结果是

    A)10,64       B)10,10       C)64,10      D)64,64

解析:

选A。

考点为带参数的宏定义。

宏定义中的参数授有类型,仅为字符序列,不能当作表达式运算。

宏展开时,把实参字符串原样写在替换文本中。

s=f(a+l)=a+l*a+l*a+l=10

t=f((a+1))=(a+1)*(a+1)*(a+1)=64

 

(36)下面结构体的定义语句中,错误的是

    A)structord{intx;inty;intz;};structorda;

    B)structord{intx;inty;intz;}structor

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 幼儿读物

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1