记一次课程设计作业学生成绩管理系统#include
#include
#include
#include
/*
学生成绩管理系统介绍
C语言课程设计60936
1.支持将数据保存到文件并从文件中读取已有数据
2.支持添加、删改数据
3.支持按学号或姓名查询、删除、修改数据
4.支持简单统计,包括不及格人数、最高分、最低分
5.支持按总分排序整理数据
*/
structstudent
{
charnum[10];
charname[20];
intcgrade;
intsxgrade;
intyygrade;
inttotal;
floatave;
};
structnode
{
structstudentdata;
structnode*next;
}*head,*last;
intAdd(inti)//执行增加学生记录操作
{
structnode*tmp;
intloop=1;
while(loop)
{
printf("请按以下格式输入数据:\n");
tmp=(structnode*)malloc(sizeof(structnode));
printf("学号姓名C语言成绩数学成绩英语成绩\n");
scanf("%s%s%d%d%d",tmp->data.num,tmp->data.name,&tmp->data.cgrade,&tmp->data.sxgrade,&tmp->data.yygrade);
tmp->data.total=tmp->data.cgrade+tmp->data.sxgrade+tmp->data.yygrade;
tmp->data.ave=tmp->data.total/3.0;
if(last!=NULL)
{
last->next=tmp;
last=last->next;
}
else
{
head=last=tmp;
}
last->next=NULL;
i++;
printf("添加成功!输入1继续录入,输入0终止录入");
intt;
scanf("%d",&t);
if(t==0)
loop=0;
}
returni;
}
intDel(inti)//执行删除学生记录操作
{
chartmpname[20];
chartmpnum[10];
intfind=0,way;
structnode*tmp=head,*tmpbak=head;
printf("请选择删除依据:1.学号2.姓名\n");
scanf("%d",&way);
switch(way)
{
case1:printf("请输入学号:");
scanf("%s",tmpnum);
while((tmp!=NULL)&&(!find))
{
if(!strcmp(tmpnum,tmp->data.num))
{
find=1;
break;
}
tmpbak=tmp;
tmp=tmp->next;
}
if(!find)
{
printf("抱歉,学号%s未查到相关数据!\n",tmpnum);
}
else
{
if(tmpbak==tmp)
{
head=head->next;
printf("删除成功!\n");
i--;
returni;
}
else
{
tmpbak->next=tmp->next;
printf("删除成功!\n");
i--;
returni;
}
}
case2:printf("请输入姓名:");
scanf("%s",tmpname);
while((tmp!=NULL)&&(!find))
{
if(!strcmp(tmpname,tmp->data.num))
{
find=1;
break;
}
tmpbak=tmp;
tmp=tmp->next;
}
if(!find)
{
printf("抱歉,姓名%s未查到相关数据!\n",tmpname);
}
else
{
if(tmpbak==tmp)
{
head=head->next;
printf("删除成功!\n");
i--;
returni;
}
else
{
tmpbak->next=tmp->next;
printf("删除成功!\n");
i--;
returni;
}
}
default:printf("选择错误,查询失败!\n");
}
}
voidEdit(structnode*tmp)//执行修改学生记录操作
{
printf("请输入修改后的信息:\n");
printf("学号姓名C语言成绩数学成绩英语成绩\n");
scanf("%s%s%d%d%d",tmp->data.num,tmp->data.name,&tmp->data.cgrade,&tmp->data.sxgrade,&tmp->data.yygrade);
tmp->data.total=tmp->data.cgrade+tmp->data.sxgrade+tmp->data.yygrade;
tmp->data.ave=tmp->data.total/3.0;
printf("修改成功!\n");
printf("*************************************\n");
}
voidQuery()//执行查询学生记录操作
{
chartmpname[20];
chartmpnum[10];
intfind=0,way,change=0;
structnode*tmp=head;
printf("请选择查询方式:1.学号2.姓名\n");
scanf("%d",&way);
switch(way)
{
case1:printf("请输入学号:");
scanf("%s",tmpnum);
while((tmp!=NULL)&&(!find))
{
if(!strcmp(tmpnum,tmp->data.num))
{
find=1;
printf("找到以下数据!\n");
printf("学号姓名C语言成绩数学成绩英语成绩总分平均分\n");
printf("%s%s%d%d%d%d%.2f\n",tmp->data.num,tmp->data.name,tmp->data.cgrade,tmp->data.sxgrade,tmp->data.yygrade,tmp->data.total,tmp->data.ave);
printf("*************************************\n");
printf("是否修改数据?输入1修改,输入0取消");
scanf("%d",&change);
if(change)
Edit(tmp);
}
tmp=tmp->next;
}
if(!find)
{
printf("抱歉,学号%s未查到相关数据!\n",tmpnum);
}
break;
case2:printf("请输入姓名:");
scanf("%s",tmpname);
while((tmp!=NULL)&&(!find))
{
if(!strcmp(tmpname,tmp->data.name))
{
find=1;
printf("找到以下数据!\n");
printf("学号姓名C语言成绩数学成绩英语成绩总分平均分\n");
printf("%s%s%d%d%d%d%.2f\n",tmp->data.num,tmp->data.name,tmp->data.cgrade,tmp->data.sxgrade,tmp->data.yygrade,tmp->data.total,tmp->data.ave);
printf("*************************************\n");
printf("是否修改数据?输入1修改,输入0取消");
scanf("%d",&change);
if(change)
Edit(tmp);
}
tmp=tmp->next;
}
if(!find)
{
printf("抱歉,姓名%s未查到相关数据!\n",tmpname);
}
break;
default:printf("选择错误,查询失败!\n");
}
}
voidTongji()//执行统计学生记录操作
{
structnode*tmp=head;
intcbjg=0,sxbjg=0,yybjg=0,avebjg=0,cmax=0,sxmax=0,yymax=0,avemax=0,cmin=100,sxmin=100,yymin=100,avemin=100;
printf("正在统计数据,请稍候...\n");
while(tmp!=NULL)
{
if(tmp->data.cgrade<60)
cbjg++;
if(tmp->data.cgrade>cmax)
cmax=tmp->data.cgrade;
if(tmp->data.cgrade
cmin=tmp->data.cgrade;
if(tmp->data.sxgrade<60)
sxbjg++;
if(tmp->data.sxgrade>sxmax)
sxmax=tmp->data.sxgrade;
if(tmp->data.sxgrade
sxmin=tmp->data.sxgrade;
if(tmp->data.yygrade<60)
yybjg++;
if(tmp->data.yygrade>yymax)
yymax=tmp->data.yygrade;
if(tmp->data.yygrade
yymin=tmp->data.yygrade;
if(tmp->data.ave<60)
avebjg++;
if(tmp->data.ave>avemax)
avemax=tmp->data.ave;
if(tmp->data.ave
avemin=tmp->data.ave;
tmp=tmp->next;
}
printf("****************************\n统计完成,数据如下:\n");
printf("C语言不及格人数:%d最高分:%d最低分:%d\n",cbjg,cmax,cmin);
printf("数学不及格人数:%d最高分:%d最低分:%d\n",sxbjg,sxmax,sxmin);
printf("英语不及格人数:%d最高分:%d最低分:%d\n",yybjg,yymax,yymin);
printf("平均分不及格人数:%d最高分:%d最低分:%d\n",avebjg,avemax,avemin);
printf("**********************************\n");
}
voidSort(intn)//执行按降序进行排列学生记录的操作
{
inti,j;
structnode*tmp=head,*tmpbak=head->next,*bak;
bak=(structnode*)malloc(sizeof(structnode));
for(i=0;i
{
for(j=0;i+j
{
if(tmpbak->data.total>tmp->data.total)
{
bak->data=tmp->data;
tmp->data=tmpbak->data;
tmpbak->data=bak->data;
}
tmp=tmp->next;
tmpbak=tmpbak->next;
}
tmp=head;
tmpbak=head->next;
}
printf("排序完成!\n");
}
intSave()//执行存盘操作stuinfo.dat
{
if(!head)return0;
FILE*fp=fopen("stuinfo.dat","wb");
inti=0;
while(head)
{
fwrite(&head->data,sizeof(student),1,fp);
i++;
head=head->next;
}
fclose(fp);
returni;
}
intload()//从文件stuinfo.dat中载入数据
{
FILE*fp=fopen("stuinfo.dat","rb");
if(!fp)
{
printf("Cannotopenthefile!\n");
return0;
}
structnode*tmp;
fseek(fp,0,SEEK_END);
longend=ftell(fp);
fseek(fp,0,SEEK_SET);
inti=0;
if(ftell(fp)==end)
{
printf("无记录!\n");
return0;
}
while(ftell(fp)!=end)
{
tmp=(structnode*)malloc(sizeof(structnode));
tmp->next=NULL;
fread(&tmp->data,sizeof(structstudent),1,fp);
i++;
if(last!=NULL)
{
last->next=tmp;
last=last->next;
}
else
{
head=last=tmp;
}
last->next=NULL;
}
fclose(fp);
returni;
}
voidDisplay()//执行将学生记录以表格形式打印输出至屏幕的操作
{
structnode*tmp=head;
printf("学号姓名C语言成绩数学成绩英语成绩总分平均分\n");
while(tmp!=NULL)
{
printf("%s%s%d%d%d%d%.2f",tmp->data.num,tmp->data.name,tmp->data.cgrade,tmp->data.sxgrade,tmp->data.yygrade,tmp->data.total,tmp->data.ave);
tmp=tmp->next;
printf("\n");
}
}
voidWrong()//给出按键错误提示
{
printf("输入错误,请重新输入!\n");
}
intQuit()//存盘且退出
{
Save();
return0;
}
intMenu()//操作选单
{
inti;
printf("========================================================\n");
printf("欢迎使用学生成绩管理系统!\n");
printf("0:存盘并退出\n");
printf("1:增加学生记录\n");
printf("2:删除学生记录\n");
printf("3:查询/修改学生记录\n");
printf("4:统计学生记录\n");
printf("5:按降序进行排列学生记录\n");
printf("6:将学生记录以表格形式打印输出至屏幕\n");
printf("========================================================\n");
printf("请选择你需要的操作:");
scanf("%d",&i);
printf("\n");
returni;
}
voidmain()
{
inti,choice,loop=1;
i=load();
printf("从stuinfo.dat导入了%d条数据\n\n",i);
while(loop)
{
choice=Menu();
switch(choice)
{
case0:loop=Quit();break;
case1:i=Add(i);break;
case2:i=Del(i);break;
case3:Query();break;
case4:Tongji();break;
case5:Sort(i);break;
case6:printf("共有%d条数据!\n",i);Display();break;
default:Wrong();
}
}
}