《C+ + 学生成绩管理系统》的设计与实现_第1页
《C+ + 学生成绩管理系统》的设计与实现_第2页
《C+ + 学生成绩管理系统》的设计与实现_第3页
《C+ + 学生成绩管理系统》的设计与实现_第4页
《C+ + 学生成绩管理系统》的设计与实现_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

《C++学生成绩管理系统》的设计与实现

一、概述:

1、每一条记录包括一种学生的学号、姓名、3门成绩、平均成绩。

poweredby25175.net

2、输入功能:可以一次完毕无数条记录的输入。

3、显示功能:完毕所有学生记录的显示。

4、查找功能:完毕按姓名查找学生记录,并显示。

5、排序功能:按学生平均成绩进行排序。

6、插入功能:按平均成绩高下插入一条学生记录。

7、保留功能:将学生记录保留在任何自定义的文献中,如保留在:c:\scoreo

8、读取功能:将保留在文献中日勺学生记录读取出来。

9、有一种清晰美观界面来调用各个功能

二、规定

1、整个系统均用C语言实现;

2、运用指针、链表来实现学生成绩的数据构造设计;

3、系统具有输入、显示、查询、删除、排序、插入,保留、读取基本功能:

4、系统的各个功能模块都用函数日勺形式来实现;

5、可以将学生成绩信息保留在文献中。

6、可以将学生信息从文献中读取出来。

三、内容

整个系统除了主函数外,此外尚有10个函数,实现八大功能:输入功能、显示

功能、查找功能、排序功能、插入功能、保留功能、读取功能。各个函数的详细

设计阐明分别如下:

1、主函数main()

运用无限次循环for(;;)和swithch。实现各函数的调用,系统根据输入的数字选

项来调用对应内函数。

2、初始化函数STUDENT*init()

这是一种无参函数,里面只有一种语句,它的作用是使链表初始化,使head口勺值

为NULL。例如:没有这个函数的I话,在你没有输入任何数据日勺状况下,去执行

显示功能的I时候会显示某些乱码!

3、菜单项选择择函数intmenu_select();

这是一种无参函数,重要实现''功能选择〃的界面,在这个界面里有显示系统日勺九

大功能,根据每个功能前面的序号进行选择,中间还显示系统目前的时间。等执

行完每一种函数功能后,按任一键回到主界面也要通过这个函数来实现!

4、输入记录函数STUDENT*create()

这是一种无参函数,用来执行第学生成绩记录时输入,当学生为0时停止输入,

函数结束后,带回一种指向链表头的指针head。

算法:先申明一种首节点head,并将headonext设为NULL。每输入一种数据

就申明一种新节点P,把p->next设为NULL,并且链接到之前列表H勺尾端,

5、显示记录函数voidprint(STUDENT*head)

这是一种不返回值日勺有参函数,形参为''链表头的指针〃,负责对所有学生成绩记

录日勺输出,局限性之处就是不能对学生成绩进行分页显示。

算法:先将p结点的指针指向第一种结点,将p结点(即第一种结点)欧I数据输出。

然后再将p结点日勺指针指向p指针的日勺指针(即下一结点),将p结点(即第一结

点)的数据输出。反复执行此步聚直到p指针指向NULL为止。

6、查找记录函数voidsearch(STUDENT*head)

这是一种不返回值日勺有参函数,形参为''链表头的指针〃,实现按学号对某个学生

进行查找,并显示所查找到H勺记录。

算法:采用线性查找法往下一种节点查找。输入所要查找日勺学生的学号S,设一

种指针变量P,先指向第一种结点,当strcmp(p->name,s)&&p!=NULL时,

使P后移一种结点,假如p!=NULL,输出p所指的结点

7、删除记录函数STUDENT*delete(STUDENT*head)poweredby

25175.net

这是一种有参函数,形参为''链表头的指针〃,先输入要删除日勺学生记录的学号,

找到后显示该学生信息,等确认后便可按''Y〃进行删除。

算法:从p指向H勺第一种结点开始,检查该结点中的num值与否等于输入的规

定删除日勺那个学号。假如相等就将该结点删除,如不相等,就将p后移一种结点,

再如此进行下去,直到碰到表尾为止。

8、排序函数STUDENT*sort(STUDENT*head)

