【真题1】 给定程序中,函数fun 的功能是:计算出带有头结点的单向链表中各结 点数据域之和作为函数值返回。 #include < stdio.h >#include < stdlib.h >#define N 8 typedef struct list { int data; struct list *next; } SLIST; SLIST *creatlist(int *); void outlist(SLIST *); int fun( SLIST *h) { SLIST *p; int s=0; p=h- >next; while(p) { /**********found**********/ s+= p- >___1___; /**********found**********/ p=p- >___2___; } return s; } main() { SLIST *head; int a[N]={12,87,45,32,91,16,20,48}; head=creatlist(a); outlist(head); /**********found**********/ printf("\nsum=%d\n", fun(___3___)); } SLIST *creatlist(int a[]) { SLIST *h,*p,*q; int i; h=p=(SLIST *)malloc(sizeof(SLIST)); for(i=0; i< N; i++) { q=(SLIST *)malloc(sizeof(SLIST)); q- >data=a[i]; p- >next=q; p=q; } p- >next=0; return h; } void outlist(SLIST *h) { SLIST *p; p=h- >next; if (p==NULL) printf("The list is NULL!\n"); else { printf("\nHead "); do { printf("- >%d", p- >data); p=p- >next; } while(p!=NULL); printf("- >End\n"); } } (2011年2月) 解析: 本题考查的是链表。 在函数fun 中,通过指针p遍历链表的各个结点,直到其为NULL,如果其不 为NULL,则将其data域的值累加到s 上去,并将p指向其后续结点,故第一 空应为data,第二空为next;第三空的目的是调用函数fun,由于函数fun的 形参为指向SLIST类型的指针,而head又是整个链表的头指针,故第三空应 填head。 答案:【1】data 【2】next 【3】head 【真题2】 给定程序modi.c 中函数fun的功能是:给一维数组a输入任意4 个整 数,并按下例的规律输出。例如输入1、2、3、4,程序运行后将输出以下方阵。 4 1 2 3 3 4 1 2 2 3 4 1 1 2 3 4 请改正函数fun 中指定部位的错误,使它能得出正确的结果。 注意:不要改动main 函数, #include < stdio.h >#define M 4 /**************found**************/ void fun(int a) { int i,j,k,m; printf("Enter 4 number : "); for(i=0; i< M; i++) scanf("%d",&a[i]); printf("\n\nThe result :\n\n"); for(i=M;i >0;i--) { k=a[M-1]; for(j=M-1;j >0;j--) /**************found**************/ a[j]=a[j+1]; a[0]=k; for(m=0; m< M; m++) printf("%d ",a[m]); printf("\n"); } } main() { int a[M]; fun(a); printf("\n\n"); } (2011年2月) 解析: 本题的考核点是用数组名作函数参数。 解题思路:本题通过双重循环逐行输出数组中的值。 程序中的第一个错误:本题考的是用数组名作函数参数,此时实参与形参都应 用数组名(或用数组指针),所以此处应当改为fun(int a[4])或fun(int *a) 等; 程序中的第二个错误:a[j]=a[j+1]是将数组中下标为j的下一个值赋给a[j], 而根据本题题意,是将前一个值赋给a[j],所以应当改为a[j]=a[j-1];。 【真题3】 某学生的记录由学号、8 门课程成绩和平均分组成,学号和8门课程的 成绩已在主函数中给出。请编写函数fun,它的功能是:求出该学生的平均分放在记 录的ave 成员中。请自己定义正确的形参。 例如,学生的成绩是:85.5,76,69.5,85,91,72,64.5,87.5,他的平均分应当是: 78.875。 注意:部分源程序存在文件prog.c 中。 请勿改动主函数main 和其他函数中的任何内容,仅在函数fun 的花括号中填入你编 写的若干语句。 #include < stdio.h >#define N 8 typedef struct { char num[10]; double s[N]; double ave; }STREC; void fun(STREC *p) {……} main() { STREC s={"GA005",85.5,76,69.5,85,91,72,64.5,87.5}; int i; fun(&s); 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); } (2011年2月) 解析: 本题的考核点是计算平均分算法。 提示思路:先统计8 门课程的总分数,然后再除8,求学生的平均分。 void fun(STREC *p) { int i; double aver=0; /*将平均分赋初值0*/ for (i=0;i< N;i++) {aver=aver+(*p).s[i]; } /*求和*/ (*p).ave=aver/N; /*计算平均值*/ } |