1、国家二级 C语言机试(操作题)模拟试卷 237及答案与解析 一、程序填空题 1 给定程序中,函数 fun的作用是:统计整型变量 m中各数字出现的次数,并存放到数组 a中,其中: a0存放 0出现的次数, a1存放 1出现的次数, a E9存放 9出现的次数。 例如,若 m为 14579233,则输出结果应为: 0, 1, 1, 2, 1, 1, 0, 1, 0, 1, 请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。 注意:源程序存放在考生文件夹下的 BLANK1 C中。不得增行或删行,也 不得更改程序的结构 ! 试题程序: 1 #include stdio h 2 vo
2、id fun(int m, int a10) 3 int i; 4 for(i=0 ; i 10; i+) 5 *found* 6 【 1】 =0; 7 while(m0) 8 9 *found* 10 i=【 2】 ; 11 ai+; 12 *found* 13 m=【 3】 ; 14 15 16 main() 17 int m, a10, i; 18 printf(请输入一个整数: ); 19 scanf( d, m); 20 fun(m, a); 21 for(i=0 ; i 10; i+) 22 printf( d, , ai); 23 printf( n); 24 二、程序修改题 2
3、 下列给定程序是建立一个带头结点的单向链表,并用随机函数为各结点赋值。函数 fun的功能是将单向链表结点 (不包括头结点 )数据域为偶数的值累加起来,并且作为函数值返回。 请改正函数 fun中的错误,使它能得出正确的结果。 注意:部分源程序在文件 MODI1 C中,不要改动 main函数,不得增行或删行,也不得更改程序的结构 ! 试题程序: 1 #include stdio h 2 #include conio h 3 #include stdlib h 4 typedef struct aa 5 int data; 6 struct aa*next; 7 NODE; 8 int fun(NO
4、DE * h) 9 int sum=0; 10 NODE*p; 11 p=h-next; 12 *found* 13 while(p-next) 14 if(p-data 2=0) 15 sum+=p=data; 16 *found* 17 p=h-next; 18 19 return sum; 20 21 NODE* creatlink(int n) 22 23 NODE*h, *p, *s; 24 int i; 25 h=p=(NODE*)malloc(sizeof (NODE); 26 for(i=: 1; idata=rand() 16; 30 s-next=p-next; 31 p-
5、next=s; 32 p=p-next; 33 34 p-next=NULL; 35 return h; 36 37 outlink(NODE*h) 38 NODE*p; 39 p=h-next; 40 printf( n n The LIST: n n HEADH ); 41 while(p) 42 printf(- d, p-data); 43 p=p-next ;) 44 printff( n); 45 46 void main() 47 NODE * head; int sum; 48 system (CLS); 49 head=creatlink(10); 50 outlink(he
6、ad); 51 sum=fun(head); 52 printf( nSUM= d, sum); 53 三、程序设计题 3 请编一个函数 float fun(double h),该函数的功能是:使变量 h中的值保留两位小数,并对第三位进行四舍五入 (规定 h中的值为正数 )。 例如,若 h值为 1234 567,则函数返回 1234 570000;若 h值为 1234 564,则函数返回 1234 560000。 注意:部分源程序在文件 PROG1 C中。 请勿改动主函数 main和其他函数中的任何内容,仅在函数 fun的花括号中填入你编写的若干语句。 试题程序: 1 #include std
7、io h 2 #include conio h 3 #include stdlib h 4 float fun(float h) 5 6 7 8 void main() 9 10 FILE*Wf; 11 float a; 12 system(CLS); 13 printf(Enter a: ); 14 scanf( f, a); 15 printf(The origina1 data is: ; 16 printf( f n n, a); 17 printf(The result: f n, fun(a); 18 * 19 wf=fopen(out dat, w); 20 fprintf(wf
8、, f, fun(8 32533); 21 fclose(wf); 22 * 23 国家二级 C语言机试(操作题)模拟试卷 237答案与解析 一、程序填空题 1 【正确答案】 (1)ai (2)m 10 (3)m 10 【试题解析】 数组 a各元素初始化为 0,用求余和整除相结合的方法得到数字的每一位数字,并用它做为数组 a的下标,相应元素加 1。 填空 1:数组 a的 10个元素赋值为 0。 填空 2: m 10可得到数 m的最后一位数字。 填空 3: m 10可使数字截短,即去掉最后一位。 二、程序修改题 2 【正确答案】 (1)while(p!=NULL) (2)p=p-next; 【试
9、题解析】 (1)判断当前指针 p指向的结点是否存在,若存在则对该结点数据域进行判断操作。 (2)判断结束后指针指向下一个结点。 三、程序设计题 3 【正确答案】 1 float fun(float n) 2 3 int tmp = (int) (h* 1000+5) 10 ; *单精度数 h乘以 1000后再加 5,相当于对h中的第三位小数进行四舍五入,除以 10后将其赋给一个长整型数时就把第三位小数后的数全部截去 * 4 return(float)tmp 100 0; *除以 100,保留 2位小数 * 5 【试题解析】 注意:本题要求对 h的值真正进行四舍五人运算,而不是为了输出,即不能用 printf( 7 2f, h)来直接得到结果。四舍五入算法:如果要求精确到小数点后面的第 n位,则需要对第 n+1位进行运算。方法是将该小数乘以 10的 n+1次方后加 5, 然后除以 10并强制转换变量类型为整型,再将该数除以 10的n次方,同时强制转换类型为浮点型。 代码实现如下: int t; *定义整型变量 t* t=(int)(h*10n+1+5) 10; *对 h进行操作,得到值浮点型, t取值时取整数部分。 10n+1为要扩大的倍数 * h=(float)t 10n; *将 t缩小 10n倍,并转换成浮点型 *