代码如下:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define M 20
#define N 3
struct Student
{
int nmb; //学号
char name[20]; //姓名
int score[N]; //N门课程的成绩
};
//录入N门课程的课程名
void InputKecheng(char b[][30])
{
int i;
system("cls");
printf("请输入%d门课程的名称:\n",N);
for (i = 0;i<N;i++)
{
scanf("%s",b[i]);
}
}
//录入学生成绩
struct Student * Inputinfo(struct Student *a,int n)
{
int i,j;
a = (struct Student *)malloc(M*sizeof(struct Student));
printf("输入%d个学生的学号,姓名,%d门课的成绩:\n",n,N);
for (i = 0;i< n;i++)
{
scanf("%d %s",&a[i].nmb,a[i].name);
for(j = 0;j<N;j++)
scanf("%d",&a[i].score[j]);
}
return a;
}
//计算单个学生的平均成绩
float Average(struct Student a)
{
int j;
float avg = 0.0;
for (j = 0;j<N;j++)
{
avg += a.score[j];
}
avg /= N;
return avg;
}
//统计学生的平均成绩
void TongjiAvg(struct Student *a,int n)
{
int i;
system("cls");
printf("学生的平均成绩分别为:\n");
for (i = 0;i<n;i++)
{
printf("%d%20s\t%.2f\n",a[i].nmb,a[i].name,Average(a[i]));
}
}
//统计课程的平均成绩
void TongjiKcAvg(struct Student *a,int n,char b[][30])
{
int i,j;
float avg = 0.0;
system("cls");
printf("%d门课程的平均成绩分别为:\n",N);
for (i = 0;i<N;i++)
{
avg = 0.0;
for (j = 0;j<n;j++)
{
avg += a[j].score[i];
}
avg = avg/n;
printf("%s\t%.2f\n",b[i],avg);
}
}
//按平均分从高到低排序
void Sort(struct Student *a,int n,char b[][30])
{
int i,j;
float avg1,avg2;
struct Student tmp;
char szt[] = "name";
for (i = 0;i< n-1;i++)
{
for (j = 0;j< n-1-i;j++)
{
avg1 = Average(a[j]);
avg2 = Average(a[j+1]);
if(avg1 < avg2)
{
tmp = a[j];
a[j] = a[j+1];
a[j+1] = tmp;
}
}
}
system("cls");
printf("number%10s",szt);
for(i = 0;i<N;i++)
printf("%10s",b[i]);
printf("\taverage\n");
for (i = 0;i<n;i++)
{
avg1 = Average(a[i]);
printf("%d%10s",a[i].nmb,a[i].name);
for(j=0;j<N;j++)
printf("%10d",a[i].score[j]);
printf("\t%.2f\n",avg1);
}
}
//写文件
void WriteFile(struct Student *a,int n,char b[][30],const char* filename)
{
FILE* fp;
int i,j;
char szt[] = "姓名";
if((fp = fopen(filename,"w")) == 0)
{
printf("文件打开失败\n");
return;
}
fprintf(fp,"学号%10s",szt);
for (i =0;i<N;i++)
{
fprintf(fp,"%10s",b[i]);
}
//fprintf(fp,"\taverage"); //这一行是写平均值,如果需要,把注释放开
fprintf(fp,"\n");
for (i=0;i<n;i++)
{
fprintf(fp,"%d%10s",a[i].nmb,a[i].name);
for(j =0;j<N;j++)
fprintf(fp,"%10d",a[i].score[j]);
//fprintf(fp,"\t%.2f",Average(a[i]));//这一行是写平均值,如果需要,把注释放开
fprintf(fp,"\n");
}
fclose(fp);
printf("文件写入完毕\n");
}
int main()
{
struct Student *a = 0;
char kecheng[N][30] = {0};
int n = 0;
int opt = 9;
int bgo = 1;
while(bgo)
{
system("cls");
printf("------------学生管理系统------------\n");
printf("| 1.录入学生信息 |\n");
printf("| 2.统计学生的平均成绩 |\n");
printf("| 3.统计每门课程的平均成绩 |\n");
printf("| 4.按照平均分排序并保存到文件 |\n");
printf("| 9.退出系统 |\n");
printf("------------------------------------\n");
scanf("%d",&opt);
switch(opt)
{
case 1:
InputKecheng(kecheng); //录入课程信息
printf("请输入学生的数量:");
scanf("%d",&n);
a = Inputinfo(a,n);//录入学生信息
WriteFile(a,n,kecheng,"inputdata.txt"); //保存文件
printf("\n按任意键返回上一层菜单\n");
getchar();
getchar();
break;
case 2:
TongjiAvg(a,n); //统计每个学生的平均成绩
printf("\n按任意键返回上一层菜单\n");
getchar();
getchar();
break;
case 3:
TongjiKcAvg(a,n,kecheng); //统计每门课程的平均成绩
printf("\n按任意键返回上一层菜单\n");
getchar();
getchar();
break;
case 4:
Sort(a,n,kecheng);
WriteFile(a,n,kecheng,"outputdata.txt"); //保存文件
printf("\n按任意键返回上一层菜单\n");
getchar();
getchar();
break;
case 9:
bgo = 0;
if(a){free(a);}
break;
}
}
return 0;
}