学生记录由学号、姓名和五门课的成绩组成,根据班级人数,将学生记录存放在结构体数组中。编程实现学生记录按平均成绩降序排序,输出单科的最高分学生记录将排序后的学生记录保存至文件中。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
typedef struct student{
int num;
char name[10];
int score[5];
int sum;
float avg;
} stu;
void input(stu a[],int n)
{
int i,j;
for(i=0;i<n;i++)
{
scanf_s("%d%s",&a[i].num,a[i].name,10);
for (j=0; j<5; ++j)
scanf_s("%d",&a[i].score[j]);
}
}
void sort(stu a[],int n)
{
int i,j;
for(i=0;i<n-1;i++)
for(j=0;j<n-i-1;j++)
if(a[j].avg < a[j+1].avg)
{
stu t = a[j];
a[j] = a[j+1];
a[j+1] = t;
}
}
void calc(stu a[],int n)
{
int i,j;
for(i=0;i<n;i++)
{
int sum = 0;
for (j=0; j<5; ++j)
{
sum += a[i].score[j];
}
a[i].avg = sum/5.0;
a[i].sum = sum;
}
}
void out(stu a[],int n)
{
int i;
printf(" 学号 姓名 成绩1 成绩2 成绩3 成绩4 成绩5 总成绩 平均成绩\n") ;
for(i=0;i<n;i++)
{
printf("%5d %10s %5d %5d %5d %5d %5d %6d %8.2f\n",a[i].num,a[i].name,a[i].score[0],a[i].score[1],a[i].score[2],a[i].score[3],a[i].score[4],a[i].sum,a[i].avg);
}
}
void maxscore(stu a[],int n)
{
int i,j,max=0;
for(i=0;i<5;i++)
{
max=0;
for(j=0;j<n;j++)
{
if (a[max].score[i]<a[j].score[i])
max = j;
}
printf("成绩%d 单科的最高分学生学号:%d 姓名:%s 总成绩:%d 平均成绩:%.2f\n",i+1,a[max].num,a[max].name,a[max].sum,a[max].avg );
}
}
void save(stu a[],int n)
{
int i;
FILE* fp;
if ((fp = fopen("data.txt", "w")) == NULL)
{
printf("cannot open file\n");
return;
}
fprintf(fp," 学号 姓名 成绩1 成绩2 成绩3 成绩4 成绩5 总成绩 平均成绩\n") ;
for(i=0;i<n;i++)
{
fprintf(fp,"%5d %10s %5d %5d %5d %5d %5d %6d %8.2f\n",a[i].num,a[i].name,a[i].score[0],a[i].score[1],a[i].score[2],a[i].score[3],a[i].score[4],a[i].sum,a[i].avg);
}
fclose(fp);
}
int main()
{
int i,j,k,n;
stu a[100];
scanf_s("%d", &n);
input(a,n);
calc(a,n);
sort(a,n);
out(a,n);
maxscore(a,n);
save(a,n);
return 0;
}