C语言上机题库百科园第八章!南信大!(56页).doc
-第八章以下叙述中正确的是()若有以下语句typedefstruct Sint g; char h;T;A.可用T定义结构体变量B.T是struct S类型的变量C.可用S定义结构体变量D.S是struct类型的变量当定义一个结构体变量时,系统分配给它的内存是( )。A.结构体中最后一个成员所需内存量B.成员中占内存量最大的容量C.结构体中第一个成员所需内存量D.各成员所需内存量的总和若有以下定义:struct linkint data;struct link *next;a,b,c,*p,*q;且变量a和b之间已有如下图所示的链表结构,若指针p指向a,指针q指向c。则能把c插入到a和b之间形成新的链表的语句是( )A.p->next=&c;q->next=p->next;B.p.next=q;q.next=p.next;C.p->next=q; q->next=&b;D.a.next=c; c.next=b;/*N名学生的成绩已在主函数中放入一个带头节点的链表结构中,h指向链表的头节点。请编写函数fun,它的功能是:求出平均分,由函数值返回。 例如,若学生的成绩是85,76,69,91,72,64,87,则平均分应当是78.625。 注意:部分源程序给出如下。请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。试题程序:*/ #include<stdlib.h>#include<stdio.h>#define N 8struct slist double s; struct slist *next;typedef struct slist STREC;double fun(STREC *h)/*Begin*/*End*/STREC *creat(double *s) /*创建链表*/ STREC *h,*p,*q; int i=0; h=p=( STREC*)malloc(sizeof(STREC); p->s=0; while(i<N) q=( STREC*)malloc(sizeof(STREC); q->s=si;i+;p->next=q;p=q; p->next=0; return h;outlist(STREC *h) STREC *p; p=h->next; printf("head "); do printf("->%4.1f ",p->s); p=p->next; /*输出各成绩*/ while(p!=NULL); printf("nn");void main() FILE *wf; double sN=85,76,69,85,91,72,64,87,ave; STREC *h; h=creat(s); outlist(h); ave=fun(h); printf("ave=%6.3fn ",ave);/*/ wf=fopen("debugout25.dat","w"); fprintf(wf,"%6.3fn",ave); fclose(wf);/*/【参考代码】 double av=0.0; STREC *p=h->next; /*p直接指向"头节点"的下一个节点,即第一个成绩*/ while(p!=NULL) av=av+p->s; /*求总分数*/ p=p->next; return av/N; /*返回平均值*/ /*学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组s中,请编写函数fun,该函数的功能是:把高于等于平均分的学生数据放在b所指的数组中,高于等于平均分的学生人数通过形参n传回,平均分通过函数值返回。注意:部分源程序给出如下。请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。试题程序: */#include <stdio.h># define N 12typedef struct char num10; double s; STREC;double fun (STREC *a,STREC *b, int *n)/*Begin*/*End*/void main() FILE *wf; STREC sN="GA05",85,"GA03",76,"GA02",69,"GA04",85, "GA01",91,"GA07",72,"GA08",64,"GA06",87, "GA09",60,"GA11",79,"GA12",73,"GA10",90; STREC hN,t; int i,j,n; double ave; ave=fun(s,h,&n); printf("The %d student data which is higher than %7.3f:n",n,ave); for(i=0; i<n; i+)printf("%s %4.1fn",hi.num,hi.s); printf("n"); for(i=0; i<n-1; i+) for(j=i+1;j<n;j+) if(hi.s<hj.s) t=hi;hi=hj;hj=t; /*分数从高到低排列*/*/ wf=fopen("debugout29.dat","w"); fprintf(wf, "%d %7.3fn",n,ave); for(i=0; i<n; i+) fprintf(wf, "%s %4.1fn",hi.num,hi.s); fclose(wf);/*/【参考代码】 int i; double av=0.0; *n=0; for(i=0;i<N;i+) av=av+ai.s; av=av/N; /*求平均值*/ for(i=0;i<N;i+) if(av<=ai.s) b*n=ai;*n=*n+1; /*将高于等于平均分的学生存入b所指存储单元中,并统计人数*/ return av; /*返回平均分*/ /*学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组s中,请编写函数fun,它的功能是:把指定分数范围内的学生数据放在b所指的数组中,分数范围内的学生人数由函数值返回。例如,输入的分数是60和69,则应当把分数在60到69的学生数据进行输出,包含60分和69分的学生数据。主函数中把60放在low中,把69放在heigh中。注意:部分源程序给出如下。请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。试题程序: */#include <stdio.h>#define N 16typedef struct char num10; int s ;STREC;int fun (STREC *a, STREC *b, int l, int h )/*Begin*/*End*/void main () FILE *wf; STREC sN= "GA005",85,"GA003",76,"GA002",69,"GA004",85, "GA001",96,"GA007",72,"GA008",64,"GA006",87, "GA015",85,"GA013",94,"GA012",64,"GA014",91, "GA011",90,"GA017",64,"GA018",64,"GA016",72; STREC hN,tt; int i, j,n, low, heigh, t; printf("Enter 2 integer number low & heigh: "); scanf("%d%d",&low,&heigh); if(heigh<low) t=heigh;heigh=low; low=t; n=fun(s,h,low, heigh); printf("The student 's data between %d-%d:n ",low, heigh); for(i=0;i<n;i+) printf("%s %4dn ",hi.num, hi.s); /*输出指定分数范围内的学生记录*/ printf("n ");/*/ n=fun(s,h,80,98); for(i=0;i<n-1;i+) /*分数在8098之间的学生记录按分数从低到高排列*/ for(j=i+1;j<n;j+) if(hi.s>hj.s) tt=hi;hi=hj;hj=tt; wf=fopen("debugout26.dat","w"); for(i=0;i<n;i+) fprintf(wf, "%s %4dn",hi.num, hi.s); fclose(wf);/*/【参考代码】 int i,j=0; for(i=0;i<N;i+) if(ai.s>=l&&ai.s<=h) /*将分数高于l,低于h的学生记录存于结构体数组b中*/ bj+=ai; return j; /*返回分数范围内的学生人数*/ /*某学生的记录由学号、8门课成绩和平均分组成,学号和8门课的成绩已在主函数中给出。请编写fun函数,它的功能是:求出该学生的平均分放在记录的ave成员中。请自己定义正确的形参。例如,若学生的成绩是85.5,76,69.5,85,91,72,64.5,87.5,则他的平均分应当是78.875。 注意:部分源程序给出如下。请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。试题程序: */#include <stdio.h>#define N 8typedef struct char num10; double sN; double ave; STREC;void fun(STREC *p)/*Begin*/*End*/void main() FILE *wf; 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.1fn",s.si); /*输出各科成绩*/ printf("nave=%7.3fn", s.ave); /*输出平均分*/*/ wf=fopen("debugout24.dat","w"); fprintf(wf,"ave=%7.3fn", s.ave); fclose(wf);/*/【参考代码】int i; p->ave=0.0; for(i=0;i<N;i+) p->ave=p->ave+p->si; /*求各门成绩的总和*/ p->ave=p->ave/N; /*求平均分*/ /*已知学生的记录由学号和学习成绩构成,N名学生的数据已存入a结构体数组中。请编写函数fun,该函数的功能是:找出成绩最低的学生记录,通过形参返回主函数(规定只有一个最低分)。已给出函数的首部,请完成该函数。注意:部分源程序给出如下。请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。试题程序:*/#include<stdio.h>#include<string.h>#include<stdlib.h>#define N 10typedef struct ss char num10; int s; STU;fun(STU a, STU *s)/*Begin*/*End*/void main() FILE *wf; STU aN= "A01",81, "A02",89, "A03",66, "A04",87, "A05",77, "A06",90, "A07",79, "A08",61, "A09",80, "A10",71,m; int i; printf("*The original data*n"); for(i=0;i<N;i+) printf("No=%s Mark=%dn", ai.num,ai.s); fun(a,&m); printf("*THE RESULT*n"); printf("The lowest :%s, %dn",m.num,m.s);/*/ wf=fopen("debugout28.dat","w"); fprintf(wf,"%s %dn",m.num,m.s); fclose(wf);/*/【参考代码】 int i; *s=a0; /*先认为第1个值最小*/ for(i=0;i<N;i+) /*如果在循环的过程中,发现比第1个值更小的则赋给*s*/ if(s->s>ai.s) *s=ai; /*学生的记录由学生和成绩组成,N名学生的数据已在主函数中放入结构体数组s中,请编写函数fun,其功能是:把分数最低的学生数据放在h所指的数组中。注意:分数最低的学生可能不止一个,函数返回分数最低的学生的人数。注意:部分源程序给出如下。请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。试题程序:*/#include <stdio.h># define N 16typedef struct char num10; int s; STREC;int fun (STREC *a,STREC *b)/*Begin*/*End*/void main() STREC sN="GA05",85,"GA03",76,"GA02",69,"GA04",85,"GA01",91,"GA07",72,"GA08",64, "GA06",87,"GA015",85,"GA013",91,"GA012",64,"GA014",91,"GA011",91,"GA017",64,"GA018",64,"GA016",72; STREC hN; int i,n; FILE *out; n=fun(s,h); printf("The %d lowest score:n",n); for(i=0;i<n;i+) printf("%s %4dn",hi.num,hi.s); printf("n"); /*/ out=fopen("debugout22.dat","w"); fprintf(out,"%dn",n); for(i=0;i<n;i+) fprintf(out,"%4dn",hi.s); fclose(out); /*/【参考代码】 int i,j=0,n=0,min; min=a0.s; for(i=0;i<N;i+) if(ai.s<min) min=ai.s; for(i=0;i<N;i+) if(ai.s=min) *(b+j)=ai;j+;n+; return n; /*学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组s中,请编写函数fun,它的功能是:把低于平均分的学生数据放在b所指的数组中,低于平均分的学生人数通过形参n传回,平均分通过函数值返回。注意:部分源程序给出如下。请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。试题程序: */#include<stdio.h>#define N 8typedef struct char num10; double s; STREC;double fun(STREC *a, STREC *b, int *n)/*Begin*/*End*/void main() FILE *wf; STREC sN= "GA05 ",85, "GA03 ",76, "GA02 ",69, "GA04 ",85, "GA01 ",91, "GA07 ",72, "GA08 ",64, "GA06 ",87; STREC hN; int i,n; double ave; ave=fun(s,h,&n); printf("The %d student data which is lower than %7.3f:n ", n,ave); for(i=0;i<n;i+) /*输出成绩低于平均值的学生记录*/ printf("%s %4.1fn ",hi.num,hi.s); printf("n ");/*/ wf=fopen("debugout30.dat","w"); fprintf(wf, "%d %7.3fn",n,ave); for(i=0;i<n;i+) fprintf(wf, "%s %4.1fn",hi.num,hi.s); fclose(wf);/*/【参考代码】 int i,j=0; double av=0.0; for(i=0;i<N;i+) av=av+ai.s; av=av/N; /*求平均值*/ for(i=0;i<N;i+) if(ai.s<av) bj+=ai; /*将低于平均值的学生记录存入结构体b中*/ *n=j; /*指针传回低于平均值的学生人数*/ return av; /*返回平均值*/ /*学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组s中,请编写函数fun,它的功能是:把分数最高的学生数据放在b所指的数组中,注意:分数最高的学生可能不止一个,函数返回分数最高的学生的人数。 注意: 部分源程序在文件PROG1.C中。 请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入 你编写的若干语句。 给定源程序: */#include <stdio.h> #define N 16 typedef struct char num10; int s; STREC; int fun( STREC *a, STREC *b ) /*Begin*/ /*End*/ int main() STREC sN="GA05",85,"GA03",76,"GA02",69,"GA04",85, "GA01",91,"GA07",72,"GA08",64,"GA06",87, "GA015",85,"GA013",91,"GA012",64,"GA014",91, "GA011",77,"GA017",64,"GA018",64,"GA016",72; STREC hN; int i,n;FILE *out ; n=fun(s,h); printf("The %d highest score :n",n); for(i=0;i<n; i+) printf("%s %4dn",hi.num,hi.s); printf("n"); out = fopen("debugout.dat","w"); for(i=0;i<n; i+) fprintf(out, "%s %dn",hi.num,hi.s); fclose(out);return 0; /*学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组s中,请编写函数fun,它的功能是:按分数的高低排列学生的记录,高分在前。注意:部分源程序给出如下。请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。试题程序: */#include <stdio.h>#define N 16typedef struct char num10; int s ;STREC;void fun (STREC a)/*Begin*/*End*/void main () FILE *wf; STREC sN= "GA005",85,"GA003",76,"GA002",69,"GA004",85, "GA001",91,"GA007",72,"GA008",64,"GA006",87, "GA015",85,"GA013",91,"GA012",64,"GA014",91, "GA011",66,"GA017",64,"GA018",64,"GA016",72; int i; fun(s); printf("The data after sorted :n"); for (i=0; i<N; i+) printf("%s %4dn",si.num,si.s); /*/ wf=fopen("debugout23.dat","w"); for (i=0; i<N; i+) fprintf(wf,"%s %4dn",si.num,si.s); fclose(wf);/*/【参考代码】 int i,j; STREC t; for(i=1;i<N;i+) for(j=0;j<N-1;j+) if(aj.s<aj+1.s) t=aj;aj=aj+1;aj+1=t; /*学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组s中,请编写函数fun,它的功能是:把分数最高的学生数据放在h所指的数组中。注意:分数高的学生可能不只一个,函数返回分数最高学生的人数。注意:部分源程序给出如下。请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。试题程序: */#include <stdio.h>#define N 16typedef struct char num10; int s ;STREC;int fun (STREC *a, STREC *b)/*Begin*/*End*/void main () FILE *wf; STREC sN="GA005",85,"GA003",76,"GA002",69,"GA004",85, "GA001",91,"GA007",72,"GA008",64,"GA006",87, "GA015",85,"GA013",91,"GA012",64,"GA014",91, "GA011",66,"GA017",64,"GA018",64,"GA016",72; STREC hN; int i, n; n=fun(s,h); printf("The %d highest score :n",n); for (i=0; i<n; i+) printf("%s %4dn ",hi.num,hi.s); /*输出最高分学生的学号和成绩*/ printf("n");/*/ wf=fopen("debugout27.dat","w"); fprintf(wf, "%dn",n); for (i=0; i<n; i+) fprintf(wf,"%s %4dn",hi.num,hi.s); fclose(wf);/*/【参考代码】 int i,j=0,max=a0.s; for(i=0;i<N;i+) if(max<ai.s) max=ai.s;/*找出最大值*/ for(i=0;i<N;i+) if(max=ai.s) bj+=ai; /*找出成绩与max相等的学生的记录,存入结构体b中*/ return j; /*返回最高成绩的学生人数*/ /*下列给定程序中,函数fun的功能是:对N名学生的学习成绩,按从高到低的顺序找出前m(m<=10)名学生,并将这些学生数据存放在一个动态分配的连续存储区中,此存储区的首地址作为函数值返回。 请改正程序中的错误,使它能得出正确的结果。 注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。 试题程序:*/ #include <stdlib.h>#include <string.h>#include <stdio.h>#include <malloc.h>#define N 10typedef struct ss char num10; int s; STU;STU *fun(STU a, int m) STU bN,*t; int i, j,k;/*ERROR*/ *t=calloc(m,sizeof(STU); for(i=0;i<N;i+) bi=ai; for(k=0;k<m;k+) for (i=j=0;i<N;i+) if(bi.s>bj.s) j=i;/*ERROR*/ tk.num=bj.num; tk.s=bj.s; bj.s=0; return t;outresult(STU a,FILE *pf) int i; for(i=0;i<N;i+) fprintf(pf, "No=%s Mark=%dn ",ai.num, ai.s); fprintf(pf, "nn ");void main() STU aN= "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 %dn",pOrderi.num, pOrderi.s); free(pOrder); 【参考答案】t=calloc(m,sizeof(STU);【参考答案】tk=bj;/*下列给定程序的功能是:建立一个带头节点的单向链表,并用随机函数为各节点数据域赋值。函数fun的作用是求出单向链表节点(不包括头节点)数据域中的最大值,并且作为函数值返回。请改正函数fun中的错误,使它能得出正确的结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。试题程序: */#include <stdio.h>#include <stdlib.h>typedef struct aa int data; struct aa *next; NODE;fun (NODE *h) int max=-1; NODE *p;/*ERROR*/ p=h; while(p) if(p->data>max)