1、国家计算机二级(C)93 及答案解析(总分:3480.00,做题时间:120 分钟)一、选择题(1-10 题每题 2分,11-50 题(总题数:50,分数:3000.00)1.有以下程序: int f(int n) if(n =1)return 1; else return f(n-1)+1; main( ) int i,j=0; for(i=1;i3;i+) j+=f(i); printf(“%d/n“,j); 程序运行后的输出结果是( )。 (分数:60.00)A.4B.3C.2D.12.有以下程序 main() int a=0,b=0; a=10: * 给 a赋值 b=20: 给 b赋值
2、 * printf(“a+b=dn“,a+b);*输出计算结果* 程序运行后的输出结果是【 】。 (分数:60.00)A.a+b=10B.a+b=30C.30D.出错3.有以下程序: main( ) int a=7,b=8,*p,*q,*r; p=q= r=p; p=q;q=r; printf(“%d,%d,%d,%d/n“,*p,*q,a,b); 程序运行后的输出结果是( )。 (分数:60.00)A.8,7,8,7B.7,8,7,8C.8,7,7,8D.7,8,8,74.执行以下程序后,test.txt 文件的内容是【 】。(若文件能正常打开) #include main() FILE *
3、 fp; char*sl=“Fortran“,*s2=“Basic“; if(fp=fopen(“test.txt“,“wb“)=NULL) printf(“Cant open test.txt filen“);exit(1); fwrite(sl,7,1,fp);*把从地址 sl开始的 7个字符写到 fp所指文件中* fseek(fp,0L,SEEK_SET);*文件位置指针移到文件开头* fwrite(s2,5,1,fp); fclose(fp); (分数:60.00)A.BasicanB.BasicFortranC.BasicD.FortranBasic5.设有以下语句 typedef
4、struct TT char c;int a 4;CIN; 则下面叙述中正确的是【 】。 (分数:60.00)A.可以用 TT定义结构体变量B.IT是 struct类型的变量C.可以用 CIN定义结构体变量D.CIN是 struct IT类型的变量6.有定义语句:int x, y;,若要通过 scanf(“%d,%d“,语句使变量 x得到数值 11,变量 y得到数值 12,下面四组输入形式中,错误的是( )。(分数:60.00)A.11 12B.11, 12C.11,12D.11,127.程序中已构成如下图所示的不带头结点的单向链表结构,指针变量 s、p、q 均已正确定义,并用于指向链表结点,
5、指针变量 S总是作为头指针指向链表的第一个结点。 (分数:60.00)A.首结点成为尾结点B.尾结点成为首结点C.删除首结点D.删除尾结点8.设变量已正确定义,则以下能正确计算 f=n!的程序段是【 】。(分数:60.00)A.F=0: for(i=1;i=n;i+) f*=i;B.f=1; for(i=1;in;i+) f*=i;C.f=1; for(i=n;i1;i+)f*=i;D.f=-1; for(i=n;i=2;i-)f*=i;9.以下叙述中正确的是【 】。(分数:60.00)A.break语句只能用于 switch语句体中B.continue语句的作用是:使程序的执行流程跳出包含它
6、的所有循环C.break语句只能用在循环体内和 switch语句体内D.在循环体内使用 break语句和 continue语句的作用相同10.有以下程序: #include stdio.h main( ) int a =1,2,3,4,5,6,7,8,9,10,11,12,*p=a+5,*q=NULL; *q=*(p+5); printf(“%d %d/n“,*p,*q); 程序运行后的输出结果是( )。 (分数:60.00)A.运行后报错B.6 6C.6 11D.5 1011.若有定义语句:int k23,* pk3;,则以下语句中正确的是【 】。(分数:60.00)A.pk=k;B.pk
7、0= (*a)+; main( ) char c1=A,c2=a,*p1,*p2; p1= p2= fun(p1,p2); printf(“%c%c/n“,c1,c2); 程序运行后的输出结果是( )。 (分数:60.00)A.AbB.aaC.AaD.Bb16.有以下程序: #include string.h main() char p=a,b,c,q10=a,b,c; printf(“%d%d/n“,strlen(p),strlen(q); 以下叙述中正确的是【 】。 (分数:60.00)A.在给 p和 q数组置初值时,系统会自动添加字符串结束符,故输出的长度都为 3B.由于 p数组中没有字
8、符串结束符,长度不能确定;但 q数组中字符长度为 3C.由于 q数组中没有字符串结束符,长度不能确定:但 p数组中字符长度为 3D.由于 p和 q数组中没有字符串结束符,故长度都不能确定17.以下叙述中错误的是【 】。(分数:60.00)A.C语言中对二进制文件的访问速度比文本文件快B.C语言中,随机文件以二进制代码形式存储数据C.语句 FILE fp:定义了一个名为 fp的文件指针D.C语言中的文本文件以 ASCII码形式存储数据18.以下叙述中正确的是【 】。(分数:60.00)A.用 C程序实现的算法必须要有输入和输出操作B.用 C程序实现的算法可以没有输出但必须要输入C.用 C程序实现
9、的算法可以没有输入但必须要有输出D.用 C程序实现的算法可以既没有输入也没有输出19.以下选项中不能正确把 c1定义成结构体变量的是( )。(分数:60.00)A.typedef struct int red; int green; int blue; COLOR; COLOR cl;B.struct color cl int red; int green; int blue; C.struct color int red; int green; int blue; cl;D.struct int red; int green; int blue; cl;20.以下关于函数的叙述中正确的是【
10、】。(分数:60.00)A.每个函数都可以被其他函数调用(包括 main函数)B.每个函数都可以被单独编译C.每个函数都可以单独运行D.在一个函数内部可以定义另一个函数21.有以下程序: #include string.h main(int argc ,char *argv ) int i,len=0; for(i=1;iargc;i+=2) len+=strlen(argvi); printf(“5d/n”,len); 经编译链接后生成的可执行文件是 ex.exe,若运行时输入以下带参数的命令行 ex abcd efg h3 k44 执行后输出结果是( )。 (分数:60.00)A.14B.
11、12C.8D.622.有以下程序: #includestring.h main( ) char *p=“abcde/0ghjik/0“; printf(“%d/n“,strlen(p) ); 程序运行后的输出结果是( )。 (分数:60.00)A.12B.15C.6D.523.已定义以下函数 fun(int *p) return *p; 该函数的返回值是( )。 (分数:60.00)A.不确定的值B.形参 p中存放的值C.形参 p所指存储单元中的值D.形参 p的地址值24.设有如下程序段: int x=2002, y=2003; printf(“%d/n“,(x,y); 则以下叙述中正确的是(
12、 )。 (分数:60.00)A.输出语句中格式说明符的个数少于输出项的个数,不能正确输出B.运行时产生出错信息C.输出值为 2002D.输出值为 200325.设有以下定义和语句 char str20=“Program“,*p; p=str; 则以下叙述中正确的是【 】。 (分数:60.00)A.*p与 str0的值相等B.str与 p的类型完全相同C.str数组长度和 p所指向的字符串长度相等D.数组 str中存放的内容和指针变量 p中存放的内容相同26.有一个名为 init.txt的文件,内容如下: #define HDY(A,B) AB #define PRINT(Y)printf(“Y
13、=d/n“,Y) 有以下程序 #include“init.txt“ main() int a=1,b=2,c=3,d=4,k; k=HDY(a+c,b+d); PRINT(k); 下面针对该程序的叙述正确的是【 】。 (分数:60.00)A.编译出错B.运行出错C.运行结果为 y=OD.运行结果为 Y=627.下列叙述中正确的是( )。(分数:60.00)A.在 Windows环境下,最大化的窗口是不能移动的B.在 Windows环境下,应用程序窗口最小化后,该应用程序暂停执行C.在 Windows环境下,只有最小化的窗口才能关闭D.在 Windows环境下,不能关闭最小化窗口28.以下选项中
14、合法的实型常数是( )。(分数:60.00)A.5E2.0B.E-3C.0.2D.1.3E29.有以下程序 main( ) int a 3=1,2,3,4,5,0,(*pa)3,i; pa=a; for(i=0;iA.7B.6C.8D.无确定值30.有以下程序 #include main() int x=1,y=2,z=3; if(xy) if(yA.331B.41C.2D.131.有以下程序 main( ) union unsigned int n; unsigned char c; ul; ul.c=A; printf(“%c/n“,ul.n); 执行后输出结果是( )。 (分数:60.0
15、0)A.产生语法错B.随机值C.AD.6532.有以下程序 #include main() FILE *pf; char *s1:“China“,*s2=“Beijing“; pf=fopcn(“abcdat“,“wb+“); fwrite(s2,7,1,pf); rewind(pf); /*文件位置指针回到文件开头*/ fwrite(sl,5,1,pf); fclose(pf); 以上程序执行后 abc.dat文件的内容是 (分数:60.00)A.ChinaB.ChinangC.ChinaBeijingD.BeijingChina33.若要说明一个类型名 STP,使得定义语句 STP s;等
16、价于 char *s;,以下选项中正确的是(分数:60.00)A.typedef STP char *s;B.typedef *char STP;C.typedef STP *char;D.typedef char* STP ;34.有三个关系 R、S 和 T如下: (分数:60.00)A.并B.自然连接C.笛卡尔积D.交35.有定义语句:int a=1,b=2,c=3,x;,则以下选项中各程序段执行后,x 的值不为 3的是( )。(分数:60.00)A.if (ca) x=1; else if (ba) x=2; else x=3;B.if (a3) x=3; else if (ba) x=
17、2; else x=1;C.if (aD.if (ab) x=b; if (bc) x=c; if (ca) x=a;36.设有定义:int a,*pa=以下 scanf语句中能正确为变量 a读入数据的是( )。(分数:60.00)A.scanf(“%d”,pa);B.scanf(“%d”,a);C.scanf(“%d”,D.scanf(“%d”,*pa);37.已有定义:char a=“xyz“,b=x,y,z;,以下叙述中正确的是【 】。(分数:60.00)A.数组 a和 b的长度相同B.a数组长度小于 b数组长度C.a数组长度大于 b数组长度D.上述说法都不对38.设 char型变量 x
18、中的值为 10100111,则表达式(2+x)(3)的值是(分数:60.00)A.10101001B.10101000C.11111101D.0101010139.有以下程序 #include main() char a=4; printf(“%d/n“,a=ay) if(yA.331B.41C.2D.1 解析:该题目考查 if条件语句,else 语句和最近的一个 if语句配对。由于 xy为假,所以直接执行最后一行代码。31.有以下程序 main( ) union unsigned int n; unsigned char c; ul; ul.c=A; printf(“%c/n“,ul.n);
19、 执行后输出结果是( )。 (分数:60.00)A.产生语法错B.随机值C.A D.65解析:32.有以下程序 #include main() FILE *pf; char *s1:“China“,*s2=“Beijing“; pf=fopcn(“abcdat“,“wb+“); fwrite(s2,7,1,pf); rewind(pf); /*文件位置指针回到文件开头*/ fwrite(sl,5,1,pf); fclose(pf); 以上程序执行后 abc.dat文件的内容是 (分数:60.00)A.ChinaB.Chinang C.ChinaBeijingD.BeijingChina解析:该
20、题目考查文件相关知识,“wb+”即打开或建立二进制文件并允许对其进行读和写操作。文件操作先写入了 s2,然后移动文件指针到文件夹,再写入 s1,这样 s1就会覆盖掉一部分 s2的内容。33.若要说明一个类型名 STP,使得定义语句 STP s;等价于 char *s;,以下选项中正确的是(分数:60.00)A.typedef STP char *s;B.typedef *char STP;C.typedef STP *char;D.typedef char* STP ; 解析:34.有三个关系 R、S 和 T如下: (分数:60.00)A.并B.自然连接C.笛卡尔积D.交 解析:在关系运算中,
21、交的定义如下:设 R1和 R2为参加运算的两个关系,它们具有相同的度 n,且相对应的属性值取自同一个域,则 R1R2 为交运算,结果仍为度等于 n的关系,其中,交运算的结果既属于R1又属于 R2。35.有定义语句:int a=1,b=2,c=3,x;,则以下选项中各程序段执行后,x 的值不为 3的是( )。(分数:60.00)A.if (ca) x=1; else if (ba) x=2; else x=3;B.if (a3) x=3; else if (ba) x=2; else x=1;C.if (aD.if (ab) x=b; if (bc) x=c; if (ca) x=a;解析:36
22、.设有定义:int a,*pa=以下 scanf语句中能正确为变量 a读入数据的是( )。(分数:60.00)A.scanf(“%d”,pa); B.scanf(“%d”,a);C.scanf(“%d”,D.scanf(“%d”,*pa);解析:37.已有定义:char a=“xyz“,b=x,y,z;,以下叙述中正确的是【 】。(分数:60.00)A.数组 a和 b的长度相同B.a数组长度小于 b数组长度C.a数组长度大于 b数组长度 D.上述说法都不对解析:C 语言规定/0为字符串结束标志。所以“char a=“xyz“的数组长度为 4,而“b=x,y,z;“的数组长度为 l数组长度与 s
23、trlen函数所求的长度不同,本题是指数组占内存空间的大小。 38.设 char型变量 x中的值为 10100111,则表达式(2+x)(3)的值是(分数:60.00)A.10101001B.10101000C.11111101D.01010101 解析:39.有以下程序 #include main() char a=4; printf(“%d/n“,a=as2时,返回值0。故本题经过排序后,得到第二个字符串是“abbd“,所以输出结果是 4。 42.已定义以下函数: fun(char *p2, char *p1) while(*p2=*p1)!=/0) p1+;p2+; 此函数的功能是( )
24、。 (分数:60.00)A.将 p1所指字符串复制到 p2所指内存空间 B.将 p1所指字符串的地址赋给指针 p2C.对 p1和 p2两个指针所指字符串进行比较D.检查 p1和 p2两个指针所指字符串中是否有/0解析:43.若有代数式根号下 n的 x次方+e 的 x方的绝对值(其中 e仅代表自然对数的底数,不是变量)则一下能正确表示该代数式的 C语言表达式的是【 】。(分数:60.00)A.B.C. D.解析:本题主要考查 C语言的库函数。abs 求整数的绝对值,fabs 求双字节型的绝对值,pow 函数的原形是double pow(double x,double Y),计算 x的 y次方;e
25、xp 函数的原形是 double exp(double x),求 10的 x次方;sqrt 函数的原形是 double sqrt(double x),为 x的平方根。故本题答案为 C)。44.有下列程序: #include stdio.h void fun(int * s,int n1,int n2) int i,j,t; i=n1;j=n2; while(ij)t=si;si=sj;sj=t;i+;j-; main() int a10=1,2,3,4,5,6,7,8,9,0,k; fun(a,0,3); fun(a,4,9);fun(a,0,9); for(k=0;k10;k+)printf
26、(“%d“,ak);printf(“/n“); 程序的运行结果是( )。 (分数:60.00)A.0987654321B.4321098765C.5678901234 D.0987651234解析:从题目的主函数入手,定义了一个一维数组并赋韧值,接着调用函数 fun(),fun()函数的功能为使数组中的元素逆序,当调用 fun(a,0,3),将实参传递给形参实现数组 a中 a0-a3这 4个元素逆序;同理调用 fun(a,4,9)是将上步排列好的 a数组中 a4-a9这 6个元素逆序;调用 fun(a,0,9)是将数组中 a0-a9这 10个元素在逆序,再用 printf()函数输出结果为 5
27、678901234,故选项 C正确。45.设有定义:int n=0,*p=则以下选项中,正确的赋值语句是( )(分数:60.00)A.p=1B.*q=2;C.q=p;D.*p=5; 解析:46.有以下程序: void f(int*x,int*y) int t; t=*x;*x=*y;*y=t; main() int a 8=1, 2,3,4,5, 6, 7,8,i,*p,*q; p=a;q= while(pq) f(p,q);p+;q-; for(i=0;i8;i+)printf(“%d,“ai); 程序运行后的输出结果是【 】。(分数:60.00)A.823,4,5,6,7,1,B.5,6,
28、7,8,12,3,4,C.1,2,3,4,5,6,7,8,D.8,7,6,5,4,3,2,1, 解析:本程序中函数 f的作用是交换指针变量 x和 y所指向的存储单元的值。 47.当把以下四个表达式用作 if语句的控制表达式时,有一个选项与其他三个选项含义不同,这个选项是【 】。(分数:60.00)A.k%2B.k%2=1C.(k%2)!=0D.!k%2=1 解析:本题选项 A、B、C 中表达式用作 if语句表达式时,其值一致,即判断 k的值是否为奇数,若为奇数,其表达式为真,否则为假;而选项 D的表达式“!k%2=1“相当于“!(k%2)=1,若 k的值为奇数,则此表达式的值为假。 48.若有
29、一些定义和语句 #include stdio.h int a=4,b=3,*p,*q,*w; p= q= w=q; q=NULL; 则以下选项中错误的语句是( )。 (分数:60.00)A.*q=0; B.w=p;C.*p=va;D.*p=*w;解析:49.有以下程序 main( ) char s =“/n123 / /“; printf(“%d,%d/n“,strlen(s),sizeof(s); 执行后输出结果是( )。 (分数:60.00)A.赋初值的字符串有错B.6,7C.5,6 D.6,6解析:50.有以下程序: void sort(int a ,int n) int i,j,t;
30、for(i=0;in-1;i+=2) for(j=i+2;jn;j+=2) if(aiaj) t=ai;ai=aj;aj=t; main ( ) int aa10=1,2,3,4,5,6,7,8,9,10,i; sort(aa,10); for(i=0;i10;i+) printf(“%d”,aai); printf(“/n”); 其输出结果是( )。 (分数:60.00)A.1,2,3,4,5,6,7,8,9,10,B.10,9,8,7,6,5,4,3,2,1,C.9,2,7,4,5,6,3,8,1,10, D.1,10,3,8,5,6,7,4,9,2,解析:二、填空题(每空 2分,共 40
31、分)(总题数:12,分数:480.00)51.以下程序中函数 huiwen的功能是检查一个字符串是否是回文,当字符串是回文时,函数返回字符串 yes!,否则函数返回字符串 no!,并在主函数中输出,所谓回文即正向与反向的拼写都一样,例如:adgda。请填空。#includestring.h char*huiwen (char*str) char*p1,*p2;int i,t=0; p1=str;p2= 1。 for(i=0;istrlen(str)/2;i+) if(*p1+!=*p2-)t=1;break; if( 2)return(“yes“!); else return(“no!“);
32、main3 char str50; printf(“Input:“);scanf(“%s“,str); printf(“%s/n“, 4); (分数:40.00)填空项 1:_ (正确答案:p1+(strlen(str)-1)或 str+(strlen(str)-1) , t=0或!(t!=0)或 t!=1或!t , huiWen(str))解析: 本题的要求是判断从键盘输入的字符串是否是回文,但在主函数中并没有完成此功能的代码,故第20空应该填调用函数 huiwen代码,即 huiwen(str)。 由于回文字符串是指正向与反向拼写都一样,所以对于一个字符串,如果正向顺序与反向顺序对应位置上
33、的字符一样,则此字符串即为回文。在函数 huiwen中,已用“p1=str“使得 p1指向字符串 str的第一个字符的地址,则第 18空语句的功能应该是使得 p2指向字符串 str的最后一个字符串的地址,故填 p1+(strlen(str)-1),由于 p1与 str指向的是同一个地址,所以,第18空也可以填 str+(strlen(str)-1)。 在进行 for循环时,如果 p1所指向的字符与 p2指向的字符不相同,则说明,字符串 str不是回文,贝佣 t=1标记,并退出循环,执行下面的 if语句,由于题中要求如果是回文,则返回“yes!“,否则,返回“no!“。故当 t=0的时候,说明字
34、符串 str为回文,所以第 19应填 t=0或!(t!=0)或 t!=1或!t。 52.按“先进后出“原则组织数据的数据结构是 1。(分数:40.00)填空项 1:_ (正确答案:栈)解析:栈是限定只在一端进行插入和删除操作的线性表,通常称插入、删除的这一端为栈顶,另一端为栈底。栈按照“先进后出“或“后进先出“的原则组织数据。53.以下函数 rotate的功能是:将 a所指 N行 N列的二维数组中的最后一行放到 b所指二维数组的第 0列中,把 a所指二维数组中的第 0行放到 b所指二维数组的最后一列中,b 所指二维数组中的其他数据不变。 #define N 4 void rotate(int
35、aN,int bN int i,j; for(i=0;iN;i+) biN-1= 1; 2=aN-1i; (分数:40.00)填空项 1:_ (正确答案:a0i)填空项 1:_ (正确答案:bi0)解析:根据题意,语句“biN-1= -|_|-;“的作用是把 a所指二维数组中的第 0行放到b所指二维数组的最后一列中,在 a数组中,第 0行用 a0来表示,所以第 19空填对 a0i;语句“ -|_|-=aN-1i;“的作用是将 a所指二维数组中的最后一行放到 b所指二维数组的第 0列中,b 数组中第 0列用 b0来表示,所以,第 20空填 bi0。 54.设有定义语句:inta3=0,12;,则
36、数组元素 a12的值是 1。(分数:40.00)填空项 1:_ (正确答案:0)解析:本题考查的是二维数组初始化问题。题中对数组的 a00,a10,a203个元素分别赋值为0,1,2,其余的元素都自动赋 0。所以 a12的值为 0。55.在面向对象方法中, 1 描述的是具有相似属性与操作的一组对象。(分数:40.00)填空项 1:_ (正确答案:类)解析:在面向对象方法中,类(class)描述的是具有相似属性与操作的一组对象,而一个具体对象则是其对应类的一个实例(Instance)。56.以下程序的功能是:通过函数 func输入字符并统计输入字符的个数。输入时用字符作为输入结 束标志。请填空。
37、 #include long 1 ;/* 函数说明语句 */ main2 long n; n=func3;printf(“n=%1d/n“,n); long func4 long m; for(m=0;getchar5!=; 6); return m; (分数:40.00)填空项 1:_ (正确答案:func-|_|-, m+)解析:第一空为函数说明语句,其格式为:函数标志符#函数名。第二空中的 m作为计数器,每读一个字符时加 1。57.若 fp已正确定义为一个文件指针,d1.dat 为二进制文件,请填空,以便为“读”而打开此文件:fp=fopen 1;。 (分数:40.00)填空项 1:_
38、(正确答案:“dl.dat“,“rb“ 或“dldat“,“r+b“ 或“dl.dat“,“rb+“。)解析:58.在进行模块测试时,要为每个被测试的模块另外设计两类模块:驱动模块和承接模块(桩模块)。其中 1的作用是将测试数据传送给被测试的模块,并显示被测试模块所产生的结果。(分数:40.00)填空项 1:_ (正确答案:驱动模块)解析:在进行测试时,要为每个被测试的模块另外设计两类模块:驱动模块和承接模块(桩模块):其中,驱动模块相当于被测试模块的主程序,它接收测试数据,并传给被测试模块,输出实际测试结果。承接模块通常用于代替被测试模块调用的其他模块,其作用仅做少量的数据操作,是一个模拟子
39、程序,不必将子模块的所有功能带入。 59.请在以下程序第一行的下划线处填写适当内容,使程序能正确运行。 1( double,double); main( ) double x,y; scanf(“%lf%lf“, printf(“%lf/n“,max(x,y); double max(double a,double b) return(ab ? a:b); (分数:40.00)填空项 1:_ (正确答案:double max)解析:60.以下程序的功能是:利用指针指向三个整型变量,并通过指针运算找出三个数中的最大值,输出到屏幕上。请填空。 main1 int x,Y,z,max,* px,*PY,*pz,*pmax; scanf(“ddd“, m=B+32; printf(“%c/n“,m); (分数:40.00)填空项 1:_ (正确答案:b)解析:62.有以下语句段 int n1=10,n2=20; printf(“ 1”,n1.n2); 要求按以下格式输出 n1和 n2的值,每个输出行从第一列开始,请填空。 n1=10 n2=20 (分数:40.00)填空项 1:_ (正确答案:n1=%d/nn2=%d)解析: