打印本文 打印本文  关闭窗口 关闭窗口  
06年4月全国计算机等级考试二级C语言考前密卷2
作者:佚名  文章来源:不详  点击数  更新时间:2008/4/18 14:37:39  文章录入:杜斌  责任编辑:杜斌

26)下面程序的输出结果是__________。  
  #define p1(x)printf(x)  
  main()  
  {  
  char d[]。"p";  
  pl(d);  
  p1("d");  
  }  
  a)pd          b)d"d"   
   c)"p"d          d)"p""d"  
  答案:a  
  评析:带参数的宏定义的一般形式为:#define宏名(参数表)字符串  
  程序中的pl(d);经宏置换后为printf(d);,所以输出字符串p;程序中的pl("d");经宏置换后printf("d")。     
(27)以下选项中,能定义s为合法的结构体变量的是__________。  
  a) typedef struct abc  
  {  double a;  
  charb[10];  
  }s;  
  b) struct  
  {  double a;  
  char b[10];  
  }s;  
  c) struct abc  
  {  double a;  
  char b[10];  
  }  
  abc s:  
  d) typedef abc  
  {  double a;  
  char b[10];  
  }  
  abc s:  
  答案:b  
  评析:定义一个结构体类型的变量,可采用三种方法:  
  ①先定义结构体类型,再定义变量名;②在定义类型的同时定义变量:③直接定义结构类型变量,即不出现结构体名:选项b符合第三种定义方法。  
    
(28)请读程序:  
  #include<stdio.h>  
  #include<string-h>  
  main()  
  {  
  char*s1="abcdef", *s2="ab";  
  s1++; s2++;  
  printf("%d、n",strcmp(sl,s2));  
  }  
  上面程序的输出结果是________。  
  a)正数         b)负数   
   c)零          d)不确定的值  
  答案:a  
  评析:strcmp(x1,x2)是串比较函数,本题中"s1"、"s2"分别表示这两个串中第一个字符的地址,s1++和s2++是将指针指向串的第二个字符,则*sl为"bcdef’’,*s2为"b"。在字符串比较中,大小的确定是各个字符串相应位置字符的ascii码值的大小决定的, sl>s2,返回值为正数。  
    
(29)请读程序:  
  #include<stdio.h>  
  main()  
  {  
  int a=5,b=7,c=9;  
  printf("%d,%d,",a,b,c);  
  printf("%d,%d,%d,"a,b);  
  }  
  上面程序的输出结果是________。  
  a)5,7,9,5,7     b)5,7,5,7   
   c)5,7,不定,7,9    d)5,7,5,7,不定  
  答案:d  
  评析:printf函数按格式控制符的个数输出表列中对应的数据,若输出表列的个数大于格式控制符个数,则输出与格式控制符对应的输出表列的数据,输出表列中多的则省略;若格式控制符个数大于输出表列的个数,则输出与格式控制符对应的输出表列的数据,格式控制符多的部分输出的数据是随机的。  
    


(30)请读程序:  
  #inciude<stdio.h>  
  func(int a,int b){  
  int c;  
  c=a+b:  
  return c:  
  }  
  main(){  
  int x=6,y=7,z=8,r;  
  r=func((x--,y++,x+y),z--);  
  printf("%d\n",r);  
  }  
  上面程序的输出结果是________。  
  a)ll          b)20   
   c)2l          d)31  
  答案:c  
  评析:函数func()的作用是返回两个形参的和,第一个形参是x、y分别自减和自增后的和,其中(x--,y++,x+y)是一个逗号表达式,它的值应该等于x+y,所以整个表达式(x--,y++,x+y)的值为13,而第二个形参的值为8(根据语法规则,应当先使用,后自增),所以func()的返回值为13+8=21。  
    
