五、编程题

五、编程题(共40分)
有10个学生5门课,按学生平均分由画到低的顺序输出学生学号、各门课的成绩以及平均分。
1.第-种方法: (15分)
①在主函数中输入学号和成绩,分别用数组存放;
②自定义一个函数计算平均分、排序并输出结果,用数组指针进行处理。

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #define N 10
 4 #define M 5
 5 int id[N];
 6 int sortid[N];
 7 static int visited[N];
 8 float aver[N];
 9 
10 void fun(float *grades){
11     int i,j,k;
12     float sum=0.0;
13     for(i=0;i<N;i++){
14         sum=0.0;
15         for(j=0;j<M;j++){
16             sum+=grades[i*M+j];
17         }
18         aver[i]=sum/M;
19     }
20     for(i=0;i<N;i++)
21         printf("%0.2f ",aver[i]);
22     printf("\n");
23     int t=0,count=0;
24     for(i=0;i<N;i++){//选择排序法
25         if(visited[i])
26             continue;
27         k=i;
28         for(j=0;j<N;j++){
29             if(aver[k]<aver[j]&&!visited[j])
30                 k=j;
31         }
32         visited[k]=1;
33         sortid[t++]=k;
34         i=0;
35     }
36 
37     for(i=0;i<N;i++){
38         printf("\nstudent's id:%d\n",id[sortid[i]]);
39         for(j=0;j<M;j++){
40             printf("%0.1f ",grades[sortid[i]*M+j]);
41         }
42         printf("\naver:%0.2f\n",aver[sortid[i]]);
43     }
44 }
45 
46 int main()
47 {
48     int idcard;
49     float grades[M*N];
50     int i,j,t=0;
51     for(i=0;i<N;i++){
52         scanf("%d",&id[i]);
53         for(j=0;j<M;j++){
54             scanf("%f",&grades[t++]);
55         }
56     }
57     fun(grades);
58     return 0;
59 }

运行结果:

2016540330
90 91 92 93 94
2016540331
100 99 98 90 9
2016540332
100 87 88 98 9
2016540333
98 90 99 97 92
2016540334
98 91 92 89 79
2016540335
90 78 89 67 66
2016540336
32 89 34 22 89
2016540337
28 89 89 89 89
2016540338
89 89 78 78 78
2016540339
89 67 67 67 67
92.00 79.20 76.40 95.20 89.80 78.00 53.20 76.80 82.40 71.40

student's id:2016540333
98.0 90.0 99.0 97.0 92.0
aver:95.20

student's id:2016540330
90.0 91.0 92.0 93.0 94.0
aver:92.00

student's id:2016540334
98.0 91.0 92.0 89.0 79.0
aver:89.80

student's id:2016540338
89.0 89.0 78.0 78.0 78.0
aver:82.40

student's id:2016540331
100.0 99.0 98.0 90.0 9.0
aver:79.20

student's id:2016540335
90.0 78.0 89.0 67.0 66.0
aver:78.00

student's id:2016540337
28.0 89.0 89.0 89.0 89.0
aver:76.80

student's id:2016540332
100.0 87.0 88.0 98.0 9.0
aver:76.40

student's id:2016540339
89.0 67.0 67.0 67.0 67.0
aver:71.40

student's id:2016540336
32.0 89.0 34.0 22.0 89.0
aver:53.20

Process returned 0 (0x0) execution time : 3.305 s
Press any key to continue.


