1、国家二级( C语言)机试模拟试卷 60 及答案与解析 一、选择题 1 一个栈的初始状态为空。现将元素 1、 2、 3、 4、 5、 A、 B、 C、 D、 E依次入栈,然后再依次出栈,则元素出栈的顺序是 ( )。 ( A) 12345ABCDE ( B) EDCBA54321 ( C) ABCDE12345 ( D) 54321EDCBA 2 下列叙述中正确的是 ( )。 ( A)循环队列有队头和队尾两个指针,因此,循环队列是非线性结构 ( B)在循环队列中,只需要队头指针就能反映队列中元素的动态变化情况 ( C)在循环队列中,只 需要队尾指针就能反映队列中元素的动态变化情况 ( D)循环队列
2、中元素的个数是由队头指针和队尾指针共同决定 3 在长度为 n的有序线性表中进行二分查找,最坏情况下需要比较的次数是( )。 ( A) O(n) ( B) O(n2) ( C) (log2n) ( D) O(nlog2n) 4 下列叙述中正确的是 ( )。 ( A)顺序存储结构的存储一定是连续的,链式存储结构的存储空间不一定是连续的 ( B)顺序存储结构只针对线性结构,链式存储结构只针对非线性结构 ( C)顺序存储结构能存储有序表,链式存储结构不能 存储有序表 ( D)链式存储结构比顺序存储结构节省存储空间 5 数据流图中带有箭头的线段表示的是 ( )。 ( A)控制流 ( B)事件驱动 ( C
3、)模块调用 ( D)数据流 6 在软件开发中,需求分析阶段可以使用的工具是 ( )。 ( A) N S图 ( B) DFD图 ( C) PAD图 ( D)程序流程图 7 在面向对象方法中,不属于 “对象 “基本特点的是 ( )。 ( A)一致性 ( B)分类性 ( C)多态性 ( D)标识唯一性 8 一间宿舍可住多个学生,则实体宿舍和学生之间的联系是 ( )。 ( A)一对一 ( B)一对多 ( C)多对一 ( D)多对多 9 在数据管理技术发展的三个阶段中,数据共享最好的是 ( )。 ( A)人工管理阶段 ( B)文件系统阶段 ( C)数据库系统阶段 ( D)三个阶段相同 10 有三个关系
4、R、 S和 T如下: 由关系R和 S通过运算得到关系 T,则所使用的运算为 ( )。 ( A)笛卡尔积 ( B)交 ( C)并 ( D)自然连接 11 以下不能用于描述算法的是 ( A)文字叙述 ( B)程序语句 ( C)伪代码和流程图 ( D) E-R图 12 以下 选项中合法的实型常量是 ( A) 0 ( B) 3.13e-2.1 ( C) 0.914 ( D) 2.0*10 13 以下叙述中正确的是 ( A) a是实型变量, a=10在 C语言中是允许的,因此可以说:实型变量中可以存放整型数 ( C)若有 int a=4,b=9; 执行了 a=b后, a的值已由原值改变为 b的值, b的
5、值变为0 ( D)若有 int a=4,b=9; 执行了 a=b;b=a;之后, a的值为 9, b的值为 4 14 以下选项中合法的变量是 ( A) 5a ( B) _10_ ( C) A% ( D) sizeof 15 不能正确表示数学式 的表达式是 ( A) a/c*b ( B) a*b/c ( C) a/ b* c ( D) a*(b/c) 16 有以下程序 #include stdio.h main() int a=3; printf(“%dn“, ( a+=a-=a*a ); 程序运行后的输出结果是 ( A) 3 ( B) 9 ( C) 0 ( D) -12 17 若变量已正确定义
6、,以下选项中非法的表达式是 ( A) a!=4|b ( B) a=1/2*(x=y=20,x*3) ( C) a % 4 ( D) A + 32 18 有以下程序 #include stdio.h main() int x=35, B; char z=B ; B = ( x ) printf(“%dn“, B ); 程序运行后的输出结果是 ( A) 1 ( B) 0 ( C) 35 ( D) 66 19 与数学表达式 xyz对应的 C语言表达式是 ( A) (x =y)|(y =x) ( B) (x =y =z) ( C) (x =y)!(y =z) ( D) (x =y) if( x 0.0
7、 ) y=0.0; else if( (x 5.0) else if( x 10.0 ) y=1.0 / x; else y=10.0; printf(“ %fn “, y ); 程序运行后的输出结果是 ( A) 0.000000 ( B) 0.25 ( C) 0.5 ( D) 1 21 有以下程序 #include stdio.h main() int i, sum; for( i=1; i 6; i+ ) sum+=i; printf(“%dn“, sum); 程序运行后的输出结果是 ( A)随机值 ( B) 0 ( C) 15 ( D) 16 22 有以下程序 #include stdi
8、o.h main() int a = 3; do printf(“%d,“, a-=2 ); while( ! (-a) ); printf(“n“); 程序运行后的输出结果是 ( A) 1 ( B) 1, -2, ( C) 3,0, ( D) 1,0 23 有以下程序 #include stdio.h void fun( int a, int b, int c ) a=b; b=c; c=a; main() int a=10 , b=20, c=30; fun( a, b, c ); printf(“%d,%d,%dn“,c,b,a); 程序运行后的输出结果是 ( A) 10,20,30 (
9、 B) 30,20,10 ( C) 20,30,10 ( D) 0,0,0 24 有以下程序 #include stdio.h main() int c6=10,20,30,40,50,60, *p,*s; p = c; s = printf(“%dn“, s-p ); 程序运行后的输出结果是 ( A) 5 ( B) 50 ( C) 6 ( D) 60 25 有以下程序 #include stdio.h main() int a3=0, i, j, k=2; for( i=0; i k; i+ ) for( j=0; j k; j+ ) aj = ai+1; printf(“%dn“, a1
10、); 程序运行后的输出结果是 ( A) 0 ( B) 2 ( C) 1 ( D) 3 26 有以下程序 #include stdio.h main() int a5=2,4,6,8,10, *p,*k; p = a; k = printf(“%d “, *( p+ ) ); printf(“%dn“, *k ); 程序运行后的输出结果是 ( A) 4 6 ( B) 4 4 ( C) 2 2 ( D) 2 4 27 有以下程序 #include stdio.h main() int aa33= 2,4,6 , i, *p = for ( i=0; i 2; i+ ) if( i = 0 ) aa
11、ii+1 = *p + 1; else +p; printf(“%d “, *p ); 程序运行后的输出结果是 ( A) 2 6 ( B) 2 3 ( C) 4 3 ( D) 4 6 28 以下 fun函数返回数组中最大值的下标 #include stdio.h int fun( int *s,int n ) int i , k; for( i=0 , k=i; i n; i+ ) if( si sk ) _; return ( k ) ; 在横线处应填入的内容是 ( A) +k ( B) i = k ( C) k+ ( D) k = i 29 有以下程序 #include stdio.h i
12、nt fun( char s ) char *p = s; while( *p != 0 ) p+; return ( p-s ); main() printf(“%dn“, fun(“0ABCDEF“) ); 程序运行后的输出结果是 ( A) 1 ( B) 6 ( C) 7 ( D) 0 30 若有以下程序段 char str412= “aa“,“bbb“,“ccccc“,“d“ , *strp4; int i; for( i = 0; i 4; i+ ) strpi = stri; 不能正确引用字符串的选项是 ( A) str0 ( B) strp ( C) strp3 ( D) *str
13、p 31 有以下程序 #include stdio.h #include string.h void fun ( char *s ) char a10; strcpy( a, “STRING“ ); s = a; main() char *p=“PROGRAM“; fun( p ); printf(“%sn“,p); 程序运行后的输出结果是(此处 代表空格 ) ( A) STRING ( B) STRING ( C) STRING ( D) PROGRAM 32 有以下程序 #include stdio.h void fun ( int n ,int *s ) int f; if( n=1 )
14、 *s = n+1 ; else fun( n-1, *s = f ; main() int x =0; fun( 4, printf(“%dn“,x); 程序运行后的输出结果是 ( A) 3 ( B) 1 ( C) 2 ( D) 4 33 有以下程序 #include stdio.h main() char c25=“6938“,“8254“ , *p2; int i, j, s=0; for( i=0; i 2; i+ ) pi=ci; for( i=0; i 2; i+ ) for( j=0; pij 0 ; j+=2 ) s=10*s+pij-0; printf(“%dn“,s); 程
15、序运行后的输出结果是 ( A) 9284 ( B) 9824 ( C) 6982 ( D) 6385 34 有以下程序 #include stdio.h void fun ( int *s ) static int j=0; do sj += s j+1; while(+j 2); main() int i, a10=1,2,3,4,5; for( i=1; i 3; i+ ) fun( a ); for( i=1; i 5; i+ ) printf(“%d“,ai); printf(“n“); 程序运行后的输出结果是 ( A) 34756 ( B) 5745 ( C) 5795 ( D) 3
16、5745 35 有以下程序段 int *p; p= _ malloc( sizeof( int ); 若要求使 p指向一个 int 型的动态存储单元,在横线处应填入的是 ( A) (int *) ( B) int ( C) int * ( D) ( *int ) 36 有以下程序 #include stdio.h #define SUB( X, Y ) (X+1)*Y main() int a=3, b=4; printf(“%dn“,SUB(a+ ,b+ ); 程序运行后的输出结果是 ( A) 25 ( B) 20 ( C) 12 ( D) 16 37 有以下程序 #include stdi
17、o.h main() char c25=“6938“,“8254“ , *p2; int i, j, s=0; for( i=0; i 2; i+ ) pi=ci; for( i=0; i 2; i+ ) for( j=0; pij 0 ; j+=2 ) s=10*s+pij-0; printf(“%dn“,s); 程序运行后的输出结果是 ( A) 6938 ( B) 9824 ( C) 4528 ( D) 6385 38 若有以下程序段 struct st int n; struct st *next; ; struct st a3= 5, p= 则以下选项中值为 6的表达式是 ( A) p
18、- n ( B) (*p).n ( C) p- n+ ( D) +(p- n) 39 有以下程序 #include stdio.h main() int i=1; i = ii; printf(“%dn“, i ); 程序运行后的输出结果是 ( A) 1 ( B) -1 ( C) 0 ( D) 7 40 以下程序用来统计文件中字符的个数(函数 feof用以检查文件是否结束,结束时返回非零 ) #include stdio.h main() FILE *fp; long num=0; fp=fopen(“fname.dat“,“r“); while( _ ) fgetc(fp); num+; p
19、rintf(“num=%dn“,num); fclose( fp ); 下面选项中,填入横线处不能得到正确结果的是 ( A) feof(fp)=NULL ( B) !feof(fp) ( C) feof(fp) ( D) feof(fp)=0 二、程序填空题 41 下列给定程序的功能是:从键盘输入若干行字符串 (每行不超过 80个宁符 ),写入文件 myfile4 txt中,用一 1作宁符串输入结束的标志,然后将文件的内容显示在屏幕上。文件的读写分别由函数 ReadText和 WfiteText实现。 请在程序的下画线处填入正确的内容并将下画线删除,使程序得出正确的结果。 注意:部分源程序给出
20、如下。 不得增行或删行,也不得更改程序的结构 ! 试题程序: #inciude stdio h #include String h #include stdlib h void WriteText(FTLE*), void ReadText(FILE*); main() FILE*fp; if(fp=fopen(“myfile4 txt”, “w”)=NULL) printf(“open fail! n”); exit(0); ) WriteText(fp); fclose(fp); if(fp=fopen(“myfile4 txt”, “r”)=NULL) printf(“open fail
21、! n”); exit(0); ReadText(fp); fclose(fp); /*found*/ void writeText(FILE【 1】 ) Char str81; printf(“ nEnter string with一 1 to end: n”); gets(str); while(strcmp(str, “一 1”)!=0) /*found*/ fputs(【 2】 , fw); fputs(“ n”, fw); gets(str); void ReadText(FILE*fr) ( char str81; printf(“ nRead file and output to
22、 screen: n”); fgets(str, 81, fr); while(!feof(fr) /*found*/ printf(“ s”, 【 3】 ); fgets(str, 81, fr); 三、程序修改题 42 下列给定程序中函数 fun的功能是:将 s所指字符串的正序和反序进行连接,形成的新串放在 t所指的数组中。 例如,当 s所指字符串为 “ABCD”时, t所指字符串中的内容应为 “ABCDDCBA”。 请改正程序中的错误,使它能得出正确的结果。 注意:不要改动 main函数,不得增行或删行,也不得更改程序的结构 ! 试题程序: #include conio h #inclu
23、de stdio h #include string h /*found*/ void fun(char s, char t) int i, d; d=Strlen(S); for(i=0; i d; i+) ti=Si; for(i=0; i d; i+) td+i=Sd一 1一 i; /*found*/ t2*d一 1= 0; main() char s100, t100, printf(“ nPlease enter string S: ”); Scanf(“ S”, S), fun(S, t), printf(“ nThe result is: s n”, t); 四、程序设计题 43
24、 请编写函数 fun,其功能是:将放在字符串数组中的 M个字符串 (每串的长度不超过 N),按顺序合并组成一个新的字符串。 例如,若字符申数组中的 M个字符串为 “AAAA”, “BBBBBBB”, “CC”,则合并后的字符串内容应该是 “AAAABBBBBBBCC”。 注意:部分源程序给出如下。 请勿改动主函数 main和其他函数中的任何内容,仅在函数 fun的花括号中填入你编写的若干语句。 试题程序: #include stdio h #include conio h #define M 3 #define N 20 void fun(char aMN, char*b) voidmain(
25、) char WMN=“AAAA”, “BBBBBBB”, “CC”; char a100=“# #”; int i; printf(“The string: n”); for(i=0; i M; i+) puts(wi); printf(“n”); fun(w, a); printf(“The A string: n”); printf(“ S”, a); printf(“ n、 n”); 国家二级( C语言)机试模拟试卷 60 答案与解析 一、选择题 1 【正确答案】 B 【试题解析】 栈是先进后出的原则组织数据,所以入栈最早的最后出栈,所以选择 B。 2 【正确答案】 D 【试题解析】
26、循环队列有队头和队尾两个指针,但是循环队列仍是线性结构的,所以 A)错误;在循环队列中只需要队头指针与队尾两个指针来共同反映队列中元素的动态变化情况,所以 B)与 C)错误。 3 【正确答案】 C 【试题解析】 当有序线性表为顺序存储时才能用二分法查找。可以证明的是对于长度为 n 的有序线性表,在最坏情况下,二分法查找只需要比较 log2n 次,而顺序查找需要比较 n 次。 4 【正确答案】 A 【试题解析】 链式存储结构既可以针对线性结构也可以针对非线性结构,所以 B)与 C)错误。链式存储结构中每个结点都由数据域与指针域两部分组成,增加了存储空间,所以 D)错误。 5 【正确答案】 D 【
27、试题解析】 数据流图中带箭头的线段表示的是数据流,即沿箭头方向传送数据的通道,一般在 旁边标注数据流名。 6 【正确答案】 B 【试题解析】 在需求分析阶段可以使用的工具有数据流图 DFD图,数据字典DD,判定树与判定表,所以选择 B。 7 【正确答案】 A 【试题解析】 对象有如下一些基本特点:标识唯一性、分类性、多态性、封装性、模块独立性好。所以选择 A。 8 【正确答案】 B 【试题解析】 因为一间宿舍可以住多个学生即多个学生住在一个宿舍中,但一个学生只能住一间宿舍,所以实体宿舍和学生之间是一对多的关系。 9 【正确答案】 C 【试题解析】 数据管理发 展至今已经历了三个阶段:人工管理阶
28、段、文件系统阶段和数据库系统阶段。其中最后一个阶段结构简单,使用方便逻辑性强物理性少,在各方面的表现都最好,一直占据数据库领域的主导地位,所以选择 C。 10 【正确答案】 D 【试题解析】 自然连接是一种特殊的等值连接,它要求两个关系中进行比较的分量必须是相同的属性组,并且在结果中把重复的属性列去掉,所以根据 T 关系中的有序组可知 R与 S 进行的是自然连接操作。 11 【正确答案】 D 【试题解析】 算法的描述有伪代码、流程图、 N-S 结构图等, E-R是实体联系 模型,所以选择 D。 12 【正确答案】 C 【试题解析】 A选项为整型数据, B 选项中 e后面必须为整数, D选项是表
29、达式,不是常量 ,所以选择 C。 13 【正确答案】 B 【试题解析】 A选项中 a是实型变量 ,a=10在 C语言中是允许的 ,但是实型变量中不可以存放整型数。 C选项中执行 a=b后 ,a的值变为 b 的值,为 9,b的值不变,仍为 9。 D选项中执行 a=b 后, a的值为 9,b 的值为 9,执行 b=a后 ,a的值为 9,b的值也为 9,所以选择 B。 14 【正确答案】 B 【试题解析】 变量的命名要符合 标识符的命名规则 ,即由下划线、字母或数字组成 ,且必须以下划线或字母开始 ,也不能和关键字相同 ,所以选择 B。 15 【正确答案】 C 【试题解析】 /号和 *号的优先级处于
30、平级 ,结合性都是自左至右 ?所以选择 C,C式子表示的是 ? 16 【正确答案】 D 【试题解析】 首先计算 a*a,结果为 9,然后执行 a=a-9,即 3-9,结果为 -6,然后执行a=(-6)+(-6),即 a=的值为 -12,所以选择 D。 17 【正确答案】 B 【试题解析】 B 选项中 a即表示 a为字符常量,再给 a赋值 1/2*(x=y=20,x*3),是不正确的。因此答案为 B 选项。 18 【正确答案】 A 【试题解析】 本题重点考察逻辑运算符和关系运算符的相关知识,已知变量 x为整型变量,并赋值为 35,变量 z为字符型变量,并赋值为 B。语句 B=(x)中, (x)的
31、值为 1, B的 asscii码小于 b的 asscii码,所以 (z b)的值也为 1,1。依据 printf()函数输出类型中 f 是以小数形式输出单、双精度实数。因此 C选项正确。 21 【正确答案】 A 【试题解析】 本题重点考察 for语句,变量没有初始化的情况下,默认值与编译器有关系 ,不同的编译器有不同的值。变量 sum定义后,没有赋初值,因此会输出随机值,故 A选项正确。 22 【正确答案】 B 【试题解析】 本题重点考察 dowhile 语句,该循环语句的特点是,先执行循环中的语句 ,然后再判断表达式是否为真 , 如果为真则继续循环;如果为假 , 则终止循环。因此 , do-
32、while循环至少要执行一次循环语句。变量 a赋初值为 3,每循环一次需执行语句 a-=2一次,同时循环条件使变量 a自减 1,所以第一次循环后变量 a变为 1,第 2次循环后变量 a变为 -2。因此 A选项正确。 23 【正确答 案】 B 【试题解析】 函数调用中发生的数据传送是单向的。即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。 因此在函数调用过程中,形参的值发生改变,而实参中的值不会变化。因此 B选项正确。 24 【正确答案】 A 【试题解析】 首先初始化一维数组 c6,语句 p = c;指将 c0元素的地址赋给指针变量 p;语句 s = 指将 c5 元素的地址赋给指针
33、变量 s。程序最后输出 s-p,即结果为 5。因此 A选项正确。 25 【正确答案】 D 【试题解析】 该题首先初始 化一维数组 a3所有元素都为 0;执行嵌套循环 for语句,当 i=0、 j=0时, a0=a0+1=1;当 i=0、 j=1时, a1=a0+1=2;当 i=1、j=0时, a0=a1+1=3;当 i=1、 j=1时, a1=a1+1=3;因此 D选项正确。 26 【正确答案】 D 【试题解析】 首先通过 p=a使 p指向数组的第 1个元素,所以输出 2;在输出 2以后,由于 p+,即 p就指向数组的第 2个元素, *k就是取出 p 所指向元素的值,而 p 指向的是数组的第 2个元素,即输出 4。因此 D选项正确。 27 【正确答案】 B 【试题解析】 观察题目,可以发现, *p= bk= 0; *在字符串最后加上字符串结束标记符 * 【试题解析】 本题考查:字符串连接操作。本程序中第 1个 for循 环的作用是对二维数组行的控制,第 2个循环的作用是从同一行中取出字符并存放到一维数组 b中,语句足 bk+=aij;。