1、国家二级 C语言机试(操作题)模拟试卷 239及答案与解析 一、程序填空题 1 给定程序中,函数 fun的功能是将 a和 b所指的两个字符串分别转换成面值相同的整数,并进行相加作为函数值返回,规定字符串中只含 9个以下数字字符。 例如,主函数中输入字符串 32486和 12345,在主函数中输出的函数值为44831。 请在程序的下画线处填入正确的内容并把下画线删除,使程序得出正确的结果。 注意:部分源程序在文件 BLANK1 C中。 不得增行或删行,也不得更改程序的结构 ! 试题程序: 1 #include stdio h 2 #include string h 3 #include ctyp
2、e h 4 #define N 9 5 long ctod(char*s) 6 long d=0; 7 while(*s) 8 if(isdigit(*s) 9 *found* 10 d=d*10+*s-【 1】 ; 11 * found* 12 【 2】 ; 13 14 return d; 15 16 long fun(char*a, char*b) 17 18 * found* 19 return 【 3】 ; 20 21 main() 22 char s1N, s2N; 23 do 24 printf(Input string s1: ); 25 gets(s1); 26 while(s
3、trlen(s1) N); 27 do 28 printf(Input string s2: ); 29 gets(s2); 30 while(strlen(s2) N); 31 printf(The result is: id n, fun(s1, s2); 32 二、程序修改题 2 给定程序 modil c的主函数中,将 a、 b、 c三个结点链成一个单向链表,并给各结点的数据域赋值,函数 fun()的作用是:累加链表结点数据域中的数据作为函数值返回。 请改正函数 fun中指定 部位的错误,使它能得出正确的结果。 注意:不要改动 main函数,不得增行或删行,也不得更改程序的结构。 试题程
4、序: 1 #include stdio h 2 typedef struct list; 3 int data ; 4 struct list*next; 5 LIST ; 6 int fun(LIST *h) 7 LIST*P; 8 *found* 9 int t; 10 p=h; 11 *found* 12 while(*P) 13 14 *found* 15 t=t+p data; 16 p=(*p) next; 17 18 return t ; 19 20 main() 21 LTST a, b, c, *h; 22 a data=34 ; b data=51; c data=87 ;
5、 c next= 0; 23 h= a; a next= b; b next= c; 24 printf(总和 = d n, fun(h); 25 三、程序设计题 3 m个人的成绩存放在 score数组中,请编写函数 fun,它的功能是:将低于平均分的人数作为函数值返回,将低于平均分的分数放在 below所指的数组中。 例如,当 score数组中的数据为 10、 20、 30、 40、 50、 60、 70、 80、 90时,函数返回的人数应该是 4, below中的数据应为 10、 20、 30、 40。 注意:部分源程序在文件 PROG1 C中。 请勿改动主函数 main和其他函数中的任何
6、内容,仅在函数 fun的花括号中填入你编写的若干语句。 试题程序: 1 #include conio h 2 #include stdio h 3 #include string h 4 #include stdlib h 5 int fun(int score, int m, int below) 6 7 8 9 void main() 10 11 FILE*wf; 12 int i, n, below9; 13 int score9=10, 2 0, 30, 40, 50, 60, 70, 80, 90; 14 system(CLS); 15 n=fun(sCOEe, 9, below);
7、 16 printf( nBelow the average score are: ); 17 for(i=0 ; idata; 【试题解析】 (1)题目中变量 t是用来存放 累加和的,因此必须初始化。 (2)题目中 *p是结构体,不能转化为 hool型。 (3)p是指针,只能用 p-,不能用 p。 三、程序设计题 3 【正确答案】 1 int fun(int score, int m, int be-low) 2 3 int i, j=0 ; 4 float av=0 0; 5 for(i=0 ; im ; i+) 6 av=av+scorei m ; *求平均值 * 7 for(i=0 ; im ; i+) 8 if(scoreiav) *如果分数低于平均分,则将此分数放入 below数组中 * 9 belowj+=scorei; 10 return j; *返回低于平均分的人数 * 11 【试题解析】 要计算低于平均分的人数,首先应该求出平均分,然后通过 for循环语句和 if条件语句找出低于平均分的分数。该题第 1个循环的作用是求出平均分 av,第 2个循环的作用是找出低于平均分的成绩记录并存入 below数组中。