1、国家二级 C语言机试(操作题)模拟试卷 6及答案与解析 一、程序填空题 1 给定程序的功能是:从键盘输入若干行文本 (每行不超过 80个字符 ),写到文件myfile4 txt中,用 -1作为字符串输入结束的标志。然后将文件的内容读出显示在屏幕上。文件的读写分别由自定义函数 ReadText和 WriteText实现。 请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。 注意:源程序存放在考生文件夹下的 BLANK1 C中。 不得增行或删行,也不得更改程序的结构 ! #include stdio h #include string h #include stdlib h v
2、oid WriteText(FILE *); void ReadText(FILE *); mairl() FILE *fP; if(fp=fopen(“myfile4 txt“, “w“)=NULL) printf(“ open fail! n“); exit: (0); WriteText(fp); fclose(fp); if(fp=fopen(“myfile4 txt“, “r“)=NULL) printf(“ open fail! n“); exit(0); ReadText(fp); fclose(fp); *found* void WriteText(FILE _1_) char
3、 str81; printf(“ nEnter string with -1 to end: n“); get s(str); while(strcmp(str, “-1“)!=0) *found* fput s(_2_, fw); fput s(“ 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(st
4、r, 81, fr); 二、程序修改题 2 给定程序 MODI1 C中函数 fun的功能是:计算小于形参 k的最大的 10个能被13或 17整除的自然数之和。 k的值由主函数传入,若 k的值为 500,则函数值为4622。 请改正程序中的错误,使程序能输出正确的结果。 注意:不要改动 main函数,不得增行或删行,也不得更改程序的结构 ! #include stdio h int fun(int k) int m=0, mc=0; while (k =2)&(mc 10) *found* if (k 13=0) (k 17=0) m=m+k; mc+; ) k-; return m; *fou
5、nd* _ main () printf(“ d n“, fun (500); 三、程序设计题 3 假定输入的 字符串中只包含字母和 *号。请编写函数 fun,它的功能是:只删除字符串前导和尾部的 *号,串中字母之间的 *号都不删除。形参 n给出了字符串的长度,形参 h给出了字符串中前导 *号的个数,形参 e给出了字符串中最后 *号的个数。在编写函数时,不得使用 C语言提供的字符串函数。 例如,字符串中的内容为: *A*BC*DEF*G*,删除后,字符串中的内容应当是: A*BC*DEF*G。 注意:部分源程序在文件 PROG1 C文件中。 请勿改动主函数 main和其他函数中的任何内容,仅在
6、函数 fun的花括号中填入你编写的若干语句。 #include stdio h void fun(char *a, int n, int h, int e) main() char s81, *t, *f; int m=0, tn=0, fn=0; void NONO (); printf(“Enter a string: n“); gets(s); t=f=s; while(*t)t+; m+; ) t-; whil e(*t=*)t-; tn+; while(*f=*)f+; fn+; ) fun(s, m, fn, tn); printf(“The string after delete
7、d: n“); puts(s); NONO(); void NONO () *本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 * FILE *in, *out; int i; cha r s81, *t, *f; Int m=0, tn=0, fn=0; in=fopen(“in dat“, “r“); out=fopen(“out dat“, “w“); for(i=0; i 10; i+) fscanf(in, “ s“, s); t=f=s; m=0; tn=0; fn=0; while(*t)t+; m+; ) t-; while(*t=*)t-; tn+; ) whil
8、e(*f=*)f+; fn+; ) fun(s, m, fn, tn); fprintf(out, “ s n“, s); fclose(in); fclose(out); 国家二级 C语言机试(操作题)模拟试卷 6答案与解析 一、程序填空题 1 【正确答案】 (1)*fw (2)str (3)str 【试题解析】 第一空:此处是补充函数参数名,参数类型已知是 FILE文件指针, fputs(“ n“, fw)是将字符 “ n”写入文件,可知 fw是文件指针名,因此第一空处应该是 void WriteText(FILE*fw)。 第二空: while(strcmp(str, “-1“)!=0)
9、循环的结束标 志是 str字符串等于 “-1”时循环退出,如果 str不等 于 “-1”,执行循环体内容:用 fputs函数将 str字符串写入文件。 fputs函数的调用形式是: fputs(s, fp),其中 s是指向字符串的指针或字符串数组名, fp是指向将要被写入的文件的文件指针,因此第二处应该是 fputs(str, fw)。 第三空: while(!feof(ff)循环的作用是不断读取文件直到到达文件尾,每次最多读 81个,将读到的数据放在 str字符串里,并用 printf输出到屏幕,因此第三处应该是 printf(“ s“, str)。 二、程序修改题 2 【正确答案】 (1)
10、if(k 13=0) (k 17=0) (2) 【试题解析】 (1)第一个标识下的 “if(k 13=0)(k 17=0)”语句应该是判断 k是否能被 13或 17整除,所以应该用逻辑符号 “=”而不是赋值符号 “=”,即 “if(k13=0)(k 17=0)”。 (2)第二个标识下, “_”明显没有函数结束括号,所以这里应该填 “”。 三、程序设计题 3 【正确答案】 Char *p=a; int j=0, len=0; while(*p)p+; len+; ) while(j len-h-e) aj=ah+j; j+; aj=0; 【试题解析】 (1)主函数中,首先统计字符串长度、前导和尾部 “*”号的数量,把这些参数传给函数 fun。 (2)根据字符串长度,前导以及尾部 “*”号统计的数目,确定执行字符移动的起始位置。 (3)在循环中依次执行字符的移动。