工作总结C语言课程设计成绩管理系统1.docx
《工作总结C语言课程设计成绩管理系统1.docx》由会员分享,可在线阅读,更多相关《工作总结C语言课程设计成绩管理系统1.docx(56页珍藏版)》请在冰豆网上搜索。
工作总结C语言课程设计成绩管理系统1
一、课程设计的内容
(1)信息维护:
要求:
学生信息数据要以文件的形式保存,能实现学生信息数据的维护。
此模块包括子模块有:
增加学生信息、删除学生信息、修改学生信息
(2)信息查询:
要求:
查询时可实现按姓名查询、按学号查询
(3)成绩统计:
要求:
A输入任意的一个课程名(如数学)和一个分数段(如60--70),统计出在此分数段的学生情况。
(4)排序:
能对用户指定的任意课程名,按成绩升序或降序排列学生数据并显示排序结果(使用表格的形式显示排序后的输出结果)(使用多种方法排序者,加分)
(二)其它要求:
(1)只能使用C/C++语言,源程序要有适当的注释,使程序容易阅读
(2)至少采用文本菜单界面(如果能采用图形菜单界面更好)
(3)学生可自动增加新功能模块(视情况可另外加分)
(4)写出课程设计报告,具体要求见相关说明文档
二、课程设计的要求与数据
1、进一步掌握和利用C语言进行程设计的能力;
2、进一步理解和运用结构化程序设计的思想和方法;
3、初步掌握开发一个小型实用系统的基本方法;
4、学会调试一个较长程序的基本方法;
5、学会利用流程图或N-S图表示算法;
6、掌握书写程序设计开发文档的能力。
删除
三、课程设计应完成的工作
1、编写完成相应题目的程序;
2、编写课程设计报告,课程设计报告的内容应包括以下6个部分:
1)需求分析:
包括设计题目、设计要求以及系统功能需求分析;
2)总体设计:
包括系统总体设计框架和系统功能模块图;
3)详细设计:
包括主要功能模块的算法设计思路以及对应的工作流程图;
4)调试分析过程描述:
包括测试数据、测试输出结果,以及对程序调试过程中存在问题的思考(列出主要问题的出错现象、出错原因、解决方法及效果等,适当的包含结果截图);
5)总结:
课程设计完成了哪些功能,有没有什么扩展功能?
还有哪些地方需要改进?
课程设计过程中的学习体会与收获、对本次课程设计的认识以及自己的建议等内容;
6)附录:
主要源程序代码,含必要的注释。
3、答辩:
在实验室建立程序运行的环境,并在指导教师的监督下,独立解
决问题、运行程序和回答教师提出的问题。
1设计目的与要求………………………………………………………………P4
2总体设计………………………………………………………………………P4
3详细设计………………………………………………………………………P5
3.1功能模块设计………………………………………………………………P5
3.1.1XX功能模块(可选)…………………………………………………P5
3.1.2YY功能模块(可选)…………………………………………………P6
3.1.3ZZ功能模块(可选)…………………………………………………P7
3.2数据结构设计……………………………………………………………P8
4调试分析……………………………………………………………………P9
4.1结构体……………………………………………………………………P9
4.2链表………………………………………………………………………P11
5遇到的问题及解决方法分析…………………………………………………P12
6总结……………………………………………………………………………P13
7源文件…………………………………………………………………………P13
7.1链表………………………………………………………………………P13
7.2结构体……………………………………………………………………P28
1、目的与要求
一目的:
编制一程序实现对学生成绩的管理,让自己既动手又动脑,独立实践,将课本上的理论知识和实际应用问题进行有机结合,锻炼自己分析、解决实际问题的能力,提高自身项目开发及程序调试能力。
二要求:
1、整个系统均用C语言实现;
2、利用指针、结构体、链表来实现学生成绩的数据结构设计;
3、系统具有输入、显示、查询(查询时可实现按姓名查询、按学号查询)、删除、排序、插入,保存、读取基本功能;
4、系统的各个功能模块都用函数的形式来实现;
5、学生信息数据要以文件的形式保存,能实现学生信息数据的维护。
此模块包括子模块有:
增加学生信息、删除学生信息、修改学生信息;
6、可以输入任意的一个课程名(如数学)和一个分数段(如60--70),统计出在此分数段的学生情况;
7、能对用户指定的任意课程名,按成绩升序或降序排列学生数据并显示排序结果;
8、可自动增加新功能模块;
9、可以将学生信息从文件中读取出来。
2总体设计
1、主函数main()
利用if-else,While循环语句和switch()实现各函数的调用,系统根据输入的数字选项来调用相应的函数。
2、菜单选择函数voidmenu();
这是一个无参函数,主要实现“功能选择”的界面,在这个界面里有显示系统的13大功能,根据每个功能前面的序号进行选择。
等执行完每一个函数功能后,按任‘0’键回到主界面也要通过这个函数提示来实现!
3、自定义函数voidprintstart()、voidWrong()、voidNofind()、voidprintc()、voidprinte(Node*p)
用voidWrong()来提示输入错误,用voidNofind()提示没有找到学生资料,用voidprintc()来输出中文,用voidprinte(Node*p)来输出中文。
main()
voidAdd(Linkl)voidMaths(Linkl)
voidQur(Linkl)voidEnglish(Linkl)
voidDel(Linkl)voidselect(Linkl)
voidModify(Linkl)voidSave(Linkl)
voidDisp(Linkl)voidmenu()
voidTongji(Linkl)voidprintc()
voidChinese(Linkl)voidprinte(Node*p)
3详细设计
3.1功能模块设计
3.1.1排序数学成绩功能模块
函数voidMaths(Linkl)
该函数用于对数学成绩进行降序,ll=(Link)malloc(sizeof(Node))用于做新的链表连接,如果原链表为空的话,返回;不为空的话,p=l->next;建立接点用于保存信息,对指定链表地址进行排序。
流程图如图所示:
Linkll
ll=(Link)malloc(sizeof(Node))用于做新的连表
l->next==NULL
是否
没有资料可以p=l->next
排序while(p)
returns=(Node*)malloc(sizeof(Node))rr=ll
while(rr->next!
=NULL&&rr->next->data.mgrade>=p->data.mgrade)
是rr->next==NULL否
rr->next=ss->next=rr->next;rr->next=s
p=p->next
l->next=ll->next(排序完成)
3.1.2显示学生资料功能模块
函数voidDisp(Linkl)
该函数负责显示学生资料,这是一个不返回值函数。
算法:
先将p结点的指针指向第一个结点,将p结点(即第一个结点)的数据输出。
然后再将p结点的指针指向p指针的的指针(即下一结点),将p结点(即第一结点)的数据输出。
重复执行此步聚直到p指针指向NULL为止。
流程图如图所示:
原来链表是否为空
是否
提示没有p指向下一结点p=p->next
资料可以输出p指向的结点,即学生信息
显示returnp指向下一结点p=p->next
3.1.3删除资料功能模块
函数voidDel(Linkl)
该函数用于有选择地删除学生资料,如果原来的链表为空的话,会返回;不为空的话,选择用按哪种类型删除,如果按学号删除,就输入学号,后判断是否取得地址,取得就执行删除;按名字删除就输入名字,运行同学号一样。
流程图如图所示:
原链表是否为空
是否
没有资料1按1学号还是2按名字?
2
可以删除输入你要删除的学号输入你要删除的名字
P是否取得输入地址P是否取得输入地址
是否否是
Returnr指向下一Nofind()Nofind()r指向下一
结点结点
执行free(p)执行free(p)
3.2数据结构设计(可选)
一个结构体变量中可以存放一组数据(如一个学生的学号、姓名、成绩等数据)。
一个结构体变量的指针就是该变量所占据的内存段起始地址。
可以设一个指针变量,用来指向一结构体变量,此时指针变量的值是结构体的起始地址。
指针量变也可以用来指向一结构体数组中的元素。
structstudent
{
charnum[10];/*学号*/
charname[20];
charsex[4];
intcgrade;
intmgrade;
integrade;
inttotle;
intave;
charneartime[10];/*最近更新时间*/
};
typedefstructnode
{
structstudentdata;
structnode*next;
}Node,*Link;
6总结
经过一个多星期的C语言课程设计,感觉自己收获不少!
首先是:
要达到这样的功能,使用链表相当方便,但不容易理解,所以在这方面我很了很多的时间看课本,使C语言的知识强化了不少。
其次,在做课程设计的过程中,发现了平时很多没有注意到的问题,例如:
返回值函数和不返回值函数两者在主函数中的调用是不同的…………
更重要的是,这次课程设计虽然花了我不少时间,但正是这些时间,让我见识到了C语言的重要性。
这个学生成绩管理系统都是在自己知识范围内完成的,所以界面清晰简单,可能不是很好看,但绝对实用!
从这里我也得到一个体会,做一个程序,或者开发一个软件,应该着重从它的后台制作入手,不能做出一个中看不中用的程序或者软件。
相信这次的课程设计使我的C语言知识扎实了很多。
由于这是第一次进行设计,写文档,难免会写得不好!
7源程序
7.1链表
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
intshoudsave=0;/**/
structstudent
{
charnum[10];/*学号*/
charname[20];
charsex[4];
intcgrade;
intmgrade;
integrade;
inttotle;
intave;
charneartime[10];/*最近更新时间*/
};
typedefstructnode
{
structstudentdata;
structnode*next;
}Node,*Link;
voidmenu()
{
printf("********************************************************************************");
printf("\t1登记学生资料\t\t\t\t\t2删除学生资料\n");
printf("\t3查询学生资料\t\t\t\t\t4修改学生资料\n");
printf("\t5显示学生资料\t\t\t\t\t6统计学生资料\n");
printf("\t7排序语文成绩\t\t\t\t\t8排序数学成绩\n");
printf("\t9排序英语成绩\t\t\t\t\t10选出分段分数\n");
printf("\t11保存学生资料\t\t\t\t\t12帮助信息\t\t\n");
printf("\t0退出系统\t\t\t\t\t\t\t\n");
printf("********************************************************************************\n");
}
voidprintstart()
{
printf("-----------------------------------------------------------------------\n");
}
voidWrong()
{
printf("\n=====>提示:
输入错误!
\n");
}
voidNofind()
{
printf("\n=====>提示:
没有找到该学生!
\n");
}
voidprintc()/*本函数用于输出中文*/
{
printf("学号\t姓名\t性别语文成绩数学成绩英语成绩总分平均分\n");
}
voidprinte(Node*p)/*本函数用于输出英文*/
{
printf("%-12s%s\t%s\t%d\t%d\t%d\t%d\t%d\n",p->data.num,p->data.name,p->data.sex,p->data.egrade,p->data.mgrade,p->data.cgrade,p->data.totle,p->data.ave);
}
Node*Locate(Linkl,charfindmess[],charnameornum[])/*该函数用于定位连表中符合要求的接点,并返回该指针*/
{
Node*r;
if(strcmp(nameornum,"num")==0)/*按学号查询*/
{
r=l->next;
while(r!
=NULL)
{
if(strcmp(r->data.num,findmess)==0)
returnr;
r=r->next;
}
}
elseif(strcmp(nameornum,"name")==0)/*按姓名查询*/
{
r=l->next;
while(r!
=NULL)
{
if(strcmp(r->data.name,findmess)==0)
returnr;
r=r->next;
}
}
return0;
}
voidAdd(Linkl)/*增加学生*/
{
Node*p,*r,*s;
charnum[10];
r=l;
s=l->next;
while(r->next!
=NULL)
r=r->next;/*将指针置于最末尾*/
while
(1)
{
printf("请你输入学号(以'0'返回上一级菜单:
)");
scanf("%s",num);
if(strcmp(num,"0")==0)
break;
while(s)
{
if(strcmp(s->data.num,num)==0)
{
printf("=====>提示:
学号为'%s'的学生已经存在,若要修改请你选择'4修改'!
\n",num);
printstart();
printc();
printe(s);
printstart();
printf("\n");
return;
}
s=s->next;
}
p=(Node*)malloc(sizeof(Node));
strcpy(p->data.num,num);
printf("请你输入姓名:
");
scanf("%s",p->data.name);
getchar();
printf("请你输入性别:
");
scanf("%s",p->data.sex);
getchar();
printf("请你输入语文成绩:
");
scanf("%d",&p->data.cgrade);
getchar();
printf("请你输入数学成绩:
");
scanf("%d",&p->data.mgrade);
getchar();
printf("请你输入英语成绩:
");
scanf("%d",&p->data.egrade);
getchar();
p->data.totle=p->data.egrade+p->data.cgrade+p->data.mgrade;
p->data.ave=p->data.totle/3;
/*信息输入已经完成*/
p->next=NULL;
r->next=p;
r=p;
shoudsave=1;
}
}
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\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\t\t查找结果\n");
printstart();
printc();
printe(p);
printstart();
}
else
Nofind();
}
else
Wrong();
}
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();
}
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("请你输入新的语文成绩(原来是%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();
}
voidDisp(Linkl)
{
intcount=0;
Node*p;
p=l->next;
if(!
p)
{
printf("\n=====>提示:
没有资料可以显示!
\n");
return;
}
printf("\t\t\t\t显示结果\n");
printstart();
printc();
printf("\n");
while(p)
{
printe(p);
p=p->next;
}
printstart();
printf("\n");
}
voidTongji(Linkl)
{
Node*pm,*pe,