【真题1】 某学生的记录由学号、8 门课成绩和平均分组成,学号和8 门课的成绩 已在主函数中给出。函数fun()的功能是:求出该学生的平均分放在记录的ave 成员 中。请自己定义正确的形参。 例如,若学生的成绩是85.5,76,69.5,85,91,72,64.5,87.5,则他的平 均分应当是78.875。 试题程序: #include < stdio.h >#define N 8 typedef struct { char num[10]; double s[N]; double ave; } STRUC; void fun(STRUC *P) { int i; p- >ave=__1__; for(i=0;i< N;i++) p- >ave=p- >ave+p- >s[i]; p- >ave=__2__; } main() { FILE *wf; STRUC s={ "GA005 ",85.5,76,69.5,85,91,72,64.5,87.5}; int i; fun(__3__); printf("The %s's student data:\n", s.num); for(i=0;i< N;i++) printf("%4.1f\n",s.s[i]); printf("\nave=%7.3f\n", s.ave); wf=fopen("out.dat","w"); fprintf(wf,"ave=%7.3f", s.ave); fclose(wf); } (2011年2月) 答案:[1]0.0 [2] (p- >ave)/N [3]&s 【真题2】 给定程序modi.c 中函数fun的功能是: 求整数x 的y 次方的低3 位 值。例如,整数5 的6 次方为15625,此值的低3 位值为625。 请改正函数fun 中指定部位的错误,使它能得出正确的结果。 注意:不要改动main 函数, #include < stdio.h >long fun(int x,int y,long *p ) { int i; long t=1; /**************found**************/ for(i=1; i< y; i++) t=t*x; *p=t; /**************found**************/ t=t/1000; return t; } main() { long t,r; int x,y; printf("\nInput x and y: "); scanf("%ld%ld",&x,&y); t=fun(x,y,&r); printf("\n\nx=%d, y=%d, r=%ld, last=%ld\n\n",x, y,r,t ); } (2011年2月) 解析: 本题的考核点是数组的使用。 解题思路:通过循环使y个x相乘可计算x的y次的值,然后通过对1000 取 余可得低3 位的值。本题需要注意的是除法运算与模运算:'/'为除法运算符, 两个整数相除结果为整数;'%'为模运算符,或称求余运算符,要求%两侧均为 整型数据。 程序中的第一个错误:根据for循环的定义,当i=y时,不执行,本题要求y 个x 相乘,应当计算,所以'for(i=1; i< y; i++)'应改为'for(i=1;i< =y;i++)'; 程序中的第二个错误:题目要求取低3位的值,而't=t/1000;'则是取的除低3 位以外的值,应当为对t取余,所以应当改为't=t%1000;'。 【真题3】 函数char * MyDelete( char * str, char c )的功能是:在字符串str 中删除变量c 中的字符,有几个删几个,并返回所删字符的个数。 例如,若输入字符串"ab abc bcdef "和 字符'b',则应输出字符串"a ac cdef "和 3 (表示删了3 个字符' b')。 注意:此程序存贮在prog.c中。 请勿改动主程序main、函数WriteData 和函数compute 中的任何内容,仅在函数 MyDelete 中的横线处填入适当内容并删除横线。 #include < conio.h >#include < stdio.h >int MyDelete( char* str, char c ) { int i, j=0, k=0; for( i = 0; str[i]; i++ ) if( str[i] != c ) { str[ j ]= str[i]; ___(1)___; } else k++; str[j]=___(2)___ ; return( ___(3)___ ); } main() { char string[81], x; clrscr(); printf("\nPlease enter a string:\n"); gets(string); printf("\nPlease enter a character: "); scanf("%c", &x ); printf( "\n\nAfter deleting %d '%c'(s), the string becomes:\n%s\n",MyDelete(string, x), x, string); compute() ; } /* 以下部分与考生答题无关, 考生不必阅读, 但不得进行任何修改 */ WriteData(int num) { FILE *fp; fp = fopen("dat32.dat", "w"); fprintf(fp, "%d", num); fclose(fp); } compute() { char string[81], c; FILE *fp ; fp=fopen("c9670303.in","r"); fgets(string, 80, fp); fscanf(fp, "%c", &c ); fclose(fp); WriteData(MyDelete(string, c)); } (2011年2月) 解析: 本题的考核点是c 语言中的循环语句和条件判断语句的使用。 解题思路:从MyDelete函数的基本流程可以看出,函数通过一个for 循环扫 描整个字符串,并定义了两个偏移量变量i和j,其中一个变量保存实际偏移 量,另一个保存去掉字符变量c后的相对偏移量。如果实际偏移量所指的字符 不是c 时,就将这个字符移到相对偏移量处,然后将相对偏移量后移一位;如 果实际偏移量所指的字符是c 时,就滤掉这个字符,将统计删除字符数的计数 器加一。当删除结束后,应该在新字符串的末尾写入一个串结束符,所以(2)处 应填入0 或0x00或'\0'。函数最后返回计数器的值。 int MyDelete( char* str, char c ) { int i, j=0, k=0; for( i = 0; str[i]; i++ ) if( str[i] != c ) { str[ j ]= str[i]; j++; } else k++; str[j]= 0; return( k ); } 答案:(1). j++ (2). 0,'\0' (3). k |