1、国家二级 C语言机试(操作题)模拟试卷 611及答案与解析 一、程序填空题 1 使用 VC+2010打开考生文件夹下 blank1中的解决方案。此解决方案的项目中包含一个源程序文件 blank1 c。在此程序中,函数 fun的功能是:将形参 s所指字符串中的数字字符转换成对应的数值,计算出这些数值的累加和作为函数值返回。 例如,形参 s所指的字符串为 abs5def126jkm8,程序执行后的输出结果为 22。 请在程序的下画线处填入正确的内容并把下画线删除,使程序得出正确的结果。 注意:部分源程序在文件 BLANK1 C中。 不得增行或删行,也不得更改程序的结构 ! 试题程序: #inclu
2、de stdio h #include string h #include ctype h int fun(char*s) int sum=0; while(*s) *found* if(isdigit(*s) sum+=*s-【 1】 ; *found* 【 2】 ; *found* return【 3】 ; main() char s81; int n; printf(“ nEnter a string: n n“); gets(s); n=fun(s); printf(“ nThe result is: d n n“, n); 二、程序修改题 2 使用 VC+2010打开考生文件夹下 m
3、odi1中的解决方案。此解决方案的项目中包含一个源程序文件 modi1 c。在此程序中,函数 fun的功能是:将长整型数中各位上为奇数的数依次取出,构成一个新数放在 t中。高仍在高位,低位仍 在低位。 例如,当 s中的数为 87653142时, t中的数为 7531。 请改正程序中的错误,使它能得出正确的结果。 注意:不要改动 main函数,不得增行或删行,也不得更改程序的结构 ! 试题程序: #include stdlib h #include stdio h #include conio h void fun(long s, long*t) int d; long s1=1; *found
4、* t=0; while(s 0) d=s 10; *found* if(d 2=0) *t=d*s1+*=t; s1*=10; s =10; void main() long s, t; system(“CLS“); printf(“ nplease enter s: “); scanf(“ ld“, &s); fun(s, &t); printif(“The result is: ld n“, t); 三、程序设计题 3 使用 VC+2010打开考生文件夹下 prog1中的解决方案。此解决方案的项目中包含一个源程序文件 prog1 c。在此程序中,编写函数 fun,其功能是:求 Fibon
5、acci数列中大于 t的最小的数,结果由函数返回。 Fibonaeci数列 F(n)的定义为: F(0)=0, F(1)=1 F(n)=F(n-1)+F(n-2) 例如,当 t=1000时,函数值为 1597。 注意:部分源程序给出如下。 请勿改动主函数 main和其他函数中的任何内容,仅在函数 fun的花括号中填入你编写的若干语句。 试题程序: #include conio h #include math h #include stdio h int fun(int t) main() int n; n=1000; printf(“n= d, f= d n“, n, fun(n); 国家二级
6、 C语言机试(操作题)模拟试卷 611答案与解析 一、程序填空题 1 【正确答案】 (1)48或 0 (2)s+ (3)sum 【试题解析】 本题是把字符串中是数字字符转换成对应的数值并进行累加。 填空 1: 0字符对应的 ASCII码值 是 48,因此数字字符转换成对应数值时只要减去 48,即是该数字字符对应的数值,所以应填 48或者 0。 填空 2:判断完一个字符之后,将字符串指针移到下一个位置,所以应填 s+。 填空 3:返回累加和 sum,所以应填 sum。 二、程序修改题 2 【正确答案】 (1)*t=0; (2)if(d 2!=0)或 if(d 2=1) 【试题解析】 (1)由函数
7、定义可知,变量 t是指针变量,所以对 t进行赋初值 0是不对的。因为 t指向的是存放新数的变量,所以此处应给新数赋初值 0,即木t=0; (2)变量 d表示数 s各位 上的数,此处的 if条件应为判断 d是否为奇数。 三、程序设计题 3 【正确答案】 int fun(int t) int f0=0, f1=1, f; do *根据 Fibonacci数列的定义求数值 * f=f0+f1; f0=f1; f1=f; )while(f t); *如果求的数值小于 t则继续 * return f; 【试题解析】 根据所给数列定义不难发现,该列最终的结果是由两个数列之和组成,所以可以在循环内部始终把 f看成是前两项之和,而 f0始终代表第 n-2项, f1代表第 n-1项。退出循 环时得到的数 f,就是大于指定数的最小的数。