(31)请读程序:  
  #include<stdio.h>  
  main()  
  {  
  int a,b;  
  for(a=l,b=1;a<=100;a十+){  
  if(b>=20)break;  
  if(b%3==1){b+=3;continue;}  
  b-=5:  
  }  
  printf("%d\n",a);  
  }  
  上面程序的输出结果是_________。  
  a)7           b)8   
   c)9           d)10  
  答案:b  
  评析:break语句的作用是用于跳出循环体; continue语句的作用是用于跳出本次循环。执行第一次循环时,(b%3==1)为真,b=4,继续下一次循环,如此反复,当b=22时结束循环,共循环8次,即a=8。  
    
(32)设变量x为float型且已经赋值,则以下语句中能够将x中的数值保留到小数点后面两位,并将第三位四舍五入的是__________。  
  a)x=x*100+0.5/100.0      
    b)x=(x*100+0.5)/100  
  c)x=(int)(x*100+0.5)/100.0   
    d)x=(x/100+0.5)*100.0  
  答案:c  
  评析:本题通过算术表达式的运算实现小数位数保留两位并四舍五入的操作,其中(int)(x*100+0.5)是指将(x*100+0.5)的值强制转换成整型。  
    
(33)请读程序片段(字符串内没有空格字符):  
  printf("%d\n",strlen("ats\n012\1\\"));  
  上面程序片段的输出结果是____________。  
  a)ll          b)10   
   c)9           d)8  
  答案:c  
  评析:这个语句的目的是输出"ats\n012\1\\"这个串的长度,在串中"\\"代表一个"\",而"\1"代表数字1,也占一个字符,"\n"是回车换行符,也占一个字符,加上a、t、s、0、l、2,共9个字符。 
(34)运行以下程序后,如果从键盘上输入china撑<回车>,则输出结果为_________。  
  #include<stdio.h>  
  main()  
  {  
  int v1=0,v2=0;char ch:  
  while((ch=getchar())!=’#’)  
  switch(ch)  
  {  
  case’a’:  
  case ’h’:  
  default:v1++;  
  case’0’:v2++:  
  }  
  printf("%d,%d\n",v1,v2);  
  }  
  a)2,0         b)5,0   
  c)5,5         d)2,5  
  答案:c  
  评析:执行完一个case后面的语句后,流程控制转移到下一个case继续执行。"case常量表达式"只是起语句标号作用,并不是在该处进行条件判断。在执行switch语句时,根据switch后面表达式的值找到匹配的入口标号,就从此标号开始执行下去,不再进行判断。  
    


(35)请选出可用作c语言用户标识符的一组标识符__________。  
  a)void   b)a3.b3   c)for   d)2a  
  define   -123     -abc    do  
  word    if      case    sizeof  
  答案:b  
  评析:c语言规定标识符只能由字母、数字和下划线三种符号组成,而且第一个字符必须是字母或下划线。选项a中的void是c语言的关键字,不合法;选项c中的case和c语言的关键字重名,不合法;选项d中的2a是数字打头而且sizeof和c语言的关键字重名,不合法。  
    
(36)下面能正确定义数组,并正确赋值的语句是_________。  
  a)int n=5,b[n][n]          
   b)int a[1][2]={{1},{3}}  
  c)int c[2][]={{1,2},{3,4}}    
  d)int d[3][2]={{1,2},{34}}  
  答案:d  
  评析:可以用下面的方法对二维数组初始化:  
  l、分行给二维数组赋初值。如int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};  
  2、可以将所有数据写在一个花括弧内,按数组排列的顺序对各元素赋初值。如:  
  int a[3][4]={1,2,3,4,5,6,7,8;9,10,1 l,12);  
  3、可以对部分元素赋初值:int a[3][4]={{1},{5},{9}};  
  它的作用是只对各行第一列的元素赋初值,其余元素值自动为0。  
  4、如果对全部元素都赋初值(即提供全部初始数据),则定义数组时对第一维的长度可以不指定,但第二维的长度不能省。如:int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};  
  与下面的定义等价:int a[][4]={1,2,3,4,5,6,7,8,9,10,1l,12};  
    