这是一种有参函数,形参为''链表头的指针〃,按学生成绩H勺平均分高下进行排序,

还可以显示名次。

9、插入函数STUDENT*insert(STUDENT*head,STUDENT*new)

这是一种有参函数,形参有两个,一种是''链表头的指针〃,一种是''待插入指针〃,

按照本来成绩平均分的高下进行插入,插入后会重新进行排序,并返回。

算法:先将学生的成绩按平均分由高分到低分进行排序,再插入一种新生的结点,

规定按平均分的高下次序插入。先用指针变量po指向待插入的结点,pl指向第

一种结点。假如pO->average<pl->average,则待插入日勺结点不应插在pl所指

的结点之前。此时将pl后移,并使p2指向刚刚pl所指H勺结点。反复以上的环

节,直到pO->average>=pl->dverage为止。这时将pO指向的结点插到pl所

指结点之前。不过假如pl所指的已是表尾结点,则pl就不应后移了。假如

pO->average比所有结点的average都小,则应将pO所指的结点插到链表末尾。

假如插入的位置既不在第一种结点之前,又不在表尾结点之后,则将pO的值赋

给p2->,使p2->next指向待插入的结点,然后将pl『、J值赋给pO->next,使得

pO->next指向pl指向日勺变量。假如插入位置为第一种结点之前,则将pO赋给

head,将pl赋给pO->next。假如要插到表尾之后,应将pO赋给pl->next,

NULL赋给pO->nextc最终再调用排序日勺函数,将学生成绩重新排序.

10、保留数据到文献函数voidsave(STUDENT*head)

这是一种不返回值日勺有参函数,形参为''链表头的指针〃,可以把学生记录保留在

电脑上由自己任意命名的一进制文献。

11、从文献读数据函数STUDENT*load()

这是一种不返回值日勺有参函数,形参为''链表头的指针〃,根据输入的I文献地址进

行读取。

四、调试分析

(1)刚开始没有那个初始化函数,程序运行后,没有输入任何数据就试得去执

行显示功能,成果显示日勺是某些乱码!加入初始化函数后,这种现象也随之消失。

(2)刚开始执行输入函数,按学号次序输入十个学生日勺成绩,输完后执行显示功

能,学生成绩记录是按学号的反次序显示时,试着在其中增长某些语句,但愿能

把学号按正常次序显示,但临时没有成功,因此在输入成绩时只能按学号反次序

输入,最终就按学号正常次序输出了。

(3)刚开始时,先把成绩按平均分排序,再插入一种学生日勺成绩,执行显示功

能,虽然插入的学生的成绩能正常插入,但该学生的名次为0。后来,在插入成

绩之后,调用排序函数,把所有成绩重新排序一次。

(4)在输入函数中设了一种无限循环,可以输入无数个学生的成绩信息,当学

号为。日勺时候则停止输入。

(5)输入太多种学生H勺成绩时,屏幕显示不能控制为一页一页显示,所认为了

以便起见,不要输入太多记录,十七左右为最佳。

(6)在没有输入任何信息H勺状况下,去执行排序功能,最终显示有一种记录,

学号、姓名为空白,成绩都为0,名次为1。

(7)在输入选项时不能输入字母,否则会死循环,提议不要乱输字母。

五、总结

通过一种多星期的C语言课程设计,感觉自己收获不少!

首先是:链表本来上课是没有上的,但这个课程设计里面重要都是用链表,由于

要到达这样H勺功能,使用链表相称以便,但不轻易理解,因此在这方面我很了诸

多日勺时间看书本和参照课外书,使C语言的知识强化了不少。

另一方面,在做课程设计时过程中,发现了平时诸多没有注意到日勺问题,例如:

返回值函数和不返回值函数两者在主函数中日勺调用是不一样日勺......

更重要日勺是,这次课程设计虽然花了我不少时间,但正是这些时间,让我见识到

了C语言的重要性。这个学生成绩管理系统都是在自己知识范围内完毕日勺,因此

界面清晰简朴,也许不是很好看,但绝对实用!

从这里我也得到一种体会,做一种程序,或者开发一种软件,应当着重从它的后

台制作入手,不能做出一种中看不中用的程序或者软件。

相信这次的课程设计为我后来继续从事计算机工作打了一种小小日勺开头。