2.第二种方法: (25分)
①在主函数中输入学号和成绩,用结构体数组存放;
②自定义一个函数计算平均分,并将学号、各门课的成绩和平均分存放在磁盘文件stud中,用数组指针进行处理;
③在主函数中读取stud文件中的内容并输出;
④自定义一个函数将stud文件中的学生数据按平均分进行排序,将排好序的学生数据存入stud_sort 文件中,用数组指针进行处理;
⑤在主函数中读取stud_sort文件中的内容并输出。

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #define M 5
  4 #define N 10
  5 typedef struct student{
  6     int id;
  7     float grades[M];
  8     float average;
  9 }STU;
 10 
 11 
 12 void sort(STU *student,FILE *out){
 13     int i,j;
 14     int k;
 15     STU t;
 16     for(i=0;i<N-1;i++){
 17         k=i;
 18         for(j=i+1;j<N;j++){
 19             if(student[k].average<student[j].average)
 20                 k=j;
 21         }
 22         if(k!=i){
 23            t=student[k];
 24            student[k]=student[i];
 25            student[i]=t;
 26         }
 27     }
 28     if((out=fopen("stud_sort.txt","w"))==NULL){
 29         printf("Can't open this file.\n");
 30         exit(1);
 31     }
 32     for(i=0;i<N;i++){
 33         fprintf(out,"%d:",student[i].id);
 34         for(j=0;j<M;j++){
 35             fprintf(out,"%0.2f ",student[i].grades[j]);
 36         }
 37         fprintf(out,"\naver:%0.2f\n\n",student[i].average);
 38     }
 39 }
 40 int main()
 41 {
 42     FILE *out,*in;
 43     STU studetns[N];
 44     int i,j;
 45     char buffer[80];
 46     float sum=0.0;
 47     if((out=fopen("stud.txt","w+"))==NULL){
 48         printf("Can't open this file.\n");
 49         exit(1);
 50     }
 51     for(i=0;i<N;i++){
 52         sum=0.0;
 53         scanf("%d",&studetns[i].id);
 54         fprintf(out,"%d ",studetns[i].id);
 55         for(j=0;j<M;j++){
 56             scanf("%f",&studetns[i].grades[j]);
 57             sum+=studetns[i].grades[j];
 58             fprintf(out,"%0.2f ",studetns[i].grades[j]);
 59         }
 60         studetns[i].average=sum/M;
 61         fprintf(out,"%0.2f\n",studetns[i].average);
 62     }
 63     fclose(out);
 64 
 65     if((in=fopen("stud.txt","r"))==NULL){
 66         printf("can't open the file.");
 67         exit(1);
 68     }
 69     for(i=0;i<N;i++){
 70         fscanf(in,"%d",&studetns[i].id);
 71         fprintf(stdout,"\nid:%d\ngrades:",studetns[i].id);
 72         for(j=0;j<M;j++){
 73             fscanf(in,"%f",&studetns[i].grades[j]);
 74             fprintf(stdout,"%0.2f ",studetns[i].grades[j]);
 75         }
 76         fscanf(in,"%f",&studetns[i].average);
 77         fprintf(stdout,"\naver=%0.2f\n",studetns[i].average);
 78     }
 79     fclose(in);
 80     if((out=fopen("stud_sort.txt","w+"))==NULL){
 81         printf("Can't open this file.\n");
 82         exit(1);
 83     }
 84     sort(studetns,out);
 85     fclose(out);
 86 
 87     if((in=fopen("stud_sort.txt","r"))==NULL){
 88         printf("Can't open this file.\n");
 89         exit(1);
 90     }
 91     fprintf(stdout,"\n\nstud_sort.txt:\n");
 92     for(i=0;i<N;i++){
 93         fscanf(in,"%d",&studetns[i].id);
 94         fprintf(stdout,"\nid:%d\ngrades:",studetns[i].id);
 95         for(j=0;j<M;j++){
 96             fscanf(in,"%f",&studetns[i].grades[j]);
 97             fprintf(stdout,"%0.2f ",studetns[i].grades[j]);
 98         }
 99         fscanf(in,"%f",&studetns[i].average);
100         fprintf(stdout,"\naver=%0.2f\n",studetns[i].average);
101     }
102     fclose(in);
103     return 0;
104 }

运行结果:

2016540330
90 91 92 93 94
2016540331
100 99 98 90 9
2016540332
100 87 88 98 9
2016540333
98 90 99 97 92
2016540334
98 91 92 89 79
2016540335
90 78 89 67 66
2016540336
32 89 34 22 89
2016540337
28 89 89 89 89
2016540338
89 89 78 78 78
2016540339
89 67 67 67 67

id:2016540330
grades:90.00 91.00 92.00 93.00 94.00
aver=92.00

id:2016540331
grades:100.00 99.00 98.00 90.00 9.00
aver=79.20

id:2016540332
grades:100.00 87.00 88.00 98.00 9.00
aver=76.40

id:2016540333
grades:98.00 90.00 99.00 97.00 92.00
aver=95.20

id:2016540334
grades:98.00 91.00 92.00 89.00 79.00
aver=89.80

id:2016540335
grades:90.00 78.00 89.00 67.00 66.00
aver=78.00

id:2016540336
grades:32.00 89.00 34.00 22.00 89.00
aver=53.20

id:2016540337
grades:28.00 89.00 89.00 89.00 89.00
aver=76.80

id:2016540338
grades:89.00 89.00 78.00 78.00 78.00
aver=82.40

id:2016540339
grades:89.00 67.00 67.00 67.00 67.00
aver=71.40


stud_sort.txt:

id:2016540333
grades:98.00 90.00 99.00 97.00 92.00
aver=95.20

id:2016540330
grades:90.00 91.00 92.00 93.00 94.00
aver=92.00

id:2016540334
grades:98.00 91.00 92.00 89.00 79.00
aver=89.80

id:2016540338
grades:89.00 89.00 78.00 78.00 78.00
aver=82.40

id:2016540331
grades:100.00 99.00 98.00 90.00 9.00
aver=79.20

id:2016540335
grades:90.00 78.00 89.00 67.00 66.00
aver=78.00

id:2016540337
grades:28.00 89.00 89.00 89.00 89.00
aver=76.80

id:2016540332
grades:100.00 87.00 88.00 98.00 9.00
aver=76.40

id:2016540339
grades:89.00 67.00 67.00 67.00 67.00
aver=71.40

id:2016540336
grades:32.00 89.00 34.00 22.00 89.00
aver=53.20

Process returned 0 (0x0) execution time : 4.323 s
Press any key to continue.