数据结构学生成绩管理系统_第1页
数据结构学生成绩管理系统_第2页
数据结构学生成绩管理系统_第3页
数据结构学生成绩管理系统_第4页
数据结构学生成绩管理系统_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

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

文档简介

1、海南大学信息科学技术学院数据结构课程设计报告 设计题目:_ 专业班级:_姓名:_学号:_指导教师:_目 录一、 需求分析 2二、 设计要求 3三、 概要设计 4四、 详细设计 6五、 运行结果 16六、 心得体会 21七、 参考文献 21 摘  要 :据结构”是计算机程序设计的重要理论技术基础,它是计算机学科的核心课程。用数据结构中的知识、算法、思想解决一些实际问题可使的一些问题变得一目了然,易懂。本论文设计一个简单程序,来实现学生管理系统的设计。首先在设计的时候就想了一下,应该运用到那些知识点,不管是C语言还是数据结构的。首先我们想到的是应该运用到线性链表表的相

2、关知识,运用到单链表(数据域+指针域)的存取结构,方便存储和查找,以及简单的排序。综合数据结构和c+语言相关知识,锻炼自己的编程能力和考察一下所学的数据结构只是,是自己在实践中发现自己的不足,找不自己的不足之处,在实践中提高。理论中的数据结构知识只有运用到实践中,再能转变为使用价值,本课程我将用源代码和流程图来说明和设计我的论文。关键字:单链表、条件、循环、排序。一、 需求分析本文是运用数据结构和C+语言知识实现一个简单的学生成绩管理系统,方便教师对学生成绩的录入、查询、删除、排序等操作。学生给您记录所用的存储结构是数据结构这门课中所学到的单链表只是。单链表要有数据域和指针域。课程设计中药涉及

3、到单链表的初始化、创建、查询、插入、删除、排序等一些基本操作。程序中要大量用用到指针操作数据,指针是c语言中的精髓,熟悉指针的操作可以极大提高编程能力和减少大量代码。录入给出多名学生的3门考试的成绩表,每个学生的信息由学号、姓名、以及各科成绩,名次组成。对学生的考试成绩进行有关统计:按总数高低次序,打印出名次表,分数相同的为同一名次;按名次打印出每个学生的学号、姓名、总分以及各科成绩,并打印统计表。系统存储的各种数据均保存在数据结构单链表内,各种操作都是对链表结构的操作。二、 设计要求首先使用人员需要进行密码验证才能登录系统。在这里密码默认为:123456,登录之后是系统的主菜单,第一行是“欢

4、迎进入学生成绩管理系统”欢迎语。菜单包括:1. 请输入学生的成绩记录2. 显示学生的成绩记录3. 搜索某个学生的成绩记录4. 删除一个学生的成绩记录5. 排序形成一个新的文件6. 插入一个记录7. 保存这个文件8. 读取这个文件9. 退出九项选择。并通过键入菜单项前的序号进行菜单选择。如果输入序号不正确将提示:序号不对!要求重新键入选择项。选择菜单之后就会进入不同的程序分支,调用各自的函数进行操作。同时本程序系统还提高记录文件导出和记录功能,以方便文件的保存和读取。默认保存文件路径问源程序文件件内。程序运行当中,对输入的数据要有事先的分析,如果用户输入的数据与实际不相符如输入成绩的数值为负,则

5、程序应输出相应的提示:“成绩超出范围,请重新输入”。再者就是,当再输入完相应的数据后,程序作出相应的提示,询问用户是否要保存数据。在排列学生成绩时候,如果出现成绩相同的情况,程序自动作出处理。最后,在程序可以正确运行的基础上,再增加一些功能,如在排列的时候,自动输出最高分与最低分等信息。三、概要设计程序伊始要定义链表结构以保存成绩记录typedef struct stu /定义结构体数组用于缓存数据/char num13;/用来保存学号char name5;/用来保存姓名int score3;/保存分数,三个科目int sum;/总成绩float average;/平均分int order;/

6、名次struct stu *next;/指向下一个数据记录指针地址STUDENT;STUDENT *init(); /初始化函数/STUDENT *create(); /创建链表/void print(STUDENT *head); / 显示全部记录/void search(STUDENT *head); /查找记录/STUDENT *Delete(STUDENT *head); /删除记录/STUDENT *sort(STUDENT *head); /排序/STUDENT *insert(STUDENT *head); /插入记录/void save(STUDENT *head); /保存文

