#include
#include
#include
#include
#include
#define N 10000
typedef struct student
{
char ID[20]; // 学号
char name[20]; // 姓名
char sex; // 性别
double score[3]; // 三科成绩
double total; // 总分
double avg; // 平均分
}STUDENT;
void memu(void);
void load(STUDENT stu[],int *nptr); // 将学生信息加载到数组stu中
void save(STUDENT stu[],int n); // 将学生信息保存在磁盘中
void add(STUDENT stu[],int *nptr); // 添加学生信息
void output(STUDENT stu[],int n); // 输出所有学生信息
void InputRecord(STUDENT stu[],int i);// 添加第n+1个学生的信息
void PrintRecord(STUDENT *sptr); // 输出指针sptr所指记录的内容
void edit(STUDENT stu[],int n); // 修改学生信息
void statis(STUDENT stu[], int n);
void del(STUDENT stu[],int *nPtr); // 删除学生信息
int main()
{
int select;
int n;
STUDENT stu[N];
load(stu,&n);
while(1)
{
memu();
scanf("%d",&select);
switch(select)
{
case 1: // 录入学生成绩
add(stu,&n);
break;
case 2: // 显示学生信息
output(stu, n);
break;
case 3: // 修改学生信息
edit(stu,n);
break;
case 4: // 删除学生信息
del(stu,&n);
break;
case 5: // 查找学生信息
break;
case 6:
statis(stu, n); // 统计个科目最高分
break;
case 7: // 按总分顺序排序
break;
case 0: // 退出系统
break;
default:
printf("你输入的有误,请重新输入");
break;
}
}
}
void memu(void)
{
system("cls");
printf(" 欢迎使用高校学生管理系统 ");
printf("\t\t 菜单 \n");
printf("\t\t1.录入学生的成绩\n");
printf("\t\t2.显示学生信息\n");
printf("\t\t3.修改学生信息\n");
printf("\t\t4.删除学生信息\n");
printf("\t\t5.查找学生信息\n");
printf("\t\t6.统计各科目最高分、平均分和不及格人数\n");
printf("\t\t7.按总分排序\n");
printf("\t\t0.退出系统\n");
}
//将学生信息加载到数组stu中
void load(STUDENT stu[],int *nptr)
{
FILE *fp; //定义文件指针
int i;
if((fp=fopen("D:\\student.txt","r"))==NULL)
{
*nptr=0;
return ;
}
for(i=0; fread(&stu[i],sizeof(STUDENT),1,fp)!=0; i++)
{
*nptr=i; //*nptr记录文件中当前学生数量
}
fclose(fp); //关闭文件
}
//将学生信息保存在磁盘中
void save(STUDENT stu[],int n)
{
FILE *fp; //定义文件指针
if((fp=fopen("D:\\student.txt","w"))==NULL) //
{
printf("打开文件失败\n");
exit(0);
}
fwrite(stu,n*sizeof(stu[0]),1,fp);
fclose(fp); //关闭文件
}
//添加学生信息
void add(STUDENT stu[],int *nptr)
{
int i=0;
char sel = 'Y';
while(sel=='Y')
{
InputRecord(stu,(*nptr)++); //添加第n+1个学生的信息
printf("if you want stop ? yes(Y) or no(N)\n");
scanf(" %c",&sel);
}
save(stu,*nptr);
}
//输入一个学生信息,存到score[i]中
void InputRecord(STUDENT stu[],int i)
{
int j;
//输入学号,并验证合法性
printf("输入第%d个学生的信息\n",i+1);
printf("输入学生学号(学号小于9位数字组成)\n");
scanf("%s",&stu[i].ID);
printf("请输入学生姓名\n");
scanf("%s",stu[i].name);
printf("请输入学生性别(f或m f代表女性 m代表男性)\n");
scanf(" %c",&stu[i].sex);
//输入五门课成绩并累加
printf("输入三门课成绩(0~100)\n");
stu[i].total=0;
for(j=0;j<3;j++)
{
scanf("%lf",&stu[i].score[j]);
stu[i].total+=stu[i].score[j];
}
//计算总成绩
stu[i].avg=stu[i].total/3;
}
//输出所有学生信息
void output(STUDENT stu[],int n)
{
int i;
//打印表头
printf("%8s%8s%4s%8s%8s%8s%8s%8s%8s%8s\n","ID","NAME","SEX",
"SCORE1","SCORE2","SCORE3","SCORE4","SCORE5","total","avg");
//打印所有记录
for(i=0;i<n;i++)
{
PrintRecord(&stu[i]);
}
system("pause");
}
//输出指针sptr所指记录的内容
void PrintRecord(STUDENT *sptr)
{
int i;
printf("%8s%8s%4c",sptr->ID,sptr->name,sptr->sex);
for(i=0;i<3;i++)
{
printf("%8.2f",sptr->score[i]);
}
printf("%8.2f%8.2f",sptr->total,sptr->avg);
printf("\n");
}
void edit(STUDENT stu[],int n)
{
int i,index;
char sel;
char str[20];
printf("输入学号");
scanf("%s",str);
index=FindByNum(stu,n,str);
if(index<0)
{
printf("该学生信息不存在\n"); //信息不存在的情况
return;
}
printf("请输入需更改的项目\n1.姓名\n2.性别\n3.科目成绩\n4.总成绩\n5.平均成绩/n(输入序号即可)\n");
int a; //菜单栏
scanf("%d",&a);
switch(a)
{
case 1:
printf("修改前的姓名如下:\n"); //修改姓名
PrintRecord(&stu[index]);
printf("请输入修改后的姓名:\n");
scanf("%s",stu[index].name);
case 2:
printf("修改前的性别如下:\n"); //修改性别
PrintRecord(&stu[index]);
printf("请输入修改后的性别:\n");
scanf("%s",stu[index].sex);
case 3:
printf("修改前的科目成绩如下:\n"); //修改科目成绩
PrintRecord(&stu[index]);
printf("请输入修改后的科目成绩:\n");
scanf("%s",stu[index].score);
case 4:
printf("修改前的总成绩如下:\n"); //修改总成绩
PrintRecord(&stu[index]);
printf("请输入修改后的总成绩:\n");
scanf("%s",stu[index].total);
case 5:
printf("修改前的平均成绩如下:\n"); //修改平均成绩
PrintRecord(&stu[index]);
printf("请输入修改后的平均成绩:\n");
scanf("%s",stu[index].avg);
}
save(stu,n);
}
int FindByNum(STUDENT stu[],int n,char *str)
{
int i;
for(i=0;i<n;i++)
if(strcmp( stu[i].ID,str)==0)
return i;
return -1;
}
void statis(STUDENT stu[], int n)
{
int i, fail;//“stu[]”为学生 “score[]”为成绩 “n”为人数 max为最高分数 fail 为不及格人数 sum为50人总分
double score[3], max, sum, avg;//“avg”为平均分
avg = 0;
max = 0;
fail = 0;
sum = 0;
for(i = 0; i < n; i++)
{
sum += stu[i].score[0];
avg = sum/n;
if(max < stu[i].score[0])
max = stu[i].score[0];
if(stu[i].score[0] < 60)
fail++;
}
printf("C语言最高分=%.2f\n",max);
printf("C语言不及格人数=%d\n",fail);
printf("C语言平均分=%.2f\n",avg);
fail = 0;
sum = 0;
max = 0;
for(i = 0; i < n; i++)
{
sum += stu[i].score[1];
avg = sum/n;
if(max < stu[i].score[1])
max = stu[i].score[1];
if(stu[i].score[1] < 60)
fail++;
}
printf("英语最高分=%.2f\n",max);
printf("英语不及格人数=%d\n",fail);
printf("英语平均分=%.2f\n",avg);
fail = 0;
sum = 0;
max = 0;
for(i = 0; i < n; i++)
{
sum += stu[i].score[2];
avg = sum/n;
if(max < stu[i].score[2])
max = stu[i].score[2];
if(stu[i].score[2] < 60)
fail++;
}
printf("数学最高分=%.2f\n",max);
printf("数学不及格人数=%d\n",fail);
printf("数学平均分=%.2f\n",avg);
system("pause");
fail = 0;
sum = 0;
max = 0;
}
// 删除学生信息
void del(STUDENT stu[],int *nPtr)
{
int i,index;
char str[20];
printf("请你输入学号");
scanf("%s",str);
index = FindByNum(stu,*nPtr,str);
if(index<0)
{
printf("\n 亲,不好意思,你所选的学生信息不存在\n");
system("pause");
return ;
}
for (i = index; i < *nPtr-1;i++)
stu[i] = stu[i+1];
(*nPtr)--;
printf("\n 恭喜恭喜 删除成功 \n");
system("pause");
save(stu,*nPtr); // 保存到文件中
}