Struts | Macromedia | SQL Server | Oracle | UNIX | Sun Solaris | Tomcate | ASP | Linux | MySQL
C# | VS.NET | VB.NET | ASP.NET | XML | Java | JSP | J2EE | WebSphere | IBM AIX | Web Services
首页 | IT资讯 | IT指南 | 学习资料 | 经验交流 | 技术动态 | 职业资讯 | IT论坛 | 下载 | 书店 | WebLogic
位置:首页 职业咨讯
我的学习课堂  会员登录  新用户注册
推荐:05年9月等级考试二级C语言考前密卷(六)
05年9月等级考试二级C语言考前密卷(六)
[ 作者:考试无忧  来源:中国考试网 ]

(28)以下选项中,非法的字符常量是 ______。
  A)'\t'    B)'\17'      C)"\n"      D)'\xaa'
  答案:C
  评析:C语言中字符常量是以单引号括起来的单个字符,或为以"\"与三位八进制数值或两位十六进制数值代替单个字符。
  
  (29)以下程序的输出结果是______ 。
  #include<stdio.h>
  main()
  {
  int a=200;
  #define a lOO
  printf("%d",a);
  #undef a
  printf ("%dt",a);
  }
  A)200 100    B)100 100      C)100 200      D)200 200
  答案:C
  评析:#define宏名的有效范围为定义命令之后到本源文件结束,可以在程序中使用#undef命令终止宏定义的作用域。本题由于#undef的作用,使a的作用范围在#define a 100到#undefa之间,故答案为c。
  
  (30)若有说明:int i,j=2,*p=&i;,则能完成i=j赋值功能的语句是______。
  A)i=*p;    B)*p=*&j;     C)i=&j;      D)i=**p;
  答案:B
  评析:指针是一种用来存放变量地址的特殊变量。本题中指针变量p用于存放整型变量i的地址,改变*p的值即为改变i的值。又因为"&"和"∥两个运算符的优先级别相同,按自右而左的方向结合,所以。&j先进行&j运算,得j的地址,再进行+运算,取所得地址里面的值,故t&j与i等价。
  
  (31)假定int类型变量占用两个字节,若有定义:int x[10]={0,2,4};,则数组x在内存中所占字节数是______。
  A)3       B)6         C)10        D)20
  答案:D
  评析:当数组定义后,系统就为其分配内存空间,而不论其中有没有内容。因此,本题中数组x[10]不论是否为其元素初始化,它所分配的存储空间仍为2+10=20个字节。
  
  (32)执行以下的程序段后,m的值是______。
  int a[2][3]={{l,2,3},{4,5,6}};
  int m,*p;
  p=&a[0][0];
  m=p[41;
  A)4       B)5         C)3         D)不确定
  答案:B
  评析:程序中定义了一个指向整型变量的指针变量,并对其赋值为二维整型数组a的首元素的地址。P[4]等价于*(p+4),即二维数组a中第四个元素的值,而a是一个2*3的二维数组,其第四个元素为a[1][1],即5。
  
  (33)以下程序的输出结果是______。
  main()
  {int i,a[10];
  for(i=9;i>=O;i--) a[i]=lO-i;
  printf("%d%d%d",a[2],a[5],a[8]);
  }
  A)258      B)74l        C)852        D)369
  答案:C
  评析:在本题运行时主要注意的是当i=9时,a[i]=10-9=1;i=8时,a[i]=10-8=2;i=7时,a[i]=10-7=3:……依此类推,,直到i=0时,a[i]=10-0=10;此时,i的值已变为.1,判断for的循环条件,不成立,然后输出a[2],a[5],a[8]分别为8,5,2。
  
  (34)下面程序的输出结果为______ 。
  #include<string.h>
  main()
  {
  char pl[7]="abc",p2[]="ABC",str[50]= "xyz";
  strcpy(str,strcat(pl,p2));
  printf("%s",str);
  }
  A)xyzabcABC  B)abcABC       C)xyzabc      D)xyzABC
  答案:B
  评析:strcpy(strl,s1):作用是将字符串s1拷贝到字符数组strl中去。strcat(字符数组1,字符数组2):把。字符串2接到字符串l的后面,结果放在字符数组1中,函数调用后返回字符数组l的地址。
  本题定义了三个字符数组pl,p2,str,strcat(p1,p2)函数的作用是将字符串数组p2接到字符串p1的后面,结果放在字符数组p1,再通过sffcpy()函数将该字符串拷贝到str数组中,原str数组中的字符串xyz被覆盖,因此打印输出字符串str即可得到abcABC。
  
  (35)以下数组定义中不正确的是______。
  A)int a[2Ⅱ3];        B)int b[][3]={0,1,2);
  C)int c[100][100]={0};    D)int d[3][]={{l,2},{l,2,3},{1,2,3,4}};
  答案:D
  评析:一维数组的定义方式为:
  类型说明符数组名[常量表达式];
  选项A符合此定义形式,正确;c语言中多维数组赋初值时可以部分赋值,也可以不指定除第一维以外的其它维的大小,故选项c正确;另外,如果对全部数组元素都赋初值,则定义数组时对第一维的长度可以不指定,但第二维的长度不能省,所以选项B正确,而选项D是错误的。
  
  (36)以下程序的输出结果是______。
  main()
  { jnt a[4][4]:{{1,3,5},{2,4,6},{3,5,7}};
  printf("%d%d%d%d\n",a[0][3],a[1][2],a[2][1],a[3][0]);
  }
  A)0650     B)1470       C)5430       D)输出值不定
  答案:A
  评析:对未给出初始值的整数数组元素,被缺省初始化为零。
  
  (37)在说明语句:int *f();中,标识符f代表的是______。
  A)一个用于指向整型数据的指针变量  B)一个用于指向一维数组的行指针
  C)一个用于指向函数的指针变量    D)一个返回值为指针型的函数名
  答案:D
  评析:带回指针值的函数,其一般定义形式为:
  类型标识符 *函数名(参数表);
  例如:int *f(x,y);
  其中,f是函数名,调用它以后能得到一个指向整型数据的指针(地址),x,y是函数f的形参。在f的两侧分别为。运算符和()运算符,而()优先级高于s,因此f先与()结合,显然是函数形式。这个函数前面有一个。,表示此函数是指针型函数(函数值是指针)。前面的int表示返回的指针指向整型变量。
  
  (38)以下程序的输出结果是______。
  main()
  { char st[20]= "hello\0\t\\";
  printf("%d%d\n",strlen(st),sizeof(st));
  }
  A)99       B)520       C)1320       D)2020
  答案:B
  评析:c语言中字符串是以'\0'字符结束的,且strlen()函数计算的是'\0'字符前的所有字符的个数。本题中strlen(st)应为5。数组定义以后系统就为其分配相应大小的内存空间,而不论其中有没有内容。sizeof()函数是计算变量或数组的所分配到的内存空间的大小。所以本题的sizeof(st)为20。
  
  (39)下面程序运行后的输出结果是______。
  int d=1:
  fun(int p)
  { static int d=5;d+=p;
  printf("%d",d);return d;
  }
  main()
  {int a=3;printf("%d\n",fun(a+fun(d)));}
  A)6 9 9     B)6 6 9       C)6 15 15      D)6 6 15
  答案:C
  评析:静态局部变量在编译时赋初值,即只赋初值一次,在程序运行时它已有初值。以后每次调用时不再重新赋初值而只是保留上次函数调用结束时的值,而对自动变量赋初值,不是在编译时进行的,而在函数调用时进行,每调用一次函数重新给一次初值,相当于执行一次赋值语句。
  本题在程序开头定义了全局变量d并赋初值1,在被调函数fun()中,定义了静态局部变量d,初值为5。在第一次调用函数fun时,d初值为5,p由主函数传递过来的值为1,则d=d+p=5+l=6,由于d是静态局部变量,在函数调用结束后,它仍保留d=6。再次调用fun函数,d的初值为6,而由主函数传递的p的值为9,则此时d=d+p=6+9=15,最后打印输出d的值并返回主函数。
  
  (40)以下选项中,不能正确赋值的是______。
  A)char s1[10];sl="chest";    B)char s2[]。{'C','t','e','s','t');
  C)char s3[20]= "Chest";    D)char*s4="Ctest\n"'
  答案:A
  评析:c语言中不能将字符串常量直接赋给数组。但在赋初值时可以。
  
  (41)以下程序输出正确的是______。
  alnovep(int *p,int(*a)[3],int n)
  {int i,j;
  for(i=0;i<n;i++)
  for(j=0 ;j<n;j++){ *p=a[i][j];p++;}
  }
  main()
  {int *p,a[3][3]={{1,3,5},{2,4,6}};
  p=(int*)malloc(100);
  amovep(p,a,3);
  printf("%d%d\n",p[2],p[5]);free(p);
  }
  A)56       B)25        C)34         D)程序错误
  答案:A
  评析:本题main函数中定义了指针p和二维数组a,通过函数amovep将数组的值存入指针p所指向的存储单元中,a的各元素分别为:a[0][0]=l,a[0][1]=3,a[0][2]=5,a[1][0]=2,a[l][1]=4,a[1][2]=6,a[2][O]=0,a[2][1]=0,a[2][2]=0a
  通过malloc()函数给指针分配内存空间,free()函数用于释放指针变量所用内存空间。在主函数中通过amovep(p,a,3)调用函数amovep,使得实参p与形参p,实参数组a与形参中指向数组的指针变量共用同一存储空间。最后输出p[2],p[5]为56。
  
  (42)下面程序的输出结果是______。
  #define a 121
  const b=12:
  enum c{a1,a2};
  main()
  {
  printf("%d,%d,%d.",sizeOf(a),sizeOf(b),sizeof(enum C));
  }
  A)121,0,4   B)2,2,2      C)0,2,4      D)0,2,2
  答案:B
  评析:sizeof函数是取变量所占的存储空间的字节数,标识a代表常量121;const b=12;,其中数据类型可以缺省,默认为整型;enum c{al,a2};定义了一个枚举类型enum c,al,a2为枚举元素,在c编译时,对枚举元素按常量处理,它们的值按定义顺序依次为0,1。因此它们的字节数均为2,2,2。
  
  (43)以下程序的输出结果是______。
  struct HAR
  {int x,y;struct HAR *p;} h[2];
  main()
  { h[0].X=1; h[O].y=2;
  h[1].x=3;h[1].y=4;
  h[0].p=&h[1];h[1].p=h;
  printf("%d%d\n",(h[O].p)->x,(h[1].p)->y);
  }
  A)12       B)23         C)14         D)32
  答案:D
  评析:本题中是一个含有两个结点的循环链表。
  c语言中结构体的定义为:.
  struct结构体类型名
  {
  成员项表:
  };
  
  (44)变量a所占的内存字节数是______ 。
  A)4       B)5          C)6          D)8
  Union U
  { char st[4];
  Int i:
  Long l;
  };
  Struct A
  { int c;
  Union U u;
  }a;
  答案:C
  评析:结构体变量所占内存长度是各成员占内存长度之和,而共用体变量所占的内存长度等于最长的成员的长度。本题结构体变量a中成员c为整型占2个字节,共用体变量u最大长度为4个字节,故选C。
  
  (45)以下程序的结果是______。
  int a,b;
  void fun()
  { a=100;b=200;)
  main()
  {int a=5,b=7;
  fun();
  printf("%d%d\n",a,b);
  }
  A)100200    B)57         C)200100      D)75
  答案:B
  评析:全程变量是可以在子函数中对其值作改变,且它也可作为函数间的值传递。但当函数或子函数中定义了与全程变量名称相同的局部变量,则全程变量将被屏蔽。
  
  (46)以下程序的输出结果是______。
  #define M(x,y,z) x*y+z
  main()
  { int a=l,b=2,c=3;
  printf("%d\n",M(a+b,b+c,c+a));
  }
  A)19      B)17         C)15        D)12
  答案:D
  评析:c语言的宏定义包括不带参数的宏定义与带参数的宏定义。本题为带参数的宏定义,其形式为:#define宏名(形参表) 字符串,本题的M(a十b,b+c,c+a)被字符串a+b*b+c+c+a代替。
  
  (47)若有以下说明和语句:
  struct st
  {int n;char *ch;);
  struct st a[3]={5,"abc",7,"def',9,"ghK"},*p=a;则值为6的表达式是______。
  A)p++ ->n    B)p一>n++      C)(*p).n++   D)+十p->n
  答案:D
  评析:根据结构变量的存储特点,p+l意味着增加地址值为结构体数组a的一个元素所占的字节数,'即p++使p由a[0]指向a[1]起始地址。本题++p>n得到p指向的结构体变量中成员n的值使之加l。因为p指向数组a起始地址,p->n的值为5,再执行自加l运行,结果为6。
  
  (48)整型变量x和Y的值相等,且为非O值,则以下选项中结果为0的表达式是______。
  A)x||Y     B)X|Y        C)X&Y        D)X^Y
  答案:D
  评析:"‖"为或运算符,当其左右表达式中只要一个为非零则整个表达式的值1。︱是按位或,&是按位与,^是按位异或,这三位运算符是按值的二进制位来比较的。
  
  (49)C语言中,组成数据文件的成分是______。
  A)记录    B)数据行       C)数据块      D)字符(字节)序列
  答案:D
  评析:c语言中的文件是流式文件。流式文件是一种无结构文件,即整个文件是一串字符流或二进制流。文件的存取以字符或字节为单位。
  
  (50)下面的程序执行后,文件test.t中内容是______。
  #include<stdio.h>
  void fun(char *fname,char *st)
  { FILE *myf;int i;
  myf=fopen(fname, "w");
  for(i=0;i<strlen(st);i++)fputc(st[i],myf);
  fclose(myf);
  }
  main()
  {fun("test.t","new world");fun("test.t","hello,");}
  A)hello,  B)new worldhello C)new world  D)hello,rid
  答案:A
  评析:c语言中文件有文本文件与二进制文件,对文件的使用前必须先打开,打开方式有只读、写入、读写等方式。
  
  二、填空题(每空2分,共40分)
  
  请将每一个空的正确答案写在答题卡的【1】至【20】序号的横线上,答在试卷上不得分。
  
  (1)实现算法所需的存储单元多少和算法的工作量大小分别称为算法的 【1】  。
  答案:【1】空间复杂度和时间复杂度
  评析:算法的复杂性是指对一个在有限步骤内终止算法和所需存储空间大小的估计。算法所需存储空间大小是算法的空间复杂性,算法的计算量是算法的时间复杂性。
  
  (2)数据结构包括数据的逻辑结构、数据的 【2】 以及对数据的操作运算。
  答案:【2】存储结构
  评析:数据结构包括3个方面,即数据的逻辑结构、数据的存储结构及对数据的操作运算。
  
  (3)一个类可以从直接或间接的祖先中继承所有属性和方法。采用这个方法提高了软件的  【3】 。
  答案:【3】可重用性
  评析:继承的优点:相似的对象可以共享程序代码和数据结构,从而大大减少了程序中的冗余,提高软件的可重用性。
  
  (4)面向对象的模型中,最基本的概念是对象和  【4】 。
  答案:【4】类
  评析:面向对象模型中,最基本的概念是对象和类。对象是现实世界中实体的模型化;将属性集和方法集相同的所有对象组合在一起,可以构成一个类。
  
  (5)软件维护活动包括以下几类:改正性维护、适应性维护、 【5】 维护和预防性维护。
  答案:【5】完善性
  评析:软件维护活动包括以下几类:改正性维护、适应性维护、完善性维护和预防性维护。完善性维护是指为了满足用户对软件提出的新功能与性能要求,需要修改或再开发软件,以扩充软件功能、增强软件性能、改进加工效率、提高软件的可维护性。
  
  (6)语句:X++;、++X;、X=X+1;、X=l+X;,执行后都使变量X中的值增l,请写出一条同一功能的赋值语句(不得与列举的相同) 【6】  。
  答案:【6】X+=1:
  评析:在c语言中使变量增l的方法有:自增运算符与赋值语句。其中自增运算符有前置与后置方式,赋值语句也有两种类型。
  本题中的主要增l方式有:x++;、++x;、X=X+I;、x=1+x;、x+=l;。
  
  (7)设Y是int型变量,请写出判断Y为奇数的关系表达式  【7】
  答案:【7】Y%2==1 或Y%2!=0
  评析:判断变量是否为奇数可以用变量与2取模,判断结果是为1或不为0。本题具体做法如下:Y%2==1或Y%2 1=0。
  
  (8) 以下程序的输出是 【8】  。
  main()
  {
  char strl[]="How do you do",*pl=strl:
  strcpy(strl+strlen(strl)/2,"es she");
  printf("%s\n",p1);
  }
  答案:【8】How does she
  评析:strcpy(strl,s1):字符串拷贝函数,作用是将字符串s1拷贝到字符数组strl中去。strlen(str):测试字符串str的长度,函数的值为字符串中实际长度,不包括'\O'在内。本题中strlen(strll的值为13,则strcpy(strl+strlen(strl)/2,"es she",);相当于strcpy(strl+6,"es she");,因此可得答案为How does she。
  
  (9)以上程序运行后的输出结果是 【9】   。
  main()
  {int i=10,J=0;
  do
  {j=j+i;i--;}
  while(i>2);
  printf("%d\n",j);
  }
  答案:【9】52
  评析:do...while语句的形式为:
  do
  {
  语句:
  }while(条件表达式)
  当条件表达式为非零时,继续执行循环体,直到条件表达式为零时退出循环。
  
  (10)设有如下程序:
  main()
  {int nl,n2;
  scanf("%df",&n2);
  while(n2!=0)
  { nl=n2%lO;
  n2=n2/10:
  printf("%d",n1);
  }
  }
  程序运行后,如果从键盘上输入1298,则输出结果为  【10】   。
  答案:【10】8921
  评析:本题的程序的功能是将输入的整数反向输出。
  
  (11)以下程序输出的最后一个值 【11】  。
  Int  ff(int n)
  {static int f=1:
  f=f*n:
  retun f
  }
  main()
  { int i;
  for(i=1;i<=5;i++)printf("%d\n",ff(i));
  }
  答案:【ll】120
  评析:
  静态变量的类型说明符是static,静态局部变量属于静态存储方式,它具有以下特点:
  ①静态局部变量属于静态存储类别,在静态存储区内分配存储单元。在程序整个运行期间都不释放。
  ②对静态局部变量是在编译时赋初值的,即只赋初值一次,在程序运行时它已有初值。以后每次调用函数时不再重新赋初值而只是保留上次函数调用结束时的值。
  ③如在定义局部变量时不赋初值的话,则对静态局部变量来说,编译时自动赋初值0(对数值型变量)或空字符(对字符变量)。(注意:c语言中的非静态变量在定义时,系统并不会自动给它赋初值)
  ④虽然静态局部变量在函数调用结束后仍然存在,但其他函数是不能引用它的。
  本题中函数的功能是:与for语句一起求一个整数的阶乘。
  
  (12)以下函数的功能是:求x的y次方,请填空.
  double fun(double x,int y)
  {int i;
  double z;
  for(i=1,z=x;i<y;i++)z=z* 【12】  ;
  return z:
  )
  答案:【12】x
  评析:函数的定义形式为:
  函数类型函数名(形参表)
  {
  类型说明语句;
  执行语句:
  }
  本题中函数的功能是:累积变量以求得变量的Y次方。
  
  (13)下列程序的输出结果是 【13】   。
  main()
  {
  int a[]={2,4,6},*ptr=&a[0],x=8,y,z;
  for(y=O;y<3;y++)
  z=(*(ptr+y)<x)?*(ptr十y):x;
  printf("%d\n",z);
  }
  答案:【13】6
  评析:条件运算符的优先级高于赋值运算符,因此本题先计算关系表达式(*(ptr+y)<x)?*(ptr+y):x的值,再赋给变量z。当y=O时,*(ptr+y)=2,而x=8,(*ptr+y)<x)条件为真,则整个条件表达式的值为*(ptr+y)=2,所以Z=2;当y=l时,*(ptr+y)=4,(*(pty+y)<x)条件为真,则整个条件表达式的值为*(ptr+y)=4,所以z=4;当y=2时,*(ptr+y)=6,(*(ptr+y)<x)条件为真,则整个条件表达式的值为*(ptr+y)=6,所以z=6;循环结束。因此输出z的结果为6。
  
  (14)以下程序运行后的输出结果是 【14】  。
  main()
  { char s[]="9876",*p;
  for(p=s;p<s+2;p++)printf("%s\n",p);
  }
  答案:【14】9876
  876
  评析:指针是一种数据类型,这种数据类型的变量用来存放内存中分配的存储单元的首地址。
  指针的定义:
  类型说明符 *指针变量名;
  
  (15)若有定义语句:char s[100],d[100];int j=0,i=0;且s中已赋字符串,请填空以实现拷贝。(注:不使用逗号表达式)
  while(s[i]){d[j]= 【15】    ;j++;}
  d[j]=0;
  答案:【15】s[i++]
  评析:本题中为了能实现字符串的拷贝,需要使字符数组s从头到尾依次遍历其所有元素。本题应使用i的自增后置来实现。
  
  (16)若有如下结构体说明:
  struct STRU
  { int a,b;char c:double d:
  struct STRU *pl,*p2;
  };
  请填空,以完成对t数组的定义,t数组的每个元素为该结构体类型。
  【16】  t[20]
  答案:【16】struct STRU
  评析:结构体类型是构造数据类型,是用户自己定义的一种类型。
  结构体类型的定义:
  struct结构体类型名
  {
  成员项表:
  };
  定义结构体变量的的形式为:
  struct结构体类型名 变量1,变量2,...
  其中变量包括:一般变量、指针变量、数组变量等。
  
  (17)下面的程序可对指定字符串中的字符串进行从大到小排序,请将程序填完整(注:程序采用了冒泡排序算法)
  #include<stdio.h>
  #include<string.h>
  main()
  { char *str="ABCDabcd",temp;
  Int n,i;
  n=strlen(str);
  while(n-->1)
  for(i=0;i<n;i++)
  if(str[i]<str[i+1])
  { temp= 【17】 ;
  str[i]=str[i+1];
  _【18】  =temp;
  }
  Printf(_【19】  );
  }
  答案:【17】str[i]
  【18】str[i+1]
  【19】"%s",str
  评析:本题要求将字符串str中的字符用冒泡排序算法从大到小排列,其实现过程是将相邻两个字符进行比较,如果当前字符小于下一个字符,则通过中间变量temp将字符两两交换,所以第一空应填:str[i],第二空应填:str[i+1]。最终打印输出得到的字符串str,所以第三空应填;"%s",str。
  
  (18)以下程序段打开文件后,先利用fseek函数将文件位置指针定位在文件末尾,然后调  用ftell函数返回当前文件位置指针的具体位置,从而确定文件长度,请填空。
  FILE *myf;long fl;
  myf=_【20】  ("test.t","rb");
  fseek(myf,(),SEEK_END);fl+ftell(myf);
  fclose(myf);
  printf("%l d\n",f1);
  答案:【20】fopen
  评析:C语言中的文件分为:ASCII文件与二进制文件。文件在使用前打开,使用后要关闭。
  打开文件的函数为:fopen(),调用形式为:fp=fopen("文件名","使用文件方式");
  关闭文件的函数为:fclose(),调用形式为:fclose(fp);其中fp为文件指针。
 (28)以下程序的输出结果是_______。
  fun(int x,inty,int z)
  {z=x*x+y*y;}
  main()
  {
  int a=3l:
  fun(5,2,a);
  printf("%d",a);
  }
  A)0  B)29  C)3l  D)无定值
  答案:C
  评析:本题中,a的值并没有改变,因为传递到函数中的是变量值。
  
  (29)下列程序段的输出结果是__________。
  void fun(、int *x,int *y)
  {primf("%d%d",*x,*y);*x=3;*y=4;}
  main()
  {
  int x=l,y=2;
  fun(&y,&x);
  printf("%d%d",x,y);
  }
  A)2 1 4 3  B)1 2 l 2  C)l 2 3 4  D)2 1 l 2
  答案:A
  评析:本题中函数传递的是变量的地址,如果形参在函数中发生改变,相对应的实参也就有了改变。
  
  (30)对于下面的程序
  #include<stdio.h>
  #include<string.h>
  char*scmp(char*s1,char*s2)
  {
  if(strcmp(sl,s2)<0)retum(s1);
  else return(s2);
  }
  main()
  {
  int i;char string[20],str[3][20];
  for(I=0;i<3;i++)gets(str[i]);
  strcpy(string,scmp(str[0],str[1]));
  strcpy(string,scmp(string,str[2]));
  printf("%s\n",string);
  }
  若运行时依次输入:abcd、abba和abc三个字符串,则输出结果为________。
  A)abcd  B)abba  C)abc  D)abca
  答案:B
  评析:本题自定义函数semp()的作用是比较字符串s1和s2的大小,如果sl<s2,函数返回s1的值,否则返回s2的值。若运行时依次输入abed、abba和abe三个字符串,执行strcpy(string,scmp(str[O],str[1]));后,string的值为abba,再执行strepy(string,scmp(string,str[2]));,由于scmp(string,str[2])返回string的值
  abba,再拷贝到字符串数组string中,所以本题输出abba。
  
  (31)下列程序的输出结果是__________。
  main()
  {
  char a[10]={9,8,7,6,5,4,3,2,1,O},*p=a+5;
  print"%d*--p);
  }
  A)非法  B)a[4]的地址  C)5  D)3
  答案:C
  评析:本题中char*p=a+5;即相当于p=&a[5],而--p,是先要减1,则printf语句要输出的值就是a[4]。
  
  (32)对下面的程序进行编译与连接生成可执行文件c.exe,并在DOS命令提示符下输入:
  c I said"I love China"!
  程序代码如下:
  main(、int argc,char*argv[])
  {
  printf("%d",argC);
  }
  其输出结果为________。
  A)4  B)5  C)6  D)7
  答案:B
  评析:带参数的main()函数常用形式为:main(int argc,ehar*argv[])
  其中,参数的个数由C程序运行时自动计算出来。字符型指针数组argv的第一个元素存放命令名,其后各个元素依次存放命令行中各个参数的首地址;整型变量arge用来记录命令行中的参数个数,文件名也作为一个参数,对于命令行中双引号内的字符串,即使有空格分开,也只算是一个参数,同时双引号本身不算参数的内容,因此本题argc的值等于5
  
  (33)下列程序的运行结果是________。
  void fun(int *a,int *b)
  {
  int *k:
  k=a;a-b;b=k;
  }
  main()
  {
  int a=3,b=6,*x=&a,*y=&b;
  fun(x,y);
  printf["%d%d.f,a,b);
  }
  A)6 3  B)3 6  C)编译出错  D)0 0
  答案:B
  评析:本题中主函数里的x、y,fun函数里的a、b、k,这些都是指针,fun函数中只是将a、b这两个指针交换了位置,而并没有改变主函数中变量a、b的值。
  
  (34)若有定义:int*p[3];,则以下叙述中正确的是________。
  A)定义了一个基类型为int的指针变量p,该变量有三个指针
  B)定义了一个指针数组p,该数组含有三个元素,每个元素都是基类型为int的指针
  C)定义了一个名为+p的整型数组,该数组含有三个int类型元素
  D)定义了一个可指向一维数组的指针变量p,所指一维数组应具有三个int类型元素
  答案:B
  评析:由于运算符[]优先级比*高,int*p[3];相当于int *(p[3]);表示数组p的三个元素都是指针变量,且每个元素都是基类型为int的指针。
  
  (35)有以下程序:
  void swapl(int *a,int *b)
  {int *c=a;
  a=b,b=c;
  }
  void swap2(int *a,int *b)
  {
  int c=*a:
  *a=*b,*b=c;
  }
  main()
  (int a=lO,b=15;
  swapl(&a,&b);
  printf("%d,%d,",a,b);
  a=lO,b=15;
  swap2(&a,&b);
  printf("%d,%dt.,a,b);
  }
  其输出结果为_________。
  A)15,10,10,15  B)15,10,15,10  C)10,15,10,15  D)10,15,15,10
  答案:D
  评析:C语言规定,实参变量对形参变量的数据传递是"值传递",只由实参传给形参,而不能由形参传回来给实参。在内函数调用结束后,形参单元被释放,实参单元仍保留并维持原值。本题中swapl()函数中,虽然改变了形参指针的值,但实参指针的值并没有改变,所以执行第一个printf后应输出10,15,;swap2()函数实现了交换两个变量a和b的值,因此执行第二个printf后输出交换后的值15,10,所以本题答案为D。
  
  (36)当调用函数时,实参是一个数组名,则向函数传送的是__________。
  A)数组的长度       B)数组的首地址
  C)数组每一个元素的地址  D)数组每个元素中的值
  答案:B
  评析:当调用函数时,实参是一个数组名,则向函数传送的是数组的首地址,函数中的形参可定义成以下三种形式:
  ①形参定义成数组;
  ②形参定义成可变长数组;
  ③形参定义为指针变量。
  
  (37)下面的程序输出结果是________。
  #define r16
  #ifr==16
  void p(int a)
  {
  printf("%x",a);
  }
  #else
  voidp(int a)
  {
  printf("%d",a);
  }
  #endif
  main()
  {
  p(32);
  }
  A)32  B)20  C)编译时错误 D)运行时错误
  答案:B
  评析:"#define r16"的作用是指定用标识符r来代替16,因此程序编译时只编译#if部分,故程序运行时,打印输出十六进制的32,即20。
  
  (38)设有以下声明语句
  struct ex
  {  intx;floaty;char z;}example;
  则下面的叙述中不正确的是_________。
  A)struct是结构体类型的关键字  B)example是结构体类型名
  C)x,y,z都是结构体成员名    D)struct ex是结构体类型
  答案:B
  评析:example是结构体变量名。
  
  (39)以下只有在使用时才为该类型变量分配内存的存储类说明是_________。
  A)auto和stmic      B)auto和register
  C)register和static   D)extem和register
  答案:B
  评析:extem、register、static、auto分别是定义外部变量、寄存器变量、静态变量、自动变量,其中,自动变量和寄存器变量属于动态存储,调用时临时分配单元;而静态变量和外部变量属于静态存储,在整个程序运行时都存在。
  
  (40)下面程序运行后的输出结果是__________。
  fut(int**s,int p[2][3])
  {
  **s=p[l][1];
  }
  main()
  {
  int a[2][3]={1,3,5,7,9,1l},*p;
  p=(int*)malloc(sizeof(int));
  fut(&p,a);
  printf("%d\n",*p);
  }
  A)l  B)7  C)9  D)ll
  答案:C
  评析:本题a[2][3]定义为一个具有两行三列的元素的数组,malloc()函数的作用是开辟了一个长度为sizeof(int)的内存区,p为指向整型数据的指针变量,程序调用fur()函数,将第一行第一列对应的元素值赋给一s,由于数组中第一行第一列对应的元素为9,所以本题输出值9。
  
  (41)以下程序的输出结果是_________。
  main()
  {
  inti,k,a[10],p[3];
  k=5;
  for(I=O;i<10;i++)a[i]=i;
  for(i=0;i<3;i++)p[i]=a[I*(i+1)];
  fbr(i=O;i<3;i++)k+=p[I]*2;
  printf("%d\n",k);
  }
  A)20  B)2l  C)22  D)23
  答案:B
  评析:按照程序的流程走一遍,可以得到,p[O]=0,p[1]=2,p[3]=6;执行三次k+=p[i]*2,相当于k=5+0*2+2*2+6*2=21
  
  (42)当执行下面的程序时,其输出结果为__________。
  union st
  {
  int a:
  charb:
  }
  main()
  {
  union st s:
  char*p=(char*)&s;
  s.a=Ox3132;
  s.b=Ox33;
  printf("%c",*p);
  }
  A)l  B)2  C)3  D)不确定
  答案:C
  评析:共用体类型结构的特点是使几个不同的变量共占同一段内存,但在每一瞬时只能存放其中一种,而不是同时存放几种,共用体变量中起作用的成员是最后一次存放的成员,在存入一个新的成员后原有的成员就失去作用。因此本题起作用的是成员b的值,所以程序打印输出3。
  
  (43)当执行下面的程序时,如果输入ABc,则输出结果是________。
  #include"stdio.h"
  #include"string.H"
  main()
  { char ss[10]="12345";
  gets(ss);strcat(ss,"6789");
  printf("%s\n",ss);
  }
  A)ABC6789  B)ABC67  C)12345ABC6  D)ABC456789
  答案:A
  评析:strcat(str1,str2)合并字符串函数的作用是把str2所指字符串的内容连接到strl字符串的后面,自动删去strl原来串中的'\0'。为了进行这项操作,要求strl所指的字符串后面有足够的空间来容纳'str2所指字符串中的内容。函数值为strl所指第一个字符的地址。
  
  (44)main(im argo,char*argv[])
  {
  while(--argc>0)printf("%s",argv[argc]);
  printf("\n");
  }
  假定以上程序经编译和连接后生成可执行文件PROG.ExE,如果在此可执行文件所
  在目录的Dos提示符下键入:PROG ABcDEFGHIJKL↙,则输出结果为_________。
  A)ABCDEFG     B)IJHL
  C)ABCDEFGHIJKL   D)lJKLABCDEFGH
  答案:C
  评析:本题主函数带有两个参数,一个int型变量argc,另一个是char型的一维一级指针数组argv。当主函数被执行时,系统自动将根据命令行的情况,分别给主函数的两个参数赋值。Arge中存放命令行中命令字和参数的总和的个数,argv用来存放命令行中命令字和所有参数的字符串的,并规定argv[0]存放命令字字符串,argv[1]用来存放第一个参数的字符串,argv[2]用来存放第2个参数的字符串,依次类推。
  题中argc的值是2,执行完--argc后为1,输出argv[1],此数组存在第一个参数的字符串ABCDEFGHIJKL。
  
  (45)设char型变量x中的值为10100lll,则表达式(2+x)"(~3)的值为_________。
  A)10101001  B)10101000  C)lll11101  D)0101010l
  答案:D
  评析:异或运算符(n)的运算规则是:参加运算的两个相应位同号,则结果为0(假):异号则为-1(真)。
  取反运算符(~)的运算规则是:对一个二进制数按位取反,即将0变为l,l变为O。本题(~3)是对3(二进制形式为00000011)按位取反即11111100。
  表达式(2+x)n(~3)的值就等价于(00000010+10100111)^11111100,结果为01010101。
  
  (46)以下程序的输出结果是________。
  long fun(int n)
  {  long s;
  if(n==1‖n==2)s=2;
  else s=n-fun(n-1);
  return S:
  }
  main()
  {primf("%ld\n",fun(3));}
  A)l  B)2  C)3  D)4
  答案:A
  评析:这是一个递归函数。递归的结束条件是,n=l或者n=2。按照程序顺序,即可得出本题结果为l。
  
  (47)以下程序试图把从终端输入的字符输出到名为abe.txt的文件中,直到从终端读入字 符串撑号时结束输入和输出操作,但程序有错
  #include<stdio.h>
  main()
  {
  FILE*fout:
  char ch:
  fout=fopen('abc.txt','w');
  ch=fgetc(stdin);
  while(chI_'))')
  {
  fputc(ch,fout);
  ch=fgetc(stdin);
  }
  fclose(fout);
  }
  出错的原因是_________。
  A)函数fopen调用形式错误  B)输入文件没有关闭
  C)函数龟etc调用形式错误  D)文件指针stdin没有定义
  答案:A
  评析:本题考查的是文件的打开函数fopen(),其调用方式通常为:FLIE*fp;fp=fopen(文件名,使用文件方式);,如:fp=fopen("abc.txt","w");表示要打开名字为abc.txt的文件,使用文件方式写入。fopen函数带回指向abc.txt文件的指针并赋给fp,即审指向文件abc.txt。
  
  (48)以下程序的输出结果是_______。
  #define SQR(X) X*X
  main()
  {  int a=16,k=2,m=l;
  a/=SQR(k+m)/SQR(k+m);
  printf("%d\n",a);
  }
  A)16  B)2  C)9  D)l
  答案:B
  评析:c语言在预编译时遇到带实参的宏名,则按命令行中指定的字符串从左到右进行置换。在做这题时,也不妨将运用置换法。得到:a/=k+m*k+m/k+m*k+m=16/7=2。注:a为整型,所以在做除法时,自动取整。
  
  (49)假定建立了以下链表结构,指针p、q分别指向如图所示的结点,则以下可以将q所指结点从链表中删除并释放该结点的语句组是________。
  ↓p          ↓q
  8
  4
  3
  head→      →…→        →       →……
  datanext
  A)free(q);p->next=q->next;
  B)(*p).next=(*q).next;free(q);
  C)q=(*q).next;(*p).next=q;free(q);
  D)q=q->next;p->next=q;p=p->next;free(p);
  答案:B
  评析:选项A的错误在于,先已经把q结点给释放,无法再进行余下语句了:选项c和D的错误在于因为有了q=(*q).next做了赋值,则free(q)释放了原来q后面的一个结点。
  
  (50)以下程序的输出结果是__________。
  main()
  {  int x=05;char z='a';
  printf("%d\n",(x&1)&&(z<'z'));)
  A)0  B)1  C)2  D)3
  答案:B
  评析:"&"是位运算符表示按位与运算,"&&"是逻辑运算符当其两边的表达式都为真时返回真值。关系表达式()&1)&&(z<'z'),(x&1)为真,(Z<'Z')也为真,两者相与,自然也为真,以整型输出,则输出1。
  
  二、填空题(每空2分,共40分)
  
  请将每一个空的正确答案写在答题卡的【1】至【20】序号的横线上,答在试卷上不得分。
  
  (1)栈的基本运算有三种:入栈、退栈和 【1】 。
  答案:【1】读栈顶元素
  评析:栈的基本运算有三种:入栈、退栈和读栈项元素。
  入栈运算是指在栈项位置插入一个新元素。这个运算有两个基本操作:首先将栈顶指针进一(即top加1),然后将新元素插入到栈顶指针指向的位置。
  退栈运算是指取出栈顶元素并赋给一个指定的变量。这个运算有两个基本操作:首先将栈顶元素(栈项指针指向的元素)赋给一个指定的变量,然后将栈项指针退一(即top减1)。
  读栈顶元素是指将栈顶元素赋给一个指定的变量。这个运算不删除栈顶元素,只是将它的值赋给一个变量。
  
  (2)在面向对象方法中,信息隐蔽是通过对象的 【2】 性来实现的。
  答案:【2】封装
  评析:软件工程的基本原则包括抽象、信息隐蔽、模块化、局部化、确定性、一致性、完备性和可验证性。
  信息隐蔽是指采用封装技术,将程序模块的实现细节隐藏起来,使模块接口尽量简单。
  
  (3)数据流的类型有 【3】 和事务型。
  答案:【3】变换型
  评析:典型的数据流类型有两种:变换型和事务型。
  变换型:是指信息沿输入通路进入系统,同时由外部形式变换为内部形式,进入系统的信息通过变换中心,经加工处理以后再沿输出通路变换成外部形式离开软件系统。
  事务型:在很多软件应用中,存在某种作业数据流,它可以引发一个或多个处理,这些处理能够完成该作业要求的功能,这种数据流就叫做事务。
  
  (4)数据库系统中实现各种数据管理功能的核心软件称为 【4】 。
  答案:【4】数据库管理系统或DBMS
  评析:数据库管理系统是数据库的机构,它是一种系统软件,负责数据库中的数据组织、数据操纵、数据维护、控制及保护和数据服务等。数据库管理系统是数据库系统的核心。
  
  (5)关系模型的数据操纵即是建立在关系上的数据操纵,一般有 【5】  、增加、删除  和修改四种操作。
  答案:【5】查询
  评析:关系模型的数据操纵即是建立在关系上的数据操纵,一般有查询、增加、删除和修改四种操作。
  数据查询:用户可以查询关系数据库中的数据,它包括一个关系内的查询以及多个关系间的查询。
  数据删除的基本单位是一个关系内的元组,它的功能是将指定关系内的指定元组删除。
  数据插入仅对一个关系而言,在指定关系中插入一个或多个元组。
  数据修改是在一个关系中修改指定的元组和属性。
  
  (6)下列程序的输出结果是 【6】 。
  main()
  {
  int a=l,b=2;
  a=a+b;b=a-b;a=a-b;
  printf("%d,%d\n",a,b);
  }
  答案:【6】2,1
  评析:本题中,执行a=a+b时,a=l,b=2,a=l+2=3;b=a-b时,a=3,b=2,b=3-2=1;a=a-b时,a=3,b=l,a=3.1=2;因此,本题的输出是2,1.
  
  (7)下列程序的输出结果是16.00,请填空;,
  main()
  {
  int a=9,b=2:
  float x= 【7】 ,y=1.1,z;
  z=a/2+b*x/y+l/2;
  printf("%5.2tin",z);
  }
  答案:【7】6.6
  评析:本题,已知结果z=16.00,即16.0=a/2+b*x/y+l/2,分别把a、b代入,得到16.0=9/2+2"x/1.1+1/2。
  因为a=9,a是整型,所以9/2的值在没有进行类型转换时,等于4,1/2同理,等于0。代入求一元一次方程,很容易就可以得出x=6.6。
  
  (8)用以下语句调用库函数malloc,使字符指针st指向具有11个字节的动态存储空间,  请填空。
  st=(chhr*) 【8】 ;
  答案:181 malloc(11)
  评析:malloc函数的格式是:void*(或char*)malloc(size),size表示应分配的存储区。此题要分配11字节的单元,把11代入即可。
  
  (9)下列程序段的输出结果是 【9】 。
  main()
  {char b[]="Hello,you";
  b[5]=0;
  printf("%s\n",b);
  }
  答案:【9】Hello
  评析:字符串中,数值0或符号'\O'表示字符串的结束。本题中,b[5]被赋了0值,表明字符串b的第六个字符就是结束标志。因此,只输出前五个字符,即Hello。
  
  (10)下列程序段的输出结果是 【10】 。
  int n='c':
  switch(n++)
  {default:printf("error");break;
  case。a':
  case'A。:
  caseIb':
  tase'B':printf("good");break;
  case'c':case'C':printf("pass");
  case'd':case'D':printf("warn");
  }
  答案:【10】passwarn
  评析:n++是在执行完其所在的语句后再加l,因此,在执行case的时候,n的值依然为'c',执行case'c'后面的语句,先打印出"pass";在执行完case'c'后,未遇到break跳出switch,便接着执行下面的语句,又打印出warn。所以此题输出结果是:passwarn。
  
  (11)以下程序通过函数指针p调用函数mn,请在填空栏内,写出定义变量p的语句。
  void fun(int'x,int*y)
  { …… }
  main()
  { int a=lO,b=20;
  【11】 :
  p=fun; p(&a,&b);
  ……
  }
  答案:【11】void(*p)();
  评析:要定义p为指向函数的指针变量,需写成:void(*p)();注意+p两侧的括弧不可以省略,表示p先与*结合,是指针变量,再与后面的()结合,表示此指针变量指向函数,这个函数无返回值(同fun函数)。
  
  (12)以下程序的输出结果 【12】 。
  main()
  {
  int p[7]={ll,13,14,15,16,17,18};
  int i=0,J=0;
  while(1<7&&p[i]%2==1)j+=p[i++];
  printf("%d\n"J);
  }
  答案:【12】24
  评析:本题程序定义了一维数组p,有七个数组元素,整型变量i,.j初值分别为0,当while的条件表达式(i<7&&p[i]%2==1)的值为真时,执行语句j+=p[i++];,如:当i=0时,i<7为真,p[I]%2=11%2=1,表达式(p[i]%2:=1)的值为真,所以整个表达式(i<7&&p[i]%2==1)的值为真,执行j=j+p[i++]=0+11=11,i=l;依次类推可以得出答案24。
  
  (13)下列程序的输出结果是 【13】  。
  void fun(int *n)
  {
  while((*n)--);
  printf("%d",++(*n));
  }
  main()
  { int a=100;
  fun(&a);
  }
  答案:【13】0
  评析:在函数fun()中,while((*n)--)是先引用+n的值,再做(*n)--运算,所以循环结束时*n的值为O,再做(+n)--运算后,*n的值为-1;执行++(*n)后,*n的值是O。
  
  (14)以下程序的输出结果是 【14】 。
  main()
  {
  int arr[]={30,25,20,15,10,5},*p=arr;
  p++;
  printf("%d\n",*(p+3));
  )
  答案:【14】10
  评析:整型指针最初被赋的值是数组art的头指针,即指向数组的第一个元素30,p++后,指针指向数组的下一个元素,即*p=arr[1]=25,在执行*(p+3)时,则相当于a[1+3],即10。因此,输出应为10。
  
  (15)以下程序运行后的输出结果是 【15】 。
  main()
  {
  char a[]="Language",b[]="Programe";
  char *p1,*p2;
  int k:
  pl=a,p2=b;
  for(k=0;k<=7;k++)
  if(*(pl+k)==*(p2+k))printf("%c",*(pl+k));
  }
  答案:【15】gae
  评析:本题定义了两个字符串数组a[],b[],字符型指针变量p1和p2,且分别指向字符串数组a和b,执行for循环,当if(*(pl+k)==*(p2+k))条件为真,执行输出*(pl+k)对应的字符。即当k=0时,*(pl+k)对应的字符串数组a.中的字符L,*(p2+k)对应的字符串数组b中的字符P,因此if(*(pl+k)==*(p2+k))条件为假,不执行printf语句,依次类推,将字符串数组a和b中对应位置上的字符一一比较,如果对应位置上的字符相同,则输出该字符。
  
  (16)下面程序把从终端读入的文本(用@作为文本结束标志)输出到一个名为bi.dat的新文  件中,请填空。
  #include "stdio.H"
  FILE *fp;
  main()
  {  char ch;
  if((fp=fopen( 【16】 ))==NULL)exit(0);
  while((ch=getchar())!='@')fputc(ch,fp);
  fclose(fp);
  }
  答案:【l6】"bi.Dat", "w"或"bi.dat","w+"或"bi.dat","r+"
  评析:本题的考点是fopen()函数,此函数的格式是fopen(文件名,使用文件方式),题目的要求是将从键盘读入的文本写到文件中,因此选择的打开方式应该是"w"(只写)。或者是读写"r+"或"w+"。
  
  (17)以下程序是从终端读入数据到数组中,统计其中正数的个数,并计算它们的和。请填空。
  main()
  {
  int i,a[20],sum,count;
  sum=count= 【17】 ;
  for(i=0;i<20;i++)scanf("%d", 【18】  );
  for(i=0;i<20;i++)
  {
  if(a[I]>0)
  { count++;
  sum+=  【19】 ;
  }
  }
  printf("sum=%d,count=%d\n",sum,count);
  }
  答案:【17】0
  【18】&a[i]
  【19】a[i]
  评析:本题要求从终端读入数据到数组中,统计其中正数的个数,并计算它们的和。程序中首先要对存放正数个数的变量count及存放和值的变量sum初始化为0,所以第一空应填:0。接着要求从终端读入数据到数组中,可以通过scanf函数实现,因此第二空应填:&a[i]。最后通过sum+=a[i];语句累加正数a[i]的值到sum中,因此第三空应填:a[i]。
  
  (18)若变量n中的值为24,则pint函数共输出 【20】 行。
  void prnt(int n,int aa[])
  { int i;
  for(I=1;i<=n;i++)
  {  printf("%6d",aa[I]);
  if(!(i%5,J)printf("\n");
  }
  printf("\n");
  }
  答案:【20】5
  评析:本题的关键在于if(!(i%5))printf("\n");这句,即如果i可被5整除时,则换行。i值为24,可以被5整除4次,并余4,因此,prnt函数共输出5行,最后一行有4个
责任编辑:eduyml 【打印此文】【关闭窗口
About us | 广告服务 | 诚聘英才 | 加盟合作 | 联系方式
copyright© 2005 diannao24.com V3.0, All rights reserved.
咨询电话:010-51296168、51296158  QQ:309030144  E-mail: diannao24@126.com
IT教育在线 www.diannao24.com 版权所有
京ICP备05058729号