1、二级 C 语言机试 303 及答案解析(总分:100.00,做题时间:90 分钟)一、B填空题/B(总题数:1,分数:30.00)1.请补充 main 函数,该函数的功能是:先以只写方式打开文件“out99.dat”,再把字符串 str 中的字符保存到这个磁盘文件中。 注意:部分源程序给出如下。 请勿改动主函数 main 和其他函数中的任何内容,仅在 main 函数的横线上填入所编写的若干表达式或语句。 试题程序: #include “stdio. h“ #include “conio.h“ #define N 80 main () FILE *fp; int i=0; char ch; ch
2、ar strN=“Im a student!“; clrscr(); if ( (fp=fopen (U 【1】 /U) ) =NULL) printf(“cannot open out99. dat/n“); exit(0); while (stri) ch=stri; U【2】 /U; putchar(ch); i+; U 【3】 /U; (分数:30.00)填空项 1:_二、B改错题/B(总题数:1,分数:30.00)2.下列给定程序中,函数 fun()的功能是;计算函数 F(x, y ,z)=(x+ y)/(x-y)+(z+ y)/(z-y)的值。其中 x 和 y 不相等,z 和 y
3、不等。例如,当 x 的值为 9,y 的值为 11,2 的值为 15 时,函数值为-3.50。 请改正程序中的错误,使它能得出正确的结果。 注意:不要改动 main 函数,不得增行或删行,也不得更改程序的结构。 试题程序: #include stdio. h #include math. h /*found*/ #define FU(m, n) (m/n) float fun(float a, float b, float c) float value; value=FU(a+ b, a-b)+FU(c+ b, c-b); /*found*/ return(Value); main() floa
4、t x, y, z, sum; printf (“Input x y z: “); scanf(“%f%f%f“, printf(“x=%f, y=%f, z=%f/n “,x, y, z); if (x=yy=z) printf (“Data error! /n “); exit (0); sum=fun (x, y, z); printf(“The result is:%5. 2f/n “,sum); (分数:30.00)填空项 1:_三、B编程题/B(总题数:1,分数:40.00)3.请编写一个函数 unsigned fun (unsigned w),w 是一个大于 10 的无符号整数,
5、若 w 是 n(n2)位的整数,则函数求出 w 的后 n-1 位的数作为函数值返回。 例如:w 值为 5923,则函数返回 923;若 w 值为923,则函数返回 23。 注意:部分源程序给出如下。 请勿改动主函数 main 和其他函数中的任何内容,仅在函数 fun 的花括号中填入所编写的若干语句。 试题程序: #includeconio. h #includestdio. h unsigned fun(unsigned w) main() unsigned x; clrscr (); printf(“Enter a unsigned integer number: “); scanf (“%
6、u“, printf(“The original data is:%u/n“,x); if (x10) printf (“Data error! “); else printf (“The result :%u/n“, fun(x) ); (分数:40.00)_二级 C 语言机试 303 答案解析(总分:100.00,做题时间:90 分钟)一、B填空题/B(总题数:1,分数:30.00)1.请补充 main 函数,该函数的功能是:先以只写方式打开文件“out99.dat”,再把字符串 str 中的字符保存到这个磁盘文件中。 注意:部分源程序给出如下。 请勿改动主函数 main 和其他函数中的任
7、何内容,仅在 main 函数的横线上填入所编写的若干表达式或语句。 试题程序: #include “stdio. h“ #include “conio.h“ #define N 80 main () FILE *fp; int i=0; char ch; char strN=“Im a student!“; clrscr(); if ( (fp=fopen (U 【1】 /U) ) =NULL) printf(“cannot open out99. dat/n“); exit(0); while (stri) ch=stri; U【2】 /U; putchar(ch); i+; U 【3】 /
8、U; (分数:30.00)填空项 1:_ (正确答案:1“out99.dat”,“w” 2 fpnte (ch,fp) 3 fclose (fp))解析:解析 填空 1:本题考查对文件操作的掌握。打开一个文件的调用方式是,fp=fopen (文件名,使用文件方式);,题目要求以只写的方式打开文件“out 99.dat”,所以文件使用方式为“w”。填空2;fputc ()函数用于将一个字符写到磁盘文件上去,调用形式为:fputc (要输出的字符,文件指针)。填空 3:对一个文件进行操作后,应该关闭它,以防它再被误用。调用形式为:fclose (文件指针);。二、B改错题/B(总题数:1,分数:3
9、0.00)2.下列给定程序中,函数 fun()的功能是;计算函数 F(x, y ,z)=(x+ y)/(x-y)+(z+ y)/(z-y)的值。其中 x 和 y 不相等,z 和 y 不等。例如,当 x 的值为 9,y 的值为 11,2 的值为 15 时,函数值为-3.50。 请改正程序中的错误,使它能得出正确的结果。 注意:不要改动 main 函数,不得增行或删行,也不得更改程序的结构。 试题程序: #include stdio. h #include math. h /*found*/ #define FU(m, n) (m/n) float fun(float a, float b, fl
10、oat c) float value; value=FU(a+ b, a-b)+FU(c+ b, c-b); /*found*/ return(Value); main() float x, y, z, sum; printf (“Input x y z: “); scanf(“%f%f%f“, printf(“x=%f, y=%f, z=%f/n “,x, y, z); if (x=yy=z) printf (“Data error! /n “); exit (0); sum=fun (x, y, z); printf(“The result is:%5. 2f/n “,sum); (分数:
11、30.00)填空项 1:_ (正确答案:(1)错误;#define FU(m, n) (m/n) 正确:#define FU(m,n) (m)/(n))解析:(2)错误:return (Value); 正确:return (value); 解析 如果从数学思想来说,这是一道简单的小学数学题,当然,用 C 语言的别的办法实现的话,也用不了三两句的程序,但是,这道题的考查点在 C 语言的宏定义上(这样的问题比较隐蔽),它的格式为#define 标识符 字符串,中间要用空格分开,在该题中,标识符为 FU (m, n),而字符串则是(m/n),由题干信息易知,应该是# define FU(m,n) (
12、m)/(n)。三、B编程题/B(总题数:1,分数:40.00)3.请编写一个函数 unsigned fun (unsigned w),w 是一个大于 10 的无符号整数,若 w 是 n(n2)位的整数,则函数求出 w 的后 n-1 位的数作为函数值返回。 例如:w 值为 5923,则函数返回 923;若 w 值为923,则函数返回 23。 注意:部分源程序给出如下。 请勿改动主函数 main 和其他函数中的任何内容,仅在函数 fun 的花括号中填入所编写的若干语句。 试题程序: #includeconio. h #includestdio. h unsigned fun(unsigned w)
13、 main() unsigned x; clrscr (); printf(“Enter a unsigned integer number: “); scanf (“%u“, printf(“The original data is:%u/n“,x); if (x10) printf (“Data error! “); else printf (“The result :%u/n“, fun(x) ); (分数:40.00)_正确答案:()解析:unsigned fun (unsigned w) if(w=10000) return w%10000; /*求出 n 位整数 w 的后 n-1 位的数*/ if(w=1000) return w%1000; if(w=100) return w%100; if(w=10) return w%10; 解析 我们首先应该明白无符号整数的定义形式,若它大于 10000(5 位)时,将 10000 对它求余则结果为后 4 位;当它大于 1000(4 位)时,将 1000 对它求余则结果为后 3 位,花此类推。特别注意这里所有 if()的顺序不能颠倒。