(37)请选出以下程序的输出结果___________。  
  #include<stdio.h>  
  sub(int*s,int y)  
  { static int t=3;  
  y=s[t];t--;  
  }  
  main()  
  { int a[]={1,2,3,4},i,x=0;  
  for(i=0;i<4;i++){  
  sub(a,x);printf("%d",x);)  
  printf("\n");  
  }  
  a)1234         b)432l  
  c)0000         d)4444  
  答案:c  
  评析:x作为函数sub()的实参时,函数对x值的改变没有返回主函数,并不能使得x的值变化,所以在打印时,x的值是始终不变的,即为0。  
    
(38)假定下面程序可执行文件名prg.exe,则该程序所在的子目录下输入命令行:prg hello  
  good<回车>后,程序的输出结果是_________。  
  main(int argc,char*argv[])  
  {  
  int i;  
  for=1;i<argc;i++)printf("%c",*argv[i]);  
  }  
  a)heuo good       b)hg   
    c)hel         d)hellogood  
  答案:b  
  评析:带参数的main()函数常用形式为:main(int argc,char.*argv[]),其中,整型变量argc用来记录命令行中的参数个数。参数的个数由c程序运行时自动计算出来。字符型指针数组argv的第一个元素存放命令名,其后各个元素依次存放命令行中各个参数的首地址,数组的大小由argc确定。for循环语句实现输出各参数的第一个字母。  
    
(39)若有以下说明和语句,请选出哪个是对c数组元素的正确引用_________。  
  int c[4][5],(*cp)[5];  
  cp=c;  
  a)cp+l         b)*(cp+3)   
    c)*(cp+1)+3      d)*(*cp+2)  
  答案:d  
  评析:cp=c这个语句是将数组第0行的地址赋给了cp。cp+1使指针指向二维数组c的第一行;+(cp+3)是数组c的第三行的第0列的地址值;+(cp+1)+3是数组c的第一行第三列的地址值。  
    


(40)下列选项中不能正确定义结构体的是_________。  
  a)typede fstruct     b)struct color c1  
  { int red;        { int red;  
  int green;        int green;  
  int blue;        int blue;  
  }color;         };  
  color cl;  
  c)struct color      d)struct  
  { int red;       { int red;  
  int green;       int green;  
  int blue;        int blue;  
  }cl;          }cl;  
  答案:b  
  评析:将一个变量定义为标准类型与定义为结构体类型不同之处在于:后者不仅要求指定变量为结构体类型,而且要求指定为某一特定的结构体类型(例如,struct color),不能只指定结构体名。其中可以不出现结构体名,答案d就是缺省结构体名的情况。而变量名列表必须放在成员列表后面,所以b答案不能正确将c1定义为结构体变量。  
    
(41)设有以下语句  
  char a=3,b=6,c;  
  c=a^b<<2:  
  则c的二进制值是_________。  
  a)00011011       b)00010100   
    c)00011100       d)00011000  
  答案:a  
  评析:"<<"是c语言中规定的左移运算符,n是异或运算符,所以,c的二进制值应为0001 1011。  
    
(42)设有如下定义  
  struct ss  
  {  char name[10];  
  int age;  
  char sex;  
  }std[3],*p=std;  
  下列各输入语句中错误的是__________.  
  a)scanf("%d",&(*p).age);    
  b)scanf("%s",&std.name);  
  c)scanf("%c",&std[o].sex);   
   d)scanf("%c",&(p->sex));  
  答案:b  
  评析:在c语言中,结构体变量的引用有三种等价方式:  
  1、结构体变量.成员名;2、(*p).成员名;3、p->成员名。  
  因为std.name是字符数组名,-本身代表地址,其前面不应该使用"&"符号,所以选项b错误。  
    
(43)设有  
  static char str[]="beijing";  
  则执行  
  printf(%d\n",strlen(strcpy(str,"china")));  
  后的输出结果为__________。  
  a)5           b)7   
  c)12           d)14  
  答案:a  
  评析:在执行printf()函数前,数组str的长度是7,但是当使用strcpy()函数将新的值赋给str后,strlenr)函数返回的应当是现在的str字符串的字符个数,即是5。  
