- 2012-9-5 18:51:35
- 类型:原创
- 来源:电脑报
- 报纸编辑:陈邓新
- 作者:
全国计算机等级考试技术组成员,计算机等级考试资深名师。参与全国计算机等级考试评卷及《全国计算机等级考试——习题集》、《C语言程序设计》等10多本教材与参考书籍的编写。
2012年9月22日,下半年的全国计算机等级考试就开考试了,在最后一周的冲刺阶段,怎么才能确保万无一失地通过考试?电脑报邀请名师,结合多年出题经验和阅卷经验,帮助大家解决这个问题,助大家一举成功(本文将刊登最受关注的C语言模拟题,VB等其他科目的模拟题请到http://go.icpcw.com/f/d15.htm下载)!
牢记冲刺复习四条经验
放松心态不要紧张
在最后复习阶段,调整好心态很重要,因为稳定平和的心态可以保证高考的稳定发挥。要相信自己,辛辛苦苦复习那么久,60分是一定拿得到的,这个没有高考难。
切不可再进行“题海战术”
在最后复习阶段,考生要回归基础,进行查漏补缺。多看看以前做过的题,错在哪里,如何避免以后再错。
注意“比较总结”学习成果
对一些关系复杂的知识点,通过比较、总结更容易理解和牢记。特别是一些容易混淆、重要的概念,例如C语言中的数组和指针的关系。
提前熟悉上机环境
在上机考试中,部分考生不熟悉考试的程序调试环境,最终影响考试成绩,例如不知道如何调试或修改程序、如何保存文件等。
遵守考试三大法则
在考试时,有的学生朋友缺乏考试经验,从而影响了成绩,下面,根据我多年的观察和总结,给大家提几条建议:
先易后难法
一般来说,优先做完较基础较简单的题目,确保小处不丢分,再集中精力攻克难题——就算最后没有做出来也不影响最终的成绩。
动笔复查法
在笔试中,复查阶段必须用笔在草稿纸上进行演算,不能只靠思考,因为只有用笔复查才可以避免思维的空白点;在上机中,每题编完后须“按要求执行”,至少要执行两次。
倒推法
在笔试中,如果碰到较难的选择题,可以根据选项进行“倒推”,例如将选项代入代码中,从输出的个数、格式、类型等判断选项是不是正确的答案。
 
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--)”。
 
报纸客服电话:4006677866 报纸客服信箱:pcw-advice@vip.sina.com 友情链接与合作:987349267(QQ) 广告与活动:675009(QQ) 网站联系信箱:cpcw@cpcw*.c*m
Copyright © 2006-2011 电脑报官方网站 版权所有 渝ICP备10009040号