1、国家二级(C 语言)机试模拟试卷 116 及答案解析(总分:86.00,做题时间:90 分钟)一、选择题(总题数:40,分数:80.00)1.下面关于算法的叙述中,正确的是( )。(分数:2.00)A.算法的执行效率与数据的存储结构无关B.算法的有穷性是指算法必须能在执行有限个步骤之后终止C.算法的空间复杂度是指算法程序中指令(或语句)的条数D.以上三种描述都正确2.下列二叉树描述中,正确的是( )。(分数:2.00)A.任何一棵二叉树必须有一个度为 2 的结点B.二叉树的度可以小于 2C.非空二叉树有 0 个或 1 个根结点D.至少有 2 个根结点3.如果进栈序列为 A,B,C,D,则可能的
2、出栈序列是( )。(分数:2.00)A.C,A,D,BB.B,D,C,AC.C,D,A,BD.任意顺序4.下列各选项中,不属于序言性注释的是( )。(分数:2.00)A.程序标题B.程序设计者C.主要算法D.数据状态5.下列模式中,能够给出数据库物理存储结构与物理存取方法的是( )。(分数:2.00)A.内模式B.外模式C.概念模式D.逻辑模式6.下列叙述中,不属于软件需求规格说明书的作用的是( )。(分数:2.00)A.便于用户,开发人员进行理解和交流B.反映出用户问题的结构,可以作为软件开发工作的基础和依据C.作为确认测试和验收的依据D.便于开发人员进行需求分析7.下列不属于软件工程 3
3、个要素的是( )。(分数:2.00)A.工具B.过程C.方法D.环境8.数据库系统在其内部具有 3 级模式,用来描述数据库中全体数据的全局逻辑结构和特性的是( )。(分数:2.00)A.外模式B.概念模式C.内模式D.存储模式9.将 ER 图转换到关系模式时,实体与联系都可以表示成( )。(分数:2.00)A.属性B.关系C.记录D.码10.某二叉树中度为 2 的结点有 10 个,则该二叉树中有( )个叶子结点。(分数:2.00)A.9B.10C.11D.1211.以下叙述中正确的是( )。(分数:2.00)A.C 程序中注释部分可以出现在程序中任意合适的地方B.C 程序的书写格式是固定的,每
4、行只能写一条语句C.构成 C 程序的基本单位是函数,所有函数名都可以由用户命名D.在对 C 语言程序进行编译时,可以发现注释行中的拼写错误12.下面的程序在编译时产生错误,其出错原因是( )。 #inc1ude main() int 1_case; float printF; printf(“请输入 2 个数:“); scanf(“d f“, &1_case, &printF); printf(“d f/n“,1_case, printF); (分数:2.00)A.定义语句出错,1 case 不能作为变量名B.定义语句出错,printF 不能用作用户自定义标识符C.定义语句无错,scanf 不
5、能作为输入函数使用D.定义语句无错,printf 不能输出 1 case 的值13.以下不正确的转义字符是( )。(分数:2.00)A.fB.dC.sD.08814.下面程序的运行结果是( )。 y=5;x=14;y=(x=3*y,x+6),x1); printf(“x=d,y=d“,x,y);(分数:2.00)A.x=27, y=27B.x=12, y=13C.x=15,y=14D.x=y=2715.sizeof(char)是( )。(分数:2.00)A.一种函数调用B.一个整型表达式C.个字符型表达式D.一个不合法的表达式16.下列 4 个程序中,完全正确的是( )。(分数:2.00)A.
6、#inc1ude main(); /*programming*/ printf(“programming!n“);B.#inc1ude stdioh main() *programming* printf(“programming!n“);C.#inc1ude stdioh main() *programming*/* printf(“programming!n“);D.inc1ude stdioh main() /*programming* printf(”programming!n“);17.设变量均已正确定义,若要通过 scanf(“dcdc“,&a1,&c1,&a2,&c2);语句为变
7、量 a1 和 a2赋数值 10 和 20,为变量 c1 和 c2 赋字符 X 和 Y。下列所示的输入形式中正确的是(注:口代表空格字符)( )。(分数:2.00)A.10X20YCRB.10X20YCRC.10XCR D10XCR20YCR 20 口 YCR18.两次运行下面的程序,如果从键盘上分别输入 3 和 2,则输出结果是( )。 #inc1ude main() int x; scanf(”d”,&x); if(x+2) printf(”d”,X); else printf(“d/n“,x ); (分数:2.00)A.4 和 3B.4 和 2C.4 和 1D.3 和 219.以下叙述中不
8、正确的是( )。(分数:2.00)A.在不同的函数中可以使用相同的名字的变量B.函数中的形式参数是局部变量C.在一个函数内定义的变量只在本函数范围内有效D.在一个函数内的复合语句中定义的变量在本函数范围内有效20.运行下面的程序,输入字符串“Microsoft Visua1 Studio”,则程序的执行结果是( )。 #inc1ude main() char Chr20; scanf(“s“,Chr); printf(“sn“,Chr); (分数:2.00)A.Microsoft Visua1 StudioB.MC.MicrosofiD.MicrosoftVisuaIStudio21.若有“d
9、ouble a:”,则正确的输入语句是( )。(分数:2.00)A.scanf(“lf“,a);B.scanf(“f“,&a);C.scanf(“lf,&a)D.scanf(“1e“,a);22.if 语句的基本形式为:if(表达式)语句,其中“表达式”( )。(分数:2.00)A.可以是任意合法的表达式B.必须是逻辑表达式C.必须是逻辑表达式或关系表达式D.必须是关系表达式23.若 i、j 已定义成 int 型,则以下程序段中内循环体的总执行次数是( )。 for(1=6;i0;i ) for(j=0;j2) printf(”d”,X); else printf(“d/n“,x ); (分数
10、:2.00)A.4 和 3 B.4 和 2C.4 和 1D.3 和 2解析:解析:本题考查 ifelse 语句。首先,scanf 函数通过键盘读入 x 的值。当 x=3 时,第一个 if 语句先判断条件,取 x 的值 3 和 2 比较,然后将 x 的值加 1,if 条件成立,执行下面的 printf 语句,输出x 的值 4。当 x=2 时,第一个 if 语句先判断条件,先取 x 的值 2 和 2 比较,然后将 x 的值加 1(x 的值变为 3),if 条件不成立,执行下面的 else 语句,先输出 x 的值 3,再将 x 的值减 1。19.以下叙述中不正确的是( )。(分数:2.00)A.在不
11、同的函数中可以使用相同的名字的变量B.函数中的形式参数是局部变量C.在一个函数内定义的变量只在本函数范围内有效D.在一个函数内的复合语句中定义的变量在本函数范围内有效 解析:解析:此题考查的是变量的作用范围。选项 D)中,在一个函数的复合语句中定义的变量是局部变量,只在定义此变量的复合语句内有效,并不是在整个函数体内都有效。20.运行下面的程序,输入字符串“Microsoft Visua1 Studio”,则程序的执行结果是( )。 #inc1ude main() char Chr20; scanf(“s“,Chr); printf(“sn“,Chr); (分数:2.00)A.Microsof
12、t Visua1 StudioB.MC.Microsofi D.MicrosoftVisuaIStudio解析:解析:当从键盘输入“Microsofi Visua1Studio”时,由于“scanf”输入函数的特点是遇到空格时结束读入字符,因此,该程序只将“Microsoft”这 9 个字符送到了字符数组 str 中,并在其后自动加上结束符“/0”。21.若有“double a:”,则正确的输入语句是( )。(分数:2.00)A.scanf(“lf“,a);B.scanf(“f“,&a);C.scanf(“lf,&a) D.scanf(“1e“,a);解析:解析:scanf 函数的调用形式是:
13、scanfl”格式字符串”,输入项地址表)。其中,“格式字符串”是要输入的变量的格式符: “输入项地址表”是要输入的变量的地址。a 是 double 型数据,格式字符串可以用“lf”,“f”是浮点型。题中定义变量 a 为双精度型变量,双精度变量的格式符为“lf”;变量的地址用取地址符“&”加变量名表示,变量 a 的地址为“&a”。22.if 语句的基本形式为:if(表达式)语句,其中“表达式”( )。(分数:2.00)A.可以是任意合法的表达式 B.必须是逻辑表达式C.必须是逻辑表达式或关系表达式D.必须是关系表达式解析:解析:本题考查 if 表达式。i(表达式)中的表达式可以为任何合法的表达
14、式,一般情况下为逻辑、条件表达式,需要注意的是,当等号(=)误写为赋值号(=)时不会报错的,但是其值恒为 1。23.若 i、j 已定义成 int 型,则以下程序段中内循环体的总执行次数是( )。 for(1=6;i0;i ) for(j=0;j0。30.已知:int c34;,则对数组元素引用正确的是( )。(分数:2.00)A.c14B.c150C.c1+00D)以上表达都错误 解析:解析:此题考查的是数组元素的引用。对于已定义的数组 aMN,数组元素的正确引用必须满足行下标小于 M,列下标小于 N,且为正整数。因此,选项 A)中列下标溢出;选项 B)中行下标出现小数;选项 C)满足要求。3
15、1.以下程序: #inc1ude #inc1ude main() char str=“abcd/n/123/xab“; printf(“d“, strlen (str); 运行后的输出结果是( )。(分数:2.00)A.10B.9C.7 D.14解析:解析:本题考查字符串的长度,需注意转义字符串,例如,“/n”表示换行,为一个长度, “/123”表示 3 位八进制数 123 表示的字符,为一个长度,“/xab“表示二位十六进制数 ab 表示的字符,也为一个长度。32.C 语言中允许用外部说明来指定变量、函数和其他标识符的特征,这里所说的外部指的是( )。(分数:2.00)A.冠以关键字 ext
16、ernB.位置在函数体外部C.作用范围是全程的D.位置在函数的外部 解析:解析:C 语言中允许用位置在函数外部的说明来指定变量、函数和其他标识符的特征。33.有以下程序: #inc1ude int fun(int x,int y) if(x=y)retum(x); else return(x+y)/2); main() int a=1,b=2,c=3; printf(“d/n“,fun(2*a,fun(b,c); 程序运行后的输出结果是( )。(分数:2.00)A.2 B.3C.4D.5解析:解析:fun(b,c)即 fun(2,3),2!=3,所以返回(2+3)/2=2;fun(2*a,2)
17、即 fun(2,2),2=2,所以返回 2。34.若有“char s33=“AAA“,“BBB“,“CCC“);”说明语句,则与它等价的语句是( )。(分数:2.00)A.char*s=“AAA“,“BBB“,“CCC“;B.char*s3=“AAA“,“BBB“,“CCC“;C.char s5=“AAA“,“BBB“,“CCC“;D.char s3=“AAA“,“BBB“,“CCC”; 解析:解析:二维字符数组在定义时可省略第一维的维数,根据初始化有 3 个字符串,所以选项 D)中数组有 3 行,与已知说明语句等价。35.计算机高级语言程序的运行方法有编译执行和解释执行两种,以下叙述中正确的
18、是( )。(分数:2.00)A.C 语言程序仅可以编译执行 B.C 语言程序仅可以解释执行C.C 语言程序既可以编译执行又可以解释执行D.以上说法都不对解析:解析:C 语言作为计算机高级语言,用它编写的程序必须经过 C 语言的编译器编译后,转换为二进制的机器码来运行。36.若有如下说明,且 int 类型占两个字节,则正确的叙述为( )。 struct st int a; int b2; a.(分数:2.00)A.结构体变量 a 与结构体成员 a 同名,定义是合法的 B.程序只在执行到该结构体时才为结构体 st 分配存储单元C.程序运行时为结构体 st 分配 8 字节存储单元D.类型名 stru
19、ct st 可以通过 extern 关键字提前引用解析:解析:本题主要考查结构体的用法:结构体变量 a 与结构体成员 a 同名,定义合法;在程序编译的时候结构的定义并不会使系统为该结构分配内存空间,只有在说明结构变量时才分配内存空间;int a 占 2 个字节,int b2占 4 个字节,共 6 个;类型名“struct st”不可以通过 extern 关键字提前引用。37.有以下程序: #inc1ude int fun(int *k) int b=0; b=*k(+b: return(b); main() int a10=1,2,3,4,5,6,7,8),i; for(i=2;iA.10 1
20、2B.810C.34 D.10 28解析:解析:b 是局部变量,因此当 i=2 时,fun 的返回值值为 3,i=3 时 fun 返回值为 4。38.设有一联合体变量定义如下: union data long a; float b: int c: char d: ; union data x: 执行下列语句后,正确的联合体变量 x 的值是 ( )。 xa=111111, xb=2222; xc=21546; xd=R;(分数:2.00)A.111111B.2222C.2.1546D.R 解析:解析:本题主要考查的知识点是联合体的内存使用。联合体与结构体的定义相同,其本质区别就在于内存使用方式的
21、不同。联合体所占用的内存空间为最长的成员所占用的空间,各个成员分量全部是从低地址方向开始使用内存单元;联合体中的空间在某一时刻只能保持某一个成员的数据,所以本题执行完一系列赋值后,只得到最后执行的字符R。39.若 x=2,y=3,则 x&y 的结果是( )。(分数:2.00)A.0B.2 C.3D.5解析:解析:本题主要考查按位与(&)运算的知识点。“”是对两个运算量相应的位进行逻辑与, “”的规则与逻辑与“&“相同。x=2 的二进制为 00000010,y=3 的二进制为00000011,x&y:00000010,转化为十进制即为 2。40.已知一个文件中存放若干工人档案记录,其数据结构如下
22、: struct a char number 100; int age; float p6;); 定义一个数组:struct a number10; 假定文件已正确打开,不能正确地从文件中读入 10 名工人数据到数组 b 中的是( )。(分数:2.00)A.fread(b,sizeof(struct a),10,fp);B.for(i=0;iC.for(i=0;iD.for(i=0;i解析:解析:数据块输入/输出函数的调用形式为:fread(buffer,size,count,fp)fread 函数参数说明:“buffer”是一个指针,对 fread 来说,它是读入数据的存放地址。对 fwri
23、te 来说,是要输出数据的地址。“size”是要读写的字节数;“count”是要进行读写多少个 size 字节的数据项;“fp”是指文件型指针。选项 B)中 bi是一个数组,不是指针,需改为bi。注意:完成一次读操作(fread()后,如果没有关闭流(fc1ose(),则指针(FILE*fp)自动向后移动前一次读写的长度,不关闭流则继续下一次读操作,接着上次的输出继续输出。二、程序填空题(总题数:1,分数:2.00)41.给定程序中,函数 fun 的功能是:计算形参 x 所指数组中 N 个数的平均值(规定所有数均为正数),将所指数组中小于平均值的数据移至数组的前部,大于等于平均值的数据移至 x
24、 所指数组的后部,平均值作为函数值返回,在主函数中输出平均值和移动后的数据。 例如,有 10 个正数:46 30 32 40 6 17 45 15 48 26,平均值为:30500000 移动后的输出为:30 6 17 15 26 46 32 40 45 48 请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。 注意:源程序存放在考生文件夹下的BLANK1C 中。 不得增行或删行,也不得更改程序的结构! #include #include #define N 10 double fun (double *x) int i,j; double av,yN; av=0; i=0
25、; while (i 5; 1+) printf (“d “,num1i ) ; printf (“/n“) ; (分数:2.00)_正确答案:(正确答案:(1)xi/N (2)j+或 j =j+1 (3)i+或 i=i+1)解析:解析:本题中函数 fun 的功能是计算形参 x 所指数组中 N 个数的平均值(规定所有数均为正数),将所指数组中小于平均值的数据移至数组的前部,大于等于平均值的数据移至 x 所指数组的后部。在 fun函数中,首先求平均值,然后拿平均值逐个和数组元素比较,如果元素值小于平均值则保存在数组 y 中,再把大于等于平均值的元素放在数组 y 后面,最后把 v 数组内的元素拷贝
26、到 x 所指的数组中。 第一空:“for(i0; i三、程序修改题(总题数:1,分数:2.00)42.给定程序 MOD11C 中,函数 fun 的功能是:在有 n 名学生,2 门课成绩的结构体数组 std 中,计算出第 1 门课程的平均分,作为函数值返回。 例如,主函数中给出了 4 名学生的数据,则程序运行的结果为:第 1 门课程的平均分是: 76125000 请改正函数 fun 中指定部位的错误,使它能得出正确的结果。 注意:不要改动 main 函数,不得增行或删行,也不得更改程序的结构。 #include typedef struct char num8; double score L2
27、; STU; double fun(STU std,int n) int i; double sum ; sum += std i score 1 ; return sum/n; main () STU std = “N1001“,765,820 ,“N1002“,665,730,“N1005“,805,660, “N1006“,810/560;printf(“第 1 门课程的平均分 是: lf/n“,fun (std,4) ; (分数:2.00)_正确答案:(正确答案:(1) double sum 改为 double sum=0 (2)for(i=0; i解析:解析:本题 fun 函数的主要
28、功能是:在有 n 名学生,2 门课成绩的结构体数组 std 中,计算出第 1门课程的平均分,作为函数值返回。这里就是很基本的求平均数,只不过这里涉及到结构体,稍微要比普通的求平均数复杂一点。fun0 函数就是相加求和,注意结构体涉及的细节问题即可。 (1)第一个错误在定义单门课程所有人总分 sum 时,因为 sum 是总分,而后面的计算式也确定为“sum+=stdiscore1”。很明显地,这里的 sum 需要定义一个初始值才能正确计算,而初始值只能是为 0 计算才是正确的,所以这里应该是“double sum“改为“double sum=0:”。 第二个错误在 fun 函数的 for 循环条
29、件中。这里的for 循环是为了求各科的分数和然后计算平均分,因此 for 循环的次数和计算平均分的个数是一样的,fun 函数是计算 n 个学生第一门课的平均分,所以这里的 sum 的循环肯定也是要进行 n 次,而原程序却是“i2”,这样明显只会进行 2 次循环,显然是不对的,所以为了进行必要的分数相加,这里的“i2”应该改成“i四、程序设计题(总题数:1,分数:2.00)43.请编写函数 fun,其功能是分别统计形参 t 所指二维数组中字母 A 和 C 的个数。 注意:部分源程序存在 PROG1C 中,请勿改动主函数 main 和其他函数中的任何内容,仅在函数 fun 的花括号中填入所编写的若
30、干语句。 #include #include #define M 14 void NONO () ; void fun (char (*t) M ,int*a,int*c) void get (char (*s) M ) int i,j ; si j=65+rand() 12; printf (“/n“) ; main () char aM M; int x,y; get (a) ; printf(“A=d C=d/n“,x,y); NONO(); void NONO() /*本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */ FILE *fp,*wf; int i,j,x,y
31、; char aMM; fp=fopen(“indat“,“r“) ; wf=fopen (“outdat“,“w“) ; for( i=0; i_正确答案:(正确答案:void fun ( char (*t) M , int*a ,int *c)int 1, j;* a=0; * c=0; for( i=0; i解析:解析:本题中 fun 函数实现的功能的主要功能是找出二维数组中 A 和 C 的个数,最先就能想到用条件语句进行判断和统计。解题步骤主要为:第一步,要得到所需要的二维数组,第二步,二维数组进入fun 函数中进行数据处理,fun 函数中需要 if 条件语句来进行判断,判断数组中的字
32、母是否为 A 或者 C,数组中的每个数据都需要进行判断,要注意 A 和 C 是分开统计的,所以这里需要同时统计 A 和 C,然后分别得到结果;第三步,输出得到的结果:字母 A 和字母 C 的个数。 本题首先需要一个二维数组,二维数组的大小在程序开始就进行了定义“define=14”,这个大小比较合适,然后利用 gets 函数得到数组,然后数据就可以进入 fun 函数中进行处理应用。进入 fun 函数,fun 函数首先肯定需要 for 循环语句将二维数组中的数据进行排序使用,然后需要条件语句进行判断处理,这两步是一体,见程序第 911 行,for循环保证全部使用了二维数组中数据,并且是依次使用,if 语句判断了字母是否为 A 或者 C 或者都不是,并且进行了统计相加得到了 A 的个数 a,C 的个数 c,这样循环完成后,A 和 C 的个数 a、c 就能继续返回主函数进行输出了,见程序 26 行,最终得到结果。
copyright@ 2008-2019 麦多课文库(www.mydoc123.com)网站版权所有
备案/许可证编号:苏ICP备17064731号-1