【真题1】 str为一个字符序列。请补充函数fun(),该函数的功能是:查找str 中 值为x 的元素,返回该字符序列中值为x的元素个数,并把这些值为x 的元素下标 依次保存在数组bb 中。例如,在“abcdefahij”中查找‘a’,结果为:2 个‘a’,下标依 次为0、6。 注意:部分源程序给出如下。 请勿改动主函数main 和其他函数中的任何内容,仅在函数fun()的横线上填入所编 写的若干表达式或语句。 试题程序: #include< stdio.h >#include< conio.h >#define N 20 int bb[N]; int fun(char *str,char ch) { int i=0, n=0; char t=ch; char *p=str; while(*p) { if (【1】) 【2】; p++; i++; } return 【3】; } main() { char str[N]; char ch; int i,n; clrscr(); printf("***Input the original string ***\n"); gets(str); printf("***The Original ***\n"); puts(str); printf("***Input character ***\n"); scanf("%c",&ch); n=fun(str,ch); printf("\nThe numbr of character is: %d\n",n); printf("***The suffix of character ***\n"); for(i=0;i< n;i++) printf("%d ",bb[i]); } (2011年2月) 解析: 填空1:通过指针p的移动来依次访问字符串的各个字符,如果指针p 所指的字符等于待查找的字符,即表示找到了满足条件的字符。填空2:将找到 的字符在字符数组中的下标值保存在数组bb中。填空3:变量n 记录在字符串 中找到待查找字符的个数。由main 函数的调用可知函数fun()的返回值为n。 答案:【1】*p==t 【2】bb[n++]=i 【3】n 【真题2】 文件modi.c 中程序的功能是:读入一个整数m,计算如下公式的值。 t = 1 - 1/2 - 1/3 - …… - 1/m 例如,若输入5,则应输出 -0.283333。 请改正程序中的错误,使它能计算出正确的结果。 注意: #include < conio.h >#include < stdio.h >double MyLim( int m ) { double t = 1.0; int i; /************found**********/ for( i = 2; i < = m; i++ ) t = 1.0 -1.0/t; return( t ); } main() { int m ; clrscr(); printf( "\nPlease enter 1 integer numbers:\n" ); /************found**********/ scanf( "%d" &m ) printf( "\n\nThe result is %lf\n", MyLim( m ) ); } (2011年2月) 解析: 本题的考核点是C语言中循环语句的使用。 对于复杂的计算公式,我们应先找出其中的规律,将其简化,然后用循环、条 件判断等将其归纳为一种算法,进而编出程序解决问题。 t = 1 - 1/2 - 1/3 - ... - 1/m,可以简化为: m t = 1 - Σ1/i i=2 所以在for 循环中,如果t的初始值为1.0,则上式即可表示为:t = t - 1.0/i ( i 从2 循环到m)。所以应该把原程序中的" t = 1.0 -1.0/t;"改为"t=t- 1.0/i;"或相同作用的语句。 另外,原程序中main 函数中的"scanf( "%d" &m )"语句也是错误的,应该改 为"scanf( "%d" ,&m );"。 【真题3】 请编一个函数double Acc(int k, double dd[]), 它的功能是:求出数 组dd 中前k 个数的小数部分的和, 并返回此值。 例如:输入4 和101.91、213.87、345.79、420.83,则输出3.4。 注意:此程序保存在prog.c中。 请勿改动主程序main、函数WriteData 和函数compute 中的任何内容,仅在函数 Acc 的花括号中填入你编写的若干语句。 #include < conio.h >#include < stdio.h >#define M 20 double Acc( int k, double dd[] ) {……} main() { int i, m; double x, tt[M]; clrscr(); printf("\nPlease enter number of numbers: "); scanf("%d", &m ); printf("\nPlease enter %d decimal numbers:\n",m); for( i = 0; i < m; i++ ) { scanf("%lf", &x ); tt[i] = x ; } printf( "\nThe sum of their decimal part is: %lf\n", Acc(m, tt)); compute() ; } /* 以下部分与考生答题无关, 考生不必阅读, 但不得进行任何修改 */ WriteData(double sum) { FILE *fp; fp = fopen("dat12.dat", "w") ; fprintf(fp, "%lf", sum); fclose(fp); } compute() { int i, m; double x, tt[M]; FILE *fp; fp = fopen("c9670103.in", "r"); fscanf(fp, "%d", &m ); for( i = 0; i < m; i++ ) { fscanf(fp, "%lf", &x ); tt[i] = x ; } fclose(fp); WriteData(Acc(m, tt)); } (2011年2月) 解析: 本题的考核点是C语言中的数据类型转换。 提示思路:根据C 语言的类型转换规则,如果把一个A类型的数据赋给一个B 类型的数据时,C 语言将先把A类型的数据转换为B类型,然后再赋值。其实 C 编译器对各类型的数据并没有十分严格的区分,最大的区别只是所占的位数不 同。当把一个浮点型的数据赋给整型变量时,C编译器将会强制去掉浮点型数据 的小数部分,此时所得到的整型数据就是浮点数据的整数部分。用浮点数据减 去整型数据所得出的结果即为该浮点数据的小数部分,将这个结果累加起来就 得出要返回的值。 double Acc( int k, double dd[] ) {int i; int int_data; double flt_data, result = 0; for (i = 0;i < k; i ++) { int_data = dd[i]; /*求数组dd[]的整数部分*/ flt_data = dd[i] - int_data; /*求数组dd[]的小数部分*/ result += flt_data; /*通过for 循环求出数组dd中前k 个数的小数部分的和 result*/ } return result; /*返回数组dd中前k个数的小数部分之和result*/ } |