由于这是第一次进行设计,写文档,难免会写得不好!

学生成绩管理系统

/*头文献*/

#include<stdio.h>

#include<dos.h>

#include<stdlib.h>/*其他阐明*/poweredby25175.net

#include<string.h>/*字符串函数*/

#include<mem.h>/*内存操作函数*/

#include<ctype.h>/*字符操作函数*/

#include<alloc.h>/*动态地址分派函数*/

#defineLENsizeof(STUDENT)

typedefstructstu产定义构造体数组用于缓存数据*/

{charnum[6];

charname[5];

intscore[3];

intsum;

floataverage;

intorder;

structstu*next;

}STUDENT;

/*函数原型*/

STUDENT*init();/*初始化函数by25175*/

intmenu_select();/*菜单函数*/

STUDENT*create();/*创立链表*/

voidprint(STUDENT*head);/*显示所有记录*/

voidsearch(STUDENT*head);/*查找记录*/

STUDENT*delete(STUDENT*head);/*删除记录*/

STUDENT*sort(STUDENT*head);/*排序*/

STUDENT*insert(STUDENT*head,STUDENT*new);/*插入记录*/

voidsave(STUDENT*head);/*保留文献*/

STUDENT*load();/*读文献*/

/*主函数界面*/

main()

{STUDENT*headznew;

head=init();/*链表初始化,使head日勺值为NULL*/

for(;;)/*循环无限次*/

{switch(menu_select())

{

casel:head=create();break;

case2:print(head);break;

case3:search(head);break;

case4:head=delete(head);break;

case5:head=sort(head);break;

case6:head=insert(head,&new);break;/*&new表达返回地址*/

case7:save(head);break;

case8:head=load();break;

case9:exit(0);/*如菜单返回值为9则程序结束*/

)

)

)

/*初始化函数*/

STUDENT*init()

{

returnNULL;/*返回空指针*/

)

/*菜单项选择择函数*/

menu_select()

{intn;

structdated;/*定义时间构造体*/

getdate(&d);/*读取系统日期并把它放到构造体d中*/

printf("pressanykeytoenterthemenu.....");/*按任一键进入主菜单*/

getch();/*从键盘读取一种字符,但不显示于屏幕*/

clrscr();/*清屏*/

z^cz^c51cJ♦Cz*c")・

printf(H\t\tWelcometo\n");

printf("\n\t\tThestudentscoremanagesystem\n");

pr।ntf(”*************************************E***************

**********************),

printf("\t\t\tl.Entertherecord\n");/*输入学生成绩记录*/

printf("\t\t\t2.Printtherecord\n");/*显示*/

printf("\t\t\t3.Searchrecordonname\n");/*寻找*/

printf("\t\t\t4.Deletearecord\n");/*删除*/

printf("\t\t\t5.Sorttomakenewafile\n");/*排序*/

printf("\t\t\t6.Insertrecordtolist\n");/*插入*/

printf("\t\t\t7.Savethefile\n");/*保留*/

printf("\t\t\t8.Loadthefile\n");/*读取*/

printf("\t\t\t9.Quit\n");/*退出*/

printf("\n\t\tMadebyHuHaihong.\n");

•.「

rII/II^Lz

%11\

^T*\■■

V1)f

printf("\t\t\t\t%d\\%d\\%d\n"zd.da_year,d.da_mon,d.da_day);/*显示目

前系统日期*/

do{

printf("\n\t\t\tEnteryourchoice(l~9):");

scanf("%d",&n);

}while(n<l||n>9);/*假如选择项不在1~9之间则重输*/

return(n);/*返回选择项,主函数根据该数调用对应H勺函数*/

)

/*输入函数*/

STUDENT*create()

