1、国家二级( C语言)笔试模拟试卷 172及答案与解析 1 下列选项中不符合良好程序设计风格的是 ( A)源程序要文档化 ( B)数据说明的次序要规范化 ( C)避免滥用 goto语句 ( D)模块设计要保证高耦合、高内聚 2 软件开发模型包括 瀑布模型 扇形模型 快速原型法模型 螺旋模型 ( A) 、 、 ( B) 、 、 ( C) 、 、 ( D) 、 、 3 软件开发的结构化生命周期方法将软件生命周期划分成 ( A)定义、开发、运行维护 ( B)设计阶段、编程阶段、测试阶段 ( C)总体设计、详细设计、编程调试 ( D)需求分析、功能定义、系统设计 4 单个用户使用的数据视图的描述称为 (
2、 A)外模式 ( B)概念模式 ( C)内模式 ( D)存储模式 5 数据结构作为计算机的一门学科,主要研究数据的逻辑结构、对各种数据结构进行的运算,以及 ( A)数据的存储结构 ( B)计算方法 ( C)数据映象 ( D)逻辑存储 6 没有关系 R和 S,关系代数表达式为 R-(R-S)表示的是 ( A) RDS ( B) R-S ( C) RUS ( D) RS 7 下列叙述中正确的是 ( A)一个算法的空间复杂度大,则其时间复杂度也必定大 ( B)一个算法的空间复杂度大,则其时间复杂度必定小 ( C)一个算法的时间复杂度大,则其空间复杂度必定小 ( D)上述三种说法都不对 8 对长度为
3、n的线性表进行顺序查找,在最坏情况下所需要的比较次数为 ( A) 10g2n ( B) n/2 ( C) n ( D) n+1 9 数据库技术的根本目标是要解决数据的 ( A)存储问题 ( B)共享问题 ( C)安全问题 ( D)保护问题 10 若某二叉树的前序遍历访问顺序是 abdgcefh,中序遍历访问顺序是 dgbaechf,则其后序遍历的结点访问顺序是 ( A) bdgcefha ( B) gdbecfha ( C) bdgaechf ( D) gdbehfca 11 下列叙述中错误的是 ( A)一个 C语言程序只能实现一种算法 ( B) C程序可以由多个程序文件组成 ( C) C程序
4、可以由一个或多个函数组成 ( D)一个 C函数可以单独作为一个 C程序文件存在 12 下面四个选项中,均是不正确的八进制数或十六进制数的选项是 ( A) 016 0x8f 018 ( B) 0abc 017 0xa ( C) 010 -0x11 0x16 ( D) 0a12 7ff -123 13 以下叙述不正确的是 ( A)一个 C源程序可由一个或多个函数组成 ( B)一个 C源程序必须包含一个 main函数 ( C) C程序的基本组成单位是函数 ( D)在 C程序中,注释说明只能位于一条语句的后面 14 现有格式化输入语句, ( A) int ( B) float ( C) double
5、( D)不确定 15 已知各变量的类型说明如下: int k, a, b; unsigned long w=5; double x=1.42; 则以下不符合 C语言语法的表达式是 ( A) x%(-3) ( B) Wd+=-2 ( C) k=(a=2, b=3, a+ ( D) a+=9-=(b=4)*(a=3) 16 有以下程序 fun(int x) int p; if(x=0x=1) return(3); p=x-fun(x-2); return p; main() printf(“%dn“, fun(7); 执行后的输出结果是 ( A) 7 ( B) 3 ( C) 2 ( D) 0 17
6、 下列程序段中,不能正确赋值的是 ( A) char*p, ch; p=&ch; scanf(“%c, &p“) ( B) char*p; p=(char*)malloc(1); scanf(“%c“, p); ( C) char*p; *p=getchar(); ( D) char*p, ch; p=缸 h; *p=getchar(); 18 在 16位编译系统上,若有定义 int a=10,20, 30, *p=&a;,当执行 p+;后,下列说法错误的是 ( A) p向高地址移了一个字节 ( B) p向高地址移了一个存储单元 ( C) p向高地址移了两个字节 ( D) p与 a+1等价 1
7、9 若运行以下程序时,从键盘输入 ADescriptor CR ( CR表示回车 ),则下面程序的运行结果是 #include stdio.h main() char c; int v0=1, v1=0,v2=0; do switch(c=getchar() casea: caseA: casee: caseE: casei:caseI: caseo: caseO: caseu: caseU: v1+=1; ( A) v0=7, v1=4, v2=7 ( B) v0=8, v1=4, v2=8 ( C) v0=11, v1=4, v2=11 ( D) v0=13, v1=4, v2=12 20
8、 设 x, y和 z都是血型变量,且 x=3, y=4, z=5,则下面表达式中,值为 0的表达式是 ( A) x&y ( B) x =y ( C) x+y&y-z ( D) !(x y&!z1) 21 若有定义 int w35;,则以下不能正确表示该数组元素的表达式是 ( A) *(*w+3) ( B) *(*w+1)4 ( C) *(*(*w+1) ( D) *(&w00+1) 22 设有程序段 int k=10; while(k=0)k=k-1; 则下面描述中正确的是 ( A) while循环执行 10次 ( B)循环是无限循环 ( C)循环体语句一次也不执行 ( D)循环体语句执行一次
9、 23 若有以下函数首部 int fun(double x10, int *n) 则下面针对此函数的函数声明语句中正确的是 ( A) int fun(double x, int *n); ( B) int fun(double , int); ( C) int fun(double *x, int n); ( D) int fun(double *, int *); 24 函数的值通过 rerurn语句返回,下面关于 return语句的形式描述错误的是 ( A) return表达式; ( B) return(表达式 ); ( C)一个 return语句可以返回多个函数值 ( D)一个 retu
10、rn语句只能返回一个函数值 25 有以下程序 main() int i; for(i=1; i =40; i+) if(i+%5=0) if(+i%8=0) pfintf(“%d“, i); printf(“n“); 执行后的输出结果是 ( A) 5 ( B) 24 ( C) 32 ( D) 40 26 下列函数的运行结果是 main() int i=2, p; int j, k; j=i; k=+i;p=f(j, k); printf(“%d“, p); intf(int a, int B) int c; if(a b)c=1; else if(a=b)c=0; else c=-1; ret
11、urn(c); ( A) -1 ( B) 1 ( C) 2 ( D)编译出错,无法运行 27 对下述程序的判断中,正确的是 #include stdio.h void main() char*p, s128; p=S; while(strcmp(s, “End“) printf(“Input a string: “);gets(s); while(*p) putchar(*p+); ( A)此程序循环接收字符串并输出,直到接收字符串 “End“为止 ( B)此程序循环接收字符串,接收到字符串 “End“则输出,否则程序终止 ( C)此程序循环接收字符串并输出,直到接收字符串 “End“为止,但
12、因为代码有错误,程序不能正常工作 ( D)此程序循环接收字符串并将其连接在一起,直到接收字符串 “End“为止,输出连接在一起的字符串 28 下列关于字符串的说法中错误的是 ( A)在 C语言中,字符串是借助于字符型一维数组来存放的,并规定以字符 0作为字符串结束标志 ( B) 0作为标志占用存储空间,计入串的实际长度 ( C)在表示字符串常量的时候不需要人为在其末尾加入 0 ( D)在 C语言中,字符串常量隐含处理成以 0结尾 29 阅读下面程序,则执行后的结果是 #include“stdio.h“ main() char str=“tomeetme“, *p; for(p=str; p s
13、tr+7; p+=2)putchar(*p); printf(“n“); ( A) tomeetme ( B) tmem ( C) oete ( D) tome 30 若要求定义具有 10个 int型元素的一维数组 a,则以下定义语句中错误的是 ( A) #define N 10 int aN; ( B) #define n 5 int a2*n; ( C) int a5+5; ( D) int n=10, an; 31 对以下说明语句的正确理解是 int a10=6, 7, 8, 9, 10; ( A)将 5个初值依次赋给 a1至 a5 ( B)将 5个初值依次赋给 a0至 a4 ( C)将
14、 5个初值依次赋给 a6至 a10 ( D)因为数组长度与初值的个数不相同,所以此语句不正确 32 有以下程序 main() int x, y, z; x=y=1; z=X+, y+, +y; printf(“%d, %d, %dn“, x, y, z); 程序运行后的输出结果是 ( A) 2, 3, 3 ( B) 2, 3, 2 ( C) 2, 3, 1 ( D) 2, 2, 1 33 以下程序有错,错误原因是 main() int *p, i; char*q, ch; p=&i; q=&ch; *p=40; *p=*q; ( A) p和 q的类型不一致,不能执行 *p=*q;语句 ( B)
15、 *p中存放的是地址值,因此不能执行 *p=40;语句 ( C) q没有指向具体的存储单元, 所以 *q没有实际意义 ( D) q虽然指向了具体的存储单元,但该单元中没有确定的值,所以执行 *p=*q;没有意义,可能会影响后面语句的执行结果 34 设 p1和 p2是指向一个血型一维数组的指针变量, k为 int型变量,则不能正确执行的语句是 ( A) k=*p1+*p2 ( B) p2=k; ( C) p1=p2; ( D) k=*p1*(*p2); 35 下列程序的输出结果是 #include“stdio.h“ #define N3 #define M3 void fun(int aMN)
16、printf(“%dn“, *(a1+2); main() int aMN; int i,j; for(i=0; i M; i+) for(j=0; j N; j+) aij=i+j-(i-j); fun(a); ( A) 3 ( B) 4 ( C) 5 ( D) 6 36 有以下程序 int add(int a, int b)return(a+b); main() int k, (*f)(), a=5,b=10; f=add; 则以下函数调用语句错误的是 ( A) k=(*f)(a, b); ( B) k=add(a, b); ( C) k=*f(a, b); ( D) k=f(a, b);
17、 37 设有如下定义: struct Sk int n; float x; data, *p; 若要使 p指向data中的 n域,正确的赋值语句是 ( A) p=&data.n; ( B) *p=data.n; ( C) p=(struct sk*)&data.n; ( D) p=(struct sk*)data.n; 38 设有以下说明语句 struct ex int x; float y; char z; example; 则下面的叙述中不正确的是 ( A) struct结构体类型的关键字 ( B) example是结构体类型名 ( C) x, y, z都是结构体成员名 ( D) stru
18、ct ex是结构体类型名 39 阅读以下程序及对程序功能的描述,其中正 确的是 #include stdio.h main() FILE*in, *out; charch, infile10, outfile10; printf(“Enter the infile name: n“); scanf(“%s“, infile); printf(“Enter the outfile name: n“); scanf(“%s“,outfile); if(in=foen(infile ( A)程序完成将磁盘文件的信息在屏幕 上显示的功能 ( B)程序完成将两个磁盘文件合二为一的功能 ( C)程序完成将
19、一个磁盘文件复制到另一个磁盘文件中 ( D)程序完成将两个磁盘文件合并并在屏幕上输出 39 执行以下程序后的输出结果是 _。 main() inta=10; a=(3*5, a+4); printf(“a=%dn“, a); 39 以下程序的输出结果是 _。 #include string.h main() printf(“%dn“, strlen(“IBMn0121“); 39 已定义 char ch=$; int i=1, j;,执行 j!=ch&i+以后, i的值为 _。 39 以下程序的运行结果是 _。 #include stdio.h long fib(int g) switch(g
20、) case 0: return 0; case 1: case 2: return 1; return(fib(g-1)+fib(g-2); main() long k; k=fib(5); printf(“k=%51dn“, k); 39 下面程序的功能是输出数组 s中最大元素的下标,请填空。 main() int k, p, s=1, -9, 7, 2, -10, 3; for(p=0, k=p; p 6; p+) if(sp sk)_ printf(“%dn“, k); 39 以下程序的功能是:求出数组 x中各相邻两个元素的和依次存放到 a数组中,然后输出。请填空。 main() in
21、t x10, a9, i; for(i=0; i 10; i+)scanf(“%d“, &xi); for( 11 ; i 10; i+) ai-1=xi+ 12 ; for(i=0; i 9; i+)printf(“%d“, ai); printf(“); 39 设有以下程序,为使之正确运行,请在横线中填入应包含的命令行。 (注:try_me()函数在 a: myfile.txt中有定义。 )_ main() printf(“n“); try_me(); printf(“n“); 39 以下程序的功能是建立 个带有头结点的单向链表,链表结点中的数据通过键盘输入,当输入数据为 -1时, 表示输
22、入结束 (链表头结点的 data域不放数据,表空的条件是 ph- next=NULL),请填空。 #include stdio.h struct list int data; struct list *next; ; struct list * creatlist() struct list *p, *q, *ph; int a; ph=(struct list *)malloc(sizeof(struct 国家二级( C语言)笔试模拟试卷 172答案与解析 1 【正确答案】 D 【试题解析】 程序设计风格是指编写程序时所表现出的特点、习惯和逻辑思路。著名的 “清晰第一,效率第二 ”的论点已成
23、为当今主导的程序设计风格。形成良好的程序设计风格,主要注意和考虑下述一些因素:源程序文档化、数据说明的次序规范化、避免滥用 goto语句等。除此之外,一般较优秀的软件设计尽量做到高内聚、低耦合,这样有利于提高软件模块的独立性。 2 【正确答案】 C 【试题解析】 软件开发模型包括瀑布模型、快速原型法模型和螺旋模型。 3 【正确答案】 A 【试题解析】 通常,将软件产品从提出、实现、使用维护 到停止使用的过程称为软件生命周期。它可以分为软件定义、软件开发及软件运行维护 3个阶段。 4 【正确答案】 A 【试题解析】 选项 A)正确,外模式是用户的数据视图,也就是用户所见到的数据模式;选项 B)不
24、正确,全局数据视图的描述称为概念模式,即数据库中全部数据的整体逻辑结构的描述;选项 C)不正确,物理存储数据视图的描述称为内模式,即数据库在物理存储方面的描述;选项 D)不正确,存储模式即为内模式。 5 【正确答案】 A 【试题解析】 数据结构作为计算机的一门学科,主要研究和讨论以下三个方面的问题: 数据集合中各数据元素之间所固有的逻辑关系,即数据的逻辑结构; 在对数据进行处理时,各数据元素在计算机中的存储关系,即数据的存储结构; 对各种数据结构进行的运算。 6 【正确答案】 A 【试题解析】 R-S表示属于 R但不属于 S, R-(R-S)表示属于 R但不属于 (R-S),即相当于 RS。
25、7 【正确答案】 D 【试题解析】 算法的复杂度主要包括时间复杂度和空间复杂度。算法的时间复杂度是指执行算法所需要的计算工作量,可以用执行算法过程中所需基本运算的执行次数来度量;算法的空间复 杂度是指执行这个算法所需要的内存空间。根据各自的定义可知,算法的时间复杂度与空间复杂度并不相关。 8 【正确答案】 C 【试题解析】 对于长度为 n的有序线性表,在最坏情况下,二分查找只需要比较logn2次,而顺序查找需要比较 n次。 9 【正确答案】 B 【试题解析】 由于数据的集成性使得数据可被多个应用程序共享,特别是在网络发达的今天,数据库与网络的结合扩大了数据库的应用范围,所以数据库技术的根本问题
26、是解决数据的共享问题。 10 【正确答案】 D 【试题解析】 前序遍历的第一个 结点 a为树的根节点;中序遍历中 a的左边的结点为 a的左子树, a的右边的结点为 a的右子树;再分别对 a的左右子树进行上述两步处理,直到每个结点都找到正确的位置。 11 【正确答案】 A 【试题解析】 一个 C程序可以有一个或多个程序文件,也可以有一个或多个函数,所以一个 C语言程序可以实现多种算法。 12 【正确答案】 D 【试题解析】 八进制中,不可能包括 8以上的数字,它的范围只在 0 7之间,以 0开头。同样,十六进制是以 0x开头,数字在 0 9和 A F之间。 13 【正确答案】 D 【试题解析】
27、本题考查 C语言的基本基础知识。在 C程序中,注释用符号 “/*”开始,而以符号 “*/”结束。程序的注释可以放在程序的任何位置。通常将注释放在程序的开始,以说明本程序的功能;或者放在程序的某个语句后面,以对此语句的功能进行描述。无论将注释放有何处,在程序进行编译时,编译程序不会处理注释的内容;且注释内容也不会出现在目标程序中。 14 【正确答案】 C 【试题解析】 根据混合运算规则,如果有一个数据是 float型或 double型,则其他数据类型先转化为 double型,运算的结果最终也是 double型。 15 【正确答案】 A 【试题解析】 “%”是求余运算符或模运算符, “%”两侧均应
28、为整型数据,选项A)中的 x是 double型数据。 16 【正确答案】 C 【试题解析】 因为 fun(int x)是一个递归函数,所以主函数中 fun(7)经过三次递归调用,其过程可以描述为 “fun(7)=7-fun(5)=7-(5-fun(3)=7-(5-(3-fun(1)=7-(5-(3-3)=7-5=2”,所以最后的输出结果为 2。 17 【正确答案】 C 【试题解析】 本题考查了字符的输入函数 getchax和利用 scanf函数输入一个字符。用 scanf输入字符时,格式说明字符应该为 %c。本题选项 C)因为指针 P没有赋初值,所以是一个不定值,不能直接将 getchar读入
29、的字符赋给指针 p所指向的字符,所以选项 C错误。 18 【正确答案】 A 【试题解析】 在 16位编译系统下,一个 int型变量是用 16位来存储的,其占用两个字节,当执行 p+之后,相当于 p向高位移动了一个存储单元,也就是两个字节。因此,本题的答案为选项 A)。 19 【正确答案】 D 20 【 正确答案】 D 【试题解析】 该题考查逻辑与 “&”和逻辑或 “”以及逻辑非 “!”符号的用法。选项 A)即 3&4为真;选项 B)即 3 =4为真;选项 C)是一个逻辑或与逻辑与的混合运算,只要执行了逻辑或左半部分,程序将直接停止执行逻辑或右半部分程序,因为 x的值为真;此时选项 C)变为 1
30、&-1为真。选项 D)不用计算,括号内逻辑或右边的值为 1,因而括号内的值为 1,再进行逻辑非运算得 0。 21 【正确答案】 C 【试题解析】 在 C语言中,二维数组的名字表示的是二维数组的地址,表达式*(W+1)表示 的是二维数组的第一行的第二个元素。在其前面再加上 *(*(w+1)就是错误的表达式。 22 【正确答案】 C 【试题解析】 本题中,首先将 0赋给 k,表达式变为 0,跳出循环,没有执行循环体语句。解答本题的关键是掌握 while语句。 23 【正确答案】 C 【试题解析】 函数首部 int fun(double x10, int *n)表示这个函数的返回值是整型,其第一个形
31、式参数是一个双精度型的一维数组,第二个参数是一个整型指针。在 C语言中,一维数组的名字表示的是一维数组的地址,所以选项 C)是正确的。 24 【正确答案】 C 【试题解析】 return语句中的表达式的值就是所求的函数值,此表达式值的类型必须与函数首部所说明的类型一致。如果类型不一致,则以函数值的类型为准,由系统自动进行转换。一个 return语句只能返回一个值。 25 【正确答案】 C 【试题解析】 当 for循环执行到第 30次时, i的值为 30能被 5整除,然后继续执行两次 if语句, i经过两次自加 1运算,值变为 32,能被 8整除,故此时第一次执行 “printf(“%d“, i
32、); ”语句,即输出 32。 26 【正确答案】 A 【试题解析】 函数调用相当于 f(2, 3),程序运算应得结果为 “-1”。 27 【正确答案】 B 【试题解析】 此题考查了字符串输入函数 gets和字符串比较函数 strcmp,另外还有字符输出函数 putchar。 gets从标准输入设备中读入全部字符,包括空格,直到遇到回车符为止。 strcmp是字符串比较函数,即 strcmp(字符串 1,字符串 2),如果字符串 1=字符串 2,则函数值为 0;如果宇符串 1,字符串 2,则函数值为一正整数;如果字符串 1字符串 2,则函数值为一负整数。 putchar(c)函数将字符 c输出到
33、标准输出设备上。 28 【正确答案】 B 【试题解析】 0作为标志占用存储空间,但是不计入串的实际长度。当给一个字符型指针赋值时,赋给这个指针的是这个字符串的地址。 29 【正确答案】 B 【试题解析】 存放字符串的字符数组的名字就是这个字符串的首地址。本题的功能是对字符串 “tomeetme”进行选择式输出,从第一个字母开始,每输出一个字符即跳过一个。 30 【正确答案】 D 【试题解析】 在选项 D)中, n是一个整型的变量。 C语言 规定,在一维数组的定义中,其下标只能是常量表达式,不能包含变量。 31 【正确答案】 B 【试题解析】 本题中,表达式将 5个初值赋给 a0至 a4,后面的
34、部分,将自动被补零。 32 【正确答案】 C 【试题解析】 整型变量 x、 y的初值都为 1, “x+, y+, +y”是一个逗号表达式,程序执行 “z=x+, y+, +y”后, x的值为 2, y的值为 3, z取豆号表达式中第二个表达式的值,为 1。 33 【正确答案】 D 【试题解析】 该程序的执行过程是:首先声明整型指针变 量 P和整型变量 i,字符型指针变量 q和字符型变量 ch,将 i的地址赋给指针变量 p,将 ch的地址赋给指针变量 q,将 40赋给 *p,此时, q已经指向了一个具体的存储单元,但 ch的值不确定,即 *p没有确定的值,所以不能执行 *p=*q语句。 34 【
35、正确答案】 B 【试题解析】 本题主要考查了一维数组指针的赋值和用指针引用数组元素进行运算。选项 B)中 p2为指向 int型变量的指针,而 k为 int型变量,不能将 int型变量直接赋值给指向 int型变量的指针,所以选项 B)错误。 35 【正确答案】 B 【试题 解析】 若有以下定义: int a34, i, j;且当 0 =i 3, 0 =j 4,则可以有以下几种方式来引用数组中的第 i行,第 j列的元素: aaj, *(ai+j), *(*(a+i)+j), (*(a+i)j, *(&a 00+4*i+j)”。 36 【正确答案】 C 【试题解析】 在语句 “k=*f(a, b)”
36、中,由于 “()”的优先级高于 “*”,所以 “*f(a,b); ”表示其返回类型为指针的带有两个整型参数的函数。 37 【正确答案】 C 【试题解析】 本题 主要考查了结构体变量引用成员数据的方法,主要有以下几种:结构体变量名,成员名或结构体指针 -,成员名的方法来引用结构体成员。 38 【正确答案】 B 【试题解析】 本题中, struct ex是结构体类型名, ex-ample是结构体变量名。 39 【正确答案】 C 39 【试题解析】 本题考查的是表达式的优先级问题。先计算表达式 3*5=15,再计算 a+4=14,将数据 14赋值给 a,根据 printf()函数内的输出格式控制串,
37、最后的输出结果应为 “a=14”。 39 【试题解析】 本题 的字符串中共有 9个字符,它们分别是 I、 B、 M、 n、0、 I, 2、 1、 ,其中, “n”表示换行, “”表示反斜杠字符 “”,所以本题的最后输出结果为 9。 39 【试题解析】 在执行逻辑表达式 “j=! ch&i+”时,首先判断 j=!ch的值,因为“ch=$”不为 0,所以 “j=! ch=0”,编译系统便不再计算表达式 “i+”的值, i的值不变,仍为 1。 39 【试题解析】 本题主要考查了函数的递归调用方法。 g=0或 g=1或 g=2是递归的终止条件, 然后用回代的方法从一个已知值推出下一个值,直到计算出最终
38、结果。 39 【试题解析】 为寻找数组中最大元素的下标,需先预设 1个临时最大元素的下标,并顺序逐一考查数组的元素,当发现当前元素比临时最大元素更大时,就用当前元素的下标更新临时最大元素下标。直至考查了数组的全部元素后,这临时最大元素下标就是数组的最大元素下标。通常预设的最大元素下标是数组的首元素下标,考查通常从首元素开始顺序向后继元素考查。程序中,存储临时最大元素下标的变量是 k,变量 p控制顺序考查的循环控制变量。当发现当前元素 sp比临时最大元 素 sk更大时,应该用 p更新 k,所以在空框处应填入代码 “k=p; ”。 39 【试题解析】 对于 10个数,相邻的两个数相加取和,总共要进行 9次加法运算,所以空 14处应填入 i=1。相邻的两个数相加取和,放在数组 a中, x0与 x1的和存放在 a0中,所以空 15处应填入 xi-1。 39 【试题解析】 本题考查了函数的存储分类的概念。如果没有特别说明,函数的存储范围是从定义函数的位置到文件的结尾,如果其他文件想使用这个函数,需要用 #include文件包含命令将定义函数的文件包含进来。 39 【试题解析】 本题考查的是链表这一数据结构对结构体变量中数据的引用。链表的特点是结构体变量中有两个域,一个是数据,另一个是指向该结构体变量类型的指针,用以指明链表的下一个结点。