1、国家二级( C语言)机试模拟试卷 34 及答案与解析 一、选择题 1 下列关于栈叙述正确的是 ( )。 ( A)算法就是程序 ( B)设计算法时只需要考虑数据结构的设计 ( C)设计算法时只需要考虑结果的可靠性 ( D)以上三种说法都不对 2 下列叙述中正确的是 ( )。 ( A)有一个以上根结点的数据结构不一定是非线性结构 ( B)只有一个根结点的数据结构不一定是线性结构 ( C)循环链表是非线性结构 ( D)双向链表是非线性结构 3 下列关于二叉树的叙述中,正确的是 ( )。 ( A)叶子结点总 是比度为 2的结点少一个 ( B)叶子结点总是比度为 2的结点多一个 ( C)叶子结点数是度为
2、 2的结点数的两倍 ( D)度为 2的结点数是度为 1的结点数的两倍 4 软件生命周期中的活动不包括 ( )。 ( A)市场调研 ( B)需求分析 ( C)软件测试 ( D)软件维护 5 某系统总体结构图如下图所示: 该系统总体结构图的深度是 ( )。 ( A) 7 ( B) 6 ( C) 3 ( D) 2 6 程序调试的任务是 ( )。 ( A)设计测试用例 ( B)验证程序的正确性 ( C)发现程序中的错误 ( D)诊 断和改正程序中的错误 7 下列关于数据库设计的叙述中,正确的是 ( )。 ( A)在需求分析阶段建立数据字典 ( B)在概念设计阶段建立数据字典 ( C)在逻辑设计阶段建立
3、数据字典 ( D)在物理设计阶段建立数据字典 8 数据库系统的三级模式不包括 ( )。 ( A)概念模式 ( B)内模式 ( C)外模式 ( D)数据模式 9 有三个关系 R、 S和 T如下: 则由关系 R和S得到关系 T的操作是 ( )。 ( A)自然连接 ( B)交 ( C)投影 ( D)并 10 下列选项中属于面向对象设计方法主 要特征的是 ( )。 ( A)继承 ( B)自顶向下 ( C)模块化 ( D)逐步求精 11 以下叙述中错误的是 ( A)算法正确的程序可以有零个输入 ( B)算法正确的程序最终一定会结束 ( C)算法正确的程序可以有零个输出 ( D)算法正确的程序对于相同的输
4、入一定有相同的结果 12 以下叙述中正确的是 ( A) C语句必须在一行内写完 ( B) C程序中的每一行只能写一条语句 ( C) C语言程序中的注释必须与语句写在同一行 ( D)简单 C语句必须以分号结束 13 以下选项中关于 C语言常量的叙述错 误的是 ( A)经常被使用的变量可以定义成常量 ( B)常量分为整型常量、实型常量、字符常量和字符串常量 ( C)常量可分为数值型常量和非数值型常量 ( D)所谓常量,是指在程序运行过程中,其值不能被改变的量 14 以下选项中,不合法的 C语言用户标识符是 ( A) a_b ( B) AaBc ( C) a-b ( D) _1 15 若变量均已正确
5、定义并赋值,以下合法的 C语言赋值语句是 ( A) x=y=5; ( B) x=n%2.5; ( C) x+n=i; ( D) x=5=4+1; 16 设有定义: int a; float b; 执行 scanf(“%2d%f“, 语句时,若从键盘输入 876 543.0回车 则 a和 b的值分别是 ( A) 87和 6.0 ( B) 876和 543.0 ( C) 87和 543.0 ( D) 76和 543.0 17 有以下定义语句,编译时会出现编译错误的是 ( A) char a=x2d; ( B) char a=n; ( C) char a=a; ( D) char a=“aa“; 1
6、8 当变量 c的值 不为 2、 4、 6时,值也为 “真 “的表达式是 ( A) (c =2 if(x 0) y=sqrt(-x); ( B) if(x =0) y=sqrt(x); else y=sqrt(-x); ( C) y=sqrt(x); if(x 0) y=sqrt(-x); ( D) y=sqrt(x =0: x :-x); 20 有以下程序 #include stdio.h main() int y=10; while(y-); printf(“y=%dn“,y); 程序执行后的输出结果是 ( A) y=-1 ( B) y=0 ( C) y=1 ( D) while构成无限循环
7、 21 有以下程序 #include stdio.h main() int i; for(i=1; i =40; i+) if(i+%5=0) if(+i%8=0) printf(“%d “,i); printf(“n“); 执行后的输出结果是 ( A) 5 ( B) 24 ( C) 32 ( D) 40 22 有以下程序 #include stdio.h main() int s; scanf(“%d“, while( s 0 ) switch(s) case 1: printf(“%d“, s+5); case 2: printf(“%d“, s+4); break; case 3: pr
8、intf(“%d“, s+3); default: printf(“%d“, s+1); break; scanf(“%d“, 运行时,若输入 1 2 3 4 5 0回车,则输出结果是 ( A) 66656 ( B) 6566456 ( C) 66666 ( D) 6666656 23 以下叙述中错误的是 ( A)用户定义的函数中可以没有 return语句 ( B)用户定义的函数中可以有多个 return语句,以便可以调用一次返回多个函数值 ( C)用户定义的函数中若没有 return语句,则应当 定义函数为 void类型 ( D)函数的 return语句中可以没有表达式 24 有以下程序 #
9、include stdio.h void fun(char *c,int d) *c=*c+1; d=d+1; printf(“%c,%c,“,*c,d); main() char b=a,a=A; fun( printf(“%c,%cn“,b,a); 程序运行后 的输出结果是 ( A) b,B,b,A ( B) b,B,B,A ( C) a,B,B,a ( D) a,B,a,B 25 下列选项中,能正确定义数组的语句是 ( A) int num0.2008; ( B) int num; ( C) int N=2008; int numN; ( D) #define N 2008 int nu
10、mN; 26 以下函数实现按每行 8个输出 w所指数组中的数据 #include stdio.h void fun( int *w, int n) int i; for(i=0;i n;i+) _ printf(“%d “,wi); printf(“n“); ( A) if( i/8=0 ) printf(“n“); ( B) if( i/8=0 ) continue; ( C) if( i%8=0 ) printf(“n“); ( D) if( i%8=0 ) continue; 27 有以下程序 #include stdio.h void fun (char *c) while(*c) i
11、f( *c = a c+; main() char s81; gets(s); fun(s); puts(s); 当执行程序时从键盘上输入 Hello Beijing回车,则程序的输出结果是 ( A) hello beijing ( B) Hello Beijing ( C) HELLO BEIJING ( D) hELLO Beijing 28 有以下程序 #include stdio.h main() int a44=1,4,3,2, 8,6,5,7, 3,7,2,5, 4,8,6,1; int i, j, k, t; for (i=0; i 4; i+) for (j=0; j 3; j
12、+) for (k=j+1; k 4; k+) if (aji aki) t=aji; aji = aki; aki = t; /* 按列排序 */ for (i=0; i 4; i+) printf(“%d, “,aii); 程序运行后的输出结果 是 ( A) 1, 6, 2, 1, ( B) 8, 7, 3, 1, ( C) 4, 7, 5, 2, ( D) 1, 6, 5, 7, 29 有以下程序( strcat函数用以连接两个字符串 ) #include stdio.h #include string.h main() char a20=“ABCD0EFG0“,b=“IJK“; str
13、cat(a,b); printf(“%sn“,a); 程序运行后的输出结果是 ( A) IJK ( B) ABCDE0FG0IJK ( C) ABCDIJK ( D) EFGIJK 30 有以下程序段 char name20; int num; scanf(“name=%s num=%d“,name, 当执行上述程序段,并从键盘输入: name=Lili num=1001回车后, name的值为 ( A) name=Lili num=1001 ( B) name=Lili ( C) Lili num= ( D) Lili 31 有以下程序 #include stdio.h main() cha
14、r ch =“uvwxyz“,*pc; pc=ch; printf(“%cn“, *(pc+5); 程序运行后的输出结果是 ( A) z ( B) 0 ( C)元素 ch5的地址 ( D)字符 y的地址 32 有以下程序 #include stdio.h main() char s=“012xy“; int i,n=0; for(i=0;si!=0;i+) if(si =a printf(“%dn“,n); 程序运行后的输出结果是 ( A) 0 ( B) 2 ( C) 3 ( D) 5 33 有以下程序 #include stdio.h int fun(int n) if(n=1) retur
15、n 1; else return(n+fun(n-1); main() int x; scanf(“%d“, x=fun(x); printf(“%dn“,x); 执行程序时,给变量 x输入 10,程序的输出结果是 ( A) 55 ( B) 54 ( C) 65 ( D) 45 34 有以下程序 #include stdio.h int f ( int m ) static int n=0; n+=m; return n; main() int n=0; printf ( “%d,“, f(+n) ); printf ( “%dn“, f(n+) ); 程序运行后的输出结果是 ( A) 3,3
16、 ( B) 1,1 ( C) 2,3 ( D) 1,2 35 设有以下语句 typedef struct TT char c; int a4; CIN; 则下面叙述中正确的是 ( A) CIN是 struct TT类型的变量 ( B) TT是 struct类型的变量 ( C)可以用 TT定义结构体变量 ( D)可以用 CIN定义结构体变量 36 有以下程序 #include stdio.h struct ord int x,y; dt2=1,2,3,4; main() struct ord *p=dt; printf(“%d,“,+(p- x); printf(“%dn“,+(p- y); 程
17、序运行后的输出结果是 ( A) 3,4 ( B) 4,1 ( C) 2,3 ( D) 1,2 37 有以下程序 #include stdio.h #define SUB(a) (a)-(a) main() int a=2,b=3,c=5,d; d=SUB(a+b)*c; printf(“%dn“,d); 程序运行后的输出结果是 ( A) 0 ( B) -12 ( C) -20 ( D) 10 38 有以下程序 #include stdio.h main() int a=2, b; b = a 2; printf (“%dn“, b ); 程序运行后的输出结果是 ( A) 2 ( B) 4 (
18、C) 6 ( D) 8 39 下列关于 C语言文件的叙述中正确的是 ( A)文件由一系列数据依次排列组成,只能构成二进制文件 ( B)文件由结构序列组成,可以构成二进制文件或文本文件 ( C)文件由数据序列组成,可以构成二进制文件或文本文件 ( D)文件由字符序列组成,其类型只能是文本文件 40 有以下程序 #include stdio.h main() FILE *fp; int a10=1,2,3,0,0, i; fp = fopen(“d2.dat“, “wb“); fwrite(a, sizeof(int), 5, fp); fwrite(a, sizeof(int), 5, fp);
19、 fclose(fp); fp = fopen(“d2.dat“, “rb“); fread(a, sizeof(int), 10, fp); fclose(fp); for (i=0; i 10; i+) printf(“%d,“, ai); 程序的运行结果是 ( A) 1,2,3,0,0,0,0,0,0,0, ( B) 1,2,3,1,2,3,0,0,0,0, ( C) 123,0,0,0,0,123,0,0,0,0, ( D) 1,2,3,0,0,1,2,3,0,0, 二、程序填空题 41 下列给定程序中,函数 fun的功能是:将形参 s所指字符串中的所有字母字符顺序前移,其他字符顺序后
20、移,处理后将新宁符串的首地址作为函数值返回。 例如,若 s所指字符串为 “asdl23fgh543df”,处理后新字符串为“asdfghdfl23543”。 请在程序的下画线处填入正确的内容并将下画线删除,使程序得出止确的结果。 注意:部分源程序给出如下。 不得增行或删行,也不得更改程序的结构 ! 试题程序: #1nclude stdio h #include stdlib h #include string h char*fun(char*s) int i,j, k,n; char*P,*t; n=strlen(S)+1; t=(char*)malloc(n*sizeof (char); P
21、=(char*)malloc(n*sizeof (char); j=0; k=0; for(i=0; i n; i+) if(Si =a) (Si =z) |(Si =A) (si =Z) /*found*/ tj=【 1】 ; j+, else Pk=si; k+; ) /*found*/ for(i=0 ; i 【 2】 ; i+) tj+i=pi; /*found*/ tj+k=【 3】 ; return t; main() char s80, printf(“Please input: ”); scanf(“ S”, S); printf(“ nThe result is: S n”,
22、 fun(s); 三、程序修改题 42 下列给定程序中函数 fun的功能是:统计 substr所指的字符串在 str所指的字符串中出现的次数。 例如,若字符串为 aaas Ikaaas,了字符串为 as,则应输出 2。 请改正程序中的错误,使它能得出正确的结果。 注意:不要改动 main函数不得增行或删行,也不得更改程序的结构 ! 试题程序: #include stdio h int fun(char*str, char*substr) int i, j, k, num=0; /*found*/ for(i=0, stri, i+) for(j=i, k=0; substrk=str j; k
23、+, j+) /*found*/ If(substrk+1= 0) num+; break; return num; main() char str80, substr80; printf(”Input a string: ”); gets(str); printf(”Input a substring: ”); gets(substr); printf(“ d n“, fun(str, sub str); 四、程序设计题 43 规定输入的字符串中只包含字母和 *号。请编写函数 fun,其功能是:除了字符串前导的 *号之外,将串中其他 *号全部删除。在编写函数时,不得使用 c语言提供的字符串函
24、数。 例如,字符串中的内容为 “*A*BC*DEF*G*”,删除后,字符串中的内容应当是 “*ABCDEFG”。 注意:部分源程序给出如下。 请勿改动主函数 main和其他函数中的任何内容。仅在函数 fun的花括号中填入你编写的若干语句。 试题程序: #include string h #include stdio h #include conio h void fun(char*a) main() char s81; printf(“Enter astring: n”); gets(S); fun(S); printf(“The string after deleted: n”); puts
25、(s); 国家二级( C语言)机试模拟试卷 34 答案与解析 一、选择题 1 【正确答案】 D 【试题解析】 算法是指解题方案的准确而完整的描述,算法不等于程序,也不等于计算方法,所以 A)错误。设计算法时不仅要考虑对数据对象的运算和操作,还要考虑算法的控制结构。 2 【正确答案】 B 【试题解析】 线性结构应满足:有且只有一个根结点与每个结点最多有一个前件,也最多有一个后件,所以 B)正确。所以有一个以上根结点的数据结构一定 是非线性结构,所以 A)错误。循环链表和双向链表都是线性结构的数据结构。 3 【正确答案】 B 【试题解析】 根据二叉树的基本性质 3:在任意一棵二叉树中,度为 0的叶
26、子结点总是比度为 2的结点多一个。所以选择 B 4 【正确答案】 A 【试题解析】 软件生命周期可以分为软件定义、软件开发与软件运行维护三个阶段。主要活动阶段是:可行性研究与计划阶段,需求分析,软件设计,软件实现,软件测试,运行和维护,所以选择 A。 5 【正确答案】 C 【试题解析】 根据总体结构图可以看出该树的深度为 3, 比如: XY系统功能 2功能 2.1,就是最深的度数的一个表现。 6 【正确答案】 D 【试题解析】 程序调试的任务是诊断和改正程序中的错误。 7 【正确答案】 A 【试题解析】 数据字典是在需求分析阶段建立,在数据库设计过程中不断修改、充实和完善的。 8 【正确答案】
27、 D 【试题解析】 数据库系统的三级模式是概念模式、外模式和内模式,所以选择D。 9 【正确答案】 A 【试题解析】 自然连接是一种特殊的等值连接,它要求两个关系中进行比较的分量必须是相同的属性 组,并且在结果中把重复的属性列去掉,所以根据 T 中元组可以判断 R和 S做的是自然连接操作。 10 【正确答案】 A 【试题解析】 面向对象基本方法的基本概念有对象、类和实例、消息、继承与多态性,所以选择 A。 11 【正确答案】 C 【试题解析】 算法的特征 : 有穷性,一个算法 (对任何合法的输入 )在执行有穷步后能够结束 ,并且在有限的时间内完成。 确定性,算法中的每一步都有确切的含义。 可行
28、性,算法中的操作能够用已经实现的基本运算执行有限次来实现。 输入 :一个算法有零个或者多个输入 ,零个输入就是 算法本身确定了初始条件。 输出 :一个算法有一个或者多个输出 ,以反映出数据加工的结果。所以 C选项错误。 12 【正确答案】 D 【试题解析】 C语句可以跨行来写 ,但是必须以分号结束 ,所以 A选项错误, C程序中的一行可以有多条语句 ,所以 B选项错误, C语言中的注释语句可以与原语句放在一行也可以不放在一行 ,所以 C选项错误。 13 【正确答案】 A 【试题解析】 C语言中 ,常量是指在程序运行过程中其值不能被改变的量 ,变量是指运行过程中其值可以改变的量 ,二者不能混淆
29、,所以 A选项错误。 14 【正确 答案】 C 【试题解析】 C语言规定 ,变量命名必须符合标识符的命名规则 ,C选项中包含了非法字符 “-“,所以错误。标识符由字母,数字或下划线组成 ,且第一个字符必须是大小写英文字母或者下划线 ,而不能是数字。 15 【正确答案】 A 【试题解析】 B 选项中运算符 “%“的前后必须为整数 ,C选项中不能将变量赋给表达式 x+n,D选项中不能将表达式 4+1赋给常量 5。 16 【正确答案】 A 【试题解析】 在格式字符前加入一个整数可以指定输入数据所占的宽度 ,所以赋值时会将 87赋给变量 a,把 6.0赋 给 float型变量 b。 17 【正确答案】
30、 D 【试题解析】 D选项中将字符串常量 “aa“赋给字符变量 a是错误的。 18 【正确答案】 D 【试题解析】 逻辑或运算符中只要有一个运算量为真结果就是真 ,当 c =2 若圆括号中表达式的值与所有 case后面的常量表达式都不等 ,则执行 default后面的语句,然后退出。所以输入 1时打印 65,输入 2时打印 6,输入 3时打印 64,输入 4时打印 5,输入 5时打印 6。 23 【正确答案】 B 【试题解析】 本题重点考察函数返回值的相关知识,函数的值只能通过 return语句返回主调函数,在函数中允许有多个 return语句,但每次 调用只能有一个return 语句被执行,
31、因此只能返回一个函数值。不返回函数值的函数,可以明确定义为 “空类型 “,类型说明符为 “void“。因此 B 选项正确。 24 【正确答案】 A 【试题解析】 本题重点考察函数的调用,首先要了解字母对应的 ASCII 码。例如 A为 65, a为 97 。即字母 +1则可得到下一个字母。其次是函数形参和实参的问题,运行过程如下:在 fun(输出 b B因为指针 c指向地址的值为 b,此时 b=*c = b;函数返回执行 printf(“%c,%cn“,b,a); 输出 b, A,因此 A选项正确。 25 【正确答案】 D 【试题解析】 C语言不允许定义动态数组,定义数组的大小必须为常量表达式
32、。A选项错误, C语言中数组没有此类型的定义方法; B 选项错误,定义数组应指明数组大小,如果不指明数组大小,需要给定初值的个数; C选项错误, N为变量,不能用来定义数组大小。因此 D选项正确。 26 【正确答案】 C 【试题解析】 要按照每行 8个输出数据的话,横线处语句的 功能应该为:当 i是8的倍数时 ( i%8=0 ),输出一个换行符。因此 C选项正确。 27 【正确答案】 C 【试题解析】 主程序读取整个字符串存于 s中,调用 fun函数,字符指针 c指向数组 s。函数 fun的功能是把指针 c所指向的字符数组中的所有小写字符转换为大写。 gets函数可以把空格作为字符串的一部分输
33、入,以回车作为输入结束。如果 *c为小写字符,则 *c=*c-32(转大写)。因此 C选项正确。 28 【正确答案】 D 【试题解析】 首先对二维数组进行赋值操作, a00、 a01、 、 a32、a33的值为 1、 4、 、 6、 1。通过 for语句和 if语句,对二维数组各列元素进行由小到大的排序操作,程序最后通过 for语句输出二维数组对角线上的元素。因此 D选项正确。 29 【正确答案】 C 【试题解析】 字符数组 a中包含两个 0,遇到第一个 0时就表示字符串 a结束。字符串处理函数 strcat(字符数组 a,字符数组 b),功能是连接两个字符数组中的字符串,把字符串 b 连接到
34、 a的后面,结果放在字符数组 a中。连接时将字符串 a后的 0取消,只在新串最后保留一个 0。本题相当于将 “ABCD“和 “IJK“连接。因此 C选项正确。 30 【正确答案】 D 【试题解析】 在输入格式控制 “name=%s num=%d“中,普通字符“name=num=“在输入时要原样输入,而格式控制符 %s和 %d对应各自的输入项,将输入的数据赋给相应的输入项。本题中输入 “name=Lili num=1001回车“后,将字符串 Lili 赋给字符数组 name,整数 1001赋给变量 num。因此 D选项正确。 31 【正确答案】 A 【试题解析】 语句 pc=ch;使得指针变量指
35、向字符数 组 ch 的首地址,即指向字符 u。则 pc+5指向的是字符向后移动 5位,指向字符 z。所以输出的 *pc+5的值即为 z。因此 A选项正确。 32 【正确答案】 B 【试题解析】 程序首先给字符数组 s 赋值为 “012xy“, for循环语句的功能是遍历字符串,通过 if 条件语句对字符串中的小写字母计数,在符串中小写字母为 2个,即 n=2。因此 B 选项正确。 33 【正确答案】 A 【试题解析】 该程序考察的是函数的递归调用,在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归 调用,执行结果为1+2+3+8+9+10=55 。因此 A选项正确。 34
36、【正确答案】 D 【试题解析】 该题目中首先区别 +n和 n+,第一次调用 f 函数时,将 +n( n自增 1后再参与运算)作为参数进行传递,此时变量 m的值为 1,执行 n+=m;后,n=1,将 1返回主函数,并输出。第二次调用 f 函数时,将 n+( n 参与运算后再自增 1)作为参数进行传递,此时变量 m的值为 1,执行语句 n+=m;,由于 n是静态存储变量,因此 n=2,将 2返回主函数并输出。因此 D选项正确。 35 【正确答案】 D 【试 题解析】 本题考查 typedef 重新声明一种结构体类型,其中 CIN为结构体类型名,而不是结构体变量,所以 D选项正确。 36 【正确答案
37、】 C 【试题解析】 本题考查结构体数组的相关操作, dt为结构体数组,那么指针 p指向了结构体数组的一个元素,所以 p- x为 1, p- y为 2,所以结果为 2,3 选项C正确。 37 【正确答案】 C 【试题解析】 本题考查宏定义,宏定义只是做简单的替换,所以本题中SUB(a+b)*c=(a+b)-(a+b)*c=-20,所以答案为 C选项。 38 【正确答案 】 D 【试题解析】 本题考查位运算符,题目中将 a向左移两位,左移两位表示乘以4,所以答案为 8,选项 D正确。 39 【正确答案】 C 【试题解析】 本题考查文件的概念,文件是由数据序列组成,可以构成二进制文件或文本文件,所
38、以答案为 C选项。 40 【正确答案】 D 【试题解析】 本题考查文件操作函数,两次 fwrite后, fp文件中已经写入1,2,3,0,0,1,2,3,0,0然后将文件 fp中的内容重新写入数组 a中,最后输出 a为1,2,3,0,0,1,2,3,0,0,所以选项 D正确。 二、程序填空题 41 【正确答案】 (1)si (2)k (3) 0或 0 【试题解析】 填空 1:将字符串 s中所有字母元索赋给数组 t。 填空 2:字符串中所有非字母元素放到字母元素后面,所以 i的取值范围是 0一k。 填空 3:最后给字符串加入结束标识 0。 三、程序修改题 42 【正确答案】 (1)for(i=0
39、; Rtri; i+) (2)if(substrk+1= 0) 【试题解析】 先看循环条件 for(i=0, stri, i+),不难发现此处 for循环语句的格式有误,其中表达式之间应以 “; ”相隔;同时很容易发现 if条件语句处的关键字书写错误。 四、程序设计题 43 【正确答案】 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; 【试题解析】 函数 fun 的功能:除了字符串前导的 *号之外,将串中其他 *号全部删除。解答本题,首先定义一个临时指针 p,初始指向原串首地址;其次利用循环语句把字符串前导 *号复制到原串;然后继续移动指针,把串中和串尾的非 *号字符复制到原串;最后为修改后的字符串赋结束字符 0。
copyright@ 2008-2019 麦多课文库(www.mydoc123.com)网站版权所有
备案/许可证编号:苏ICP备17064731号-1