【真题1】 下列给定程序中,函数fun()的功能是:对N 名学生的学习成绩,按从 高到低的顺序找出前m(m≤10)名学生来,并将这些学生数据存放在一个动态分配的 连续存储区中,此存储区的首地址作为函数值返回。 试题程序: #include < conio.h >#include < string.h >#include < stdio.h >#include < malloc.h >#define N 10 typedef struct ss { char num[10]; int s; } STU; __1___ *fun(STU a[], int m) { STU b[N],*t; int i, j,k; t=calloc(m,__2__); for(i=0;i< N;i++) b[i]=a[i]; for(k=0;k< m;k++) { for (i=j=0;i< N;i++) if(b[i].s >b[j].s)__3__; t[k]=b[j]; t[k].s=b[j].s; b[j].s=0; } return t; } outresult(STU a[],FILE *pf) { int i; for(i=0;i< N;i++) fprintf(pf, "No=%s Mark=%d\n ",a[i].num, a[i].s); fprintf(pf, "\n\n "); } main() { STU a[N]={{ "A01 ",81},{ "A02 ",89},{ "A03 ",66},{ "A04 ",87},{ "A05 ",77}, { "A06 ",90},{ "A07 ",79},{ "A08 ",61},{ "A09 ",80},{ "A10 ",71}}; STU *pOrder; int i, m; printf("*****THE RESULT*****\n"); outresult(a,stdout); printf("\nGive the number of the students who have better score: "); scanf("%d",&m); while(m >10) { printf("\nGive the number of the students who have better score: "); scanf("%d",&m); } pOrder=fun(a,m); printf("***** THE RESULT*****\n"); printf("The top :\n"); for(i=0;i< m;i++) printf("%s %d\n",pOrder[i].num, pOrder[i].s); free(pOrder); } (2011年2月) 解析: 填空1:根据题目的意思,这里应该是子函数的声明,很明显这里需要 填写返回值类型,题目中已经给出了是指针型的,根据后面返回的参数t可以判 断这里应该是结构STU 类型。 填空2:根据题目的意思,这里是动态申请空间,calloc 是用于分配内存空间的 函数,其调用形式为 (类型说明符*)calloc(n,size),功能:在内存动态存储区 中分配n 块长度为"size"字节的连续区域,函数的返回值为该区域的首地址, (类型说明符*)用于强制类型转换,calloc 函数与malloc 函数的区别仅在于一 次可以分配n 块区域。例如: ps=(struet stu*) calloc(2,sizeof (struct stu));,其中的sizeof(struct stu)是求stu 的结构长度。因此该语句的意思 是:按stu 的长度分配两块连续区域,强制转换为stu 类型,并把其首地址赋 予指针变量ps。 填空3:由算法可以看出,这里应该是从大到小进行排序,所以一旦发现有比第 j个元素还大的某个i,就应该把i 作为当前最大的元素,直到循环结束,这种算 法考生应该掌握。 答案:【1】STU 【2】sizeof(STU) 【3】j=i 【真题2】 给定程序modi.c 中函数fun的功能是:计算n 的5 次方的值(规定n 的值大于2、小于8),通过形参指针传回主函数。并计算该值的个位、十位、百位 上数字之和作为函数值返回。例如,7 的5 次方是16807,其低3 位数的和值是 15。 请改正函数fun 中指定部位的错误,使它能得出正确的结果。 注意:不要改动main 函数, #include < stdio.h >#include < math.h >int fun( int n ,int *value ) { int d,s,i; /**************found**************/ d=0; s=1; for(i=1; i< =5; i++) d=d*n; *value=d; for(i=1; i< =3; i++) { s=s+d%10; /**************found**************/ s=s/10; } return s; } main() { int n, sum, v; do { printf("\nEnter n( 2< n< 8): ");scanf("%d",&n); } while(n< =2||n >=8); sum=fun( n,&v ); printf("\n\nThe result:\n value=%d sum=%d\n\n",v,sum); } (2011年2月) 解析: 本题的考核点是C语言中for循环的使用。 解题思路:程序中第一个for 循环的作用是计算n的5 次方,计算结果存放于 变量d中,第二个for 循环语句实现了计算变量d中个位、十位、百位上数字 之和,结果存放于变量s 中,并返回s。 本题中的第一个错误:程序中d和s初始化错误,导致d和s 的值为0,所以 应该将程序中的语句"d=0; s=1;"改为"d=1;s=0;"或相同作用的语句。 本题中的第二个错误:程序要实现的是计算变量d个位、十位和百位上的数 值,所以应该将程序中的语句" s=s/10;"改为"d=d/10;"或相同作用的语句。 【真题3】 编写函数fun,函数的功能是:从字符串中删除指定的字符。同一字母的 大、小写按不同字符处理。若程序执行时,输入字符串为:turbo c and borland c++,从键盘上输入字符:n,则输出后变为:turbo c ad borlad c++,如果输入 的字符字符串中不存在,则字符串照原样输出。 注意:部分源程序存在文件prog.c 中。 请勿改动主函数main 和其他函数中的任何内容,仅在函数fun 的花括号中填入你编 写的若干语句。 #include < stdio.h >#include < conio.h >int fun(char s[],int c) {……} main() { static char str[]="turbo c and borland c++"; char ch; clrscr(); printf("原始字符串:%s\n",str); printf("输入一个字符:"); scanf("%c",&ch); fun(str,ch); printf("str[]=%s\n",str); } (2011年2月) 解析: 本题的考核点是从字符串中删除指定字符的算法。 解题思路:从字符串中的第一个字符开始,依次与要删除的字符进行比较,若 相同,则将它之后的字符逐个向前移动一个位置,即将该字符删除,直到字符 串尾,将所有与指定字符相同的字符删除。 本评析仅供参考。 int fun(char s[],int c) { int i=0,j; while (s[i]!='\0') /*判断s[i]是否为句末结束符*/ { if (s[i]==c) /*判断s[i]是否为指定要删除的字符c*/ {j=i+1; while (s[j-1]!='\0')/*将c 字符后的所有字符顺序向前移一位*/ {s[j-1]=s[j];j=j+1;} } i=i+1; } } |