#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char obj[][20]={"语文","英语","数学"};
typedef struct _Stu
{
int term;//学期
char class_num[10];//班级
char num[20];//学号
int score[3];//成绩
char name[20];//姓名
int sum;//总分
}STU,*PSTU;
//显示学生信息
void Display(PSTU stu,int n)
{
int i,j;
printf("%-10s%-10s%-10s%-10s%-10s%-10s%-10s%-10s\n","班级","学号","姓名",obj[0],obj[1],obj[2],"总分","平均分");
for(i=0;i<n;i++)
{
printf("%-10s",stu[i].class_num);
printf("%-10s",stu[i].num);
printf("%-10s",stu[i].name);
for(j=0;j<3;j++)//依次输出语数英成绩
{
printf("%-10d",stu[i].score[j]);
}
printf("%-10d",stu[i].sum);
printf("%-10.2f\n",stu[i].sum/3.0);
}
}
void Total_Obj(PSTU stu,int n)//统计不及格科目
{
int choice,i;
system("cls");
printf("请选择要统计的科目:\n");
printf("1:语文 2:数学 3:英语\n");
scanf("%d",&choice);
if(choice<=3&&choice>=1)
{
choice--;//把选择变成对应下标
}
else
{
printf("选择错误!\n");
system("pause");
return ;
}
printf("%-10s%-10s%-10s%-10s\n","班级","学号","姓名",obj[choice]);
for(i=0;i<n;i++)
{
if(stu[i].score[choice]<60)//如果分数低于60分 不及格
{
printf("%-10d",stu[i].class_num);
printf("%-10d",stu[i].num);
printf("%-10s",stu[i].name);
printf("%-10d\n",stu[i].score[choice]);
}
}
system("pause");
}
void Modify_Info(PSTU stu,int n)//修改成绩信息
{
int i,j;
char no[20];
system("cls");
printf("请输入要修改的学生学号:");
scanf("%s",no);
for(i=0;i<n;i++)
{
if(!strcmp(no,stu[i].num))
{
break;
}
}
if(i==n)//遍历数组没找到
{
printf("无该学生信息!\n");
system("pause");
return ;
}
Display(&stu[i],1);//找到后显示
stu[i].sum=0;
for(j=0;j<3;j++)
{
printf("请输入%s成绩:",obj[j]);
scanf("%d",&stu[i].score[j]);
stu[i].sum+=stu[i].score[j];
}
printf("修改成功!\n");
system("pause");
}
//添加新的信息
int Add_New_Info(PSTU stu,int n)
{
int i;
system("cls");
printf("请输入当前学期:");
scanf("%d",&stu[n].term);
printf("请输入班级:");
scanf("%s",&stu[n].class_num);
printf("请输入学号:");
scanf("%s",&stu[n].num);
printf("请输入姓名:");
scanf("%s",&stu[n].name);
stu[n].sum=0;//记录总分
for(i=0;i<3;i++)
{
printf("请输入%s成绩:",obj[i]);
scanf("%d",&stu[n].score[i]);
stu[n].sum+=stu[n].score[i];
}
printf("\n录入成功!\n");
system("pause");
return n+1;
}
//保存信息
void Save_Info(PSTU stu,int n)
{
int i;
FILE* pFile;
pFile= fopen("stu.dat","w+");
if(pFile==NULL)
{
return;
}
for(i=0;i<n;i++)
{
fwrite(&stu[i],1,sizeof(STU),pFile);
}
fclose(pFile);
}
//读取信息
int Read_Info(PSTU stu)
{
int i=0;
FILE* pFile;
pFile= fopen("stu.dat","r+");
if(pFile==NULL)
{
return 0;
}
while(fread(&stu[i++],1,sizeof(STU),pFile));
fclose(pFile);
if(i>=1)
{
return i-1;
}
return 0;
}
int menu()
{
int choice;
system("cls");
printf("1:录入学生信息\n");
printf("2:修改学生信息\n");
printf("3:统计学生成绩\n");
printf("4:根据学号查询\n");
printf("5:根据科目统计\n");
printf("6:根据班级显示\n");
printf("0:退出\n");
printf("请输入选择:");
scanf("%d",&choice);
while(choice<0||choice>6)//确保没有超出范围
{
printf("请重新输入选择:");
scanf("%d",&choice);
}
return choice;
}
void Search_Class(PSTU stu,int n)
{
int i;
char no[20];
system("cls");
printf("请输入要查找的班级:");
scanf("%s",no);
for(i=0;i<n;i++)//根据班级号查找
{
if(!strcmp(no,stu[i].class_num))
{
Display(&stu[i],1);
}
}
system("pause");
}
void Search_Info(PSTU stu,int n)
{
int i;
char no[20];
system("cls");
printf("请输入要查找的学号:");
scanf("%d",no);
for(i=0;i<n;i++)//根据学号查找
{
if(!strcmp(no,stu[i].num))
{
Display(&stu[i],1);
}
}
system("pause");
}
void Sort(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;
}
}
}
}
int main()
{
STU stu[100];
int NUM=0;
int choice;
NUM=Read_Info(stu);//加载文件
do
{
choice=menu();
switch(choice)
{
case 1:
NUM=Add_New_Info(stu,NUM);
break;
case 2:
Modify_Info(stu,NUM);
break;
case 3:
system("cls");
Sort(stu,NUM);
Display(stu,NUM);
system("pause");
break;
case 4:
Search_Info(stu,NUM);
break;
case 5:
Total_Obj(stu,NUM);
break;
case 6:
Search_Class(stu,NUM);
break;
}
}while(choice!=0);
Save_Info(stu,NUM);//保存文件
return 0;
}