1、二级 C 语言真题(1)及答案解析(总分:100.00,做题时间:90 分钟)一、选择题(总题数:40,分数:40.00)1.下列叙述中正确的是_。(分数:1.00)A.程序执行的效率与数据的存储结构密切相关B.程序执行的效率只取决于程序的控制结构C.程序执行的效率只取决于所处理的数据量D.以上说法均错误2.下列与队列结构有关联的是_。(分数:1.00)A.函数的递归调用B.数组元素的引用C.多重循环的执行D.先到先服务的作业调度3.对下列二叉树 (分数:1.00)A.DYBEAFCZXB.YDEBFZXCAC.ABDYECFXZD.ABCDEFXYZ4.一个栈的初始状态为空,现将元素 1,2
2、,3,A,B,C 依次入栈,然后再依次出栈,则元素出栈的顺序是_。(分数:1.00)A.1,2,3,A,B,CB.C,B,A,1,2,3C.C,B,A,3,2,1D.1,2,3,C,B,A5.下面属于白盒测试方法的是_。(分数:1.00)A.等价类划分法B.逻辑覆盖C.边界值分析法D.错误推测法6.下面对对象概念描述正确的是_。(分数:1.00)A.对象间的通信靠消息传递B.对象是名字和方法的封装体C.任何对象必须有继承性D.对象的多态性是指一个对象有多个操作7.软件设计中模块划分应遵循的准则是_。(分数:1.00)A.低内聚低耦合B.高耦合高内聚C.高内聚低耦合D.以上说法均错误8.下面描述
3、中不属于数据库系统特点的是_。(分数:1.00)A.数据共享B.数据完整性C.数据冗余度高D.数据独立性高9.数据库设计过程不包括_。(分数:1.00)A.概念设计B.逻辑设计C.物理设计D.算法设计10.有三个关系 R、S 和 T 如下: R A B C a 1 2 b 2 1 c 3 1 S A D c 4 a 5 T A B C D c 3 1 4 a 1 2 5 则由关系 R 和 S 得到关系 T 的操作是_。(分数:1.00)A.自然连接B.交C.投影D.并11.以下叙述中正确的是_。(分数:1.00)A.程序必须包含所有三种基本结构才能称为一种算法B.我们所写的每条 C 语句,经过
4、编译最终都将转换成二进制的机器指令C.如果算法非常复杂,则需要使用三种基本结构之外的语句结构才能准确表达D.只有简单算法才能在有限的操作步骤之后结束12.以下叙述中正确的是_。(分数:1.00)A.在算法设计时,可以把复杂任务分解成一些简单的子任务B.在 C 语言程序设计中,所有函数必须保存在一个源文件中C.只要包含了三种基本结构的算法就是结构化程序D.结构化程序必须包含所有的三种基本结构,缺一不可13.以下叙述中正确的是_。(分数:1.00)A.只能在函数体内定义变量,其他地方不允许定义变量B.常量的类型不能从字面形式上区分,需要根据类型名来确定C.预定义的标识符是 C 语言关键字的一种,不
5、能另作它用D.整型常量和实型常量都是数值型常量14.以下叙述中正确的是_。(分数:1.00)A.在 C 程序中的八进制和十六进制可以是浮点数B.整型变量可以分为 int 型、short 型、long 型和 unsigned 型四种C.八进制数的开头要使用英文字母 o,否则不能与十进制区分开D.英文大写字母 X 和英文小写字母 x 都可以作为二进制数字的开头字符15.以下叙述中正确的是_。(分数:1.00)A.在 scanf 函数中的格式控制字符串是为了输入数据用的,不会输出到屏幕上B.在使用 scanf 函数输入整数或实数时,输入数据之间只能用空格来分隔C.在 printf 函数中,各个输出项
6、只能是变量D.使用 printf 函数无法输出百分号“%”16.以下叙述中正确的是_。(分数:1.00)A.在 scanf 函数的格式串中,必须有与输入项一一对应的格式转换说明符B.只能在 printf 函数中指定输入数据的宽度,而不能在 scanf 函数中指定输入数据的宽度C.scanf 函数中的字符串,是提示程序员的,输入数据时不必管它D.复合语句也被称为语句块,它至少要包含两条语句17.以下叙述中正确的是_。(分数:1.00)A.逻辑“或”(即运算符“|”)的运算级别比算术运算符要高B.C 语言的关系表达式:0x10 完全等价于:(0x) 则以下叙述中正确的是_。(分数:1.00)A.语
7、句 a=是非法的B.表达式 a+1 是非法的C.三个表达式 a1、*(a+1)、* for(i=0;i4;i+) ai=*p+; printf(“%d/n“,a2); 程序的输出结果是_。(分数:1.00)A.2B.8C.4D.628.以下叙述中正确的是_。(分数:1.00)A.语句“int a43=1,2,4,5;”是错误的初始化形式B.语句“int a43=1,2,4,5;”是错误的初始化形式C.语句“int a3=1,2,4,5;”是错误的初始化形式D.在逻辑上,可以把二维数组看成是一个具有行和列的表格或矩阵29.以下叙述中正确的是_。(分数:1.00)A.字符串常量“Hello”会被隐
8、含处理成一个无名字符型数组,它有 5 个元素B.不能用字符串常量对字符数组名进行整体赋值操作C.char str7=“string!“; 在语法上是合法的,运行也是安全的D.char *str; str=“Hello“;与 char str; str=“Hello“;效果是一样的30.以下叙述中正确的是_。(分数:1.00)A.在语句“char str=“string!“;“中,数组 str 的大小等于字符串的长度B.语句“char str10=“string!“;“和“char str10=“string!“;”并不等价C.对于一维字符数组,不能使用字符串常量来赋初值D.对于字符串常量“st
9、ring!”,系统已自动在最后加入了“/0“字符,表示串结尾31.设有定义 char str=“Hello“; 则语句 printf(“%d%d“, sizeof(str), strlen(str); 的输出结果是_。(分数:1.00)A.5 5B.6 6C.6 5D.5 632.在 32 位编译器上,设有定义 char *str1=“Hello“, str2=“Hello“;, 则以下语句 printf(“%d%d“, sizeof(str1), sizeof(str2); 的输出结果是_。(分数:1.00)A.5 6B.5 5C.6 6D.4 633.以下叙述中正确的是_。(分数:1.00
10、)A.任何情况下都不能用函数名作为实参B.函数既可以直接调用自己,也可以间接调用自己C.函数的递归调用不需要额外开销,所以效率很高D.简单递归不需要明确的结束递归的条件34.以下叙述中正确的是_。(分数:1.00)A.函数的形式参数不属于局部变量B.对于变量而言,“定义”和“说明”这两个词实际上是同一个意思C.在复合语句中不能定义变量D.全局变量的存储类别可以是静态类35.以下叙述中正确的是_。(分数:1.00)A.在一个程序中,允许使用任意数量的#include 命令行B.在包含文件中,不得再包含其他文件C.#include 命令行不能出现在程序文件的中间D.虽然包含文件被修改了,包含该文件
11、的源程序也可以不重新进行编译和连接36.以下叙述中正确的是_。(分数:1.00)A.函数的返回值不能是结构体类型B.在调用函数时,可以将结构体变量作为实参传给函数C.函数的返回值不能是结构体指针类型D.结构体数组不能作为参数传给函数37.以下叙述中正确的是_。(分数:1.00)A.结构体数组名不能作为实参传给函数B.结构体变量的地址不能作为实参传给函数C.结构体中可以含有指向本结构体的指针成员D.即使是同类型的结构体变量,也不能进行整体赋值38.设有如下的说明和定义: struct int a; char *s; x, *p= x.a=4; x.s=“hello“; 则以下叙述中正确的是_。(
12、分数:1.00)A.(p+)-a 与 p+-a 都是合语法的表达式,但二者不等价B.语句“+p-a;”的效果是使 p 增 1C.语句“+p-a;”的效果是使成员 a 增 1D.语句“*p-s+;”等价于“(*p)-s+ +;”39.下面关于位运算符的叙述,正确的是_。(分数:1.00)A.|表示“按位或”的运算B.#表示“按位异或”的运算C. void ReadText(FILE *); main( ) FILE * fp; if(fp=fopen(”myiile4.txt“,“w“)=NULL) printf(“open fail!/n“);exit(0); WriteText(fp); f
13、close(fp); if(fp=fopen(“myfile4.txt“,“r“)=NULL) printf(“open fail!/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* * *
14、* * * * * * */ fputs( 2,fw);fputs(“/n“,fw); gets(str); void ReadText(FILE *fr) char str81; printf(“/nRead file and output to screen:/n“); fgets(str,81,fr); while(!feof(fr) /* * * * * * * * * *found* * * * * * * * * */ printf(“%s“, 3); fgets(str,81,fr); (分数:18.00)三、程序修改题(总题数:1,分数:18.00)42.下列给定程序中,函数
15、fun 的功能是:从低位开始依次取出长整型变量 s 中奇数位上的数,构成一个新数存放在 t 中。高位仍在高位,低位仍在低位。 例如,当 s 中的数为 7654321 时,t 中的数为 7531。 请改正程序中的错误,使它能得出正确的结果。 注意:部分源程序在文件 MODI1.C 中,不得增行或删行,也不得更改程序的结构! #include stdio.h /* * * * * * * * * * found* * * * * * * * * * / void fun(long s, long t) longsl=10; *t=s% 10; while(s0) s = s/100; *t = s
16、%10 * sl + *t; /* * * * * * * * * * found* * * * * * * * * * / sl=sl*100; main( ) long s, t; printf(“ /nPlease enter s:“); scanf(“%ld“, fun(s, printf(“The result is: %ld/n“, t); (分数:18.00)四、程序设计题(总题数:1,分数:24.00)43.学生记录由学号和成绩组成,N 名学生的数据已放入主函数中的结构体数组中,请编写函数 fun,其功能是:把分数最低的学生数据放入 b 所指的数组中。注意:分数最低的学生可能不
17、止一个,函数返回分数最低的学生人数。 注意:部分源程序在文件 PROG1.C 中。 请勿改动主函数 main 和其他函数中的任何内容,仅在函数 fun 的花括号中填入你编写的若干语句。 #include stdio.h #deftne N 16 typedef struct char num10; int s; STREC; mt fun( STREC * a, STREC * b ) main( ) STREC sN = “GA05“ ,85 , “GA03“ ,76, “GA02“,69, “GA04“,85, “GA01“,91,“GA07“,72,“GA08“,64,“GA06“,87
18、, “GA015“,85, “GA013“,91,“GA012“,64, “ GA014“,91/, “GA011“,91, “GA017“,64,“GA018“,64,“GA016“,72t; STREC hN; int i,n; FILE * out; n=fun(s,h); printf(“The % d lowest score :/n“,n); for(i=0;in; i+ +) printf(“% s %4d/n“, hi. num,hi.s); printf(“ /n“); out=fopen(“out.dat“,“w“); fprintf(out,“% d/n“,n); for
19、(i=0;in;i+ +) fprintf(out,“%4d/n“,hi.s); fclose (out); (分数:24.00)_二级 C 语言真题(1)答案解析(总分:100.00,做题时间:90 分钟)一、选择题(总题数:40,分数:40.00)1.下列叙述中正确的是_。(分数:1.00)A.程序执行的效率与数据的存储结构密切相关 B.程序执行的效率只取决于程序的控制结构C.程序执行的效率只取决于所处理的数据量D.以上说法均错误解析:解析 程序执行的效率与数据的存储结构、数据的逻辑结构、程序的控制结构、所处理的数据量等有关。2.下列与队列结构有关联的是_。(分数:1.00)A.函数的递归
20、调用B.数组元素的引用C.多重循环的执行D.先到先服务的作业调度 解析:解析 队列的修改是依照“先进先出”的原则进行的,故 D 正确。3.对下列二叉树 (分数:1.00)A.DYBEAFCZXB.YDEBFZXCAC.ABDYECFXZ D.ABCDEFXYZ解析:解析 前序遍历是指在访问根节点、遍历左子树与遍历右子树这三者中,首先访问根节点,然后遍历左子树,最后遍历右子树;并且在遍历左、右子树时,仍然先访问根节点,然后遍历左子树,最后遍历右子树。因此,前序遍历可描述为:若二叉树为空,则执行空操作。否则:访问根节点;前序遍历左子树;前序遍历右子树。所以 C 正确。4.一个栈的初始状态为空,现将
21、元素 1,2,3,A,B,C 依次入栈,然后再依次出栈,则元素出栈的顺序是_。(分数:1.00)A.1,2,3,A,B,CB.C,B,A,1,2,3C.C,B,A,3,2,1 D.1,2,3,C,B,A解析:解析 栈的修改是按照“后进先出”的原则进行的,所以顺序应与入栈顺序相反,故选 C。5.下面属于白盒测试方法的是_。(分数:1.00)A.等价类划分法B.逻辑覆盖 C.边界值分析法D.错误推测法解析:解析 白盒测试法主要有逻辑覆盖、基本路径测试等。逻辑覆盖测试包括语句覆盖、路径覆盖、判定覆盖、条件覆盖、判断一条件覆盖,故选择 B。其余为黑盒测试法。6.下面对对象概念描述正确的是_。(分数:1
22、.00)A.对象间的通信靠消息传递 B.对象是名字和方法的封装体C.任何对象必须有继承性D.对象的多态性是指一个对象有多个操作解析:解析 对象之间进行通信的结构叫做消息,故 A 正确。封装性是指从外面看只能看到对象的外部特征,而不知道也无须知道数据的具体结构以及实现操作,不能简单地说成是名字和方法,故 B 错误。对象不一定必须有继承性,故 C 错误,多态性是指同一个操作可以是不同对象的行为,故 D 错误。7.软件设计中模块划分应遵循的准则是_。(分数:1.00)A.低内聚低耦合B.高耦合高内聚C.高内聚低耦合 D.以上说法均错误解析:解析 根据软件设计原理提出如下优化准则:划分模块时,尽量傲到
23、高内聚、低耦合,保持模块相对独立性,并以此原则优化初始的软件结构;一个模块的作用范围应在其控制范围之内,且判定所在的模块应与受其影响的模块在层次上尽量靠近;软件结构的深度、宽度、扇入、扇出应适当;模块的大小要适中。故 C 正确。8.下面描述中不属于数据库系统特点的是_。(分数:1.00)A.数据共享B.数据完整性C.数据冗余度高 D.数据独立性高解析:解析 数据库系统的特点为高共享、低冗余、独立性高、具有完整性等。故 C 错误。9.数据库设计过程不包括_。(分数:1.00)A.概念设计B.逻辑设计C.物理设计D.算法设计 解析:解析 数据库设计过程主要包括:需求分析、概念结构设计、逻辑结构分析
24、、数据库物理设计、数据库实施、数据库运行和维护阶段。故答案为 D。10.有三个关系 R、S 和 T 如下: R A B C a 1 2 b 2 1 c 3 1 S A D c 4 a 5 T A B C D c 3 1 4 a 1 2 5 则由关系 R 和 S 得到关系 T 的操作是_。(分数:1.00)A.自然连接 B.交C.投影D.并解析:解析 关系 R 和关系 S 有公共域,关系 T 是通过公共域的等值进行连接的结果,符合自然连接,故选 A。11.以下叙述中正确的是_。(分数:1.00)A.程序必须包含所有三种基本结构才能称为一种算法B.我们所写的每条 C 语句,经过编译最终都将转换成二
25、进制的机器指令 C.如果算法非常复杂,则需要使用三种基本结构之外的语句结构才能准确表达D.只有简单算法才能在有限的操作步骤之后结束解析:解析 C 语言程序可以不包含三种基本结构,也可以包含其中的一种或多种,所以 A 错误。三种基本结构可以表示任何复杂的算法,所以 C 错误。正确的算法,不管是简单算法还是复杂算法,都可以在有限的操作步骤之后结束,这是算法的有穷性,所以 D 错误。12.以下叙述中正确的是_。(分数:1.00)A.在算法设计时,可以把复杂任务分解成一些简单的子任务 B.在 C 语言程序设计中,所有函数必须保存在一个源文件中C.只要包含了三种基本结构的算法就是结构化程序D.结构化程序
26、必须包含所有的三种基本结构,缺一不可解析:解析 C 语言的程序中,函数不一定都放在同一个源文件中,可以分别放在不同的源文件中,通过#include 命令来引用,所以 B 错误。结构化程序可以包含三种基本结构中的一种或几种,所以 C、D 错误。13.以下叙述中正确的是_。(分数:1.00)A.只能在函数体内定义变量,其他地方不允许定义变量B.常量的类型不能从字面形式上区分,需要根据类型名来确定C.预定义的标识符是 C 语言关键字的一种,不能另作它用D.整型常量和实型常量都是数值型常量 解析:解析 变量可以定义在函数体外,也可以定义在函数体内,所以 A 错误。常量的类型可以从字面形式上区分,比如
27、1 为整型常量,1.0 为实型常量,a 为字符型常量,所以 B 错误。预定义的标识符不是C 语言的关键字,所以 C 错误。14.以下叙述中正确的是_。(分数:1.00)A.在 C 程序中的八进制和十六进制可以是浮点数B.整型变量可以分为 int 型、short 型、long 型和 unsigned 型四种 C.八进制数的开头要使用英文字母 o,否则不能与十进制区分开D.英文大写字母 X 和英文小写字母 x 都可以作为二进制数字的开头字符解析:解析 在 C 语言中,浮点数只采用十进制,它有两种表示形式:十进制数形式和指数形式,所以A 错误。八进制数以数字 0 开头,所以 C 错误。C 语言中二进
28、制数用 0 和 1 表示,所以 D 错误。15.以下叙述中正确的是_。(分数:1.00)A.在 scanf 函数中的格式控制字符串是为了输入数据用的,不会输出到屏幕上 B.在使用 scanf 函数输入整数或实数时,输入数据之间只能用空格来分隔C.在 printf 函数中,各个输出项只能是变量D.使用 printf 函数无法输出百分号“%”解析:解析 scanf 函数中的格式控制字符串是为了输入数据用的,无论其中有什么字符,也不会输出到屏幕上,所以 A 正确。scanf 函数的格式控制串可以使用其他非空白字符,如逗号,但在输入时必须输入这些字符,以保证匹配就可以,所以 B 错误。printf 函
29、数可以输出常量,也可以输出变量,所以 C 错误。printf 函数可以用“/%”来输出百分号“%”,所以 D 错误。16.以下叙述中正确的是_。(分数:1.00)A.在 scanf 函数的格式串中,必须有与输入项一一对应的格式转换说明符 B.只能在 printf 函数中指定输入数据的宽度,而不能在 scanf 函数中指定输入数据的宽度C.scanf 函数中的字符串,是提示程序员的,输入数据时不必管它D.复合语句也被称为语句块,它至少要包含两条语句解析:解析 在 printf 和 scanf 函数中都可以指定数据的宽度,所以 B 错误。scanf 函数的格式控制串可以使用其他非空白字符,如逗号,
30、但在输入时必须输入这些字符,以保证匹配,所以 C 错误。复合语句可以由任意多条语句构成,也可以一条都没有,所以 D 错误。17.以下叙述中正确的是_。(分数:1.00)A.逻辑“或”(即运算符“|”)的运算级别比算术运算符要高B.C 语言的关系表达式:0x10 完全等价于:(0x) 则以下叙述中正确的是_。(分数:1.00)A.语句 a=是非法的 B.表达式 a+1 是非法的C.三个表达式 a1、*(a+1)、*D 选项中,* for(i=0;i4;i+) ai=*p+; printf(“%d/n“,a2); 程序的输出结果是_。(分数:1.00)A.2B.8C.4D.6 解析:解析 本题通过
31、语句“*p=a”将一维数组 a 的首地址的值赋值给变量 p,即 p 的值为 2。执行 for循环,ai=*p+,指将 p 的值赋给 ai后,再进行自增操作,因此 4 次循环后 a2的值为 6。因此 D 选项正确。28.以下叙述中正确的是_。(分数:1.00)A.语句“int a43=1,2,4,5;”是错误的初始化形式B.语句“int a43=1,2,4,5;”是错误的初始化形式C.语句“int a3=1,2,4,5;”是错误的初始化形式D.在逻辑上,可以把二维数组看成是一个具有行和列的表格或矩阵 解析:解析 二维数组在初始化时,可以省略第 1 维,但是不可以省略第 2 维。可以为部分数组元素
32、初始化。A 选项、B 选项和 C 选项内的初始化都没有错误。因此 D 选项正确。29.以下叙述中正确的是_。(分数:1.00)A.字符串常量“Hello”会被隐含处理成一个无名字符型数组,它有 5 个元素B.不能用字符串常量对字符数组名进行整体赋值操作 C.char str7=“string!“; 在语法上是合法的,运行也是安全的D.char *str; str=“Hello“;与 char str; str=“Hello“;效果是一样的解析:解析 字符串中的字符依次存储在内存中一块连续的区域内,并且把空字符“/0“自动附加到字符串的尾部作为字符串的结束标志。故字符个数为 n 的字符串在内存中
33、应占(n+1)个字节。选项 A 中有 6 个元素,其中包含结尾字符。C 选项中字符串常量包含 8 个字符,所以不能赋值在 str7中。D 选项中,后者赋值错误。30.以下叙述中正确的是_。(分数:1.00)A.在语句“char str=“string!“;“中,数组 str 的大小等于字符串的长度B.语句“char str10=“string!“;“和“char str10=“string!“;”并不等价C.对于一维字符数组,不能使用字符串常量来赋初值D.对于字符串常量“string!”,系统已自动在最后加入了“/0“字符,表示串结尾 解析:解析 字符串中的字符依次存储在内存中一块连续的区域内
34、,并且把空字符“/0“自动附加到字符串的尾部作为字符串的结束标志。故字符个数为 n 的字符串在内存中应占(n+1)个字节。A 选项中数组长度比字符串长度小一个字节,因为字符串中包含隐含的结尾符。B 选项中两者等价。C 选项中,可以使用字符串常量来给一维字符数组赋值,就像 B 选项中一样。31.设有定义 char str=“Hello“; 则语句 printf(“%d%d“, sizeof(str), strlen(str); 的输出结果是_。(分数:1.00)A.5 5B.6 6C.6 5 D.5 6解析:解析 本题考查 sizeof 和 strlen 函数对字符串处理的不同之处。sizeof
35、 求出字符串的字符个数,包括结尾符。strlen 求出字符串的实际字符,不包括结尾符。所以答案为 C 选项。32.在 32 位编译器上,设有定义 char *str1=“Hello“, str2=“Hello“;, 则以下语句 printf(“%d%d“, sizeof(str1), sizeof(str2); 的输出结果是_。(分数:1.00)A.5 6B.5 5C.6 6D.4 6 解析:解析 本题主要考查指向字符串的指针和字符数组。str1 为一个字符指针,所以 sizeof 为4;str2 为字符数组,其中包含 6 个字符,所以答案为 D 选项。33.以下叙述中正确的是_。(分数:1.
36、00)A.任何情况下都不能用函数名作为实参B.函数既可以直接调用自己,也可以间接调用自己 C.函数的递归调用不需要额外开销,所以效率很高D.简单递归不需要明确的结束递归的条件解析:解析 在某些情况下,函数名可以作为实参传递,所以 A 选项错误。函数递归调用使用栈区来递归,需要额外开销,并且效率不高,所以 C 选项错误。递归调用需要明确指出递归结束条件,否则就陷入死循环了,所以 D 选项错误。34.以下叙述中正确的是_。(分数:1.00)A.函数的形式参数不属于局部变量B.对于变量而言,“定义”和“说明”这两个词实际上是同一个意思C.在复合语句中不能定义变量D.全局变量的存储类别可以是静态类 解
37、析:解析 函数的形参属于局部变量,所以 A 选项错误。声明变量不分配空间,定义变量要分配空间,所以 B 选项错误。复合语句中可以定义变量,所以 C 选项错误。35.以下叙述中正确的是_。(分数:1.00)A.在一个程序中,允许使用任意数量的#include 命令行 B.在包含文件中,不得再包含其他文件C.#include 命令行不能出现在程序文件的中间D.虽然包含文件被修改了,包含该文件的源程序也可以不重新进行编译和连接解析:解析 本题考查预处理中文件包含的概念。包含文件中可以包含其他文件,故 B 选项错误;#include 可以出现在程序文件的中间,故 C 选项错误;包含文件被修改了,包含该
38、文件的源程序必须重新进行编译和连接,故 D 选项错误。36.以下叙述中正确的是_。(分数:1.00)A.函数的返回值不能是结构体类型B.在调用函数时,可以将结构体变量作为实参传给函数 C.函数的返回值不能是结构体指针类型D.结构体数组不能作为参数传给函数解析:解析 本题考查结构体变量作为函数参数。函数返回可以是结构体类型,也可以是结构体类型的指针。结构体数组可以作为参数传给函数。37.以下叙述中正确的是_。(分数:1.00)A.结构体数组名不能作为实参传给函数B.结构体变量的地址不能作为实参传给函数C.结构体中可以含有指向本结构体的指针成员 D.即使是同类型的结构体变量,也不能进行整体赋值解析
39、:解析 本题考查结构体变量作为函数参数。结构体变量的地址可以作为参数传给函数,故 A 错误;结构体数组名就是一个地址,可以传给函数,故 B 错误;如果是同类型的结构体变量,可以整体赋值,故D 错误。38.设有如下的说明和定义: struct int a; char *s; x, *p= x.a=4; x.s=“hello“; 则以下叙述中正确的是_。(分数:1.00)A.(p+)-a 与 p+-a 都是合语法的表达式,但二者不等价B.语句“+p-a;”的效果是使 p 增 1C.语句“+p-a;”的效果是使成员 a 增 1 D.语句“*p-s+;”等价于“(*p)-s+ +;”解析:解析 本题考
40、查结构体变量的引用。+p-a 的效果是使成员 a 增 1;p+-a 不合法;*p-s+为字符 e,与(*p)-s+不等价。39.下面关于位运算符的叙述,正确的是_。(分数:1.00)A.|表示“按位或”的运算B.#表示“按位异或”的运算C. void ReadText(FILE *); main( ) FILE * fp; if(fp=fopen(”myiile4.txt“,“w“)=NULL) printf(“open fail!/n“);exit(0); WriteText(fp); fclose(fp); if(fp=fopen(“myfile4.txt“,“r“)=NULL) prin
41、tf(“open fail!/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
42、); void ReadText(FILE *fr) char str81; printf(“/nRead file and output to screen:/n“); fgets(str,81,fr); while(!feof(fr) /* * * * * * * * * *found* * * * * * * * * */ printf(“%s“, 3); fgets(str,81,fr); (分数:18.00)解析:*fw str str 解析 本题考查:函数定义以及文件指针;fputs 函数的功能是向指定的文件写入一个字符串,其调用形式为:fputs(字符串,文件指针)。 填空 1:
43、定义函数,函数的形参是一个文件类型的指针。 填空 2:此处考查 fputs 函数的形式,应填入 str。 填空 3:依据 printf 函数的格式,输出字符串内容,即 printf(“%s“,str);。三、程序修改题(总题数:1,分数:18.00)42.下列给定程序中,函数 fun 的功能是:从低位开始依次取出长整型变量 s 中奇数位上的数,构成一个新数存放在 t 中。高位仍在高位,低位仍在低位。 例如,当 s 中的数为 7654321 时,t 中的数为 7531。 请改正程序中的错误,使它能得出正确的结果。 注意:部分源程序在文件 MODI1.C 中,不得增行或删行,也不得更改程序的结构!
44、 #include stdio.h /* * * * * * * * * * found* * * * * * * * * * / void fun(long s, long t) longsl=10; *t=s% 10; while(s0) s = s/100; *t = s%10 * sl + *t; /* * * * * * * * * * found* * * * * * * * * * / sl=sl*100; main( ) long s, t; printf(“ /nPlease enter s:“); scanf(“%ld“, fun(s, printf(“The result
45、 is: %ld/n“, t); (分数:18.00)解析:void fun(long s, long *t) sl=s1*10 解析 本题考查:函数定义,指针型变量;数值 n 和其各个位如何表示。 (1)主函数中调用函数的参数为地址,因此函数 fun 的形式参数应为指针类型。 (2)重新组合一个数,从个位开始,然后十位,依次类推,因此每增加一位数,原数值需乘以 10,即s1=s1*10;。四、程序设计题(总题数:1,分数:24.00)43.学生记录由学号和成绩组成,N 名学生的数据已放入主函数中的结构体数组中,请编写函数 fun,其功能是:把分数最低的学生数据放入 b 所指的数组中。注意:分
46、数最低的学生可能不止一个,函数返回分数最低的学生人数。 注意:部分源程序在文件 PROG1.C 中。 请勿改动主函数 main 和其他函数中的任何内容,仅在函数 fun 的花括号中填入你编写的若干语句。 #include stdio.h #deftne N 16 typedef struct char num10; int s; STREC; mt fun( STREC * a, STREC * b ) main( ) STREC sN = “GA05“ ,85 , “GA03“ ,76, “GA02“,69, “GA04“,85, “GA01“,91,“GA07“,72,“GA08“,64,
47、“GA06“,87, “GA015“,85, “GA013“,91,“GA012“,64, “ GA014“,91/, “GA011“,91, “GA017“,64,“GA018“,64,“GA016“,72t; STREC hN; int i,n; FILE * out; n=fun(s,h); printf(“The % d lowest score :/n“,n); for(i=0;in; i+ +) printf(“% s %4d/n“, hi. num,hi.s); printf(“ /n“); out=fopen(“out.dat“,“w“); fprintf(out,“% d/n“,n); for(i=0;in;i+ +) fprintf(out,“%4d/n“,hi