{inti,s;

STUDENT*head=NULLz*p;/*定义函数,此函数带回一种指向链表头的指针

*/

clrscr();

for(;;)

{p=(STUDENT*)malloc(LEN);/*开辟一种新的单元*/

if(!p)/*假如指针p为空*/

{printf("\nOutofmemory.");/*输出内存溢出*/

return(head);/*返回头指针,下同*/

)

printf("Enterthenum(0:listend):");

scanf("%s"zp->num);

if(p->num[O]=='O,)break;/*假如学号首字符为0则结束输入*/

printf("Enterthename:");

scanf("%s",p->name);

printf("Pleaseenterthe%dscores\n",3);/*提醒开始输入成绩*/

s=0;/*计算每个学生的总分,初值为0*1

for(i=0;i<3;i++)/*3门课程循环3次*/

{

do{

printf("score%d/,i+1);

scanf("%d",&p->score[i]);

if(p->score[i]<0||p->score[i]>100)/*保证成绩在0~100之间*/

printf("Dataerror,pleaseenteragain.\n");

}while(p->score[i]<0||p->score[i]>100);

s=s+p->score[i];/*累加各门成绩*/

)

p->sum=s;/*将总分保留*/

p->average=(float)s/3;/*先用强制类型转换将s转换成float型,再

求平均值*/

p->order=0;/*未排序前此值为07

p->next=head;/*将头结点做为新输入结点时后继结点*/

head=p;/*新输入结点为新日勺头结点*/

)

return(head);

)

/*显示所有记录函数*/

voidprint(STUDENT*head)

{inti=0;/*记录记录条数*/

STUDENT*p;/*移动指针*/

clrscr();

p=head;/*初值为头指针*/

printf("\n************************************STUDENT***********

*4*")■

printf("----------------------------------------------------------------------------------\n");

printf("|Rec

|Num|Name|Scl|Sc2|Sc3|Sum|

Ave|Order|\n");

printf("----------------------------------------------------------------------------------\n");

while(p!=NULL)

i++;

printf("|%3d

|%4s|%-4s|%3d|%3d|%3d|%3d|

%4.2f|%-5d|\n"z

iz

p->num,p->name/p->score[0],p->score[l],p->score[2]zp->sum,p->averagez

p->order);

p=p->next;

)

printf("----------------------------------------------------------------------------------\n");

\n");

)

/*查找记录函数*/

voidsearch(STUDENT*head)

{STUDENT*p;/*移动指针*/

chars[5];/*寄存姓名用的字符数组*/

clrscr();

printf("Pleaseenternameforsearching.\n");

scanf("%s",s);

p=head;/*将头指针赋给p*/

while(strcmp(p->namezs)&&p!=NULL)/*当记录日勺姓名不是要找H勺,或指

针不为空时*/

p=p->next;/*移动指针,指向下一结点*/

if(p!=NULL)/*假如指针不为空*/

\nn);

printf("---------------------------------------------------------------------------------

-\nn);

printf("|Num|Name|scl|sc2|sc3|

Sum|Ave|Order|\n");

printf("---------------------------------------------------------------------------------

-\nn);

printf("|%4s|%4s|%3d|%3d|%3d

|%3d|%4.2f|%-5d|\n"z

p->numzp->namezp->score[0]zp->score[l],p->score[2],p->sum,p->av

erage,p->order);

printf("----------------------------------------------------------------------------------

n");

pr।”***************************************EN*********

*****************************\n),

)

else

printf("\nThereisnonum%sstudentonthelist.\n"zs);/*显示没有

该学生*/

)

/*删除记录函数*/

STUDENT*delete(STUDENT*head)

{intn;

STUDENT*plz*p2;/*pl为查找到要删除H勺结点指针,p2为其前驱指针*/

charczs[6];/*s[6]用来寄存学号,c用来输入字母*/

clrscr();

printf("Pleaseenterthedeletednum:");

scanf("%s",s);

pl=p2=head;/*给pl和p2赋初值头指针*/

while(strcmp(pl->numzs)&&pl!=NULL)/*当记录的学号不是要找的,或

指针不为空时*/

{p2=pl;/*将pl指针值赋给p2作为pl口勺前驱指针*/

pl=pl->next;/*将pl指针指向下一条记录*/

)

if(strcmp(pl->num,s)==O)/*学号找到了*/

\n");

printf("----------------------------------------------------------------------------------------------

-\n");

printf("|Num|Name|scl|sc2|sc3|

Sum|Ave|Order|\n");

printf("----------------------------------------------------------------------------------------------

-\nn);

printf("|%4s|%4s|%3d|%3d|%3d

|%3d|%4,2f|%-5d|\n”,

pl->num,pl->name,pl->score[0]zpl->score[l]zpl->score[2],pl->su

m,pl->average,pl->order);

printf("---------------------------------------------------------------------------------------------

-\n");

pr1("***************************************EN*********

\nH);

printf("AreyousuretodeletethestudentY/N?");/*提醒与否要删除,输

入Y删除,N则退出*/

for(;;)

{scanf("%c",&c);

if(c==h||c==N)break;/*假如不删除,则跳出本循环*/

if(c==y||C==Y)

{

if(pl==head)/*若pl==head,阐明被删结点是首结点*/

head=pl->next;/*把第二个结点地址赋予head*/

else

p2->next=pl->next;/*否则将一下结点地址赋给前一结点地

址*/

n=n-l;

printf("\nNum%sstudenthavebeendeleted.\n",s);

printfC'Dontforgettosave.\n");break;/*删除后就跳出循环*/

)

)

)

else

printf("\nThereisnonum%sstudentonthelist.\n"zs);/*找不到该结

点*/

return(head);

)

/*排序函数*/

STUDENT*sort(STUDENT*head)

{inti=0;/*保留名次*/

STUDENT*plz*p2z*t,*temp;/*定义临时指针*/

temp=head->next;/*将原表的头指针所指的下一种结点作头指针

*/

head->next=NULL;/*第一种结点为新表的头结点*/

while(temp!=NULL)/*当原表不为空时,进行排序*/

t=temp;/*取原表时头结点*/

temp=temp->next;/*原表头结点指针后移*/

pl=head;/*设定移动指针pl,从头指针开始*/

p2=head;/*设定移动指针p2做为plH勺前驱,初值为头指针

*/

while(t->average<pl->average&&pl!=NULL)/*作成绩平均分比较*/

p2=pl;/*待排序点值小,则新表指针后移*/

pl=pl->next;

)

if(pl==p2)/*pl==p2,阐明待排序点值大,应排在首位*/

t->next=pl;/*待排序点的后继为p*/

head=t;/*新头结点为待排序点*/

)

else/*待排序点应插入在中间某个位置p2和pl之间,如p为空则

是尾部*/

{

t->next=pl;/*t的后继是pl*/

p2->next=t;/*p2口勺后继是t*/

}

)

pl=head;/*已排好序的头指针赋给pl,准备填写名次*/

while(pl!=NULL)/*当pl不为空时,进行下列操作*/

(

i++;/*结点序号7

pl->order=i;/*将结点序号赋值给名次*/

pl=pl->next;/*指针后移*/

)

printf("Sortingissucessful.\nH);/*排序成功*/

return(head);

)

/*插入记录函数*/

STUDENT*insert(STUDENT*head,STUDENT*new)

{STUDENT*pOz*pl,*p2;

intn,sumlzi;

pl=head;/*使pl指向第一种结点*/

pO=new;/*pO指向要插入口勺结点*/

printf("\nPleaseenteranewrecord.\n");/*提醒输入记录信息*/

printf("Enterthenum:'1);

scanf("%s",new->num);

printf("Enterthename:");

scanf("%s"znew->name);

printf("Pleaseenterthe%dscores.\n",3);

suml=0;/*保留新记录日勺总分,初值为0*/

for(i=0;i<3;i++)

{

do{

printf("score%d:"J+l);

scanf("%d"z&new->score[i]);

if(new->score[i]>100||new->score[i]<0)

printf("Dataerror,pleaseenteragain.\n");

}while(new->score[i]>100||new->score[i]<0);

suml=suml+new->score[i];/*累加各门成绩*/

)

new->sum=suml;/*将总分存入新记录中*/

new->average=(float)suml/3;

new->order=0;

if(head==NULL)/*本来的链表是空表*/

{head=pO;pO->next=NULL;}/*使pO指向欧J结点作为头结点*/

else

{while((pO->average<pl->average)&&(pl->next!=NULL))

{p2=pl;/*使p2指向刚刚pl指向的结点*/

pl=pl->next;/*pl后移一种结点*/

)

if(pO->average>=pl->average)

{if(head==pl)head=pO;/*插到本来第一种结点之前*/

elsep2->next=p0;/*插到p2指向口勺结点之后*/

pO->next=pl;}

else

{pl->next=pO;pO->next=NULL;}/*插至1J最终的结点之后*/

)

n=n+l;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论