#include<stdio.h>
#include<string>double maxeng=0; //英语最高分
double maxmath=0; //数学最高分
double maxchinese=0; //语文最高分
int engnopasscount=0; //英语不及格人数
int mathnopasscount=0; //数学不及格人数
int chinesenopasscount=0; //语文不及格人数
struct Student
{ char ID[20];
char Name[20];
float Math;
float Chinease;
float English;
float Average;
}stu[1000];
int num=0;
float Avr(struct Student stu)
{
return (stu.Chinease+stu.English+stu.Math)/3;
}
/* 添加学生信息*/
void Student_Add()
{ int t;
do
{printf("请输入学生学号\n");
scanf("%s",&stu[num].ID);
for(t=0;t<num;t++)
if(strcmp(stu[t].ID,stu[num].ID)==0)
{printf("已有此学生,输入失败\n");
return;}
getchar();
printf("请输入学生姓名\n");
scanf("%s",&stu[num].Name);
getchar();
printf("请输入学生数学成绩\n");
scanf("%f",&stu[num].Math);
getchar();
printf("请输入学生语文成绩\n");
scanf("%f",&stu[num].Chinease);
getchar();
printf("请输入学生英语成绩\n");
scanf("%f",&stu[num].English);
getchar();
stu[num].Average=Avr(stu[num]);
num++;
puts("continue?(y/n)");
}while(getchar()=='y');
}
/*学生单人成绩信息*/
void Student_Information(int index)
{ printf("%10s%10s%8s%8s%8s%10s\n","学号","姓名","数学成绩","语文成绩","英语成绩","平均成绩");
printf("--------------------------\n");
printf("%10s%10s%8.2f%8.2f%8.2f%10.2f\n",stu[index].ID,stu[index].Name,stu[index].Math,stu[index].Chinease,stu[index].English,stu[index].Average);
}
/*通过学号返回数组下标*/
int Student_SearchByIndex(char id[])
{
int i;
for(i=0;i<=num;i++)
{
if (strcmp(stu[i].ID,id)==0)
{
return i;
}
}
return -1;
}
/*通过名字返回数组下标*/
int Student_SearchByName(char name[])
{
int i;
for (i=0;i<num;i++)
{
if (strcmp(stu[i].Name,name)==0)
{
return i;
}
}
return -1;
}
/*修改学生信息*/
void Student_Modify(void)
{ do
{int index;
char id[20];
printf("请输入要修改的学生的学号");
scanf("%s",&id);
getchar();
index=Student_SearchByIndex(id);
if(index==-1)
printf("没有这个学生\n");
else
{ printf("这个学生的信息\n");
Student_Information(index);
printf("-------请输入新值--------\n");
printf("请输入学生学号\n");
scanf("%s",&stu[index].ID);
getchar();
printf("请输入学生姓名\n");
scanf("%s",&stu[index].Name);
getchar();
printf("请输入学生数学成绩\n");
scanf("%f",&stu[index].Math);
getchar();
printf("请输入学生语文成绩\n");
scanf("%f",&stu[index].Chinease);
getchar();
printf("请输入学生英语成绩\n");
scanf("%f",&stu[index].English);
getchar();
stu[index].Average=Avr(stu[index]);
}
puts("continue?(y/n)");
}while(getchar()=='y');
}
/*删除学生信息*/
void Student_Delete()
{
int i;
do
{
char id[20];
int index;
printf("请输入要删除的学生的学号:");
scanf("%s",&id);
getchar();
index=Student_SearchByIndex(id);
if (index==-1)
{
printf("学生不存在!/n");
}
else
{
printf("你要删除的学生信息为:\n");
Student_Information(index);
printf("是否真的要删除?(y/n)");
if (getchar()=='y')
{
for (i=index;i<num;i++)
{
stu[i]=stu[i+1];
}
num--;
}
getchar();
}
puts("continue?(y/n)");
}while(getchar()=='y');
}
//插入学生信息
void Student_Insert(void)
{
do
{int snum,i;
printf("请输入您想放入的位置:");
scanf("%d",&snum);
for(i=snum-1;i<=num;i++)
{ stu[i+1]=stu[i];
}
printf("请输入学生学号\n");
scanf("%s",&stu[snum].ID);
getchar();
printf("请输入学生姓名\n");
scanf("%s",&stu[snum].Name);
getchar();
printf("请输入学生数学成绩\n");
scanf("%f",&stu[snum].Math);
getchar();
printf("请输入学生语文成绩\n");
scanf("%f",&stu[snum].Chinease);
getchar();
printf("请输入学生英语成绩\n");
scanf("%f",&stu[snum].English);
getchar();
stu[snum].Average=Avr(stu[snum]);
puts("continue?(y/n)");
}while(getchar()=='y');
}
/*通过姓名查找学生信息*/
void Student_Select(void)
{
do
{
char name[20];
int index;
printf("请输入要查询的学生的姓名:");
scanf("%s",&name);
getchar();
index=Student_SearchByName(name);
if (index==-1)
{
printf("学生不存在!/n");
}
else
{
printf("你要查询的学生信息为:/n");
Student_Information(index);
}
puts("continue?(y/n)");
}while(getchar()=='y');
}
/*按平均值排序*/
void Student_SortByAverage(void)
{int i,j;
struct Student t;
for(i=0;i<=num;i++)
for(j=i+1;j<=num;j++)
if(stu[i].Average<stu[j].Average)
{
t=stu[i];
stu[i]=stu[j];
stu[j]=t;
}
}
/*输出所有学生的成绩*/
void Student_GradeOutput(void)
{ int i;
printf("%10s%10s\t%8s\t%8s\t%8s\t%10s\n","学号","姓名","数学成绩","语文成绩","英语成绩","平均成绩");
printf("--------------------------\n");
for(i=0;i<num;i++)
printf("%10s%10s\t%8.2f\t%8.2f\t%8.2f\t%10.2f\n",stu[i].ID,stu[i].Name,stu[i].Math,stu[i].Chinease,stu[i].English,stu[i].Average);
}
void scoremax(int i)
{if(stu[i].Math>maxmath) maxmath=stu[i].Math;
if(stu[i].Chinease>maxchinese) maxchinese=stu[i].Chinease;
if(stu[i].English>maxeng) maxeng=stu[i].English;
}
void scoremaxandnopasscount()
{int i;
for(i=0;i<num;i++)
{if(stu[i].Math<60) mathnopasscount++;
if(stu[i].English<60) engnopasscount++;
if(stu[i].Chinease<60) chinesenopasscount++;
scoremax(i);
}
printf("数学挂科人数:%d\t英语挂科人数:%d\t语文挂科人数:%d\n",mathnopasscount,engnopasscount,chinesenopasscount);
printf("各科最高成绩\n数学:%f\n英语:%f\n语文:%f\n",maxmath,maxeng,maxchinese);
}
void IO_ReadInfo()
{
FILE *fp;
int i;
if ((fp=fopen("Database.txt","r"))==NULL)
{
printf("不能打开文件!\n");
return;
}
if (fread(&num,sizeof(int),1,fp)!=1)
{
return;
}
else
{
for(i=0;i<num;i++)
{
fread(&stu[i],sizeof(struct Student),1,fp);
}
}
fclose(fp);
}
/*将学生信息写入文件*/
void IO_WriteInfo()
{
FILE *fp;
int i;
if ((fp=fopen("Database.txt","w"))==NULL)
{
printf("不能打开文件!\n");
return;
}
if (fwrite(&num,sizeof(int),1,fp)!=1)
{
printf("写入文件错误!\n");
}
for (i=0;i<num;i++)
{
if (fwrite(&stu[i],sizeof(struct Student),1,fp)!=1)
{
printf("写入文件错误!\n");
}
}
fclose(fp);
}
main()
{ int choice;
IO_ReadInfo();
while(1)
{
/*主菜单*/
printf("-------- 学生成绩管理系统------\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("请选择(1-9):");
scanf("%d",&choice);
getchar();
switch(choice)
{
case 1:
Student_Add();
break;
case 2:
Student_Modify();
break;
case 3:
Student_Delete();
break;
case 4:
Student_Insert();
break;
case 5:Student_Select();
break;
case 6: Student_SortByAverage();
Student_GradeOutput();
break;
case 7:Student_GradeOutput();break;
case 8: scoremaxandnopasscount();break;
case 9: return 0;break;
default: printf("请输入规定范围内的数字\n");break;
}
IO_WriteInfo();
}
}