#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LEN 10 //字符串最大长度
#define STU_NUM 30 /*最多的学生人数*/
#define COURSE_NUM 6
typedef struct student
{
long num; //每个学生的学号
char name[MAX_LEN]; //每个学生的姓名
float score[COURSE_NUM];//每个学生COURSE_NUM门功课的成绩
float sum; //每个学生的总成绩
float aver; //每个学生的平均成绩
}STU;
int Menu(void); /*Menu()函数原型,功能是显示菜单*/
void ReadScore(STU stu[], int n,int m); /*ReadScore()函数原型,功能是输入n个学生某门课程的成绩*/
void AverSumofEveryStudent(STU stu[], int n,int m); /*AverSumofscore()是函数原型,功能是计算全班的总分和平均分*/
void AverSumofEveryCourse(STU stu[], int n,int m);
void SortbyScore(STU stu[], int n,int m,int(*compare)(float a,float b)); //SortbyScore()是函数原型,功能是按选择法将数组score的元素值排序
int Ascending(float a, float b); //Ascending()是函数原型,功能是使数据按升序排序
int Descending(float a, float b); //Descending()是函数原型,功能是使数据按降序排序
void SwapFloat(float *x, float *y); //SwapFloat()是函数原型,功能是交换两个单精度浮点型数据
void SwapLong(long *x, long *y); // SwapLong()是函数原型,功能是交换两个长整形数据
void SwapChar(char x[], char y[]); // SwapChar()是函数原型,功能是交换两个字符型数据
void AsSortbyNum(STU stu[], int n,int m); /*AsSortbyNum()是函数原型,功能是按选择法将数组num的元素按从小到大排序*/
void SortbyName(STU stu[], int n,int m); //按姓名排序函数原型
void SearchbyNum(STU stu[], int n,int m); /*SearchbyNum ()是函数原型,功能是按学号查找学生成绩并显示查找结果*/
void SearchbyName(STU stu[], int n,int m); /*SearchbyName()是函数原型,功能是按名字查找学生成绩并显示查找结果*/
void StatisticAnalysis(STU stu[], int n,int m); /*StatisticAnalysis()是函数原型,功能是统计各分数段的学生人数及所占百分比*/
void PrintScore(STU stu[], int n,int m); /*打印学生成绩*/
void WritetoFile(STU record[],int n,int m); /*输出n个学生的学号、姓名及m门课程的成绩到文件"student.txt"*/
void ReadfromFile(STU record[],int *n,int *m); //从文件中读取学生的学号、姓名及成绩等信息写入到结构体数组stu中
int main()
{
char ch;
int n = 0, m = 0;
STU stu[STU_NUM];
while (1)
{
ch = Menu();
switch (ch)
{
case 1: printf("请输入学生人数n(n<=%d):", STU_NUM);
scanf("%d", &n);
printf("请输入课程数m(m<=%d):",COURSE_NUM);
scanf("%d", &m);
ReadScore(stu, n, m);
break;
case 2: AverSumofEveryCourse(stu, n, m);
break;
case 3: AverSumofEveryStudent(stu, n, m);
break;
case 4: SortbyScore(stu, n, m, Descending);
printf("\n成绩按降序排序结果:\n");
PrintScore(stu, n, m);
break;
case 5: SortbyScore(stu, n, m, Ascending);
printf("\n成绩按升序排序结果:\n");
PrintScore(stu, n, m);
break;
case 6: AsSortbyNum(stu, n, m);
printf("\n成绩按学号升序排序结果:\n");
PrintScore(stu, n, m);
break;
case 7: SortbyName(stu, n, m);
printf("\n成绩按姓名字典顺序排序结果:\n");
PrintScore(stu, n, m);
break;
case 8: SearchbyNum(stu, n, m);
break;
case 9: SearchbyName(stu, n, m);
break;
case 10: StatisticAnalysis(stu, n, m);
break;
case 11:PrintScore(stu, n, m);
break;
case 12:WritetoFile(stu, n, m);
break;
case 13:ReadfromFile(stu,&n,&m);
printf("学生成绩信息如下:\n");
PrintScore(stu, n, m);
break;
case 0: printf("程序结束!\n");
exit(0);
default:printf("输入菜单序号错误!");
}
}
return 0;
}
/*函数功能:显示菜单并获得用户键盘输入的选项*/
int Menu(void)
{
int itemSelected; /*整型变量itemSelected为菜单选项*/
printf("\n学生成绩管理系统\n");
printf("1.输入学生成绩\n");
printf("2.计算每门课程总分和平均分\n");
printf("3.计算每个学生各门课程总分和平均分\n");
printf("4.按成绩降序排序\n");
printf("5.按成绩升序排序\n");
printf("6.按学号升序排序\n");
printf("7.按姓名字典顺序\n");
printf("8.按学号查询学生成绩\n");
printf("9.按姓名查询成绩\n");
printf("10.统计分析\n");
printf("11.成绩列表\n");
printf("12.向文件写数据\n");
printf("13.从文件读数据\n");
printf("0.退出\n");
printf("\n请输入你的选择:");
scanf("%d",&itemSelected); //读入用户输入
return itemSelected;
}
/*函数功能:输入n个学生的某门成绩*/
void ReadScore(STU stu[], int n, int m)
{
int i, j;
printf("请顺序输入每个学生的学号、姓名和成绩:\n");
printf("学号\t\t姓名");
for (j=0; j<m; j++)
{
printf("\t课程%d ", j+1);
}
printf("\n");
for (i=0; i<n; i++)
{
scanf("%ld%s", &stu[i].num, stu[i].name);
for (j=0; j<m; j++)
{
scanf("%f", &stu[i].score[j]);
}
}
}
/*函数功能:计算每个学生各门课程总分和平均分*/
void AverSumofEveryStudent(STU stu[], int n, int m)
{
int i, j;
for (i=0; i<n; i++)
{
stu[i].sum = 0;
for (j=0; j<m; j++)
{
stu[i].sum = stu[i].sum + stu[i].score[j];
}
stu[i].aver = m>0 ? stu[i].sum / m : -1;
printf("学生%d:总分 = %.0f,平均分 = %.0f\n",i+1, stu[i].sum, stu[i].aver);
}
}
/*函数功能:计算每门课程的总分和平均分*/
void AverSumofEveryCourse(STU stu[], int n, int m)
{
int i, j;
float sum[COURSE_NUM], aver[COURSE_NUM];
for (j=0; j<m; j++)
{
sum[j] = 0;
for (i=0; i<n; i++)
{
sum[j] = sum[j] + stu[i].score[j];
}
aver[j] = n>0 ? sum[j] / n : -1;
printf("课程%d:总分=%.0f,平均分=%.0f\n", j+1,sum[j],aver[j]);
}
}
/*函数功能:按选择法将数组score的元素值从高到低排列*/
void SortbyScore(STU stu[], int n, int m, int (*compare)(float a, float b))
{
int i, j, k, t;
for (i=0; i<n-1; i++)
{
k = i;
for (j=i+1; j<n; j++)
{
if ((*compare)(stu[j].sum, stu[k].sum)) k = j;
}
if (k != i)
{
for(t=0; t<m; t++)
{
SwapFloat(&stu[k].score[t], &stu[i].score[t]);
}
SwapFloat(&stu[k].sum, &stu[i].sum);
SwapFloat(&stu[k].aver, &stu[i].aver);
SwapLong(&stu[k].num, &stu[i].num);
SwapChar(stu[k].name, stu[i].name);
}
}
}
//使函数按升序排序
int Ascending(float a,float b)
{
return a<b;
}
//使函数按降序排序
int Descending(float a,float b)
{
return a>b;
}
//函数功能:交换两个单精度浮点型数据
void SwapFloat(float *x,float *y)
{
float temp;
temp = *x;
*x = *y;
*y = temp;
}
//函数功能:交换两个长整形数据
void SwapLong(long *x,long *y)
{
long temp;
temp = *x;
*x = *y;
*y = temp;
}
/*交换两个字符串*/
void SwapChar(char x[],char y[])
{
char temp[MAX_LEN];
strcpy(temp,x);
strcpy(x,y);
strcpy(y,temp);
}
/*函数功能:按选择法将数组num的元素从高到低排序*/
void AsSortbyNum(STU stu[], int n, int m)
{
int i, j, k, t;
for (i=0; i<n-1; i++)
{
k = i;
for (j=i+1; j<n; j++)
{
if (stu[j].num < stu[k].num)
k = j;
}
if (k != i)
{
for (t=0; t<m; t++)
{
SwapFloat(&stu[k].score[t], &stu[i].score[t]);
}
SwapFloat(&stu[k].sum, &stu[i].sum);
SwapFloat(&stu[k].aver, &stu[i].aver);
SwapLong(&stu[k].num, &stu[i].num);
SwapChar(stu[k].name, stu[i].name);
}
}
}
/*函数功能:交换法实现字符串按字典顺序排序*/
void SortbyName(STU stu[], int n, int m)
{
int i, j, t;
for (i=0; i<n-1; i++)
{
for (j = i+1; j<n; j++)
{
if (strcmp(stu[j].name, stu[i].name) < 0)
{
for (t=0; t<m; t++)
{
SwapFloat(&stu[i].score[t], &stu[j].score[t]);
}
SwapFloat(&stu[i].sum, &stu[j].sum);
SwapFloat(&stu[i].aver, &stu[j].aver);
SwapLong(&stu[i].num, &stu[j].num);
SwapChar(stu[i].name, stu[j].name);
}
}
}
}
/*函数功能:按学号查找学生成绩并显示查找结果*/
void SearchbyNum(STU stu[], int n, int m)
{
long number;
int i, j;
printf("请输入要查询的学生学号:");
scanf("%ld", &number);
printf("学号\t\t姓名\t");
for (j=0; j<m; j++)
{
printf("课程%d\t", j+1);
}
printf("总分\t平均分\n");
for (i=0; i<n; i++)
{
if (stu[i].num == number)
{
pr