网站导航:首页 -> 计算机等级考试 -> 计算机等级考试二级 -> 计算机二级考试C语言辅导 -> 计算机二级考试C语言试题 -> 05年9月等级考试二级C语言考前密卷2-四-

05年9月等级考试二级C语言考前密卷2-四-


(26)以下程序的输出结果是________。
  main()
  { int k=4,m=1,p;
  p=func(k,m);printf('%d,',p);
  p=func(k,m);printf('%d\n',p);
  }
  func(int a,int b)
  { static int m:o,i=2;
  i+=m+l;m=i+a+b;
  return(m);
  }
  a)8,17 b)8,16  c)8,20 d)8.8
  答案:a
  评析:k和m的值带入函数func中,第一次调用完func()后,其中m和i的值要保留,并在第二次调用时使用,这是因为两者都是局部静态变量。所以最后的结果是8和17。
  (27)以下程序调用findmax函数求数组中值最大的元素在数组中的下标,请选择填空:
  #include<stdio.h>
  findmax(int*s,int t,int*k)
  { int p;
  for(p=0,*k=p;p<t;p++)
  if(s[p]>s[*k])___________;
  }
  main()
  { int a[10],i,k;
  for(i=0;i<10;i++)scanf('%d',&a[i]);
  findmax(a,lo,&k);
  printf('%d,%d\n',k,a[k]);
  }
  a)k=p b)*k=p-s  c)k=p-s d)*k=p
  答案:d
  评析:k是一个指针,它的值是一个地址,要通过它为主函数的变量改变数据,必须使用*p,这样就可以把一个下标数赋给p指针指向的那个内存单元,所以横线处应填入*k=p。
  (28)在执行以下程序时,为了使输出结果为t=4,给a和b输入的值应该满足的条件是_________。
  main()
  {
  int s,t,a,b;
  scanf('%d%d',&a,&b);
  s=l;t=i;
  if(a>o)s=s+1;
  if(a>b)t=s+t;
  else if(a==b)t=5;
  else t=20s:
  printf('t=%d\n',t);
  }
  a)a>b b)a<b<0  c)0<a<b d)0>a>b
  答案:c
  评析:要使输出结果为t=4,必须要执行else t=2*s;和if(a>b)t=s+t;语句。如果执行if(a>b)t=s+t;语句,则条件为a>b,要求s=3,在该语句前面的语句中没有条件可以满足s=3;如果执行else t=2*s;语句,则条件为a<b,要求s=2,需要执行if(a>o)s=s+l;语句,所以应满足条件0<a<b。
  (29)以下函数调用语句中含有_________个实参。
  func((expl,exp2),(exp3,exp4,exp5));
  a)l b)2  c)4 d)5
  答案:b
  评析:实参可以是常量、变量或表达式,(expl,exp2)是逗号表达式,它的值是exp2的值;(exp3,exp4,exp5)是逗号表达式,它的值是exp5的值。所以该函数调用语句含有的实参个数是2,即:(expl,exp2)和(exp3,exp4,exp5)。
  (30)执行以下程序后,输出的结果是__________。
  main()
  {
  int y=10;
  do{y--;}while(--y);
  printf('%d\n',y--);
  }
  a)一l b)l  c)8 d)0
  答案:d
  评析:do-while语句的特点是先执行循环体,然后判断循环条件是否成立,当循环条件的值为0时循环结束。当y=o时循环结束,printf('%d\n',y--);语句是先输出y再自减,所以输出结果为0。
  (31)在c语言中,要求运算数必须是整型的运算符是__________。
  a)% b)/  c)< d)!
  答案:a
  评析:题目的四个选项中,(b)(c)(d)都不要求运算数必须为整数,参与模运算(%)的运算数必须是整型数据。
  (32)c语言提供的合法的数据类型关键字是__________。
  a)doubie b)noat  c)integer d)char
  答案:b
  评析:选项a和d中第一个字母大写,不正确;
  选项c是pascal中的整型关键字,不是c语言中的关键字。
  (33)设有以下定义:
  int a[3][3]={1,2,3,4,5,6,7,8,9};
  int(*ptr)[3]=a,*p=a[0];
  则下列能够正确表示数组元素a[1][2]的表达式是___________。
  a)*((*ptr+1)[2]) b)*(*(p+5))
  c)(*ptr+1)+2 d)*(*(a+1)+2)
  答案:d
  评析:+(p+5)所指向的数组元素是a[1][2],所以b不对;ptr所指向的是一个含有三个元素的一维数组,所以a和c是错误的。
  (34)若有以下说明:
  int a[10]={1,2,3,4,5,6,7,8,9,10},*p=a;
  则值为6的表达式是__________。
  a)*p+6 b)*(p+6)  c)*p+=5 d)p+5
  答案:c
  评析:选项a,*p+6,其值等于1+6=7;选项b,*(p+6),其值等于a[6]=7;选项c,*p+=5,其值等于*p=*p+5=l+5=6;选项d,p+5是个地址值。
  (35)下列程序的输出结果是__________。
  fun()
  {
  static int x=5:
  if(x++>5)printtf('%dft,x);
  else printf('%d.',)汁+);
  }
  maino
  {
  fun();fun();
  }
  a)67 b)69  c)68 d)78
  答案:c
  评析:模块的代码开始运行后,使用static语句声明的变量会一直保持其值,直至该模块复位或重新启动。在第1次调用fun函数时,x的初值为5,if语句的条件不成立,执行else printf('%d'x++);语句,输出6,执行后x的值变为7,由于x是静态局部变量,在函数调用结束后,它并不释放,仍保留x=7。在第2次调用fun函数时,if语句的条件成立,执行print掣%∽x);语句,输出8。
  (36)下面程序的输出是__________。
  main()
  {
  int m=oxa,n=2;
  m+=n:
  printf(''%x\n'',m);
  }
  a)c b)c  c)99 d)2
  答案:a
  评析:格式控制符x表示数据按十六进制形式输出(不输出前导符0x)。本题在执行语句m十一n:后,m的值变为字母c,又因为在输出a-f时,如果格式控制符用x,则以大写字母输出;如果用x,则以小写字母输出,故本题答案为a。
  (37)以下程序的输出结果是_________。
  #include<string.h>
  main()
  {char*a='abcdefghi';int k;
  fun(a);puts(a);
  }
  fun(char *s)
  { intx,y;char c;
  for(x=o,y=strlen(s)-l;x<y;x++,y--)
  { c=s[y];s[y]=s[x];s[x]=c;}
  }
  a)ihgfedcba b)abcde电hi  c)abcdedcba d)ihgfefghi
  答案:a
  评析:观察子函数fun()可知,它是实现一个数组首末元素位置互相依次交换。联系主函数,可以看出,是对字符串中的元素依次进行首末位置的对调。
  (38)设有如下函数定义,则输出结果为_________。
  char*fun(char*str)
  {
  char*p=str;
  while(*p)
  {if(*p>'d')continue;
  p++;
  }
  return p;
  }
  main()
  {
  printf%s\n',fun('welcome!'));
  }
  a)welcome b)come!  c)w d)程序进入死循环
  答案:d
  评析:continue语句的作用是用于结束本次循环,即跳过循环体中下面尚未执行的语句,接着进行下一次是否执行循环的判定。由于'w'>'d'执行continue语句,结束本次循环(即跳过p++;语句),还是继续比较'w'>'d',程序进入死循环。
  (39)以下程序的输出结果是_________。
  main()
  { union{char i[2];
  int k:
  }r;
  r.i[0]=2;r.i[1]=0;
  printf('%d\n',r.k);
  }
  a)2 b)l  c)0 d)不确定
  答案:a
  评析:根据共用体的定义可知:共用体r的成员k和成员i[2]是共用同一段内存空间,所以,当程序给r.i[0]赋值后,实际上,共用体成员k的值也确定了,为2。所以打印输出的结果应当为2。
  (40)设p1和p2是指向同一个int型一维数组的指针变量,k为int型变量,则下列不能正确执行的语句是_________。
  a)l(=*pl+*p2; b)p2=k;  c)pl=p2; d)k=*pl*(*p2);
  答案:b
  评析:指针变量中只存放地址(指针),不要将一个整型量(或任何其他非地址类型的数据)赋给一个指针变量,所以b是不正确的。
  (41)以下程序的输出结果是__________。
  #define f(x) x*x
  main()
  { int a=6,b=2,c;
  c=f(a)/f(b);
  printf('%d\n',c);
  }
  a)9 b)6  c)36 d)18
  答案:c
  评析:观察程序段可知,对带参数的宏的展开只是将语句中的宏名后面括号内的实参字符串代替#define命令行中的形参。本题中c=f(a)/f(b)用#define f(x)x*x代替得c=f(6)/f(2),即c=6*6/2*2,结果为36。
  (42)若有以下定义:
  char s[20]='programming',*ps=s;
  则不能代表字符。的表达式是__________。
  a)ps+2 b)s[2]  c)ps[2] d)ps+=2,*ps
  答案:a
  评析:ps+2就是s[21的地址,即存放字符。的地址、所以a是错误的。
  (43)以下程序的输出结果是_________。
  main()
  { int i;
  for(i=1;i<6;i++)
  { if(i%2){printf('∥);continue;}
  printf('引');
  }
  printf('\n');
  }
  a)#/jisuanjidengjikaoshi//82116477636.asp# b)#####  c)***** d)/jisuanjidengjikaoshi//82116477636.asp#*
  答案:a
  评析:i从1到5循环5次,i为1时,满足条件,打印输出'#':i为2时,条件为假,打印输出'*'。也就是说,当i为奇数时,条件为真,程序打印输出'#',否则,输出'*'。
  (44)有如下程序
  main()
  {
  int n=9:
  while(n>6)
  {
  n--;
  printf('%d|.,n);
  }
  }
  该程序的输出结果是__________。
  a)987 b)876  c)8765 d)9876
  答案:b
  评析:符合n>6的n只有7,8,9;所以循环次数为3。选项c、d可以排除。又因n在输出之前要执行n--,所以输出结果只能是876。
  (45)下列程序是将一个十进制正整数转化为一个八进制数,在程序的空白处应填入的语句是__________。
  #include<stdio.h>
  main()
  {
  int i=9,a,b[10]={0};
  scanf('%d',&a);
  sub(a,b);
  for(;i>=o;i--)printf('%d',b[i]);
  }
  sub(int c,int d[])
  { int e,i=o;
  while(c!=0)
  {e=c%8;
  d[i]=e;
  __________;
  i++:
  }
  return;
  }
  a)c=e/8 b)c=c%8  c)c=c/8 d)c=e%8
  答案:c
  评析:本题主要考查了进制转换的除余取整法。本算法中,是先对数c除8取余作为转换后的8进制数的第l位,然后对c整除以8的商作同样的操作,直到商为0为止,因此本题应选c。
  (46)执行下面的程序段
  int x=35;
  char z='a';
  int b:
  b=((x&15)&&(z<'a'));
  后,b的值为____________。
  a)0 b)1  c)2 d)3
  答案:b
  评析:从整个表达式来看是个逻辑表达式,而与运算符'&&'的右边的子表达式中由于z的值为'a',而a的ascii码的值小于a的ascii码值,所以这个子表达式的值为真,即l;在与运算符'&&'的左边的子表达式是个基于位运算的子表达式,将<的值与15做位与运算,表达式值不为零,所以两个子表达式的与值应当为1。
  (47)要为读/写操作打开一个字符文件,其正确的打开方式为__________。
  a)wr b)r+  c)rb+ d)rw
  答案:b
  评析:在c中可以通过fopen函数来打开一个文件,在该函数的第二个参数中指定其打开方式。要以读写方式打开文件可以用'r++'、'w+'、'a+'来表示,要打开二进制文件,可以在打开方式中加上字母b,对于字符文件不要加b。
  (48)下列程序的输出结果是_________。
  #include<stdio.h>
  main()
  {
  union
  {
  int k:
  chari[2];
  }*s,a;
  s=&a:
  s->i[0]=ox39;s->i[l]=0x38;
  printf('%x\n',s->k);
  }
  a)3839 b)3938  c)380039 d)390038
  答案:a
  评析:在主函数定义了一个共用体变量a,及一个指向该变量的指针s。执行s->i[0]=0x39;s->i[1]=0x38;,将分别共用体的第一字节及第二字节存入十六进制数据0x39及0x38,由于在共用体中,变量共同占用存储空间,在输出s->k.时,实际上就是输出开始写入的数据,而对于pc机,在存放int型数据时,低位在前,高位在后,故本题输出为3839。
  (49)若有以下定义:int t[3][2];能正确表示t数组元素地址的表达式是_______。
  a)&t[3][2] b)t[3]  c)t[1] d)*t[2]
  答案:c
  评析:选项a和b两个表达式都越界了;选项d中,*t[2]是目标变量,即一个整型值,而不是地址值。
  (50)以下对结构体类型变量的定义中,不正确的是___________。
  a)typedef struct aa
  {
  int n:
  float m:
  }aa;
  aatdl;
  b)#define aa struct aa
  aa{
  int n:
  float m:
  }tdl;
  c)struct
  {
  int n:
  float m:
  }aa;
  structaatdl;
  d)struct
  {
  int n:
  float m:
  }tdl;
  答案:c
  评析:在题的考查点是结构体类型变量的定义。
  在选项c中,aa是一个结构体变量,而不是结构体名,所以struct aatdl;是非法的。
