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