1、国家二级 C语言机试(操作题)模拟试卷 336及答案与解析 一、程序填空题 1 给定程序的功能是:调用函数 fun将指定源文件中的内容复制到指定的目标文件中,复制成功时函数返回值为 1,失败时返回值为 0。在复制的过程中,把复制的内容输出到终端屏幕。主函数中源文件名放在变量 sfname中,目标文件名放在变量 tfname中。 请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。 注意:源程序存放在考生文件夹下的 BLANK1 C中。 不得增行或删行,也不得更改程序的结构 ! 1 #include stdio h 2 #include stdlib h 3 int fun(c
2、har *source, char*target) 4 FILE *fs, *ft; char ch; 5 *found* 6 if(fs=fopen(source, _1_)=NULL) 7 return 0; 8 if(ft=fopen(target, w)=NULL) 9 return 0; 10 printf( nThe data in file: n); 11 ch=fgetc(fs); 12 *found* 13 while(!feof(_2_) 14 putchar(ch); 15 *found* 16 fputc(ch, _3_); 17 ch=fgetc(fs); 18 19
3、 fclose(fs); fclose(ft); 20 printf( n n); 21 return 1; 22 23 main() 24 char sfname20=myfile1, tfname20=myfile2; 25 FTTE *myf; int i; char c; 26 myf=fopen(sfname, w); 27 printf( nThe originaldata: n); 28 for(i=1; i 30; i+) 29 c=A+rand() 25; 30 fprintf(myf, c, c); 31 printf( c, c); 32 fclose(myf); pri
4、ntf( n n); 33 if(fun(sfname, tfname) 34 printf(Succeed!); 35 else printf(Fail!); 36 二、程序修改题 2 给定程序 MODI1 C中函数 fun的功能是:从低位开始取出长整型变量 S中偶数位上的数,依次构成一个新数放在 t中。高位仍在高位,低位仍在低位。 例如, 当 s中的数为: 7654321时, t中的数为: 642。 请改正程序中的错误,使它能得出正确的结果。 注意:不要改动 main函数,不得增行或删行,也不得更改程序的结构 ! 1 #include stdio h 2 *found* 3 void fu
5、n(long s, long t) 4 long s1=10; 5 s =10; 6 *t=s 10; 7 *found* 8 while(s 0) 9 s=s 100; 10 *t=s 10 *s1+*t; 11 s1=s1 * 10; 12 13 14 main() 15 long s, t; 16 printf( nPlease enter s: ); scanf( 1d, s); 17 fun(s, t); 18 printf(The result is: 1d n, t); 19 三、程序设计题 3 请编写一个函数 void fun(char *tt, int pp),统计在 tt所
6、指字符串中 a到 z26个小写字母各自出现的次数,并依次放在 pp所指数组中。 例如,当输入字符串: abcdefgabcdeabc后,程序的输出结果应该是: 3 3 3 2 2 1 1 0 0 0 0 0 0 0 O 0 0 0 0 0 0 0 0 0 0 0 注意:部分源程序在文件 PROG1 C中。 请勿改动主函数 main和其他函数中的任何内容,仅在函数 fun的花括号中填入你编写的若干语句。 1 #include stdio h 2 #include string h 3 void fun(char *tt, int pp) 4 5 6 7 main() 8 char aa1000;
7、 9 int bb26, k; 10 void NONO(); 11 printf( nPlease enter a char string: ); scanf( s, aa); 12 fun(aa, bb); 13 for(k=0 ; k 26; k+) printf( d, bbk); 14 printf( n); 15 NONO(); 16 17 void NONO() 18 *本函数用于打开文件,输入测试数据,调用 fun函数,输出数据,关闭文件。 * 19 char as1000; 20 int bb26, k, i; 21 FILE *rf, *wf; 22 rf=fopen(in
8、 dat, r); 23 wf=fopen(out dat, w); 24 for(i=0; i 10; i+) 25 fscanf(rf, s, aa); 26 fun(aa, bb); 27 for(k=0; k 26; k+) fprintf(wf, d, bbk); 28 fprintf(wf, n); 29 30 fclose(rf); 31 fclose(wf); 32 国家二级 C语言机试(操作题)模拟试卷 336答案与解析 一、程序填空题 1 【正确答案】 (1)r (2)fs (3)ft 【试题解析】 第一空:将指定源文件中的内容复制到指定的目标文件中,源文件只需读,因此以只
9、读方式打开即可,故第一空处应该是“if(fs=fopen(source,“r“)=NULL)”。 第二空: “while(!feof( _2_ )”循环的目的是不断读取源文件直至到达源文件的末尾,循环结束标志是已达到文件的末尾。用 feof()函数来检查是否已经到了文件末尾,文件状态检测函数 feoff)的调用形式是: feof(fs),如果已经到达文件尾函数返回非零值,否则返回 0,故第二空处应该是 “while(!feof(fs)”。 第三空:考察 fputc函数的使用方法, fputc函数的调用形式是: fputc(ch, ft),ch是要输出的字符,由 “ch=fgetc(fs)”从源
10、文件读到字符 ch,然后将 ch写到目标文件中,故第三空处应该是 “fputc(ch,ft); ”。 二、程序修改题 2 【正确答案】 (1)void fun(long s, long *t) (2)while(s 0) 【试题解析】 函数目的是取出长整型变量 s中偶数位上的数。 (1)第一个标识下的形参 t被定义为一个 long型变量,而对应的主函数中的实参却是一个地址值。因此, t在函数定义中应该被定义为一个指针变量,即 “void fun(long s, long t)”改为“void fun(longs,long *t)”。 (2)第二个标识下的 while循环控制表达式 “s 0”要
11、求 s小于 0才进入循环。而 s的值总是大于 0,因此将 “while(s 0)”改为 “while(s0)”。 三、程序设计题 3 【正确答案】 1 char *p=tt; 2 int i; 3 for(i=0 ; i 26; i+) ppi=0; 4 while(*p) 5 if(*p =a *p =z) pp*p-a+=1 ; 6 p+; 【试题解析】 该程序功能是统计字符串中 26个字母各自出现的次数。解题思路,从己给部分源程序的 main主函数开始入手,函数形参指针 tt接受主函数中字符数组 aa的起始地址,形参 pp接受主函数中的 bb数组的起始地址, bb数组的每一个元素都是计数器, bb0中统计字母 “a”的个数, bb1中统计字母 “b”的个数,依此类推, bb25中统计字母 “z”的个数。