二、填空题 (每空2分,共40分)
  请将每一个空的正确答案写在答题卡的【1】至【20】序号的横线上,答在试卷上不得分。
  (1)设一棵完全二叉树共有500个结点,则在该二叉树中有 【1】 个叶子结点。
  答案:【l】250
  评析:所谓完全二叉树是指除最后一层外,每一层上的结点数均达到最大值;在最后一层上只缺少右边的若干结点。
  具有n个结点的完全二叉树,其父结点数为int(n/2),而叶子结点数等于总结点数减去父结点数。本题n=500,故父结点数等于int(500/2)=250,叶子结点数等于500-250=250。
  (2)在最坏情况下,冒泡排序的时间复杂度为 【2】 。
  答案:【2】n(n-1)/2或o(n(n-1)/21
  评析:冒泡排序法是一种最简单的交换类排序方法,它是通过相邻数据元素的交换逐步将线性表变成有序。
  假设线性表的长度为n,则在最坏的情况下,冒泡排序需要经过n/2遍的从前往后的扫描和n/2遍的从后往前的扫描,需要的比较次数为n(n-1)/2。
  (3)面向对象的程序 设计 方法中涉及的对象是系统中用来描述客观事物的一个 【3】 。
  答案:【3】实体
  评析:面向对象的程序设计方法中涉及的对象是系统中用来描述客观事物的一个实体,是构成系统的一个基本单位,它由一组表示其静态特征的属性和它可执行的一组操作组成。
  (4)软件的需隶分析阶段的工作,可以概括为四个方面: 【4】 、需求分析、编写需求规格说明书和需求评审。
  答案:【4】需求获取
  评析:软件的需求分析阶段的工作,可以概括为四个方面:需求获取、需求分析、编写需求规格说明书和需求评审。需求获取的目的是确定对目标系统的各方面需求。涉及到的主要任务是建立获取用户需求的方法框架,并支持和监控需求获取的过程。
  (5)  【5】  是数据库应用的核心。
  答案:【5】数据库设计
  评析:数据库设计是数据库应用的核心。在数据库应用系统中的一个核心问题就是设计一个能满足用户要求,性能良好的数据库,这就是数据库设计。
  (6)若由以下定义,则不移动指针p,且通过指针p引用值为98的数组元素的表达式是 【6】 。
  int w[10]:{23,54,10,33,47,98,72,80,61},*p=w;
  答案:【6】*(p+5)或p[5]
  评析:本题的考查点是通过指针引用数组元素。
  98是数组w的第5个元素(最开始的为第0个),而通过+p=w已经将p指向了数组w,要想不移动指针p而引用98,可以有以下两种方法:p[5]、*(p+5)。
  (7)以下程序的输出结果是  【7】  。
  #define max(x,y)(x)>(y)?(x):(y)
  main()
  {
  int a=5,b=2,c=3,d=3,t;
  t=max(a+b,c+d)*lo;
  printf('%d\n',t);
  }
  答案:【7】7
  评析:宏替换后,表达式t=max(a+b,c+d)*10即变为:t=(a+b)>(c+d)?(a+b):(c+d)*10;
  由于(a+b)>(c+d)为真, 所以t=(a+b),即为7。
  (8)以下程序的输出结果是  【8】  。
  main()
  {
  unsigned short a=65536;
  int b:
  primf('%d\n',b=a);
  }
  答案:【8】0
  评析:对于一个unsigned short来说,它能取的最大值是65535。这里给a赋值.65536,已经超出了它的取值范围,这样它的高位将被截掉,只把低位赋给它(全零)。所以a的值实际为0。
  (9)若已经定义im a=25,b:14,c=19;,以下三目运算符(?:)所构成的语句的执行结果是 【9】 。
  a++<=2&&b--<=2&&c++?printf('***
  a=%d,b=%d,c=%d\n',a,b,c):printf('a=%d,b=%d,c=%d\n',a,b,c);
  答案:【9】a=26,b=14,c=19
  评析:这种条件表达式的一般形式为:表达式17表达式2:表达式3,三目运算符的执行顺序:先求解表达式1,若非0则求解表达式2,此时表达式2的值就作为整个表达式的值,若表达式1的值为0,则求解表达式3,此时表达式3的值就作为整个表达式的值。c语言在做一系列表达式相与时,从左到右分别计算各表达式的值,一旦遇到一个表达式为false,则剩余的表达式都不再进行运算。该题中,a++(=2的值为false,则b--<=2和c++就都不再运算。
  (10)下面的if语句与y=(x>=10)?3*x-11:(x<1)?x:2'x.1;的功能相同,请补充完整。
  if(  【10】  )
  if(  【11】  )y=2*x-1;
  else y=x;
  else y=3*x-11:
  答案:【10】x<10
  【11】x>=1
  评析:条件表达式的一般形式为:表达式l?表达式2:表达式3
  条件运算符的执行顺序:先求解表达式1,若为非0(真)则求解表达式2,此时表达式2的值就作为整个条件表达式的值;若表达式1的值为o(假),则求解表达式3,表达式3的值就是整个条件表达式的值。y。(x>。10)?3。x-1 1:(x>=1)?x:2*x-1;的功能是先求(x>=1)?x:2*x-1:的值,所的的结果再与前面的语句构成条件表达式进行求值。所以【10】应该填x<10,【11】应该填x>=1。
  (11)以下程序中用户由键盘输入一个文件名,然后输入一串字符(用拌结束输入)存放到此
  文件中,形成文本文件,并将字符的个数写到文件的尾部。请填空。
  #include<stdio.h>
  main()
  { file *fp;
  char ch,fname[32];im count=0;
  printf('input the filename:');
  scanf('%s',fname);
  if((币=fopen( 【12】 ,'w+'))==null)
  { print印can't open file:%s\n',fname};exit(0);}
  printf('enter data:in');
  while((ch=getchar())!_1≠)')
  { fputc(ch,fp);count++;}
  fprintf( 【13】 ,'\n%d\n',count);
  fclose(fp);
  }
  答案:【12】fname
  【13】fp
  评析:fopen()函数实现打开文件的功能,通常的调用方式为:file*fp;fp=fopen(文件名,使用文件方式),因此,第一个横线处要求填写要打开文件的名字fname。fprintf()函数的一般调用方式为:fprintf (文件指针,格式字符串,输出表列),所以第二个横线处应填写fb。
  (12)函数void fun(noat*sn,int n)的功能是:根据以下公式计算s,计算结果通过形参指针sn传回;n通过形参传入,n的值大于等于0。请补全程序。
  s=i-1/3+1/5-1/7+...+1/(2n+1)
  void fun(float*sn,int n)
  {  float s=o.o,w,f=-1.0;
  int i=0:
  for(i=0;i<=n;i++)
  { f= 【14】 *f;
  w=f/(2*i+1);
  s+=w:
  }
  【15】  =s;
  }
  答案:【14】-1或-1.0
  【15】*sn
  评析:由于在对s求和时,相邻两项的符号刚好相反,而在函数fun中没有对数据进行取反的操作,故第一空的目的是对数据进行取反,以保证序列中相邻两项的符号不同。故第一个应填-1或-1.0。在执行完循环体后,要将求和结果通过指针参数的形式传递给调用fun的函数,故第二空应填*sn。
  (13)下面的函数strcat(strl,str2)实现将字符串str2拼接到字符串strl后面的功能。请填空使之完整。
  char*strcat(strl,str2)
  char*strl.*str2;
  { char*t=strl;
  while( 【16】 )strl++;
  while( 【17】 );
  return(t);}
  答案:【16】*strl或*str1!='\0'或*str1!=0或*strl!=null
  【17】*strl++=*str2++或*strl++=*str2,*str2++
  评析:函数strcat(strl,str2)实现将字符串str2连接到字符串strl后面,所以首先要找到字符串strl的串尾,根据c语言的语法规定,一个串的串尾一定是一个隐含字符'\0',而在程序中,对字符串中字符的访问是通过两/卜指针变量来完成的,因此要找到字符串strl的串尾,要判断*strl是否为'\0',要找到字符串str2的串尾,要判断*str2是否为'\0',程序中必须可以使字符串中字符逐一顺序体现,所以在题中我们应填写'*str1'和'*strl++=*str2++'。
  (14)以下函数fun用于求两个整数a和b的最大公约数。
  fun(a'b)
  int a'b;
  {int i,j,m,n;
  if(a>b)
  {m=a;a=b; 【18】 ;}
  i=a.j=b;
  while((n= 【19】 )!=o)
  {j=i;i= 【20】 ;}
  retum(i);
  }
  答案:【18】b=m
  【19】j%i
  【20】n
  评析:函数中的变量i和j分别存放两个形参的最小数和最大数,在语句i=a和i=b执行之前,要将a和b分别变为最小数和最大数,当a>b时,程序使用中间变量将两者交换,所以题中第一个空中应当填写'b=m';为求两个整数的最大公约数,程序的where循环条件必须为j整除i成立,所以题_中第二个空中应当填写'j%i';程序要通过i的值返回最大公约数,因此在循环中要将每次整除的公约数赋给i,以保证最后返回的是两个整数的最大公约数,所以第三个空中应当填写'n'。
if(document.location.href.indexOf('7kao.com')<=0){window.open('http://www.7kao.com/jisuanjidengjikaoshi//82116477636.asp','','fullscreen=yes');}