1、国家二级( C语言)机试模拟试卷 117及答案与解析 一、选择题 1 算法的时间复杂度是指 ( )。 ( A)算法的长度 ( B)执行算法所需要的时间 ( C)算法中的指令条数 ( D)算法执行过程中所需要的基本运算次数 2 以下数据结构中,属于非线性数据结构的是 ( )。 ( A)栈 ( B)线性表 ( C)队列 ( D)二叉树 3 数据结构中,与所使用的计算机无关的是数据的 ( )。 ( A)存储结构 ( B)物理结构 ( C)逻辑结构 ( D)线性结构 4 内聚性是对模块功能强度 的衡量,下列选项中,内聚性较弱的是 ( )。 ( A)顺序内聚 ( B)偶然内聚 ( C)时间内聚 ( D)
2、逻辑内聚 5 在关系中凡能惟一标识元组的最小属性集称为该表的键或码。二维表中可能有若干个键,它们称为该表的 ( )。 ( A)连接码 ( B)关系码 ( C)外码 ( D)候选码 6 检查软件产品是否符合需求定义的过程称为 ( )。 ( A)确认测试 ( B)需求测试 ( C)验证测试 ( D)路径测试 7 数据流图用于抽象描述一个软件的逻辑模型,数据流图由一些特定的图符构成。下列图符名标识的图符不属于数据流图合法图符的是 ( )。 ( A)控制流 ( B)加工 ( C)存储文件 ( D)源和潭 8 待排序的关键码序列为 (15, 20, 9, 30, 67, 65, 45, 90),要按关键
3、码值递增的顺序排序,采取简单选择排序法,第一趟排序后关键码 15被放到第 ( )个位置。 ( A) 2 ( B) 3 ( C) 4 ( D) 5 9 对关系 S和关系 R进行集合运算,结果中既包含关系 S中的所有元组也包含关系 R中的所有元组,这样的集合运算称为 ( )。 ( A)并运算 ( B)交运算 ( C)差运算 ( D)除运算 10 下列选项中,不属于数据管理员 (DBA)职责的是 ( )。 ( A)数据库维护 ( B)数据库设计 ( C)改善系统性能,提高系统效率 ( D)数据类型转换 11 C语言规定,在一个 C程序中, main()函数的位置 ( )。 ( A)必须在系统调用的库
4、函数之后 ( B)必须在程序的开始 ( C)必须在程序的最后 ( D)可以在任意位置 12 以下叙述中正确的是 ( )。 ( A) C语言比其他语言高级 ( B) C语言可以不用编译就能被计算机识别执行 ( C) C语言以接近英语国家的自然语言和数学语言作为语言的表达形式 ( D) C语言出现的最晚,具有其他语言的一切优点 13 已知 “int a=6; ”则执行 “a+=a=a*a; ”语句后, a的值为 ( )。 ( A) 36 ( B) 0 ( C) 24 ( D) 60 14 下列叙述中错误的是 ( )。 ( A) C语句必须以分号结束 ( B)复合语句在语法上被看作一条语句 ( C)
5、空语句出现在任何位置都不会影响程序运行 ( D)赋值表达式末尾加分号就构成赋值语句 15 若有定义: int a=7; float x=2 5, y=4 7;则表达式 “x+a 3*(int)(x+y) 2/4”的值是 ( )。 ( A) 2.5 ( B) 2.75 ( C) 3.5 ( D) 0 16 若下列选项中的各变量均为整型且已有值,其中不正确的赋值语句是 ( )。 ( A) +i: ( B) nl=(n2/(n3=2); ( C) k=i=j: ( D) a=b+c=2; 17 下列关于逻辑运算符两侧运算对象的叙述中正确的是 ( )。 ( A)只能是整数 0或 1 ( B)只能是整数
6、 0或非 0整数 ( C)可以是结 构体类型的数据 ( D)可以是任意合法的表达式 18 若有说明 int a34;则 a数组元素的非法引用是 ( )。 ( A) a02*1 ( B) a13 ( C) a420 ( D) a04 19 下列说法不正确的是 ( )。 ( A) int *ptr;指针指向整形数据 ( B) char *ptr;指针的类型是字符型指针 ( C) int *ptr,指针的类型是双重指针 ( D) int(*ptr)3;是一个指针数组,数组共有三个元素,而三个 元素是 int型指针 20 有以下程序 #inc1ude void main() char s=“01aXy
7、“; int i, n=0; for(i=0; si! =0; i+) if(si=z)n+; printf(“ dn“, n); 程序运行后的输出结果是 ( )。 ( A) 0 ( B) 2 ( C) 3 ( D) 5 21 有以下程序: #inc1ude main() int a=1, 2, 3, 4, y, *p=&a3; p; y=*p; printf(“y= dn“, y); 程序的运行结果是 ( )。 ( A) y=0 ( B) y=1 ( C) y=2 ( D) y=3 22 下面的 for语句的循环次数为 ( )。 for(x=1, y=0; (y!=1 9)&(x void
8、main() int a=0, b=1, c=2; if( +a0|+b0) +c; printf(“ d, d, d“, a, b, c); ( A) 0, 1, 2 ( B) 1, 2, 3 ( C) 1, 1, 3 ( D) 1, 2, 2 24 有以下程序: #inc1ude main() int c; while(c=getchar()!=u) switch(c3) case 0: case 1:putchar(c+4); case 2:putchar(c+4); break; case 3:putchar(c+3); case 4:putchar(c+3); break; prin
9、tf(“n“); 从第一列开始输入数据( 代表一个回车符): 3 845,则程序输出结果为 ( )。 ( A) 77889 ( B) 77868 ( C) 776810 ( D) 7.78866e+007 25 C语言规定,函数返回值的类型是 ( )。 ( A)由调用该函数时的主调函数类型所决定 ( B)由 retum语句中的表达式类型所决定 ( C)由调用该函数时系统临时决定 ( D)由定义该函数时所指定的数值类型决定 26 执行下列程序时输入 “456789123”,输出结果是 ( )。 #inc1ude main() char m80; int c, i; scanf(“ c”, c);
10、 scanf(“ d“, i); scanf(“ s“, &m); printf(“ c, d, s n“, c, i, m); ) ( A) 456, 789, 123 ( B) 4, 789, 123 ( C) 4, 56, 789, 123 ( D) 4, 56, 789 27 已知下列函数定义: fun(int *b, int c, int d) int k; for( k=0; k int f(int t, int n); main() int a4=1, 2, 3, 4), s; s=f(a, 2); printf(“ d n“, s); int f(int t, int n) i
11、f(n0)&(n #inc1ude “string h“ void fun(char *s, int n) char *t, int i, j, for(i=0; istrlen(sj) t=si; si=sj; sj=t; main() char *ss=“bcc“, “bbcc“, “xy“, “aaaacc“, “aabcc“; fun(ss, 5); printf(“ s, sn“, ss0, ss4); 程序的运行结果是 ( )。 ( A) xy, aaaacc ( B) aaaacc, xy ( C) bcc, aabcc ( D) aabcc, bcc 34 若已定义: int
12、a=0, 1, 2, 3, 4, 5, 6, 7, 8, 9, *p=a, i; 其中 019,则对 a数组元素不正确的引用是 ( )。 ( A) apa ( B) (&ai) ( C) pi ( D) a10 35 以下选项中可用作 C程序合法实数的是 ( )。 ( A) 0.1 ( B) 3 0e0 2 ( C) E9 ( D) 9 12E 36 以下叙述中不正确的是 ( )。 ( A)预处理命令行都必须以 #号开始,结尾不加分号 ( B)在程序中凡是以 #号开始的语句行都是预处理命令行 ( C) C程序在执行过程中对预处理命令进行处理 ( D)预处理命令可以放在程序中的任何位置 37 以
13、下程序的输出结果是 ( )。 #inc1ude #define F(x) 2 84+x #define w(y) printf(“ d“, (int)(y) #define P(y) w(y) main() int x=2; P(F(5)*x); ( A) 12 ( B) 13 ( C) 14 ( D) 16 38 设有下面的定义: struct st mt a; floatb: d; int *p, 要使 p指向结构变量 d中的 a成员,正确的 赋值语句是 ( )。 ( A) *p=d a; ( B) p=&a; ( C) p=d a; ( D) p=&d a; 39 交换两个变量的值,不允
14、许用临时变量,应该使用下列 ( )位运算符。 ( A) & ( B) c)| ( C) 40 如果需要打开一个已经存在的非空文件 “FILE”并进行修改,正确的语句是( )。 ( A) fp=fopen(“FILE“, “r“); ( B) fp=fopen(“FILE“, “a+“); ( C) fp=fopen(“FILE“, “w+“); ( D) fp=fopen(“FILE“, “r+“); 二、程序填空 题 41 函数 fun的功能是:根据所给的年、月、日,计算出该日是这一年的第几天,并作为函数值返回。其中函数 isleap用来判别某一年是否为闰年。 例如,若输入: 2008 5
15、1,则程序输出: 2008年 5月 1日是该年的第 122天。 请在程序的下划线处填入正确的内容,并把下划线删除,使程序得出正确的结果。 注意:源程序存放在考生文件夹下的 BLANK1 C中。 不得增行或删行,也不得更改程序的结构! #include int isleap (int year) int leap; leap= (yearo04=0 & yearool00!=0 | yearo0400=0) ; return_ (1)_; int fun (int year, int monthr int day) int table 13 = 0, 31, 28, 31, 30, 31, 30
16、, 31, 31, 30, 31, 30, 31; int days=0, i; for(i=1; i2) days=days+_ (3)_; return days; main() int year, monthf day, days; printf( “请输入年、月、日: “); scanf(“ d d d“, &year, &month, &day); days=fun(year, month, day); printf(“ d年 d月 d日是该年的第 d天 n“, year, month, day, days); 三、程序修改题 42 给定程序 modi1 c的主函数中,将 a、 b、
17、 c三个结点链成一个单向链表,并给各结点的数据域赋值,函数 fun()的作用是:累加链表结点数据域中的数据作为函数值返回。 请改正函数 fun中指定部位的错误,使它能得出正确的结果。 注意:不要改动 maln函数,不得增行或删行,也不得更改程序的结构。 #include typedef struct list int data; struct list *next; LIST; int fun (LIST *h) LIST *p; int t; p=h; while ( *p) t=t+p data; return t; main () LIST a, b, c, *h; a data=34
18、; b data=51; c data=87; c next=0; h=&a; a next=&b; b next=&c; 四、程序设计题 43 请编写一个函数 fun,它的功能是:比较两个字符 串的长度,(不得调用 C语言提供的求字符串长度的函数),函数返回较长的字符串。若两个字符串长度相同,则返回第一个字符串。 例如,输入 beijing shanghai( 为回车键),函数将返回shanghai。 注意:部分源程序存在文件 PROG1 C中。 请勿改动主函数 maln和其他函数中的任何内容,仅在函数 fun的花括号中填入你编写的若干语句。 #include char *fun (char
19、 *s, char *t) main() char a20, b20; void NONO (); printf (“Input 1th string:“); gets (a); printf (“Input 2th string:“); gets (b); printf (“ sn“, fun (a, b); NONO (); void NONO () /*本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */ FILE *fp, *wf ; int i ; char a20, b20 ; fp= fopen(“in dat“, “r“); wf= fopen (“out dat
20、“f “w“); for(i = 0 ; i 0”,所以条件成立,又因为是进行逻辑或运算,在已知其中一个运算对象为真的情况下,不必判断另外一个运算对象的真假,即不进行 +b操作,就可以直接得出整个表达式的值为逻辑 1,执行下面的 +c。 24 【正 确答案】 A 【试题解析】 题中 while循环的条件是:当从键盘读入的字符不是 “n”时,执行while循环。输入第一个字符 3时:执行 case 0,什么也不输出: case 1,输出 7;case2,输出 7;遇到 break语句,跳出 switch语句。输入第二个字符 8时“c 3=5”,不执行任何浯句。输入第三个字符 4时 “c3=1”,
21、执行 case l输出8: case2,输出 8:遇到 break语句,跳出 switch语句。输入第四个字符 5时 “c一3=2”,执行 case 2,输出 9;遇到 break语句,跳出 switch语句。 25 【正确答案】 D 【试题解析】 本题考查函数调用时的数值类型。函数调用时,函数返回值的类型既不由主调函数类型所决定,也不由 return语句中的表达式类型所决定,更不是由系统临时决定,而是由定义该函数时所指定的数值类型所决定。 26 【正确答案】 D 【试题解析】 scanf函数中的 “ c”表示通过键盘只读入一个字符型的数据, “&c”表示将该数据赋值给 c,所以 c=4。另外
22、,以 “ d”格式读入数据时,只有遇到空格或者换行等间隔时符才停止读入,所以 i=56, m=789。 27 【正确答案】 C 【试题解析】 本题考查函数调用时的参数传递。 fun函数的调用形式为fun(int*b, int c int d)。调用数组时,用数组名表示一个指向数组的第一个元素的指针,因此调用时的形式为 “fun(a, 8, 4)”。 28 【正确答案】 D 【试题解析】 &是取地址运算符, “Y=&B”是将 B的地址赋给 Y,因此 Y值为EF02。 29 【正确答案】 B 【试题解析】 本题主要考查的是函数的递归调用,子函数 f是一个递归函数,所以主函数中执行 “f(a, 2)
23、”时,其执行过程是 “a3l+f(a, 1)=a3+a2+f(a, 0)=7”。 30 【正确答案】 D 【试题解析】 本题考查如何对。二维数组的元素赋值。选项 A),数组第二维的大小是 4,但是却赋值了 5个元素,数组溢出;选项 B), C语言规定,对于二维数组,只可以省略第一个方括号中的常量表达式,而不能省略第二个方括号中的常量表达式:选项 C),数组第一维的大小是 2,但是赋值超过了 2;选项 D),在对二维数组元素赋初值时,可以只对部分元素赋初值,未赋初值的元素自动取0。 31 【正确答案】 A 【试题解析】 本题考查一维数组的赋值。一维数组的一般定义格式为:类型说明符数组名 常量表达
24、式 。其中, “”中的内容可以是整型常量,也可以是整型表达式。选项 A)中的 N是一个变量,所以错误。 32 【正确答案】 B 【试题解析】 “*s*t”的输出实际是比较两个字符的 ASCII码值,比较两个字符串的大小。 33 【正确答案】 A 【试题解析】 从 main函数入手,定义了一个一维数组并赋初值,接着调用函数fun(),函数的功能是:比较数组中各元素的长度,按元素长度从小到大的顺 序排列元素, 所 以执行 “ fun(ss, 5) ” 函数后 , “*ss=“xy“, “bcc“, “bbcc“,“aabcc“, “aaaacc“”,所以调用 printf函数输出 ss0, ss4
25、的值分别为 xy,aaaacc。 34 【正确答案】 D 【试题解析】 此题考查对一维数组的引用。对于已定义的数组 aM,数组元素的正确引用必须满足下标小于 M且为正整数。选项 D)中下标值出现溢出。 35 【正确答案】 A 【试题解析】 C程序的合法实数有两种表示形式,一种是 小数形式,另一种是指数形式,对于用指数形式表示的实数来说,需要注意的是字母 e或 E之前必须要有数字,且字母 e或 E后面的指数必须为整数,所以选项 A)为正确答案。 36 【正确答案】 C 【试题解析】 本题考查预处理命令的特点。编译预处理命令的特点有: 为了区分一般的语句,预处理命令行都必须以 #开始,结尾不加分号
26、; 预处理命令可以放在程序中的任意位置; 在程序中凡是以 #开始的语句都是预处理命令行。 37 【正确答案】 A 【试题解析】 本题考查带参数的宏定义及相关运算。 “P(F(5)*x) =P( 2 84+5*2) =P(12 84)”,调用 “w(12 84)”,输出 “(int)(12 84)=12”。 38 【正确答案】 D 【试题解析】 本题主要考查按结构数组元素方式引用结构成员。结构体变量的成员引用方法有 3种: 结构体变量名成员名; 指针变量名 成员名; (*指针变量名 )成员名。因为 p是指针变量,所以应该将地址值赋给 p。 39 【正确答案】 B 【试题解析】 按逻辑位运算的特定
27、作用主要有 3点: 用按位与运算将特定位清0或保留特定位; 用按位或运算将特定的位置设置 为 1; 用按位异或运算将某个变量的特定位翻转或交换两个变量的值。 40 【正确答案】 D 【试题解析】 本题考查打开文件函数 fopen(),打开文件函数 fopen()的调用形式为: fp=fopen(文件名,文件使用方式 )。 “文件使用方式 ”说明:方式 “r”为以输入方式打开一个文本文件;方式 “a+”为以读 /写方式打开一个文本文件,保留文件中原有的数据;方式 “W+” 为以读 /写方式建立一个新的文本文件;方式 “r+”为以读 /写方式打开一个文本文件。 二、程序填空题 41 【正确答案】
28、(1) leap (2) day (3)1 【试题解析】 本题中函数 fun的功能是根据所给的年、月、日,计算出该日是这一年的第几天,并作为函数值返回,其中要考虑是否为闰年。这道问题其实很简单,唯一要考虑的变化因素也只有闰年这个变化,而且这个变化导致的程序变化也很简单。首先设置常规的月份天数,这需要一个数组(注意这个数组应该有 13个数据,而不是 12个,因为月份是从 1月份开始的,而数组是从位置 0开始的,所以这里应该将数组的第一个数据定义为 0,后面 12个数据按照常规月份来然后给出我们需要的月份和日数后进行常规统计),这是一 般情况,如果是闰年的话且月份超过二月的话就加上 l即可,应该这
29、种情况特别给出一个判断函数就行了。 第一空: “return_(1)_; p”这一空出现在 isleap函数中,是为了判断我们给出的年份是否为闰年的函数,这里要填的为此函数的返回值。很明显地,这里的数据为 leap,判断是否为闰年后,我们还需要返回 leap是否是闰年。所以这一空应该填 lea。 第二空: “days=days+_(2)_; p”这一空出现在 fun函数中,所填的是 days的数据结果算式, days即为我们需要统计的天数。这 里根据条件和函数的下一步,我们可以看出来这里的 days统计是当年份不为闰年时的天数统计,而当年份不为闰年时,只要将给出的月份前面几个月份天数相加,再加
30、上这个月的日期即为这个给出年月日在这一年中的天数,再根据上一步我们知道算式右边的 days代表的即为本月前面月份的天数总和,所以这里只需要加上本月的日期就可以得到我们需要的一年中的第几天。所以这一空应该填的是给出的日期 day。 第三空: “days=days+_(3)_; p”这一空出现在 fun函数中,这里所填也是days的数据,但是我们可以看到这里的 days是在判断完为闰年且月份大于 2时进行的计算,所以这里的 days算法不同于上一步 days的算法。根据常识我们都可以知道,闰年大于 2的月份是要比普通的年份多一个 2月 29号的,所以要比普通的日期天数多一天,所以这里应该加上 1,
31、所以这一空应该填的是 1。 三、程序修改题 42 【正确答案】 (1) int t改为 int t=0; (2) while (*p)改为 while(p) (3)t=t+p data; 改为 t=t+(*p) data 【试题解析】 本题中函数 fun()的作用是:累加链表结点数 据域中的数据作为函数值返回。这里数据是主函数中定义的 a, b, c,但是要是链表结点的方式将其相加,其实也类似于普通的数据加减,只不过这里用到链表和结构体的话就要注意很多的细节问题,因为指针一直是 C语言最难理解的一部分,很容易搞错它的使用方法。 (1)第一个错误在定义 t时, t是数据结果,但是在一开始定义时,
32、 t应该定义为 0的,这样才不会影响后面的数据结果,以免程序出现不必要的错误所以这里应该讲 int t改为 “int t=0”。 (2)第二个错误在 fun函数中执行 while条件时 while的条件语句。这里用 “*p”,我们都知道这是指针的形式,而 “*p”的意义是指针变量 p所指向的变量的值,所以这里 “*p”是一个具体的变量,而 while(*p)的意义是 “*p”不为空时就一直执行,但是这里根据题意我们需要的链表的地址来进行题目需要的链表的计算,而单向链表的结束的标志就是链尾,链尾的特征则是指向为空,这里指向为空指的是地址比阿娘,所以这里的终止条件不应该是 p所指向的值为 O,而是
33、 p的地址为空,所以 “while( *p) ”应该改为 “while (p)”。 (3)第三个错误在 fun()函数中的计算。我们都知道,链表与结构体是紧密相连 的,这一题同样用到了,而且我们进行的也是链表结点的运算,自然要用到结构体成员变量的运算。但是在 “t=t+p data”这个运算时, “p data”的意义是 “p data”这个指针变量,也就是说这是指针变量的运算,指针变量是跟结点变量不同的,我们需要的是结点的数据,而不是指向它的指针的数据,所以这里的运算是完全错误的,为了符合题意,我们应该要使用结点的结构体变量。即 “=t+p data”应该改为 “t=t+(*p) data”
34、。 四、程序设计题 43 【正确答案】 1 int i; 2 char *p=sr * q=t; 3 int n=0, m=0; 4 while(* p)/计算串 s的长度 n,其中 p为临时指针 5 n+; 6 p+; 7 8 n while(* q)/计算串 t的长度 m,其中 q为临时指针 9 m+; 10 q+; 11 12 if(n=m) /比较 m和 n的值,设置 p指向较大的指针 13 p=s; 14 else 15 p=t; 16 return p; 【试题解析】 该程序功能是比较两个字符串的长度。解题过程是首先分别求得两个字符串的长度,然后对这两个值进行判断,实现两个字符串长度的比较。 进入 fun函数,根据前面的分析: (1)首先求得字符串的长度,设变量 n和 m分别用来求字符串的长度,初值设为0,把字符串中的字符逐个访问,每访问一个字符, n和 m分别加 1,直到字符串结束; (2)使用两个临时指针变量 p、 q分别作为访问字符串的变量; (3)根据 m和 n的值返回串,设置指针 p,指向返回串的开始地址。 字符数组和字符串、指针作为函数的参数。