1、国家二级(C 语言)机试模拟试卷 130 及答案解析(总分:86.00,做题时间:90 分钟)一、选择题(总题数:40,分数:80.00)1.下列叙述中正确的是( )。(分数:2.00)A.线性表的链式存储结构与顺序存储结构所需要的存储空间是相同的B.线性表的链式存储结构所需要的存储空间一般要多于顺序存储结构C.线性表的链式存储结构所需要的存储空间一般要少于顺序存储结构D.线性表的链式存储结构与顺序存储结构在存储空间的需求上没有可比性2.下列叙述中正确的是( )。(分数:2.00)A.栈是一种先进先出的线性表B.队列是一种后进先出的线性表C.栈与队列都是非线性结构D.以上三种说法都不对3.软件
2、测试的目的是( )。(分数:2.00)A.评估软件可靠性B.发现并改正程序中的错误C.改正程序中的错误D.发现程序中的错误4.在软件开发中,需求分析阶段产生的主要文档是( )。(分数:2.00)A.软件集成测试计划B.软件详细设计说明书C.用户手册D.软件需求规格说明书5.软件生命周期是指( )。(分数:2.00)A.软件产品从提出、实现、使用维护到停止使用退役的过程B.软件从需求分析、设计、实现到测试完成的过程C.软件的开发过程D.软件的运行维护过程6.面向对象方法中,继承是指( )。(分数:2.00)A.一组对象所具有的相似性质B.一个对象具有另一个对象的性质C.各对象之间的共同性质D.类
3、之间共享属性和操作的机制7.层次型、网状型和关系型数据库划分原则是( )。(分数:2.00)A.记录长度B.文件的大小C.联系的复杂程度D.数据之间的联系方式8.一个工作人员可以使用多台计算机,而一台计算机可被多个人使用,则实体工作人员与实体计算机之间的联系是( )。(分数:2.00)A.一对一B.一对多C.多对多D.多对一9.数据库设计中反映用户对数据要求的模式是( )。(分数:2.00)A.内模式B.概念模式C.外模式D.设计模式10.有三个关系 R、S 和 T 如下: (分数:2.00)A.自然连接B.差C.交D.并11.计算机能直接执行的程序是( )。(分数:2.00)A.源程序B.目
4、标程序C.汇编程序D.可执行程序12.以下叙述中正确的是( )。(分数:2.00)A.C 语言规定必须用 main 作为主函数名,程序将从此开始执行B.可以在程序中由用户指定任意一个函数作为主函数,程序将从此开始执行C.C 语言程序将从源程序中第一个函数开始执行D.main 的各种大小写拼写形式都可以作为主函数名,如 MAIN,Main 等13.以下选项中可用做 C 程序合法实数的是( )。(分数:2.00)A.30e02B.1e0C.E9D.912E14.下列定义变量的语句中错误的是( )。(分数:2.00)A.int_int;B.double int_;C.char For;D.noat
5、US$:15.表达式:int)(double)92)一 92 的值是( )。(分数:2.00)A.0B.3C.4D.516.设变量均已正确定义,若要通过 scanf(“dcdc”,后面的语句 n+=2;k 一一;。执行 break 语句跳出 switch 判断,打印 n 的值,即2。经过第一次循环后,k 的值为 3,然后进行 k0&n0&nsex);D.scanf(“d”,ps 一age); 解析:解析:本题考查结构体的相关知识,题目中需要输入一个变量,scanf 要求参数为指针,而 D 选项中 ps 一age 为一个变量,不是指针,所以错误。36.若有以下语句:typedef struet
6、S int g;char h;T;以下叙述中正确的是( )。(分数:2.00)A.可用 S 定义结构体变量B.可用 T 定义结构体变量 C.S 是 struet 类型的变量D.T 是 struet S 类型的变量解析:解析:本题考查 typedef 重新声明一种结构体类型,那么 T 为结构体类型,而不是结构体变量,所以 B 选项正确。37.有以下程序: #include #include struet A int a; char b10; double c; ; struct A f(struet A t); main() struet A a=1001,“ZhangDa”,10980; a=
7、f(a); printf(“d,s,61fn”,aa,ab,ac); struet A f(struet A t) ta=1002; strcpy(tb,“ChangRong”); te=12020: return t; 程序运行后的输出结果是( )。(分数:2.00)A.1002,ZhangDa,12020B.1002,ChangRong,12020 C.1001,ChangRong,10980D.1001,ZhangDa,10980解析:解析:本题考查结构体变量的引用以及作为函数参数,题目虽然看似复杂,其实比较容易,f 函数的参数是结构体变量,然后对参数重新赋值并返回,所以该题目的答案为
8、B 选项。38.设有宏定义: #define IsDIV(k,n)(kn=1)?1:0) 且变量 m 已正确定义并赋值,则宏调用: IsDIV(m,5)&IsDIV(m,7)为真时所要表达的是( )。(分数:2.00)A.判断 m 是否能被 5 和 7 整除B.判断 m 被 5 和 7 整除是否都余 1 C.判断 m 被 5 或者 7 整除是否余 1D.判断 m 是否能被 5 或者 7 整除解析:解析:本题考查逻辑运算符的相关概念,逻辑与若要为真,那么两边都要为真,即 m 都能被 5 和 7整除都余 1,所以选项 B 正确。39.有以下程序: #include main() int a=1,b
9、=2,e=3,x; x=(ab)&c; prinff(“dn”,X); 程序运行后的输出结果是( )。(分数:2.00)A.3 B.1C.2 0)0解析:解析:本题考查位运算符以及相关运算,为按位或,&为按位与,那么 ab 为 3,再与 c 按位与仍然为 3,所以答案为 A 选项。40.有以下程序: #include main() FILE*fp; int k,13,a6=1,2,3,4,5,6; fp:fopen(“d2dat”,“W”); fprintf(fp,“dddn”,a0,a1,a2); fprinff(fp,“dddn”,a3,a4,a5); fclose(fp); fp=fop
10、en(“d2dat”,“r”);fscanf(fp,“dd”,&k,&n); prinff(“ddn”,k,n); fclose(fp); 程序运行后的输出结果是( )。(分数:2.00)A.1 2B.1 4C.123 4D.123 456 解析:解析:fprinff()函数向文本文件输出数据,将输出的内容按格式输出到硬盘的文本文件中。执行两次 fprinff 后,文件中的内容为“123 456”,所以 D 选项正确。二、程序填空题(总题数:1,分数:2.00)41.函数 fun 的功能是:将一副扑克牌编号为 1,2,3,53,54,以某种特定的方式洗牌,这种方式是将这副牌分成两半,然后将它们
11、交叉,并始终保持编号为 1 的牌在最上方,如第一次这样洗牌后的结果为:1,28,2,29,53,27,54。两次洗牌后的结果为:1,41,28,15,2,42,53,40,27,14,54。程序的功能是:输出经过 n 次这样洗牌后的结果。请在程序的下画线处填入正确的内容,并把下画线删除,使程序得出正确的结果。注意:源程序存放在考生文件夹下的 BLANKlC 中。不得增行或删行,也不得更改程序的结构!试题程序: #includestdioh void fun(int a55,int lrl) int i,k; *found* int m55; for(i=0;i11;i+) for(k=1;k=
12、27;k+) b2*k 一 1=ak; *found* b一2*k=ak+27; for(k=1;k=54;k+) *found* ak=3; main() int m,a55,i; flor(i=1;i55;i+)ai=i; trintf(“请输入洗牌次数:”);scanf(“d”,&m); fun(a,m); for(i=1;i55;i H)prinff(“d,”,ai); printf(“n”); (分数:2.00)_正确答案:(正确答案:(1)b (2)2 (3)bk)解析:解析:填空 1:for 循环中使用了一个数组 b,用来临时存放交换位置后的扑克牌,C 语言中变量需要先声明后使用
13、,所以填空 (1)处需要声明一个数组 b。答案为 b。 填空 2:第二个 for 循环是将数组 a中前一半元素(即 127 编号的扑克牌)放入数组 b 的奇数位置,将数组 a 中的后一半元素(即 2854 编号的扑克牌)放人数组 b 的偶数位置,实现扑克牌的交叉洗牌。所以填空(2)处是数组 b 的起始值为 2 的偶数下标 2k,答案为 2。 填空 3:由于数组 b 属于函数中的临时变量,所以将数组 a 的元素交叉存储到数组b 后,还需要将数组 b 的元素依次赋值给数组 a,第三个 for 循环实现的功能是将数组 b 赋值给数组 a,所以填空(3)处需要填入对应下标为 k 的数组 b 的元素,答
14、案为 bk。三、程序修改题(总题数:1,分数:2.00)42.下列给定程序中,函数 fun 的功能是:从低位开始依次取出长整型变量 s 中奇数位上的数,构成一个新数存放在 t 中。高位仍在高位,低位仍在低位。例如,当 s 中的数为 7654321 时,t 中的数为 7531。请改正程序中的错误,使它能得出正确的结果。注意:部分源程序在文件 MODllC 中,不得增行或删行,也不得更改程序的结构! #includestdioh *found* void fun(10ng s,long t) long s1=10; ,it t=s10: while(s0) s=s100; *t=s10*s1+*t
15、: *found* s1=s1*100: main() long s,t; prinff(“nPlease enter s:”);scanf(“ld”,s); fun(s,&t); prinff(“The result is:1dn”,t); (分数:2.00)_正确答案:(正确答案:(1)void fun(long s,long*t) (2)s1=s1*10;)解析:解析:函数定义,指针型变量;数值 n 和其各个位如何表示。 (1)主函数中调用函数的参数为地址,因此函数 fun 的形式参数应为指针类型。 (2)重新组合一个数,从个位开始,然后十位,依次类推,因此每增加一位数,原数值需乘以 1
16、0,即 s1=s1*10;。四、程序设计题(总题数:1,分数:2.00)43.规定输入的字符串中只包含字母和*号。请编写函数 fun,其功能是:除了字符串前导的*号之外,将串中其他*号全部删除。在编写函数时,不得使用 C 语言提供的字符串函数。例如,字符串中的内容为:“*A*BC*DEF*G*”,删除后,字符串中的内容应当是:“*ABCDEFG”。注意:部分源程序在文件 PROGlC 中。请勿改动主函数 main 和其他函数中的任何内容,仅在函数 fun 的花括号中填入你编写的若干语句。 #includestdioh void fun(char*a) main() char s81;void
17、NONO(); printf(“Enter a string:n”);gets(s); fun(s); prinff(“The string after deleted:n”);puts(s); NONO(); void NONO() *本函数用于打开文件,输人数据,调用函数,输出数据,关闭文件。* FILE,*in,*out; int i;char s81; in=fopen(“indat”,“r”); out=fopen(“outdat”,“W”); for(i=0;i10;i+) fscanf(in,“s”,s); fun(s); fprintf(out,“sn”,s); fclose(in); fclose(out); (分数:2.00)_正确答案:(正确答案:void fun(char*a) int i=0: char*p=a; while(*p&*p=*) ai=*p; i+: p+; while(*p) if(*p!=*) ai=*p;i+; p+; ai=0; )解析:解析:本题考查:指针型变量定义;while 循环语句;if 语句条件表达式;字符串结束标识0。