7、件/void main();/主函数作为下同的菜单选择登录密码YN主菜单菜单选项输入记录显示记录搜索记录删除记录记录排序插入记录保存文件读取文件退出else0<=n<=9系统流程图如下四、详细设计1. 成绩录入功能教师进入此功能后,根据提示录入学生成绩,在录入过程中,遇到不合适的的成绩系统会自动识别,进行提示。STUDENT *create()system("cls"); /清屏/int i,s;STUDENT *head=NULL,*p; / 定义函数.此函数带回一个指向链表头的指针/clrscr();for(;)p=(STUDENT *)malloc(LEN

8、); /开辟一个新的单元/if(!p) /如果指针p为空/printf("n内存溢出"); /输出内存溢出/return (head); /返回头指针,下同/printf("输入学号(输入0结束):"); scanf("%s",&p->num);if(p->num0='0') break; /如果学号为0则结束输入/printf("输入姓名:");scanf("%s",&p->name);printf("开始输入成绩%d科n"

9、,3); /提示开始输入成绩/s=0; /计算每个学生的总分,初值为0/for(i=0;i<3;i+) /3门课程循环3次/doprintf("成绩%d:",i+1);scanf("%d",&p->scorei);if(p->scorei<0 | p->scorei>100) /成绩一定要在0100之间/printf("成绩超出范围,请重新输入n");while(p->scorei<0 | p->scorei>100);s=s+p->scorei; /将各门成绩

10、累加起来/p->sum=s; /将总分保存/p->average=(float)s/3; /先用强制类型转换将s转换成float型,再求平均值/p->order=0; /没有排序时,此值为0/p->next=head; /将头结点做为新输入结点的后继结点/head=p; /新输入结点为新的头结点/return(head); 2. 显示记录功能系统中如已有记录,执行此功能之后将显示出所有的记录,如系统无记录,将不予显示,并显示提示信息void print(STUDENT *head)system("color A");int i=0; /统计记录的数目

