学生管理系统.docx
《学生管理系统.docx》由会员分享,可在线阅读,更多相关《学生管理系统.docx(34页珍藏版)》请在冰豆网上搜索。
学生管理系统
福建工程学院计算机与信息科学系
实验报告
实验目的、要求
二、实验要求
1.该实验的课内学时是4个课时。
2.程序完成后应该完成如下基本功能:
1)用自定义结构体typedefstruct设计该软件的数据结构;
2)用数组或指针链表将所有学生的数据按照学号顺序链接起来。
3)程序能够按照学号顺序输入学生的三门成绩,并计算平均成绩和总成绩。
4)程序能够显示已经输入的指定学号的学生成绩以及平均成绩和总成绩。
5)程序能够按要求显示指定分数段的学生成绩以及平均成绩和总成绩。
6)能够统计班级总人数、班级平均成绩。
7)能够增加和删除指定学生的成绩。
8)按照指定的要求以及顺序(升序或降序)显示学生成绩以及平均成绩和总成绩。
3.在完成上述基本功能的前提下,有能力的同学可以完成如下加强功能:
1)能够输入的数据长期存储在文件中,再次运行程序时从文件中读取数据,无须重复输入。
5)在程序的提示语言清晰明确,界面美观并且适用。
实验设计内容
#include
#include
typedefstructnode
{
charnum[10];
charname[10];
intscore[5];/*score[0]存数学成绩score[1]语文成绩score[2]英语成绩score[3]总分score[4]平均分*/
structnode*next;
}student;/*学生成绩结构体*/
/*初始化结构体*/
student*init(student*t)
{
t=(student*)malloc(sizeof(student));
t->next=NULL;
t->score[4]=t->score[3]=t->score[0]=t->score[1]=t->score[2]=0;
returnt;
}
/*保存数据*/
voidsave(student*stu)
{
FILE*fp;
if((fp=fopen("score1","w"))==NULL)/*为输出打开文件score1*/
{
printf("cannotopenfile\n");exit(0);
}
stu=stu->next;
while(stu!
=NULL)
{
if(fwrite(stu,sizeof(student),1,fp)!
=1)
printf("filewriteerror\n");
stu=stu->next;
}
fclose(fp);
}
/*读取数据*/
student*load(student*stu)
{
FILE*fp;student*p,*r;r=stu;
if((fp=fopen("score1","r"))==NULL)/*为输入打开文件score1*/
returnstu;
do
{p=(student*)malloc(sizeof(student));
p->next=NULL;
if((fread(p,sizeof(student),1,fp)!
=1)){fclose(fp);returnstu;};
r->next=p;
r=r->next;
}while
(1);
}
/*输出一个特定的学生的成绩*/
voidoutput1(student*t)
{intk;
printf("%s\t%s\t",t->num,t->name);
for(k=0;k<5;k++)
printf("%d\t",t->score[k]);
printf("\n");
}
/*输出全体学生的成绩*/
voidoutput(student*stu)
{
stu=stu->next;
printf("学号\t姓名\t数学\t语文\t英语\t总分\t平均分\n");
while(stu!
=NULL)
{
output1(stu);
stu=stu->next;
}
}
/*将stu后插在t中*/
student*charu(student*stu,student*t)
{student*p;intk;
p=(student*)malloc(sizeof(student));
strcpy(p->num,stu->num);
strcpy(p->name,stu->name);
for(k=0;k<5;k++)
p->score[k]=stu->score[k];
p->next=t->next;
t->next=p;
returnp;
}
/*按成绩排序*/
voidpaixu(student*stu,inti)
{
student*t,*p,*r;
intj,k;p=stu;
printf("输入0按数学成绩\n");
printf("输入1按语文成绩\n");
printf("输入2按英语成绩\n");
printf("输入3按总分\n");
printf("输入4按平均分\n");
do
{
scanf("%d",&j);
if(j<0&&j>4)printf("输入错误请重新输入\n");
elsebreak;
}while
(1);
t=init(t);
r=t;
stu=stu->next;
if(t->next==NULL)
r=charu(stu,t);/*在排序好的链表t中插入第一个节点*/
if(i==0)/*按升序排序*/
while(stu->next!
=NULL)
{
stu=stu->next;
if(r->score[j]>stu->score[j])r=t;/*如果待插入的score[j]<当前的score[j],指针r回溯*/
while(r->next->score[j]score[j]&&r->next!
=NULL)
r=r->next;/*找到比待插入的score[j]大的指针r->next*/
r=charu(stu,r);/*在r后面插入stu*/
}
else
while(stu->next!
=NULL)
{
stu=stu->next;
if(r->score[j]score[j])r=t;
while(r->next->score[j]>stu->score[j]&&r->next!
=NULL)
r=r->next;
r=charu(stu,r);
}
output(t);
}
/*排序菜单*/
voidoutput2(student*stu)
{inti;
output(stu);
printf("输入0升序\n");
printf("输入1降序\n");
printf("输入其他任意字符退出\n");
scanf("%d",&i);
if(i==0||i==1)
paixu(stu,i);
printf("输入任意字符结束\n");
getch();
}
/*查找学生号为num是否存在*/
student*findnum(char*num,student*t,int*i)
{
*i=1;
if(t->next==NULL)
returnt;
else
{
*i=strcmp(t->next->num,num);
while(*i<0)/*t->next->num{
t=t->next;
if(t->next==NULL)
returnt;
*i=strcmp(t->next->num,num);
}
}
returnt;/*t->next->num>=num时返回,此时i>=0*/
}
/*插入一个学生信息*/
student*insertstu(char*num,student*stu,char*name)
{student*p,*t;int*i,j;i=&j;
t=findnum(num,stu,i);/*查找该学号是否存在*/
if(j!
=0)/*该学号不存在,则插入*/
{
p=init(p);
strcpy(p->num,num);
strcpy(p->name,name);
p->next=t->next;
t->next=p;
returnstu;
}
else
{printf("已有此学号\n学号\t姓名\n%s\t%s\n",t->next->num,t->next->name);returnstu;}
}
/*录入新学生信息*/
voidbase(student*stu)
{
charnum[10],name[20];
printf("输入e结束输入新学生的信息\n");
printf("num(不超过10个数)\tname(不超过10个字)\n");
scanf("%s",num);
do
{
printf("\t\t\t");
scanf("%s",name);
stu=insertstu(num,stu,name);/*插入一个学生信息*/
scanf("%s",num);
}while(num[0]!
='e');
output(stu);
printf("输入任意字符退出\n");
getch();
}
/*增加修改一门课程成绩*/
voidzengjia(student*t,inti)
{
t->score[3]-=t->score[i];/*总分减去第i门课的成绩*/
scanf("%d",&(t->score[i]));/*输入第i门课的成绩*/
t->score[3]+=t->score[i];/*总分加上第i门课的成绩*/
}
voiddeletegrade(student*t,inti)
{
t->score[3]-=t->score[i];/*总分减去第i门课的成绩*/
t->score[i]=0;/*第i门课的成绩归零*/
}
/*修改成绩*/
voidaltergrade(student*stu)
{
intj,*i;student*t;chara,*num;
i=&j;
printf("0修改数学成绩\n");
printf("1修改语文成绩\n");
printf("2修改英语成绩\n");
printf("3删除数学成绩\n");
printf("4修改语文成绩\n");
printf("5修改英语成绩\n");
printf("输入e结束操作\n");
a=getch();
printf("学号\t成绩\n");
scanf("%s",num);
printf("a===%cnum===%s",a,num);
do
{
t=findnum(num,stu,i);/*按学生号查找学生信息*/
if(j==0)/*学生号存在*/
{
t=t->next;
switch(a)
{
case'0':
zengjia(t,0);
break;
case'1':
zengjia(t,1);
break;
case'2':
zengjia(t,2);
break;
case'3':
deletegrade(t,0);
break;
case'4':
deletegrade(t,1);
break;
case'5':
deletegrade(t,2);
break;
default:
break;
}
t->score[4]=t->score[3]/3;
}
else
printf("无此学号\n");
scanf("%s",num);
}while(num[0]!
='e');
output(stu);
printf("输入任意字符结束\n");
getch();
}
/*第i科成绩录入*/
studentgradeenter(student*stu,inti)
{
student*t;t=stu;
t=t->next;
printf("学号\t该科成绩\n");
while(t!
=NULL)
{
printf("%s\t",t->num);
if(t->score[i]==0)/*如果学号为t->num的同学该科成绩没有*/
{
scanf("%d",&t->score[i]);
t->score[3]+=t->score[i];/*学号为t->num的总分*/
t->score[4]=t->score[3]/3;/*学号为t->num的平均分*/
}
else
printf("%d\n",t->score[i]);
t=t->next;/*录入下一个同学的该科成绩*/
}
printf("该科全部输入完成\n输入任意字符结束\n");
getch();
}
/*成绩录入菜单*/
voidentergrade(student*stu)
{
inti;
printf("0录入数学成绩\n");
printf("1录入语文成绩\n");
printf("2录入英语成绩\n");
scanf("%d",&i);
switch(i)
{
case0:
gradeenter(stu,i);break;
case1:
gradeenter(stu,i);break;
case2:
gradeenter(stu,i);break;
default:
printf("输入错误请输入相应操作的题号\n");
}
}
/*按学生号查找学生*/
voidchaxun(student*stu)
{
char*num;intj,k,*i;student*t;i=&j;
printf("输入要查询的学生学号\n");
scanf("%s",num);
t=findnum(num,stu,i);/*查找学生号为num是否存在*/
if(j==0)/*该学生号存在*/
{
t=t->next;
printf("查询结果为\n");
printf("学号\t姓名\t数学\t语文\t英语\t总分\t平均分\n");
output1(t);/*输出此学生信息*/
}
else
printf("查无此号\n");
printf("输入任意字符结束\n");
getch();
}
/*统计全班人数和平均分*/
voidtongji(student*stu)
{
inttotal=0,score=0;
stu=stu->next;
while(stu!
=NULL)
{
score+=stu->score[3];
stu=stu->next;
total++;
}
score=score/total;
printf("班级总人数为:
%d平均分为:
%d\n输入任意字符退出\n",total,score);
getch();
}
/*按分数段查询*/
voidfenshuduan(student*stu)
{
inti,min,max,j;
printf("输入0按数学分数段\n");
printf("输入1按语文分数段\n");
printf("输入2按英语分数段\n");
printf("输入3按总分分数段\n");
printf("输入4按平均分分数段\n");
scanf("%d",&i);
printf("输入分数段上限:
");
scanf("%d",max);
printf("\n输入分数段下限:
");
scanf("%d",min);
if(max{j=max;max=min;min=j;}
stu=stu->next;
printf("学号\t姓名\t数学\t语文\t英语\t总分\t平均分\n");
while(stu!
=NULL)
{
if(min<=stu->score[i]&&stu->score[i]<=max)/*将分数段内的同学信息输出*/
output1(stu);
stu=stu->next;
}
}
voidmain()
{
chara='8';
student*stu;
stu=init(stu);/*初始化stu*/
stu=load(stu);/*读取score1的数据*/
while(a!
='7')
{
clrscr();
printf("************************************************************\n");
printf("学生成绩管理系统\n");
printf("-------madeinchina\n");
printf("0录入学生基本信息\n");
printf("1修改或删除学生成绩\n");
printf("2录入学生成绩\n");
printf("3显示指定学生的信息\n");
printf("4输出指定分数段的学生信息\n");
printf("5输出班级总人数和平均分\n");
printf("6输出全体学生的信息\n");
printf("7退出\n");
printf("*************************************************************\n");
a=getch();
switch(a)
{
case'0':
base(stu);break;
case'1':
altergrade(stu);break;
case'2':
entergrade(stu);break;
case'3':
chaxun(stu);break;
case'4':
fenshuduan(stu);break;
case'5':
tongji(stu);break;
case'6':
output2(stu);break;
case'7':
break;
default:
printf("iamsorrytohearthatyouenterthewrongnum\n");
printf("按任意键重新输入\n");getch();continue;
}
}
save(stu);/*将数据保存在score1中*/
printf("欢迎再次使用学生成绩管理系统........请按任意键退出.......");
getch();
}
_
层次图描
实验结果记录以及与预期结果比较以及分析
记录每次实验结果以及分析情况
总结以及心得体会
本实验经过我深思熟虑采用链表!
通过本实验的加强功能即文件的操作(保存及导出),我巩固了这部分的功能。
在编写对链表进行升序排序时候,大大的提高了我对链表的操作。
指导老师评阅意见
指导老师:
年月日
填写内容时,可把表格扩大。
实验的源程序代码(要有注释)附在表后。
#include
#include
typedefstructnode
{
charnum[10];
charname[10];
intscore[5];/*score[0]存数学成绩score[1]语文成绩score[2]英语成绩score[3]总分score[4]平均分*/
structnode*next;
}student;/*学生成绩结构体*/
/*初始化结构体*/
student*init(student*t)
{
t=(student*)malloc(sizeof(student));
t->next=NULL;
t->score[4]=t->score[3]=t->score[0]=t->score[1]=t->score[2]=0;
returnt;
}
/*保存数据*/
voidsave(student*stu)
{
FILE*fp;
if((fp=fopen("score1","w"))==NULL)/*为输出打开文件score1*/
{
printf("cannotopenfile\n");exit(0);
}
stu=stu->next;
while(stu!
=NULL)
{
if(fwrite(stu,sizeof(student),1,fp)!
=1)
printf("filewriteerror\n");
stu=stu->next;
}
fclose(fp);
}
/*读取数据*/
student*load(student*stu)
{
FILE*fp;student*p,*r;r=stu;
if((fp=fopen("score1","r"))==NULL)/*为输入打开文件score1*/
returnstu;
do
{p=(student*)malloc(sizeof(student));
p->next=NULL;
if((fread(p,sizeof(student),1,fp)!
=1)){fclose(fp);returnstu;};
r->next=p;
r=r->next;
}while
(1);
}
/*输出一个特定的学生的成绩*/
voidoutput1(student*t)
{intk;
printf("%s\t%s\t",t->num,t->name);
for(k=0;k<5;k++)
printf("%d\t",t->score[k]);
printf("\n");
}
/*输出全体学生的成绩*/
voidoutput(student*stu)
{
stu=stu->next;
printf("学号\t姓名\t数学\t语文\t英语\t总分\t平均分\n");
while(stu!
=NULL)
{
output1(stu);
stu=stu->next;
}
}
/*将stu后插在t中*/
student*charu(student*stu,student*t)
{student*p;intk;
p=(student*)malloc(sizeof(student));
strcpy(p->num,stu->num);
strcpy(p->name,stu->name