学生成绩管理系统课程设计报告.docx
- 文档编号:9426706
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:47
- 大小:550.89KB
学生成绩管理系统课程设计报告.docx
《学生成绩管理系统课程设计报告.docx》由会员分享,可在线阅读,更多相关《学生成绩管理系统课程设计报告.docx(47页珍藏版)》请在冰豆网上搜索。
学生成绩管理系统课程设计报告
中南大学
《C语言程序设计》
课程设计报告
课题名称:
学生成绩管理系统
专业
学生姓名
班级
学号
指导教师
完成日期
信息科学与工程学院
成绩管理系统
1课程设计的目的
1.加深对《C语言程序设计》课程知识的理解,掌握C语言应用程序的开发方法和步骤;
2.进一步掌握和利用C语言进行程设计的能力;
3.进一步理解和运用结构化程序设计的思想和方法;
4.初步掌握开发一个小型实用系统的基本方法;
5.学会调试一个较长程序的基本方法;
6.学会利用流程图或N-S图表示算法;
7.掌握书写程设计开发文档的能力(书写课程设计报告)。
2设计内容与要求
设计内容:
成绩管理系统
现有学生成绩信息,内容如下:
姓名学号C数学英语
shuchang12999899
jiutian32876887
changzi33988999
jiutia1374345
设计要求:
✧封面(参见任务书最后一页)
✧系统描述:
分析和描述系统的基本要求和内容;
✧功能模块结构:
包括如何划分功能模块,各功能模块之间的结构图,以及各模块的功能描述;
✧数据结构设计:
设计数据结构以满足系统的功能要求,并加以注释说明;
✧主要模块的算法说明:
即实现该模块的思路;
✧运行结果:
包括典型的界面、输入和输出数据等;
✧总结:
包括C语言程序设计实践中遇到的问题,解决问题的过程及体会、收获、对程序开发的认识与思考等。
✧附录:
包括主要程序清单,要有适当的注释,使程序容易阅读。
3主要技术指标及特点
程序流程图如下:
3.1登录界面显示
此登录界面是预先设定好作为菜单来显示的,在主函数中以menu()来实现的,在函数中,是通过switch……case来实现选择功能的,用户可以通过需要进行选择,方便了用户的使用,非常人性化。
3.2登记学生资料
当系统中没有保存学生信息时,就会提示没有学生记录!
也就是说不能从文件中导出,这时就需要用户进行学生资料的导入,当输入的学号已经存在时,系统会提示用户重新输入一个未被占用的学号信息,否则就重新分配内存空间。
3.3保存学生资料
该操作是将用户输入的学生信息进行保存,用文件的方法进行调试,当用户输入对象的个数超过0时,显示保存成功,否则提示,系统连接为空。
3.4删除学生资料
这里又是通过switch……case函数的调用,让用户进行选择,共有两种方法:
1.按照学号2.按照姓名,操作完成后,系统会自动提示,该学生已经成功删除,当再次显示的时候,函数中的链表就不再指向该学号,从而起到删除的作用。
删除完成后,再次保存一下学生资料,不然系统仍然默认为原始人数。
3.5修改学生资料
通过选择到达修改界面:
此时将呈现出现有的学生资料,按照要求将新的信息输入其中,再保存资料,如果输入的学号系统中未显示,那么系统则提示没有资料可以修改。
这个为修改完的图片
3.6查询学生资料
按照选择,则会呈现出用户需要查找的所有信息,每次呈现出来的时候都要用之前定义的printheader()函数,这个很好地将数据按照格式化的形式显现出来。
此为按照学号查找的例子,按照姓名查找是同样道理。
3.6统计学生资料(自加功能)
统计学生资料主要还是用的switch……case函数,通过选择,用printheader(),printdata(r),printf(END)等函数用表格的形式将符合条件的学生信息全部显示出来,不过唯一不足的就是所有的学生信息没有能够连贯起来,每个学生信息前面都有表头,没处理好。
3.8对学生资料进行排序
该图显示的是按照语文成绩排序完的结果,用链表将数据进行一个接一个的比较,按照降序将学生信息排列下来,最后提示排序已经完成,并将所有结果按照用户要求显示出来。
3.9程序主要代码
主函数
#include"stdio.h"/*标准输入输出函数库*/
#include"stdlib.h"/*标准函数库*/
#include"string.h"/*字符串函数库*/
#include"conio.h"/*屏幕操作函数库*/
#defineHEADER1"----------------------------student'sinformation----------------------------\n"
#defineHEADER2"|Number|Name|C|Math|English|Total|Average|\n"
#defineHEADER3"|---------------|---------------|----|----|----|--------|-------|"
#defineFORMAT"|%-10s|%-15s|%4d|%4d|%4d|%4d|%.2f|\n"
#defineDATAp->data.num,p->data.name,p->data.egrade,p->data.mgrade,p->data.cgrade,p->data.total,p->data.ave
#defineEND"--------------------------------------------------------------\n"
intshoudsave=0;/**/
structstudent
{
charnum[10];/*Number*/
charname[20];
charsex[4];
intcgrade;
intmgrade;
integrade;
inttotal;
floatave;
charneartime[10];/*最近更新时间*/
};
typedefstructnode
{
structstudentdata;
structnode*next;
}Node,*Link;
菜单函数
voidmenu()
{
system("cls");/*调用DOS命令,清屏.与clrscr()功能相同*/
cprintf("\n");
printf("@@@@@Students'performancemanagementsystem@@@@@@\n\n");
printf("@@@@@@@@@@@@@@@@@@@@@@@Menu@@@@@@@@@@@@@@@@@@@@@@@@\n");
printf("*1input2delete*\n");
printf("*3search4modify*\n");
printf("*5insert6count*\n");
printf("*7sort8save*\n");
printf("*9dispaly0exit*\n");
printf("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n");
/*cprintf()送格式化输出至文本窗口屏幕中*/
}
voidprintheader()/*格式化输出表头*/
{
printf(HEADER1);
printf(HEADER2);
printf(HEADER3);
}
voidprintdata(Node*pp)/*格式化输出表中数据*/
{
Node*p;
p=pp;
printf(FORMAT,DATA);
}
voidWrong()
{
printf("\n=====>error!
\n");
}
voidNofind()
{
printf("\n=====>Norecordnow!
PleasepressEnter\n");
}
voidDisp(Linkl)/*显示单链表l中存储的学生记录,内容为student结构中定义的内容*/
{
Node*p;
p=l->next;/*l存储的是单链表中头结点的指针,该头结点没有存储学生信息,指针域指向的后继结点才有学生信息*/
if(!
p)/*p==NULL,NUll在stdlib中定义为0*/
{
printf("\n=====>Norecordnow!
PleasepressEnter\n");
getchar();
return;
}
printf("\n\n");
printheader();/*输出表格头部*/
while(p)/*逐条输出链表中存储的学生信息*/
{
printdata(p);
p=p->next;/*移动直下一个结点*/
printf(HEADER3);
}
getchar();
}
/*************************************************************
作用:
用于定位链表中符合要求的节点,并返回指向该节点的指针
参数:
findmess[]保存要查找的具体内容;nameornum[]保存按什么查找;
在单链表l中查找;
**************************************************************/
Node*Locate(Linkl,charfindmess[],charnameornum[])/*该函数用于定位连表中符合要求的接点,并返回该指针*/
{
Node*r;
if(strcmp(nameornum,"num")==0)/*按Number查询*/
{
r=l->next;
while(r!
=NULL)
{
if(strcmp(r->data.num,findmess)==0)
returnr;
r=r->next;
}
}
elseif(strcmp(nameornum,"name")==0)/*按Name查询*/
{
r=l->next;
while(r!
=NULL)
{
if(strcmp(r->data.name,findmess)==0)
returnr;
r=r->next;
}
}
return0;
}
/*增加学生记录*/
voidAdd(Linkl)
{
Node*p,*r,*s;/*实现添加操作的临时的结构体指针变量*/
charch,flag=0,num[10];
r=l;
s=l->next;
system("cls");
Disp(l);/*先打印出已有的学生信息*/
while(r->next!
=NULL)
r=r->next;/*将指针移至于链表最末尾,准备添加记录*/
while
(1)/*一次可输入多条记录,直至输入Number为0的记录结点添加操作*/
{
while
(1)/*输入Number,保证该Number没有被使用,若输入Number为0,则退出添加记录操作*/
{
printf("pleaseinputtheNumber(press'o'toupperlevel):
");
scanf("%s",num);
flag=0;
if(strcmp(num,"0")==0)/*输入为0,则退出添加操作,返回主界面*/
{return;}
s=l->next;
while(s)/*查询该Number是否已经存在,若存在则要求重新输入一个未被占用的Number*/
{
if(strcmp(s->data.num,num)==0)
{
flag=1;
break;
}
s=s->next;
}
if(flag==1)/*提示用户是否重新输入*/
{getchar();
printf("=====>Number%sexistedalready!
PleasepressEnter.inputagain?
(y/n):
",num);
scanf("%c",&ch);
if(ch=='y'||ch=='Y')
continue;
else
return;
}
else
{break;}
}
p=(Node*)malloc(sizeof(Node));/*申请内存空间*/
if(!
p)
{
printf("\nAllocatememoryfailure");/*如没有申请到,打印提示信息*/
return;/*返回主界面*/
}
strcpy(p->data.num,num);/*将字符串num拷贝到p->data.num中*/
printf("pleaseinputtheName:
");
scanf("%s",p->data.name);
getchar();
printf("pleaseinputthescoreofC:
");
scanf("%d",&p->data.cgrade);
getchar();
printf("pleaseinputthescoreofMath:
");
scanf("%d",&p->data.mgrade);
getchar();
printf("pleaseinputthescoreofEnglish:
");
scanf("%d",&p->data.egrade);
p->data.total=p->data.egrade+p->data.cgrade+p->data.mgrade;
p->data.ave=p->data.total/3;
getchar();
/*信息输入已经完成*/
p->next=NULL;
r->next=p;
r=p;
shoudsave=1;
}
}
查询函数
voidQur(Linkl)/*按Number或Name,查询学生记录*/
{
intsel;/*1:
按Number查,2:
按Name查,其他:
返回主界面(菜单)*/
charfindmess[20];/*保存用户输入的查询内容*/
Node*p;
if(!
l->next)/*若链表为空*/
{
system("cls");
printf("\n=====>Norecordnow!
PleasepressEnter\n");
return;
}
system("cls");
printf("\n=====>1SearchbyNumber\n=====>2SearchbyName\n");
printf("select[1,2]:
");
scanf("%d",&sel);
if(sel==1)/*Number*/
{
printf("pleaseinputtheNumberyouwanttosearch:
");
scanf("%s",findmess);
p=Locate(l,findmess,"num");/*在l中查找Number为searchinput值的节点,并返回节点的指针*/
if(p)/*若p!
=NULL*/
{
printheader();
printdata(p);
printf(END);
printf("pressanykeytoback");
getchar();
}
else
Nofind();
getchar();
}
elseif(sel==2)/*Name*/
{
printf("pleaseinputtheNameyouwanttosearch:
");
scanf("%s",findmess);
p=Locate(l,findmess,"name");
if(p)
{
printheader();
printdata(p);
printf(END);
printf("pressanykeytoback");
getchar();
}
else
Nofind();
getchar();
}
else
Wrong();
}
删除函数
/*删除学生记录:
先找到保存该学生记录的节点,然后删除该节点*/
voidDel(Linkl)/*删除*/
{
intsel;
Node*p,*r;
charfindmess[20];
if(!
l->next)
{
printf("\n=====>norecord!
\n");
getchar();
return;
}
printf("\n=====>1DeletebyNumber\n=====>2DeletebyName\n");
scanf("%d",&sel);
if(sel==1)
{
printf("pleaseinputtheNumberyouwanttodelete:
");
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=====>Deletesuccessful!
\n");
getchar();
shoudsave=1;
}
else
Nofind();
}
elseif(sel==2)
{
printf("pleaseinputtheNameyouwanttodelete:
");
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=====>Deletesuccessful!
\n");
getchar();
shoudsave=1;
}
else
Nofind();
getchar();
}
else
Wrong();
getchar();
}
修改函数
/*修改学生记录。
先按输入的Number查询到该记录,然后提示用户修改Number之外的值,Number不能修改*/
voidModify(Linkl)
{
Node*p;
charfindmess[20];
if(!
l->next)
{system("cls");
printf("\n=====>norecord!
\n");
getchar();
return;
}
system("cls");
printf("modifytheinformation");
Disp(l);
printf("pleaseinputtheNumberyouwanttomodify:
");
scanf("%s",findmess);
p=Locate(l,findmess,"num");
if(p)
{
printf("pleaseinputthenewNumber(whichwas%s):
",p->data.num);
scanf("%s",p->data.num);
printf("pleaseinputthenewName(whichwas%s):
",p->data.name);
scanf("%s",p->data.name);
getchar();
printf("pleaseinputthenewCscore(whichwas%d):
",p->data.cgrade);
scanf("%d",&p->data.cgrade);
getchar();
printf("pleaseinputthenewMathscore(whichwas%d):
",p->data.mgrade);
scanf("%d",&p->data.mgrade);
getchar();
printf("pleaseinputthenewEnglishscore(whichwas%d):
",p->data.egrade);
scanf("%d",&p->data.egrade);
p->data.total=p->data.egrade+p->data.cgrade+p->data.mgrade;
p->data.ave=p->data.total/3;
printf("\n=====>modifysuccessful!
\n");
shoudsave=1;
getchar();
}
else
Nofind();
getchar();
}
插入函数
/*插入记录:
按Number查询到要插入的节点的位置,然后在该Number之后插入一个新节点。
*/
voidInsert(Linkl)
{
Linkp,v,newinfo;/*p指向插入位置,newinfo指新插入记录*/
charch,num[10],s[10];/*s[]保存插入点位置之前的Number,num[]保存输入的新记录的Number*/
intflag=0;
v=l->next;
system("cls");
Disp(l);
while
(1)
{printf("pleaseinputtheNumberyouwanttoinsert:
\n");
scanf("%s",num);
flag=0;v=l->next;
while(v)/*查询该Number是否存在,flag=1表示该Number存在*/
{
if(strcmp(v->data.num,s)==0){flag=1;break;}
v=v->next;
}
if(flag==1)
break;/*若Number存在,则进行插入之前的新记录的输入操作*/
else
{getchar();
printf("\n=====>Number%snorecord,tryagain?
(y/n):
",s);
scanf("%c",&ch);
if(ch=='y'||ch=='Y')
{continue;}
else
{return;}
}
}
/*以下新记录的输入操作与Add()相同*/
printf("pleaseinputtheNumberyouwantyoadd:
\n");
scanf("%s",num);
v=l->next;
while(v)
{
if(strcmp(v->data.num,num)==0)
{
printf("=====>sorry,newNumber:
'%s'!
existingalready\n",num);
printheader();
printdata(v);
printf("
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 学生 成绩管理系统 课程设计 报告