11、/STUDENT *p; /将指针移动/system("cls"); /清屏/p=head; /初值为头指针/printf("n*STUDENT*n");printf("-n");printf("| 排名 | 学号 | 姓名 | 成绩1 | 成绩2 | 成绩3 | 总分 | 平均分 | 次序 |n");printf("-n");while(p!=NULL)i+;printf("| %3d |%12s |%6s | %3d | %3d | %3d | %3d | %4.2f | %-5d

12、|n", i, p->num,p->name,p->score0,p->score1,p->score2,p->sum,p->average,p->order);p=p->next;printf("-n");printf("*END*n");3. 搜索记录功能此功能可根据输入的学生姓名显示出存在学生的成绩记录void search(STUDENT *head)system("cls"); /清屏/STUDENT *p; / 移动指针/char s13; /存放姓名用的字符

13、数组/p=head;/clrscr();printf("请输入要寻找的学生的姓名:n");scanf("%s",s);while(strcmp(p->name,s) && p->next!= NULL) /当记录的姓名不是所想要找的,或者指针不是为空的时候/p=p->next; /将指针移动,使之指向下一结点/if(!strcmp(p->name,s)printf("n*FOUND*n");printf("-n");printf("| 学号 | 姓名 | 成绩1 |

14、 成绩2 | 成绩3 | 总分 | 平均分 | 次序 |n");printf("-n");printf("|%12s |%-6s | %3d | %3d | %3d | %3d | %4.2f | %-5d|n", p->num,p->name,p->score0,p->score1,p->score2,p->sum,p->average,p->order);printf("-n");printf("*END*n");elseprintf("n不存

15、在姓名为%s的学生记录!n",s); /显示没有这个学生/4. 删除记录功能此功能能可根据输入的学生学号显示出存在的记录,并提示是否删除此记录,键入确定Y之后,将删除系统中此记录STUDENT *Delete(STUDENT *head)int n;STUDENT *p1,*p2; /p1为查找到要删除的结点指针,p2为其前驱指针/char c,s13; /s6用来存放学号,c用来输入字母/system("cls"); /清屏/printf("请输入要删除的记录学号: ");scanf("%s",s);p1=p2=head;

16、 /给p1和p2赋初值头指针/while(strcmp(p1->num,s)&&p1->next!= NULL) /当记录的学号不是所想要找的,或指针不为空时/p2=p1; /将p1指针值赋给p2作为p1的前驱指针/p1=p1->next; /将p1指针指向下一条记录/if(strcmp(p1->num,s)=0) /找到学号/printf("*FOUND*n");printf("-n");printf("| 学号 | 姓名 | 成绩1 | 成绩2 | 成绩3 | 总分 | 平均分 | 次序 |n&quo

17、t;);printf("-n");printf("|%12s |%-6s | %3d | %3d | %3d | %3d | %4.2f | %-5d|n", p1->num,p1->name,p1->score0,p1->score1,p1->score2,p1->sum,p1->average,p1->order);printf("-n");printf("*END*n");printf("你确定删除这个学生吗(Y/N) ?"); /提示是否确

18、定要删除,如果输入Y删除,N就不删除/for(;)scanf("%c",&c);if(c='n'|c='N') break; /如果不删除,则跳出这个循环/if(c='y'|c='Y')if(p1=head) /如果p1=head,说明被删结点是首结点/head=p1->next; /把第二个结点地址赋予head/elsep2->next=p1->next; /否则将一下结点地址赋给前一结点地址/n=n-1;printf("n学号 %s的学生已经被删除!n",s);

19、printf("请注意保存新文件!n");break; /删除后,跳出本循环/elseprintf("n不存在学号为 %s 的学生成绩记录!n",s); /找不到该结点/return(head);5. 记录排序功能执行此功能可以将系统记录进行排名操作,按名次高低进行排序,执行此操作后,再执行显示记录功能,就可以看到排序后的记录结果了。6. STUDENT *sort(STUDENT *head)7. 8. system("cls"); /清屏/9. int i=0; /保存名次/10. STUDENT *p1,*p2,*t,*temp

20、; /定义临时指针/11. if(head=NULL)12. 13. printf("记录为空!");14. return (head);15. 16. temp=head->next; /将原表的头指针所指的下一个结点作头指针/17. head->next=NULL; /第一个结点为新表的头结点/18. while(temp!=NULL) /当原来的表不是空的时候,进行排序/19. 20. t=temp; /取原表的头结点/21. temp=temp->next; /原表头结点指针后移/22. p1=head; /设定移动指针p1,从头指针开始/23.

21、p2=head; /设定移动指针p2做为p1的前驱,初值为头指针/24. while(p1!=NULL&&t->average<p1->average) /作成绩平均分比较/25. 26. p2=p1; /想要排序点值小,则新表指针后移/27. p1=p1->next;28. 29. if(p1=p2) /p1=p2,说明想要排序点值大,应排在首位/30. 31. t->next=p1; /想要排序点的后继为p/32. head=t; /新头结点为待排序点/33. 34. else /想要排序点应插入在中间某个位置p2和p1之间,如p为空则放在尾部

22、/35. 36. t->next=p1; /t的后继是p1/37. p2->next=t; /p2的后继是t/38. 39. 40. p1=head; /已排好序的头指针赋给p1,准备填写名次/41. while(p1!=NULL) /当p1不为空时,进行下列操作/42. 43. i+; /结点序号/44. p1->order=i; /将结点序号赋值给名次/45. p1=p1->next; /指针后移/46. 47. printf("排序成功.n"); /排序成功/48. return (head);49. 插入记录功能此功能可以增加学生成绩记录/-

23、插入记录函数-/STUDENT *insert(STUDENT *head)system("cls"); /清屏/STUDENT *ne;int n,sum1,i; ne=(STUDENT *)malloc(LEN); /开辟一个新的单元/printf("n请输入一个新的记录:n"); /提示输入记录信息/printf("请输入学号:");scanf("%s",ne->num);while(resercher(head,ne->num,0)printf("此学号已存在,请重新输入学号:&quo

24、t;);scanf("%s",ne->num);printf("请输入姓名:");scanf("%s",ne->name);printf("请输入%d科成绩:n",3);sum1=0; /保存新记录的总分,初值为0/for(i=0;i<3;i+)doprintf("成绩%d:",i+1);scanf("%d",&ne->scorei);if(ne->scorei>100|ne->scorei<0)printf("

25、;成绩错误,请重新输入!.n");while(ne->scorei>100|ne->scorei<0);sum1=sum1+ne->scorei; /将各门成绩累加/ne->sum=sum1; /将总分存入新记录中/ne->average=(float)sum1/3;ne->order=0; ne->next=head; /将头结点做为新输入结点的后继结点/head=ne; n=n+1; /结点数加1/head=sort(head); /调用排序函数,将学生成绩重排/printf("n学生%s 的成绩已经插入!n&quo

26、t;,ne->name); printf("不要忘记保存这个新的文件.n");return(head);7. 保存记录功能执行此功能后,可以将系统中存在的记录保存为txt文本文档,系统中无记录不予保存void save(STUDENT *head)system("cls"); /清屏/if(head!=NULL)FILE *fp; /定义指向文件的指针/STUDENT *p; / 定义移动指针/if(fp=fopen("成绩.txt","wb")=NULL) /为输出打开一个txt,为只写方式/printf(

27、"不能建立此文件n");return; /如果打不开,则返回菜单/printf("n保存文件.n");p=head; /移动指针从头指针开始/while(p!=NULL) /如果p不为空/fwrite(p,LEN,1,fp); /写入一条记录/p=p->next; /指针后移/fclose(fp); /关闭文件/printf("成功的保存了这个文件!n");elseprintf("此文件为空,不用保存!");7. 导入记录功能此功能可以将已保存为txt文本文档的记录导入到系统中,导入失败则显示不能打开此文件S

28、TUDENT *load()STUDENT *p1,*p2,*head=NULL; /定义记录指针变量/FILE *fp; / 定义指向文件的指针/if(fp=fopen("成绩.txt","rb")=NULL) /打开一个txt文件,为只读方式/printf("不能打开此文件n");return(head);printf("n导入文件!n");p1=(STUDENT *)malloc(LEN); /开辟一个新单元/if(!p1)printf("内存溢出!n");return(head);hea

29、d=p1; /申请到空间,将其作为头指针/while(!feof(fp) /循环读数据直到文件尾结束/if(fread(p1,LEN,1,fp)!=1) break; /如果没读到数据,跳出循环/p1->next=(STUDENT *)malloc(LEN); /为下一个结点开辟空间/if(!p1->next)printf("内存溢出!n");return (head);p2=p1; /使p2指向刚刚p1指向的结点/p1=p1->next; /指针后移,新读入数据链到当前表尾/p2->next=NULL; /最后一个结点的后继指针为空/fclose(

30、fp);printf("你已成功从这个文件读取数据n");return (head);8. 菜单选择功能这是系统的主函数,系统运行的整个过程中都在运行,进入此项就可以选择模块功能选项void main()system("color A");int n,key=0;STUDENT *head;head=init(); /链表初始化,使head的值为NULL/char password20 ;/struct date d; /定义时间结构体/getdate(&d); /读取系统日期并把它放到结构体d中/while(1)if(key=0)system(

31、"cls");printf("nttt请输入管理员登录号(初始登录号123456):nntttpassword:");elsesystem("cls");printf("nttt密码错误请重新输入:(初始登录号123456):nntttpassword:");scanf("%s",password); if(strcmp(password,"123456")=0)system("cls"); /清屏/doprintf("t*t 欢迎进入学生成绩管

32、理系统 t*n");printf("*n");printf("tt1. 请输入学生的成绩记录n"); /输入学生成绩记录/printf("tt2. 显示学生的成绩记录n"); /显示/printf("tt3. 搜索某个学生的成绩记录n"); /寻找/printf("tt4. 删除一个学生的成绩记录n"); /删除/printf("tt5. 排序形成一个新的文件n"); /排序/printf("tt6. 插入一个记录n"); /插入/printf(

33、"tt7. 保存这个文件n"); /保存/printf("tt8. 读取这个文件n"); /读取/printf("tt9. 退出n"); /退出/printf("*n");/printf("tttt%d%d%dn",d.da_year,d.da_mon,d.da_day); printf("ntttEnter your choice(19):"); scanf("%d",&n);switch(n) case 1:head=create();break;case 2:print(head);break;case 3:search(head

温馨提示

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

评论

0/150

提交评论