(44)下列程序段中,不是死循环的是__________。  
  a)int i=100;      b)unsigned k=0;  
  while(1)         do  
  {             {  
  i=i%100+l:        ++k;  
  if(i>=100)break;    }  
  }            while(k>=0);  
  c)for(;;);       d)int s=3379;  
  while(s++%2+s%2)s++;  
  答案:a  
  评析:当表达式为非0值时,执行while语句中的内嵌语句,可用break语句跳出循环,用continue语句结束本次循环。选项a不是死循环,当i=100时跳出循环。选项c为空循环语句。  
    
(45)以下程序的输出结果是________。  
  #include<stdio.h>  
  main()  
  { int i;  
  for(i=l;i<5;i++){  
  if(i%2)print引剃’);  
  else continue;  
  printf("≠f");  
  }  
  printf("$\n");  
  }  
  a)*#*#*#$        b)#*#*#*$    
  c)*#*#$          d)#*#*$  
  答案:c  
  评析:当i不可以整除2时打印"*",然后打印"拌",不能整除2则执行continue,跳过printf("#"):语句,结束本次循环,返回到循环的起始点。当循环结束后,打印"$"。  
    


(46)库函数strcpy用以复制字符串,若有以下定义和语句:  
  char strl[]="china",str2[10],*str3,*str4="china";  
  则对库函数strcpy的正确的调用是_________。  
  a)strcpy(strl,"people");b)strcpy(str2,"people");  
  c)strcpy(str3,"people");d)strcpy(str4,"people");  
  答案:b  
  评析:strcpy(字符数组1,字符串2)其作用是将字符串2复制到字符数组l中去。  
  注:(1)字符数组l必须定义得足够大;(2)"字符数组1"必须写成数组名的形式; (3)复制时连同字符串后面的’\0’一起复制到字符数组1中。  
    
(47)有以下程序  
  #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;}  
  }  
  }  
  从第一列开始输入以下数据,↙代表一个回车符。  
  2473↙  
  程序的输出结果是_________。  
  a)668977         b)668966    
    c)66778777        d)6688766  
  答案:a  
  评析:getchar()函数是从键盘接受一个字符输入;当用户键入的字符不是回车符时,会进入一个多分支选择语句,根据c-’2’的值进行分支选择;putchar()是在屏幕上打印一个字符,最后的结果应当为668977。  
    
(48)下面程序的输出结果是_________。  
  union un  
  { int a[4];  
  long b:  
  char c[6];}  
  main()  
  {  
  union un u:  
  printf("%d%d",sizeof(u),sizeof(u.a));  
  }  
  a)82            b)88   
    c)188          d)182  
  答案:b  
  评析:sizeof函数计算已知类型所占的字节数。共用体变量所占的内存长度等于最长的成员的长度。  
    
(49)以下程序的输出结果是________。  
  main()  
  { int w=5;fun(w);printf("\n");}  
  fun(int k)  
  { if(k>0) fun(k-1);  
  printf("%d.t,k);  
  }  
  a)5 4 3 2 l     b)0 1 2 3 4 5  
  c)l 2 3 4 5     d)5 4 3 2 l 0  
  答案:b  
  评析:函数的递归调用就是在调用一个函数的过程中又出现直接或间接地调用该函数本身。fun函数共被调用6次,即fun(5)、fun(4)、fun(3)、fun(2)、向n(1)、fun(0)。其中fun(5)是main函数调用的。  
    
  (50)若巾是指向某文件的指针,且已读到此文件的末尾,则函数feof(f1))的返回值是  
  a)eof          b)o   
    c)非零值        d)null  
  答案:c  
  评析:函数feof是用来判断文件是否已读到末尾,如果已读到末尾则返回非零值,否则返回o。
打印本文 打印本文  关闭窗口 关闭窗口