1、国家二级 C语言机试(操作题)模拟试卷 532及答案与解析 一、程序填空题 1 给定程序中,函数 fun的功能是将 a和 b所指的两个字符串分别转换成面值相同的整数,并进行相加作为函数值返回,规定字符串中只含 9个以下数字字符。 例如,主函数中输入字符串 ”32486”和 ”12345”,在主函数中输出的函数值为44831。 请在程序的下画线处填入正确的内容并把下画线删除,使程序得出正确的结果。 注意:部分源程序在文件 BLANK1.C中。 不得增行或删行,也不得更改程序的结构! 试题程序: #include stdio .h #include string.h #include ctype.
2、h #define N 9 long ctod ( char*s ) long d=0; while ( * s) if (isdigit (* s) d=d*10 + * s -【 1】 ; 【 2】 ; return d; long fun ( char *a, char *b ) *found* return 【 3】 ; main () char sl N , s2 N ; do printf (“Input string s1: “) ; gets (s1) ; while ( strlen (s1)N ) ; do printf (“Input string s2 :“) gets
3、 (s2); while (strlen (s2) N); printf (“The result is: ldn“, fun (s1, s2); 二、程序修改题 2 下列给定程序中, fun函数的功能是:分别统计字符串中大写字母和小写字母的个数。 例如,给字符串 s输入: AAaaBBbb123 CCcccd,则应输出: upper=6, lower=8。请改正程序中的错误,使它得出正确的结果。 注意:部分源程序在文件 MODI1.C中,不要改动 mlun函数,不得增行或删行,也不得更改程序的结构! 试题程序: #include stdio.h *found* void fun ( char
4、 *s, int a, int b ) while ( *s) if(*s =A&*s =Z) *found* * a= a +1 ; if(*s =a&*s =Z) *found* *b=b+1; s + ; main () char s100; int upper = 0, lower = 0 ; printf ( “nPlease a string : “ ); gets ( s ); fun ( s, & upper, &lower ); printf ( “ n upper = d lower = dn“, upper, lower ) ; 三、程序设计题 3 请编一个函数 floa
5、t fun( double h), 该函数的功能是:使变量 h中的值保留两位小数,并对第三位进行 四舍五入(规定h中的值为正数)。 例如,若 h值为 1234. 567,则函数返回 1234. 570000;若 h值为 1234.564,则函数返回 1234. 560000。 注意:部分源程序在文件 PROGl.C中。 请勿改动主函数 main和其他函数中的任何内容,仅在函数 fun的花括号中填入你编写的若干语句。 试题程序: #include stdio .h #include conio.h #include stdlib.h float fun (float h ) void main
6、() FILE *wf; float a; system (“CLS“) : printf (“Enter a: “) ; printf (“The original data is : “) ; printf (“ fnn“, a); printf (fThe result: fn“, fun (a); * wf = fopen (“out.dat“ f “w“) ; fprintf (wf, “ f“, fun (8 .32533); fclose (wf) ; * 国家二级 C语言机试(操作题)模拟试卷 532答案与解析 一、程序填空题 1 【正确答案】 (1)0 (2)s+或 +s (
7、3)ctod(a)+ctod(b) 【试题解析】 填空 1: isdigt(*s)这个函数表示检查 *s是否是数字( 0 9),d=d*10+*s-?表示的是要把字符串分别转换成面值相同的整数,因此本空应该填写0。 填空 2: *s所代表的字符串中 字符需要一个一个的字符进行转换成整数,因此此空应该填写 s+或 +s。 填空 3:题目要求把转换后的字符进行相加后作为函数的返回值,因此本空应该填写 ctod(a) +ctod(b)。 二、程序修改题 2 【正确答案】 (1)void fun(char *s, int *a, int *b) (2)*a=*a+1; (3)*b=*b+1; 【试题解
8、析】 (1)由主函数中调用 fun函数的语句 fun(s, &upper &lower)可知,函数的后两个变量为指针的形式,所以用 *a和 *b。 (2)*a的作用是用 来记录大写字母的个数,此处的作用是对 *a累加 1,所以此处应改为 *a=*+1。 (3)*b的作用是用来记录小写字母的个数,此处的作用是对 *b累加 1,所以此处应改为 *b=*b+1。 三、程序设计题 3 【正确答案】 float fun (float h) int tmp=(int) (h * 1000+5)/10; *单精度数 h乘以 1000后再加 5相当于对 h中的第三位小数进行四舍五入,除以10后将其赋给一个长整
9、型数时就把第三位小数后的数全部截去 * return(float) tmp/100.0; *除以 100,保留 2位小数 * 【试题解析】 注意:本题要求对 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倍,并转换成浮点型 *