
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct _STU
{
int no;//学号
char name[20];//姓名
int score[6];//分数
int num;//有多少门课
int sum;//总分
}STU,*PSTU;
void Print_Stu_Info(PSTU stu,int n)
{
int i,j;
float sum;
system("cls");
printf("%-10s%-10s%-24s%-5s%-5s\n","学号","姓名","成绩","总分","平均分");
for(i=0;i<n;i++)
{
printf("%-10d%-10s",stu[i].no,stu[i].name);
for(j=0,sum=0;j<stu[i].num;j++)
{
printf("%-4d",stu[i].score[j]);
}
while(j<6)
{
printf("%-4s","");
j++;
}
printf("%-5d",stu[i].sum);
printf("%-5.2f\n",stu[i].sum*1.0/stu[i].num);
}
system("pause");
}
void Sort_Sum_High_To_Low(PSTU stu,int n)
{
int i,j;
STU temp;
for(i=0;i<n;i++)
{
for(j=i+1;j<n;j++)
{
if(stu[i].sum<stu[j].sum)
{
temp=stu[i];
stu[i]=stu[j];
stu[j]=temp;
}
}
}
system("cls");
printf("%-10s%-10s%-24s%-5s%-8s%-5s\n","学号","姓名","成绩","总分","平均分","名次");
for(i=0;i<n;i++)
{
printf("%-10d%-10s",stu[i].no,stu[i].name);
for(j=0;j<stu[i].num;j++)
{
printf("%-4d",stu[i].score[j]);
}
while(j<6)
{
printf("%-4s","");
j++;
}
printf("%-5d",stu[i].sum);
printf("%-8.2f",stu[i].sum*1.0/stu[i].num);
printf("%-5d\n",i+1);
}
system("pause");
}
void Sort_No_Low_To_High(PSTU stu,int n)
{
int i,j;
STU temp;
for(i=0;i<n;i++)
{
for(j=i+1;j<n;j++)
{
if(stu[i].no>stu[j].no)
{
temp=stu[i];
stu[i]=stu[j];
stu[j]=temp;
}
}
}
Print_Stu_Info(stu,n);
}
void Sort_Name_Low_To_High(PSTU stu,int n)
{
int i,j;
STU temp;
for(i=0;i<n;i++)
{
for(j=i+1;j<n;j++)
{
if(strcmp(stu[i].name,stu[j].name)>0)
{
temp=stu[i];
stu[i]=stu[j];
stu[j]=temp;
}
}
}
Print_Stu_Info(stu,n);
}
int Add_New_Stu(PSTU stu,int n)
{
int i;
system("cls");
printf("输入学号:");
scanf("%d",&stu[n].no);
printf("输入姓名:");
scanf("%s",stu[n].name);
printf("有多少门课:");
scanf("%d",&stu[n].num);
stu[n].sum=0;
for(i=0;i<stu[n].num;i++)
{
printf("第%d门课成绩:",i+1);
scanf("%d",&stu[n].score[i]);
stu[n].sum += stu[n].score[i];
}
printf("录入成功!\n");
system("pause");
return n+1;
}
void Save_Info(PSTU stu,int n)
{
int i;
char path[100];
FILE* pFile;
system("cls");
printf("请输入保存文件路径:");
scanf("%s",path);
pFile= fopen(path,"w+");
if(pFile==NULL)
{
printf("文件保存失败!\n");
system("pause");
return;
}
for(i=0;i<n;i++)
{
fwrite(&stu[i],1,sizeof(STU),pFile);
}
fclose(pFile);
printf("文件保存成功!\n");
system("pause");
}
int Read_Info(PSTU stu)
{
int i=0;
char path[100];
FILE* pFile;
system("cls");
printf("请输入读取文件路径:");
scanf("%s",path);
pFile= fopen(path,"r+");
if(pFile==NULL)
{
printf("文件读取失败!\n");
system("pause");
return 0;
}
while(fread(&stu[i++],1,sizeof(STU),pFile));
fclose(pFile);
printf("文件读取成功!\n");
system("pause");
if(i>=1)
{
return i-1;
}
return 0;
}
int menu()
{
int choice;
system("cls");
printf("1:Read from a file\n");
printf("2:Calculate total and average score of every course\n");
printf("3:Calculate total and average score of every student\n");
printf("4:Sort in descending order by total score of every student\n");
printf("5:Sort in ascending order by number\n");
printf("6:Sort in dictionary order by name\n");
printf("7:Search by number\n");
printf("8:Search by name\n");
printf("9:Statistic analysis for every course\n");
printf("10:List record\n");
printf("11:Write to file\n");
printf("0:Exit\n");
printf("12:测试输入\n");
printf("Please choice:");
scanf("%d",&choice);
while(choice<0||choice>12)
{
printf("Please choice again:");
scanf("%d",&choice);
}
return choice;
}
void Calc_Stu_Sum(PSTU stu,int n)
{
int i;
system("cls");
printf("%-10s%-10s%-5s%-5s\n","学号","姓名","总分","平均分");
for(i=0;i<n;i++)
{
printf("%-10d%-10s",stu[i].no,stu[i].name);
printf("%-5d",stu[i].sum);
printf("%-5.2f\n",1.0*stu[i].sum/stu[i].num);
}
system("pause");
}
void Calc_Course_Sum(PSTU stu,int n)
{
int i,j;
float sum[6]={0};
system("cls");
printf("%-10s%-10s%-5s%-5s\n","学号","姓名","总分","平均分");
for(i=0;i<n;i++)
{
printf("%-10d%-10s",stu[i].no,stu[i].name);
for(j=0;j<stu[i].num;j++)
{
sum[j]+=stu[i].score[j];
}
}
for(i=0;i<stu[i].num;i++)
{
printf("科目%d 总分:%5.0f 平均分:%5.2f\n",i+1,sum[i],sum[i]/n);
}
system("pause");
}
void Search_By_No(PSTU stu,int n)
{
int temp,i;
system("cls");
printf("请输入要查找的学号:");
scanf("%d",&temp);
for(i=0;i<n;i++)
{
if(temp==stu[i].no)
{
Print_Stu_Info(&stu[i],1);
return ;
}
}
printf("无该学号信息!\n");
system("pause");
}
void Search_By_Name(PSTU stu,int n)
{
int i;
char temp[20];
system("cls");
printf("请输入要查找的名字:");
scanf("%s",temp);
for(i=0;i<n;i++)
{
if(!strcmp(temp,stu[i].name))
{
Print_Stu_Info(&stu[i],1);
return ;
}
}
printf("无该姓名信息!\n");
system("pause");
}
void Total_All_info(PSTU stu,int n)
{
int i,j,sum[6][5]={0};
system("cls");
for(i=0;i<n;i++)
{
for(j=0;j<stu[i].num;j++)
{
switch(stu[i].score[j]/10)
{
case 10:
case 9:
sum[j][0]++;
break;
case 8:
sum[j][1]++;
break;
case 7:
sum[j][2]++;
break;
case 6:
sum[j][3]++;
break;
default:
sum[j][4]++;
break;
}
}
}
printf("%-10s%-10s%-10s%-10s%-10s%-10s\n","","优秀","良好","中等","及格","不及格");
for(i=0;i<stu[0].num;i++)
{
printf("科目%-5d",i+1);
for(j=0;j<5;j++)
{
printf(" %-2d %-4.2f%% ",sum[i][j],sum[i][j]*1.0/n*100);
}
printf("\n");
}
system("pause");
}
int main()
{
int choice;
STU stu[30];
int NUM=0;//记录人数
do
{
choice=menu();
switch(choice)
{
case 1:
NUM=Read_Info(stu);
break;
case 2:
Calc_Course_Sum(stu,NUM);
break;
case 3:
Calc_Stu_Sum(stu,NUM);
break;
case 4:
Sort_Sum_High_To_Low(stu,NUM);
break;
case 5:
Sort_No_Low_To_High(stu,NUM);
break;
case 6:
Sort_Name_Low_To_High(stu,NUM);
break;
case 7:
Search_By_No(stu,NUM);
break;
case 8:
Search_By_Name(stu,NUM);
break;
case 9:
Total_All_info(stu,NUM);
break;
case 10:
Print_Stu_Info(stu,NUM);
break;
case 11:
Save_Info(stu,NUM);
break;
case 12:
NUM=Add_New_Stu(stu,NUM);
break;
}
}while(choice!=0);
return 0;
}