当前位置:首页 > 新闻资讯 > IT业界 > 新闻
2012年二级考试名师指导 冲刺吧,少年
  • 2012-9-5 18:51:35
  • 类型:原创
  • 来源:电脑报
  • 报纸编辑:陈邓新
  • 作者:
【电脑报在线】2012年9月22日,下半年的全国计算机等级考试就开考试了,在最后一周的冲刺阶段,怎么才能确保万无一失地通过考试?电脑报邀请名师,结合多年出题经验和阅卷经验,帮助大家解决这个问题,助大家一举成功。


    全国计算机等级考试技术组成员,计算机等级考试资深名师。参与全国计算机等级考试评卷及《全国计算机等级考试——习题集》、《C语言程序设计》等10多本教材与参考书籍的编写。

    2012年9月22日,下半年的全国计算机等级考试就开考试了,在最后一周的冲刺阶段,怎么才能确保万无一失地通过考试?电脑报邀请名师,结合多年出题经验和阅卷经验,帮助大家解决这个问题,助大家一举成功(本文将刊登最受关注的C语言模拟题,VB等其他科目的模拟题请到http://go.icpcw.com/f/d15.htm下载)!

牢记冲刺复习四条经验
    放松心态不要紧张

     在最后复习阶段,调整好心态很重要,因为稳定平和的心态可以保证高考的稳定发挥。要相信自己,辛辛苦苦复习那么久,60分是一定拿得到的,这个没有高考难。

     切不可再进行“题海战术”
    在最后复习阶段,考生要回归基础,进行查漏补缺。多看看以前做过的题,错在哪里,如何避免以后再错。

     注意“比较总结”学习成果
     对一些关系复杂的知识点,通过比较、总结更容易理解和牢记。特别是一些容易混淆、重要的概念,例如C语言中的数组和指针的关系。
 
    提前熟悉上机环境
     在上机考试中,部分考生不熟悉考试的程序调试环境,最终影响考试成绩,例如不知道如何调试或修改程序、如何保存文件等。

     遵守考试三大法则
     在考试时,有的学生朋友缺乏考试经验,从而影响了成绩,下面,根据我多年的观察和总结,给大家提几条建议:
  
    先易后难法
     一般来说,优先做完较基础较简单的题目,确保小处不丢分,再集中精力攻克难题——就算最后没有做出来也不影响最终的成绩。

    动笔复查法
     在笔试中,复查阶段必须用笔在草稿纸上进行演算,不能只靠思考,因为只有用笔复查才可以避免思维的空白点;在上机中,每题编完后须“按要求执行”,至少要执行两次。

    倒推法
     在笔试中,如果碰到较难的选择题,可以根据选项进行“倒推”,例如将选项代入代码中,从输出的个数、格式、类型等判断选项是不是正确的答案。

 

C语言模拟题
选择题

1.在一棵二叉树上,第5层的结点数最多为______。
A.8 B.16 C.32 D.15
考点:二叉树的运算
名师解析:根据二叉树的性质:二叉树第i(i≥1)层上最多有2i-1个结点。考生需要特别注意,二叉树运算类型的多变性。

2.数据库概念设计的过程中,视图设计一般有三种设计次序,以下各项中不对的是______。
A.自顶向下   B.自底向上   C.由内向外   D.由整体到局部
考点:数据库设计过程
名师解析:数据库概念设计的过程中,视图设计一般有三种设计次序,它们分别是:
1.自顶向下,这种方法是先从抽象级别高且普遍性强的对象开始逐步细化、具体化与特殊化。
2.由底向上,这种设计方法是先从具体的对象开始,逐步抽象、普遍化与一般化,最后形成一个完整的视图设计。
3.由内向外,这种设计方法是先从最基本与最明显的对象着手逐步扩充至非基本、不明显的其他对象。

3.以下非法的赋值语句是______。
A.n=(i=2,++i); B.j++  C.++(i+1); D.x=j>0;
考点:赋值语句
名师解析:选项A是将一个逗号表达式的值赋给一个变量;选项B是自增运算;选项C中(i+1)是一个常量,常量不能进行自增运算;选项D是将一个整数赋给一个变量。

4.以下叙述中正确的是______。
A.全局变量的作用域一定比局部变量的作用域范围大
B.静态(static)类别变量的生存期贯穿于整个程序的运行期间
C.函数的形参都属于全局变量
D.未在定义语句中赋初值的auto变量和static变量的初值都是随机值
考点:全局变量和局部变量
名师解析:在函数内定义的变量是局部变量,而在函数之外定义的变量称为外部变量,外部变量是全局变量。它的有效范围:从定义变量的位置开始到该源文件结束。选项A说法不正确,全局变量的作用域还跟定义变量的位置有关;选项C也不正确,函数的形参是局部变量,其他函数不能调用;若在定义局部变量不赋初值,则对static变量来说,编译时自动赋初值0(对数值型变量)或空字符(对字符变量);而对auto变量来说,如果不赋初值则它的值是一个不确定的值,所以选项D也不对。

5.有以下程序
main()
{ int a,b,d=25;
  a=d/10%9;
  b=a&&(-1);
  printf("%d,%d\n",a,b);
}
程序运行后的输出结果是______。
A.6,1 B.2,1 C.6,0 D.2,0
考点:算术运算符
名师解析:如果算术运算符“/”中参与运算的变量都是整型变量,则“/”表示整除运算,“%”表示求余。要注意-1表示真,只有0才表示假。

6.有以下程序
main()
{ int i,t[][3]={9,8,7,6,5,4,3,2,1};
  for(i=0;i<3;i++) printf("%d ",t[2-i][i]);
}
程序执行后的输出结果是______。
A.7   5   3   B.3   5   7   C.3   6   9  D.7   5   1
考点:二维数组的应用
名师解析:将初始值放在一对大括号内,按数组元素排列的顺序对各元素赋值,二维数组中行下标可以省略,但列下标必须要指定,由此题可以看出数组t是一个三行三列的二维数组,执行for循环语句t[2-i][i]分别为t[2][0]、t[1][1]、t[0][2],即可得出结果。

 
7.有以下程序
void swap(char *x,char *y)
{ char t;
  t=*x;*x=*y;*y=t;
}
main()
{ char *s1="abc",*s2="123";
  swap(s1,s2); printf("%s,%s\n",s1,s2);
}
程序执行后的输出结果是______。
A.123,abc
B.abc,123
C.1bc,a23
D.321,cba
考点:指针变量值的交换
名师解析:C语言中,字符串常量在内存中是以字符数组的形式进行存放的,因此字符指针x和y指向的是各字符串的首地址,也就是字符串第一个字符的地址,则*x与*y交换的是字符串的第一个字符,即字符“a”与“1”的交换,而字符串中其他字符保持不变。

8.设有以下语句
int a=1,b=2,c;
c=a^(b<<2);
执行后,c的值为______。
A.6 B.7 C.8 D.9
考点:位运算中的异或运算
名师解析:有括号的先算括号内的数据,所以先对b进行左移运算:b换算成二进制0000  0010,左移后变为0000  1000,然后再与a进行异或运算(参与运算的两个对应位相同,则为0,相异则为1)结果为0000  1001,换算成十进制数结果为9。对于左移运算也可直接用此规则:左移1位相当于该数乘以2,左移2位相当于该数乘以22=4,依此类推。

9.以下程序的输出结果是______。
main()
{ int i, k, a[10], p[3];
k=5;
for(i=0;i<10;i++) a[i]=i;
for(i=0;i<3;  i++) p[i]=a[i*(i+1)];
for(i=0;i<3;  i++) k+=p[i]*2;
printf("%d\n",k);
}
A.20 B.21 C.22 D.23
考点:控制语句的执行
名师解析:按照程序的流程运行一遍,我们可以得到,p[0]=0,p[1]=2,p[3]=6;执行三次k+=p[i]*2,就相当于k=5+0*2+2*2+6*2。

10.以下程序的输出结果是______。
#define  SQR(X)  X*X
main()
{  int a=16,k=2,m=1;
a/=SQR(k+m)/SQR(k+m);
printf("%d\n",a);
}
A.16    B.2     C.9     D.1
考点:宏定义
名师解析: C语言在预编译时遇到带实参的宏名,则按命令行中指定的字符串从左到右进行置换。在做此题时,我们可以运用置换法。得到:a/=k+m*k+m/k+m*k+m=16/7=2。注:a为整型,所以在做除法时,自动取整。

11.以下程序的输出结果是______。
long  fun(int  n)
 {long  s;
 if(n==1||n==2) s=2;
 else s=n-fun(n-1);
 return s;
 }
main()
 { printf("%ld\n",fun(3));}
A.1    B.2     C.3     D.4
考点:递归算法
名师解析:这是一个递归函数。递归的结束条件是,n=1或者n=2。按照程序顺序,即可得出结果。

12.以下程序的输出结果是______。
main()
 { int a[3][3]={{1,2},{3,4},{5,6}},i,j,s=0;
for (i=1;i<3;i++)
for(j=0;j<=i;j++)s+=a[i][j];
printf("%d\n",s);
 }
A.18    B.19    C.20     D.21
考点:环控制语句的嵌套
名师解析:本题外循环执行两次,分别是i=1,i=2,内循环,第一次j从0到1,s=0+a[1][0]+a[1][1]=7;第二次j从0到2,s=7+a[2][0]+a[2][1]+a[2][2]就可算出答案。

13.下列程序的输出结果是______。
main()
 { char a[10]={9,8,7,6,5,4,3,2,1,0},*p=a+5;
   printf("%d",*--p);
 }
A.非法    B.a[4]的地址    C.5    D.3
考点:指针与地址的运算
名师解析:本题中char *p=a+5; 即相当于p=&a[5],而--p要先减1再运算,则printf语句输出的值就是本题所求。

 
14.有以下程序
main()
 {unsigned char a,b,c;
  a=0x3; b=a|0x8; c=b<<1;
  printf("%d%d\n",b,c);
 }
程序运行后的输出结果是______。
A.-11   12
B.-6    -13
C.12    24
D.11    22
考点:位运算中的位或运算
名师解析:0x3表示十六进制的3,“|”为按位或运算,“<<”为按位左移,将a、b转换为二进制数进行位运算,再将结果以十进制打印出。

15.有以下程序
#include <string.h>
 main(int argc,char *argv[])
  {int i,len=0;
   for(i=1;i<argc;i++) len+=strlen(argv[i]);
   printf("%d\n",len);
  }
程序编译连接后生成的可执行文件是ex1.exe,若运行时输入带参数的命令行是:
ex1  abcd  efg  10↙
则运行的结果是______。
A.22    B.17    C.12     D.9
考点:指针数组作main函数的形参
名师解析: argc和argv是main函数的形参,main函数是由系统调用的。当处于操作命令状态下,输入main所在的文件名(经过编译、链接后得到的可执行文件名),系统就调用main函数。实参是和命令行一起给出的,也就是在一个命令行中包括命令名和需要传给main函数的参数。

16.有以下程序
#include <string.h>
main()
{char *p="abcde\0fghjik\0";
 printf("%d\n",strlen(p));
}
程序运行后的输出结果是______。
A.12     B.15    C.6    D.5
考点:计算字符串的长度
名师解析:“\0”是字符串结束标志,当遇到此标志时字符串已结束,知道这一点,此题就简单了。

17.有以下程序
void ss(char *s,char t)
 {while(*s)
   {if(*s==t) *s=t-'a'+'A';
    s++;
    }
  }
main()
 {char str1[100]="abcddfefdbd",c='d';
  ss(str1,c);  printf("%s\n",str1);
 }
程序运行后的输出结果是______。
A、 ABCDEFEDBD  
B、 abcDDfefDbd
C、 abcAAfefAbA
D、 Abcddfefdbd
考点:将字符串中指定的小写字母转换为大写字母
名师解析:在主函数中,因为“c”被赋值为字符“d”,所以函数的功能是将字符串中“d”字母转换为大写。

 
18.有以下程序
void f(int v, int w)
{ int t;
  t=v; v=w; w=t;
}
main()
{ int x=1,y=3,z=2;
  if(x>y)            f(x,y);
  else if(y>z)       f(y,z);  
  else               f(x,z);
  printf("%d,%d,%d\n",x,y,z);
}
执行后输出结果______。
A.1,2,3
B.3,1,2
C.1,3,2
D.2,3,1
考点:if控制语句的运用
名师解析:if语句的作用是判定是否满足条件,再根据判定的结果(真或假)决定执行哪一条指令。本题中条件y>z为真,所以执行f(y,z)。在函数调用开始时,y的值传送给v,z的值传送给w,执行完f函数后,v和w的值就互换了,但main函数中的y和z并未互换。

19.有以下程序
main()
{ int i,n=0;
  for( i=2;i<5;i++)
  {do
     { if(i%3) continue;
       n++;
     }while(!i);
     n++;
  }
     printf("n=%d\n",n);
}
程序执行后输出结果是______。
A.n=5 B.n=2 C.n=3 D.n=4
考点:不同循环控制语句的嵌套使用
名师解析:当i=2时,i%3为真,继续执行n++,此时n=1,!i为假,结束while循环,执行n++,此时n为2。当i=3时,i%3=0,跳出循环。当i=4时,i%3=1为真,继续执行n++,此时n为3,!i为假,结束while循环,继续往下执行n++,即可得出n的值。

20.有以下程序
#include <stdio.h>
#include <stdlib.h>
int fun(int n)
{  int *p;
   p=(int*)malloc(sizeof(int));
   *p=n;    return *p;
}
main()
{  int a;
   a=fun(10);  printf("%d\n",a+fun(10));
}
程序的运行结果是______。
A.0    B.10    C.20   D.出错
考点:指针的运用
名师解析: malloc(sizeof(int))的作用是开辟一个长度为sizeof(int)存储空间,并通过强制类型转换(int*)将此存储空间的地址赋给了一个整型的指针变量p。然后执行语句*p=n,使得*p的值为10,并通过return返回此值,在主函数中输出a+10的值。

填空题
21.在最坏情况下,冒泡排序的时间复杂度为______。
考点:算法的复杂度
名师解析:冒泡排序法是一种最简单的交换类排序方法,它是通过相邻数据元素的交换逐步将线性表变成有序。假设线性表的长度为n,则在最坏的情况下,冒泡排序需要经过n/2遍的从前往后的扫描和n/2遍的从后往前的扫描。

22.设一棵完全二叉树共有500个结点,则在该二叉树中有______个叶子结点。
考点:数据结构中二叉树的性质
名师解析:所谓完全二叉树是指除最后一层外,每一层上的结点数均达到最大值;在最后一层上只缺少右边的若干结点。具有n个结点的完全二叉树,其父结点数为int(n/2),而叶子结点数等于总结点数减去父结点数。本题n=500,故父结点数等于int(500/2)=250,即可得出叶子结点数。

23.人员基本信息一般包括:身份证号,姓名,性别,年龄等。其中可以作为主关键字的是______。
考点:数据库中键的概念
名师解析:主关键字能唯一标识每条记录,它可以是一个字段,也可以是一组字段。根据“唯一识别”这个标准,就可以知道答案。

 
24.下面的函数strcat(str1,str2)实现将字符串str2拼接到字符串str1后面的功能。请填空使之完整。
char *strcat(str1,str2)
char *str1,*str2;
{   char *t=str1;
     while(______)str1++;
     while(______);
     return(t);}
考点:字符串连接函数strcat()
名师解析:函数strcat(str1,str2)实现将字符串str2连接到字符串str1后面,所以首先要找到字符串str1的串尾,根据C语言的语法规定,一个串的串尾一定是一个隐含字符“\0”,而在程序中,对字符串中字符的访问是通过两个指针变量来完成的,因此要找到字符串str1的串尾,要判断*str1是否为“\0”,字符串str2也同理,程序中必须可以使字符串中字符逐一顺序体现。

25.以下程序的输出结果是______。
main()
{ int  x=0;
  sub(&x,8,1);
  printf("%d\n",x);
}
sub(int  *a,int n,int k)
{ if(k<=n)  sub(a,n/2,2*k);
  *a+=k;
}
考点:一个完整的递归调用
名师解析:主函数中调用sub函数流程如下:
sub(*x,8,1)-sub(*x,4,2)-sub(*x,2,4)-x=x+k
                 |           |
               x=x+k=7     x=x+k=6


26.设有如下宏定义
  #define   MYSWAP(z,x,y)   {z=x; x=y; y=z;}
以下程序段通过宏调用实现变量a,b内容的交换,请填空。
float  a=5,b=16,c;
MYSWAP(______,a,b)
考点:宏的应用
名师解析:本题最重要的是理解宏MYSWAP(z,x,y)的作用:通过z实现x,y的内容交换。所以MYSWAP(c,a,b)可以通过c实现a,b内容的交换。

27.以下程序运行后的输出结果是______。
#include <stdio.h>
main()
{   FILE *fp; int x[6]={1,2,3,4,5,6},i;
    fp=fopen("test.dat","wb");
    fwrite(x,sizeof(int),3,fp);
    rewind(fp);
    fread(x,sizeof(int),3,fp);
    for(i=0;i<6;i++) printf("%d",x[i]);
    printf("\n");
    fclose(fp);
}
考点:文件操作
名师解析:“fp=fopen("test.dat","wb"); ”表示文件test.dat以二进制形式打开,然后对该文件进行写操作。“fwrite(x,sizeof(int),3,fp); ”表示要从数组x中输出3次(每次sizeof(int)个字节)数据到fp所指向的文件中,其中sizeof(int)=2。rewind函数的功能是使文件的位置指针回到文件的开头。“fread(x,sizeof(int),3,fp); ”表示从fp所指向的文件读入3次(每次2个字节)数据,存储到数组x中。最后通过for循环依次输出数组x中元素,就可以得到输出结果。

 
上机题
28.人员的记录由编号和出生年、月、日组成,N名人员的数据已在主函数中存入结构体数组std中。函数fun的功能是:找出指定出生年份的人员,将其数据放在形参k所指的数组中,由主函数输出,同时由函数值返回满足指定条件的人数。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:源程序存入在考生文件夹下的BLANK.C中。不得增行或删行,也不得更改程序结构!
代码:
#include    <stdio.h>
#define    N    8
typedef  struct
{  int  num;
   int  year,month,day ;
}STU;
int fun(STU  *std, STU  *k, int  year)
{  int  i,n=0;
   for (i=0; i<N; i++)
/**********found**********/
      if(  ___1___==year)
/**********found**********/
         k[n++]= ___2___;
/**********found**********/
   return (___3___);
}
main()
{  STU  std[N]={ {1,1984,2,15},{2,1983,9,21},{3,1984,9,1},{4,1983,7,15},
                 {5,1985,9,28},{6,1982,11,15},{7,1982,6,22},{8,1984,8,19}};
   STU  k[N];         int  i,n,year;
   printf("Enter a year :  ");  scanf("%d",&year);
   n=fun(std,k,year);
   if(n==0)
      printf("\nNo person was born in %d \n",year);
   else
   {   printf("\nThese persons were born in %d \n",year);
       for(i=0; i<n; i++)
         printf("%d  %d-%d-%d\n",k[i].num,k[i].year,k[i].month,k[i].day);
   }
}
考点:结构体
名师解析:在fun函数中,要比较人员记录的出生年份是否为指定年份,只要比较STU变量中year成员变量是否等于形参中提供的year值,而在for循环中是对STU型数组中各个变量进行比较的;如果两者相等,则将其存入到STU型数组k中;最后,整数n就是能够查到的记录的条数。

29.给定程序modi.c中,函数fun的功能是:将十进制正整数m转换成k(2<=k<=9)进制数,并按位输出。例如:若输入8和2,则应输出1000(即十进制数8转换成二进制数表示为1000)。
请改正程序中的错误,使它能得出正确结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
#include <conio.h>
#include <stdio.h>
#include <windows.h>  
void fun(int m,int k)
{
  int aa[20],i;
  for (i=0;m;i++)
  {
/************found************/
    aa[i]=m/k;
    m/=k;
  }
/************found************/
  for(;i;i--)
    printf("%d",aa[i]);
}


main()
   {
   int b,n;
   system("cls");
   printf("\nPlease enter a number and a base:\n");
   scanf("%d  %d",&n,&b);
   fun(n,b);
   printf("\n");
   }
考点:数制的转换
名师解析:k进制数有两个特点:有0到k-1共k个数码和逢k进1、借1当k。k进制数某一位上的数码实际上代表该数码乘上该位上的权,如十进制数12,1实际代表1*10。原程序给出的fun函数中,第一个for循环用来将十进制的整型数据m转换为k进制数据,并将结果按从低位到高位的顺序保存在数组aa中。在for循环之后,i即为转换成的k进制数的位数。

C语言模拟题答案
选择题
1.B  2.D 3.C 4.B 5.B 6.7.C 8.D 9.B 10.B 11.A 12.A 13.C 14.D 15.D 16.D 17.B 18.C 19.D 20.C

填空题
21. n(n-1)/2  22. 250   23. 身份证号  24. “*str1”和“*str1++=*str2++”  25. 4  26. c  27. 123456

上机题

28. std[i].year   std[i]   n 29. 第一个for循环之后应改为“aa[i]=m%k”或相同作用的语句。第二个错误处为:从后往前打印存有i个数的数组中的值,其下标应该为[i-1]到[0],应改为“for(i=i-1;i>=0;i--)”。



 
本文出自2012-09-10出版的《电脑报》第36期 F.APP软件
(网站编辑:吴融)


我来说两句(0人参与讨论)
发表给力评论!看新闻,说两句。
匿名 ctrl+enter快捷提交
读者活动
48小时点击排行
论坛热帖