学生成绩管理系统.docx
《学生成绩管理系统.docx》由会员分享,可在线阅读,更多相关《学生成绩管理系统.docx(25页珍藏版)》请在冰豆网上搜索。
学生成绩管理系统
/*学生成绩管理主要要求:
(1)能按学期、按班级完成对学生成绩的录入、修改
(2)能按班级统计学生的成绩,求学生的总分及平均分,并能根据学生的平均成绩进行排序
(3)能查询学生成绩,不及格科目及学生名单
(4)能按班级输出学生的成绩单
(5)系统以菜单方式工作
*/
/*
思路:
学生成绩包括主要包括3门成绩数学,英语,C语言,以及学生本人的信息:
即姓名以及班级号,同时需要用学期来定义每学期的成绩。
于是可以
定义结构体来实现上述信息。
采用模块化程序设计思想,按照题目要求,对功能模块进行划分,
设计多个函数分别实现各个功能,减少交叉使用,便于功能的实现和编程调试实现。
主要功能有:
voidPrint(char*File)//在屏幕上输出文件中的信息
voidInsert(char*File)//实现插入某个学生相关信息的功能
voidLuru(char*File)//实现对学生成绩的录入功能,并完成计算总分,和平均分的功能
voidDelete(char*File)//实现删除学生相关信息的功能
voidModify(char*File)//修改学生的信息
voidSearch_number(char*File)//按学号查找学生成绩
voidSearch_Fail(char*File)//查找出不及格学生的成绩
voidexport_class(char*File)//按班级输出学生信息
voidmain()//调用其他函数,实现各个功能选择
intIsEmpty(FILE*fp)//判断文件是否为空文件
voidPrintMenu()//输出修改选项菜单
voidMenu()//输出主程序选择菜单
voidSort(char*File)//按成绩由小到大排序并输出
*/
#include"stdio.h"
#include"malloc.h"
#include"string.h"
#include"stdlib.h"
#include"conio.h"
#defineN20
//函数的声明
voidPrintMenu();
voidPrint(char*File);
voidInsert(char*File);
voidLuru(char*File);
intIsEmpty(FILE*fp);
voidSort(char*File);
typedefstructstudent//定义结构体,记录学生信息
{
intterm[6];
longxuehao;
intClass[3];
charname[N];
floatscore[3];
doubleaverage;
floatsum;
}stu;//使用stu代表structstudent结构类型
voidPrint(char*File)//在屏幕上输出文件中的信息
{
stutemp;
FILE*fp=fopen(File,"r");
if(fp==NULL)
{
printf("打开文件%s失败!
\n",File);
return;
}
fseek(fp,0,SEEK_SET);//从文件开始读取
printf("学号姓名高数英语C语言平均分总分:
\n");
while(fread(&temp,sizeof(stu),1,fp))
printf("%10d%10s%10.2f%10.2f%10.2f%10.2lf%10.2f\n",temp.xuehao,temp.name,temp.score[0],temp.score[1],temp.score[2],temp.average,temp.sum);
printf("\n");
fclose(fp);
}
//实现排序功能
voidSort(char*File)
{
inti,j,k,len;
stus[N],temp;
FILE*fp=fopen(File,"r");
if(fp==NULL)
{
printf("文件打开失败!
");
return;
}
if(IsEmpty(fp))
{
printf("文件为空,不需要排名,请先录入信息!
");
return;
}
fseek(fp,0,SEEK_END);
len=ftell(fp)/sizeof(stu);
fseek(fp,0,SEEK_SET);
for(i=0;ifread(s+i,sizeof(stu),1,fp);
fclose(fp);
for(i=0;i{
k=i;
for(j=i+1;jif(s[j].average
k=j;
if(k!
=i)
{
temp=s[i];
s[i]=s[k];
s[k]=temp;
}
}
printf("以下是按学生平均成绩排序的学生信息:
\n");
printf("学号姓名高数英语C语言\n");
for(i=0;i{
printf("%10d%10s%10.2f%10.2f%10.2f%10.2lf%10.2f\n",
s[i].xuehao,s[i].name,s[i].score[0],s[i].score[1],s[i].score[2],s[i].average,s[i].sum);
}
remove("学生成绩管理");
fp=fopen(File,"w");
for(i=0;ifwrite(s+i,sizeof(stu),1,fp);
fclose(fp);
}
voidInsert(char*File)//实现插入某个学生相关信息的功能
{
intcount;
inti;
intm;
stutemp,temp1;
FILE*fp=fopen(File,"a+");//以追加的方式打开
if(fp==NULL)
{
printf("打开文件%s失败!
\n",File);
return;
}
printf("您本次要插入几名学生的信息\n");
scanf("%d",&count);
for(i=0;i{
printf("您现在录入的是第%d名学生的信息\n",i+1);
Repeat:
printf("请输入学号:
\n");
m=scanf("%d",&temp.xuehao);
if(m==0)
{
printf("您输入的学号有误\n");
fflush(stdin);//清除文件缓冲区
gotoRepeat;
}
fseek(fp,0,SEEK_SET);
while(fread(&temp1,sizeof(stu),1,fp))
{
if(temp1.xuehao==temp.xuehao)
{
printf("该学生的学号已经存在\n");
gotoRepeat;
}
}
printf("请输入学生姓名\n");
scanf("%s",temp.name);
printf("请输入高数成绩\n");
scanf("%f",&temp.score[0]);
printf("请输入英语成绩\n");
scanf("%f",&temp.score[1]);
printf("请输入C语言成绩\n");
scanf("%f",&temp.score[2]);
temp.average=0;
temp.sum=0;
temp.average=(temp.score[0]+temp.score[1]+temp.score[2])/3;
temp.sum=temp.score[0]+temp.score[1]+temp.score[2];
if(!
fwrite(&temp,sizeof(stu),1,fp))
{
printf("向文件%s写入信息失败\n",File);
return;
}
}
printf("向文件%s写入信息成功\n",File);
fclose(fp);
}
voidLuru(char*File)/*实现对学生成绩的录入功能,并完成计算总分,和平均分的功能*/
{
intcount;
inti;
intm;
stutemp,temp1;
FILE*fp=fopen(File,"a+");//以写的方式打开
if(fp==NULL)
{
printf("打开文件%s失败!
\n",File);
return;
}
printf("您本次要输入几名学生的信息\n");
scanf("%d",&count);
for(i=0;i{
printf("您现在录入的是第%d名学生的信息\n",i+1);
Repeat:
printf("请输入学号:
\n");
m=scanf("%d",&temp.xuehao);
if(m==0)
{
printf("您输入的学号有误\n");
fflush(stdin);//清除文件缓冲区
gotoRepeat;
}
fseek(fp,0,SEEK_SET);
while(fread(&temp1,sizeof(stu),1,fp))
{
if(temp1.xuehao==temp.xuehao)
{
printf("该学生的学号已经存在\n");
gotoRepeat;
}
}
printf("请输入学生姓名\n");
scanf("%s",temp.name);
printf("请输入高数成绩\n");
scanf("%f",&temp.score[0]);
printf("请输入英语成绩\n");
scanf("%f",&temp.score[1]);
printf("请输入C语言成绩\n");
scanf("%f",&temp.score[2]);
temp.average=0;
temp.sum=0;
temp.average=(temp.score[0]+temp.score[1]+temp.score[2])/3;
temp.sum=temp.score[0]+temp.score[1]+temp.score[2];
if(!
fwrite(&temp,sizeof(stu),1,fp))
{
printf("向文件%s写入信息失败\n",File);
return;
}
}
printf("向文件%s写入信息成功\n",File);
fclose(fp);
}
voidDelete(char*File)//实现删除学生相关信息的功能
{
inti=0,len,del;
stus[N];
FILE*fp=fopen(File,"r");
if(fp==NULL)
{
printf("文件打开失败!
");
return;
}
if(IsEmpty(fp))
{
printf("文件为空,不需要查找,请先录入信息!
");
return;
}
printf("请输入您要删除的学生的学号:
");
scanf("%d",&del);
fseek(fp,0,SEEK_SET);
while(fread(s+i,sizeof(stu),1,fp))
{
if(s[i].xuehao==del)
{
printf("下面的学号为%d的学生的信息:
\n",del);
printf("学号姓名高数英语C语言\n");
printf("%5d,%10s,%10.2f,%10.2f,%10.2f\n",s[i].xuehao,s[i].name,s[i].score[0],
s[i].score[1],s[i].score[2]);
i-=1;
}
i++;
}
fclose(fp);
len=i;
fp=fopen(File,"w");
fseek(fp,0,SEEK_SET);
for(i=0;ifwrite(s+i,sizeof(stu),1,fp);
fclose(fp);
fp=fopen(File,"r");
printf("下面是剩余学生的信息\n");
Print(File);//输出删除后文件中的学生的信息
fclose(fp);
}
voidModify(char*File)//修改学生的信息
{
inti=0,len,flag=1,m,stuxuehao,xuanze;
stutemp,s[N];
FILE*fp=fopen(File,"r");
if(fp==NULL)
{
printf("文件打开失败!
");
return;
}
if(IsEmpty(fp))
{
printf("文件为空,不需要查找,请先录入信息!
");
return;
}
printf("请输入需要修改的学生的学号\n");
m=scanf("%d",&stuxuehao);
while(m==0)
{
printf("你输入的学号有误\n");
fflush(stdin);
printf("请再次输入你要修改的学号\n");
m=scanf("%d",&stuxuehao);
}
fseek(fp,0,SEEK_SET);
while(fread(s+i,sizeof(stu),1,fp))
{
if(s[i].xuehao==stuxuehao)
{
flag=0;
printf("以下是学号为%d的学生的信息:
\n",stuxuehao);
printf("学号姓名高数英语C语言\n");
printf("%5d,%10s,%10.2f,%10.2f,%10.2f\n",s[i].xuehao,s[i].name,s[i].score[0],
s[i].score[1],s[i].score[2]);
PrintMenu();
printf("请选择你要修改的项:
\n");
scanf("%d",&xuanze);
switch(xuanze)
{
case1:
L1:
printf("请输入新的学号\n");
scanf("%d",&s[i].xuehao);
fseek(fp,0,SEEK_SET);
while(fread(&temp,sizeof(stu),1,fp)&&temp.xuehao!
=stuxuehao)//判断新输入的学号是否已经存在
{
if(temp.xuehao==s[i].xuehao)
{
printf("该学生的学号已经存在!
\n");
gotoL1;
}
}
printf("请输入新的姓名:
");
scanf("%s",s[i].name);
printf("请输入新的高数成绩:
");
scanf("%f",&s[i].score[0]);
printf("请输入新的英语成绩:
");
scanf("%f",&s[i].score[0]);
printf("请输入新的C语言成绩:
");
scanf("%f",&s[i].score[0]);
break;
case2:
L2:
printf("请输入新的学号:
");
scanf("%d",&s[i].xuehao);
fseek(fp,0,SEEK_SET);
while(fread(&temp,sizeof(stu),1,fp)&&temp.xuehao!
=stuxuehao)//判断新输入的学号是否已经存在
{
if(temp.xuehao==s[i].xuehao)
{
printf("该学生的学号已经存在!
\n");
gotoL2;
}
}
break;
case3:
printf("请输入姓名:
");
scanf("%s",s[i].name);
break;
case4:
printf("请输入新的高数成绩:
");
scanf("%f",&s[i].score[0]);
break;
case5:
printf("请输入新的英语成绩:
");
scanf("%f",&s[i].score[1]);
break;
case6:
printf("请输入新的C语言成绩:
");
scanf("%f",&s[i].score[2]);
break;
default:
printf("未进行修改\n");
}
}
i++;
}
fclose(fp);
if(flag==1)
{
printf("没有找到学号为%d的学生的相关信息",stuxuehao);
return;
}
len=i;
fp=fopen(File,"w");
fseek(fp,0,SEEK_SET);
for(i=0;i{
fwrite(s+i,sizeof(stu),1,fp);
}
fclose(fp);
fp=fopen(File,"r");
Print(File);
fclose(fp);
}
voidMenu()//输出主程序选择菜单
{
printf("\n");
printf("--------------------------------------------------\n");
printf("学生信息管理系统\n");
printf("1.学生成绩录入2.在屏幕上输出文件中的信息\n");
printf("3.学号查询信息4.查询不及格科目及学生名单\n");
printf("5.删除学生信息6.输出排序后的学生成绩\n");
printf("7.修改学生信息8.插入某个学生相关信息\n");
printf("-------------0.退出系统--------------------------\n");
printf("请依照编号选择对应功能\n");
printf("--------------------------------------------------\n");
printf("\n");
}
voidPrintMenu()//输出修改选项菜单
{
printf("----------------------------------------\n");
printf("\n");
printf("*************修改选项菜单***************\n");
printf("\n");
printf("完全修改请选择:
1修改学号请选择:
2\n");
printf("修改姓名请选择:
3修改数学成绩请选:
3\n");
printf("修改英语成绩请选:
4修改C语言成绩请选:
5\n");
printf("-----------退出修改请选择:
0--------------\n");
printf("\n");
printf("----------------------------------------\n");
}
intIsEmpty(FILE*fp)//判断文件是否为空文件
{
intlen;
fseek(fp,0,SEEK_END);//将指针定位到文件尾部
len=ftell(fp);//取指针的位置以测得长度,返回fp所指向的文件中的读写位置
return(len==0)?
1:
0;//len为0的话表示是空文件
}
voidSearch_number(char*File)//按学号查找学生成绩
{
intNumber;
stutemp;//定义结构体变量temp
FILE*fp=fopen(File,"r");
if(fp==NULL)
{
printf("无法打开文件");
return;
}
if(IsEmpty(fp))
{
printf("文件为空,不需查找,请先录入信息!
");
return;
}
printf("请输入需要查找的学生的学号:
");
scanf("%d",&Number);
fseek(fp,0,SEEK_SET);//从文件开始进行查找
while(fread(&temp,sizeof(stu),1,fp))//从fp所指向的文件读取一个数据块(sizeof(stu),并放到*temp所指向的内存地址中
{
if(temp.xuehao==Number)
{
printf("以下为学号为%d的学生的信息:
\n",Number);
printf("%8s%8s%14s%14s%14s\n","学号","姓名","数学成绩","英语成绩","C语言成绩");
printf("%8d%8s%10.1f%15.1f%15.1f\n",temp.xuehao,temp.name,temp.score[0],temp.score[1],temp.score[2]);
return;//结束程序
}
}
printf("没有找到学号为%d的学生的信息!
",Number);
return;
fclose(fp);
}
voidSearch_Fail(char*File)/