学生成绩管理系统课程设计报告.docx
- 文档编号:28363705
- 上传时间:2023-07-10
- 格式:DOCX
- 页数:23
- 大小:316.48KB
学生成绩管理系统课程设计报告.docx
《学生成绩管理系统课程设计报告.docx》由会员分享,可在线阅读,更多相关《学生成绩管理系统课程设计报告.docx(23页珍藏版)》请在冰豆网上搜索。
学生成绩管理系统课程设计报告
学生成绩管理系统
课程设计报告
编写人:
同组成员:
(课程设计负责人)
完成日期:
2011年12月22日
辅导教师:
批阅日期:
分数:
一、功能描述-2-
功能介绍-2-
结构图-2-
二、总体设计-2-
三、数据结构设计-3-
1、学生成绩信息结构体-3-
2、删除学生资料结构体-3-
3、查询学生信息结构体-5-
4、修改学生资料结构体-6-
5、输出所有学生资料结构体-7-
6、对学生总成绩排序结构体-8-
7、保存学生资料结构体-9-
四、函数功能描述-10-
1、输出数据函数*/函数原型:
-10-
2、输出列名函数…-10-
3、输出数据函数…-10-
4、用于提示用户选择操作的函数-10-
5、查找函数-10-
6、查询学生信息函数-10-
7、删除函数-10-
8、修改函数-10-
9、输出所有数据函数-10-
10、统计函数-10-
11、排序函数-10-
12、保存函数-10-
13、主函数-10-
五、运行结果-10-
1、主界面-10-
2、输入学生记录(图略)-11-
3、删除学生资料:
-11-
4、查询学生资料:
-12-
5、修改学生资料-12-
6、保存学生资料-13-
7、输出统计结果-13-
8、对数据进行排序-14-
9输出所有结果:
-14-
10、退出系统-14-
六、设计小结-15-
七、小组成员负责内容及心得:
-15-
一、功能描述
功能介绍
此成绩管理系统主要利用单链表实现,由如下八个功能模块实现
1、登记学生资料:
主要登记学生的学号|、姓名以及各科成绩
2、删除学生资料:
主要完成对个别学生资料的删除。
……
3、查询学生资料:
主要完成对学生的各科成绩查询。
4、修改学生资料:
主要完成对部分学生的错误信息进行修改。
5、保存学生资料;主要完成学生资料的保存工作。
6、输出统计结果;主要筛选出所有学生的单科成绩、总成绩、平均成绩的最高分数的任务。
7、对数据行进排序:
主要对学生总成绩进行排序。
8、输出所有结果:
主要输出所有同学信息。
结构图
二、总体设计
功能模块设计
⑴主函数执行流程
…voidmain()/*主函数*/
{
Linkl;/*链表*/
FILE*fp;/*文件指针*/
intsel;/*用来判断用户要进行的哪个操作*/
charch;/*用于判断用户是否要保存文件*/
charjian;/*用于判断用户是否要建立文件*/
⑵输入记录模块……
charfindmess[20];/*用于暂时存放学号*/
if(!
l->next)/*判断链表是否为空*/
{
printf("\n★★★★没有资料可以修改!
★★★★★\n");
return;
}
printf("请你输入要修改的学生学号:
");
scanf("%s",findmess);
p=Locate(l,findmess,"num");
if(p)
{
printf("请你输入新学号(原来是%s):
",p->data.num);
scanf("%s",p->data.num);
printf("请你输入新姓名(原来是%s):
",p->data.name);
scanf("%s",p->data.name);
getchar();/*清除多余输入*/
printf("请你输入新性别(原来是%s):
",p->data.sex);
scanf("%s",p->data.sex);
printf("请你输入新的c语言成绩(原来是%d分):
",p->data.cgrade);
scanf("%d",&p->data.cgrade);
getchar();/*清除多余输入*/
printf("请你输入新的数学成绩(原来是%d分):
",p->data.mgrade);
scanf("%d",&p->data.mgrade);
getchar();/*清除多余输入*/
printf("请你输入新的英语成绩(原来是%d分):
",p->data.egrade);
scanf("%d",&p->data.egrade);
p->data.totle=p->data.egrade+p->data.cgrade+p->data.mgrade;
p->data.ave=p->data.totle/3;
printf("\n☆☆☆☆资料修改成功!
☆☆☆☆\n");
shoudsave=1;/*用于判断是否保存的*/
}
三、数据结构设计
1、学生成绩信息结构体
structstudent/*定义结构体*/
{
charnum[20];/*学号*/
charname[20];/*姓名*/
charsex[4];/*性别*/
intcgrade;/*c语言成绩*/
intmgrade;/*数学成绩*/
integrade;/*英语成绩*/
inttotle;/*总成绩*/
intave;/*平均成绩*/
};
typedefstructnode/*自定义结构体*/
{
2、删除学生资料结构体
voidDel(Linkl)/*删除函数*/
{
intsel;/*判断通过什么方式删除学生信息*/
Node*p,*r;
charfindmess[20];/*用于存放学号或姓名*/
if(!
l->next)
{/*判断链表是否为空*/
printf("\n★★★★没有资料可以删除!
★★★★\n");
return;
}
printf("\n=====>1按学号删除\n=====>2按姓名删除\n");
scanf("%d",&sel);
if(sel==1)
{
printf("请你输入要删除的学号:
");
scanf("%s",findmess);
p=Locate(l,findmess,"num");/*调用查找函数,返回元素的指针结点*/
if(p)
{
r=l;
while(r->next!
=p)
r=r->next;
r->next=p->next;/*删除后的每个指针前移*/
free(p);
printf("\n※※※※※该学生已经成功删除!
※※※※※\n");
shoudsave=1;/*判断是否保存*/
}
else
Nofind();
}
elseif(sel==2)
{
printf("请你输入要删除的姓名:
");
scanf("%s",findmess);
p=Locate(l,findmess,"name");
if(p)
{
r=l;
while(r->next!
=p)
r=r->next;
r->next=p->next;/*删除后的每个指针前移*/
free(p);
printf("\n※※※※该学生已经成功删除!
※※※※\n");
shoudsave=1;
}
else
Nofind();
}
else
Wrong();
}
3、查询学生信息结构体
voidQur(Linkl)/*用于查询学生信息*/
{
intsel;/*来判断用户要用什么方式查询信息*/
charfindmess[20];/*用来存放学生的学号或姓名*/
Node*p;
if(!
l->next)/*判断链表中是否有数据*/
{
printf("\n☆☆☆☆没有资料可以查询!
☆☆☆☆☆\n");
return;
}
printf("\n=====>1按学号查找\n=====>2按姓名查找\n");
scanf("%d",&sel);
if(sel==1)/*用学号查找*/
{
printf("请你输入要查找的学号:
");
scanf("%s",findmess);
p=Locate(l,findmess,"num");/*调用查找函数*/
if(p)
{
printf("\t\t★★★★★查找结果★★★★★\n");
printstart();
printc();
printe(p);
printstart();
}
else
Nofind();
}
elseif(sel==2)/*姓名查找*/
{
printf("请你输入要查找的姓名:
");
scanf("%s",findmess);
p=Locate(l,findmess,"name");/*调用查找函数,对姓名进行查找*/
if(p)
{
printf("\t\t★★★★★查找结果★★★★★\n");
printstart();
printc();
printe(p);/*输出查找的结果*/
printstart();
}
else
Nofind();
}
else
Wrong();
}
4、修改学生资料结构体
voidModify(Linkl)/*修改函数*/
{
Node*p;
charfindmess[20];/*用于暂时存放学号*/
if(!
l->next)/*判断链表是否为空*/
{
printf("\n★★★★没有资料可以修改!
★★★★★\n");
return;
}
printf("请你输入要修改的学生学号:
");
scanf("%s",findmess);
p=Locate(l,findmess,"num");
if(p)
{
printf("请你输入新学号(原来是%s):
",p->data.num);
scanf("%s",p->data.num);
printf("请你输入新姓名(原来是%s):
",p->data.name);
scanf("%s",p->data.name);
getchar();/*清除多余输入*/
printf("请你输入新性别(原来是%s):
",p->data.sex);
scanf("%s",p->data.sex);
printf("请你输入新的c语言成绩(原来是%d分):
",p->data.cgrade);
scanf("%d",&p->data.cgrade);
getchar();/*清除多余输入*/
printf("请你输入新的数学成绩(原来是%d分):
",p->data.mgrade);
scanf("%d",&p->data.mgrade);
getchar();/*清除多余输入*/
printf("请你输入新的英语成绩(原来是%d分):
",p->data.egrade);
scanf("%d",&p->data.egrade);
p->data.totle=p->data.egrade+p->data.cgrade+p->data.mgrade;
p->data.ave=p->data.totle/3;
printf("\n☆☆☆☆资料修改成功!
☆☆☆☆\n");
shoudsave=1;/*用于判断是否保存的*/
}
else
Nofind();
}
5、输出所有学生资料结构体
voidDisp(Linkl)/*输出所有数据*/
{
intcount=0;
Node*p;
p=l->next;
if(!
p)/*判断数据表中是否有元素*/
{
printf("\n★★★★:
没有资料可以显示!
★★★★\n");
return;
}
printf("\t\t☆☆☆☆☆☆全部数据结果☆☆☆☆☆☆☆\n");
printstart();
printc();
printf("\n");
while(p)
{
printe(p);/*输出元素,之后指针后移*/
p=p->next;
}
printstart();
printf("\n");
}
voidTongji(Linkl)/*统计函数*/
{
Node*pm,*pe,*pc,*pt,*pa;/*用于指向分数最高的结点*/
Node*r=l->next;
if(!
r)
{
printf("\n☆☆☆☆:
没有资料可以统计!
☆☆☆☆\n");
return;
}
pm=pe=pc=pt=pa=r;
while(r!
=NULL)
{
if(r->data.cgrade>=pc->data.cgrade)
pc=r;
if(r->data.mgrade>=pm->data.mgrade)
pm=r;
if(r->data.egrade>=pe->data.egrade)
pe=r;
if(r->data.totle>=pt->data.totle)
pt=r;
if(r->data.ave>=pa->data.ave)
pa=r;
r=r->next;
}
printf("☆-----------------------------统计结果-------------------------------☆\n");
printf("总分最高者:
\t%s%d分\n",pt->data.name,pt->data.totle);
printf("平均分最高者:
\t%s%d分\n",pa->data.name,pa->data.ave);
printf("英语最高者:
\t%s%d分\n",pe->data.name,pe->data.egrade);
printf("数学最高者:
\t%s%d分\n",pm->data.name,pm->data.mgrade);
printf("c语言最高者:
\t%s%d分\n",pc->data.name,pc->data.cgrade);
printstart();
}
6、对学生总成绩排序结构体
voidSort(Linkl)/*排序函数*/
{
Linkll;
Node*p,*rr,*s;
Node*r;r=l;
ll=(Link)malloc(sizeof(Node));/*用于做新的连表*/
ll->next=NULL;
if(r->next==NULL)
{
printf("\n=====>提示:
没有资料可以排序!
\n");
return;
}
p=r->next;
while(p)
{
s=(Node*)malloc(sizeof(Node));/*新建接点用于保存信息*/
s->data=p->data;
s->next=NULL;
rr=ll;
while(rr->next!
=NULL&&(strcmp(rr->next->data.num,p->data.num)<0))
rr=rr->next;
if(rr->next==NULL)
rr->next=s;
else
{
s->next=rr->next;
rr->next=s;
}
p=p->next;
}
r->next=ll->next;
printf("\n=====>提示:
排序已经完成!
\n");
}
7、保存学生资料结构体
voidSave(Linkl)/*保存函数*/
{
FILE*fp;
Node*p;
intflag=1,count=0;
fp=fopen("c:
\\student","wb");/*以可写的方式打开文件*/
if(fp==NULL)/*判断文件是否存在*/
{
printf("\n=====>提示:
重新打开文件时发生错误!
\n");
exit
(1);
}
p=l->next;
while(p)
{
if(fwrite(p,sizeof(Node),1,fp)==1)/*向文件写入元素*/
{
p=p->next;
count++;/*保存的信息条数*/
}
else
{
flag=0;/*来判断是否保存成功*/
break;
}
}
if(flag)
{
printf("\n★★★★文件保存成功.(有%d条记录已经保存.)★★★★\n",count);
shoudsave=0;/*证明保存结束*/
}
fclose(fp);/*关闭文件*/
}
四、函数功能描述
1、输出数据函数*/函数原型:
函数原型:
voidprinte(Node*p)/*
2、输出列名函数…
函数原型:
voidprintc()…
3、输出数据函数…
函数原型:
voidprinte(Node*p)
4、用于提示用户选择操作的函数
函数原型:
voidmenu()
5、查找函数
函数原型:
Node*Locate(Linkl,charfindmess[],charnameornum[])
6、查询学生信息函数
函数原型:
voidQur(Linkl)
7、删除函数
函数原型:
voidDel(Linkl)
8、修改函数
函数原型:
voidModify(Linkl)
9、输出所有数据函数
函数原型:
voidDisp(Linkl)
10、统计函数
函数原型:
voidTongji(Linkl)
11、排序函数
函数原型:
voidSort(Linkl)
12、保存函数
函数原型:
voidSave(Linkl)
13、主函数
函数原型:
voidmain()
五、运行结果
1、主界面
成绩管理系统主菜单
2、输入学生记录(图略)
3、删除学生资料:
4、查询学生资料:
5、修改学生资料
6、保存学生资料
7、输出统计结果
8、对数据进行排序
9输出所有结果:
10、退出系统
六、设计小结
本系统的优点:
能够满足教学工作的需要,采用人性化、合理化的运作模式,在一定程度上大量节省了财力以及物力,降低老师在教学工作中的工作量。
本系统共计八个模块,能够满足教学中的各种需要。
本系统的缺点:
1、学号不固定长度时,导致各个同学成绩不能实现对应。
2、主界面不够鲜明
3、未实现学号排姓名排序
4、结构过于复杂
5、未实现临时增加学生信息
7、小组成员负责内容及心得:
小组成员负责板块:
罗传庆:
主函数、主界面、用于提示用户选择操作的函数的编程以及各分支函数的链接
贾垚:
学生信息的导入、删除学生资料的函数的编程
王晋:
查询学生资料、修改学生资料的函数的编程
张龙:
保存学生资料、输出统计结果的函数的编程
王毅:
对数据行进排序、输出所有结果的函数的编程
心得:
从最初拿到课程设计,分配工作到结束工作,过程中我们遇到了大大小小的问题,有任务分配的诸多问题,各模块整理总和中出现的问题,以及在设计过程中诸多的意见分歧,到讨论解决问题统一的方案,存在好多的问题,每个人都认为自己的正确,互不相让,争斗激烈,口角战不少,可是我们综合着以解决问题为原则,无论再怎么争吵,都不能影响我们生活中的关系,这样我们才得以同心协力的完成任务。
在这次做作业过程中我们都学到了很多在课本上学不到的东西。
比如团结合作,相互谦让,学习中的矛盾不带入平时的交往中。
这次的作业量不是单个一个人能够完成的,团队协作有很大的助力,只有团结一起,才能成功完成这次作业,而且每个人在遇到问题后能够不耻下问,这是一个很虚心的表现,在当代年轻人中这是难能可贵的精神,我们会在以后的生活和学习中继续发扬。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 学生 成绩管理系统 课程设计 报告