学生成绩管理系统 毕业课程设计报告.docx

上传人:b****7 文档编号:16108288 上传时间:2023-07-10 格式:DOCX 页数:47 大小:477.06KB
下载 相关 举报
学生成绩管理系统 毕业课程设计报告.docx_第1页
第1页 / 共47页
学生成绩管理系统 毕业课程设计报告.docx_第2页
第2页 / 共47页
学生成绩管理系统 毕业课程设计报告.docx_第3页
第3页 / 共47页
学生成绩管理系统 毕业课程设计报告.docx_第4页
第4页 / 共47页
学生成绩管理系统 毕业课程设计报告.docx_第5页
第5页 / 共47页
学生成绩管理系统 毕业课程设计报告.docx_第6页
第6页 / 共47页
学生成绩管理系统 毕业课程设计报告.docx_第7页
第7页 / 共47页
学生成绩管理系统 毕业课程设计报告.docx_第8页
第8页 / 共47页
学生成绩管理系统 毕业课程设计报告.docx_第9页
第9页 / 共47页
学生成绩管理系统 毕业课程设计报告.docx_第10页
第10页 / 共47页
学生成绩管理系统 毕业课程设计报告.docx_第11页
第11页 / 共47页
学生成绩管理系统 毕业课程设计报告.docx_第12页
第12页 / 共47页
学生成绩管理系统 毕业课程设计报告.docx_第13页
第13页 / 共47页
学生成绩管理系统 毕业课程设计报告.docx_第14页
第14页 / 共47页
学生成绩管理系统 毕业课程设计报告.docx_第15页
第15页 / 共47页
学生成绩管理系统 毕业课程设计报告.docx_第16页
第16页 / 共47页
学生成绩管理系统 毕业课程设计报告.docx_第17页
第17页 / 共47页
学生成绩管理系统 毕业课程设计报告.docx_第18页
第18页 / 共47页
学生成绩管理系统 毕业课程设计报告.docx_第19页
第19页 / 共47页
学生成绩管理系统 毕业课程设计报告.docx_第20页
第20页 / 共47页
亲,该文档总共47页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

学生成绩管理系统 毕业课程设计报告.docx

《学生成绩管理系统 毕业课程设计报告.docx》由会员分享,可在线阅读,更多相关《学生成绩管理系统 毕业课程设计报告.docx(47页珍藏版)》请在冰点文库上搜索。

学生成绩管理系统 毕业课程设计报告.docx

学生成绩管理系统毕业课程设计报告

(此文档为word格式,下载后您可任意编辑修改!

中南大学

《C语言程序设计》

课程设计报告

课题名称:

学生成绩管理系统

 

专业

电气信息

学生姓名

舒畅

班级

0914

学号

指导教师

穆帅

完成日期

2010年7月10日

 

信息科学与工程学院

 

1课程设计的目的1

2设计内容与要求1

3主要技术指标及特点2

3.1登录界面显示2

3.2登记学生资料3

3.3保存学生资料4

3.4删除学生资料4

3.5修改学生资料6

3.6查询学生资料7

3.6统计学生资料7

3.8对学生资料进行排序9

3.9程序主要代码10

4设计小结31

成绩管理系统

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.----\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?

(yn):

",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.total3;

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.total3;

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?

(yn):

",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("\n");

getchar();

return;

}

v=v->next;

}

newinfo=(Node*)malloc(sizeof(Node));

if(!

newinfo)

{

printf("\nFailedtoallocateresources");*如没有申请到,打印提示信息*

return;*返回主界面*

}

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 经管营销 > 金融投资

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2