c语言学生成绩管理系统(共43页).docx
精选优质文档-倾情为你奉上摘 要利用所学过的C语言知识,采用结构化程序设计方法,设计一个学生成绩管理档案程序,该程序的主要功能为: 0将表格初始化,1建立学生成绩表格,2从表中删除原有纪录,3显示单链表中所有记录,4按照姓名查找纪录,5计算所有学生的总分和均分,6插入纪录到表中,7复制文件,8将所有学生成绩排序,9分类合计,10退出。该系统功能完善,界面友好,短小经用,使用方便,即使是不熟悉计算机也可以自如的使用该系统。通过上机调试运行与模拟操作,完成对学生成绩的管理,减轻管理人员的劳动强度,提高一个学校的自动化管理水平。关键词:学生成绩管理;结构化程序设计;调试运行;功能完善目 录专心-专注-专业第一章 概述 现今已步入高速发展的时代,电脑技术发展日新月异,时代潮流也不断变革,竞争越发激烈,时间就是金钱,但是就是在一些琐碎的事上面浪费了大量的时间,例如查询资料之类.如果我们把浪费的时间用于其他方面,势必会有更大的收益.应此需求,为使广大教师掌握更多的时间,相应的开发出此软件学生成绩管理软件系统.而编写详细设计说明书是软件开发过程必不可少的部分,其目的是为了使开发人员在完成概要设计说明书的基础上完成概要设计规定的各项模块的具体实现的设计工作。本软件属于绿色软件, 适合任何层次的用户, 因此本说明书的预期读者范围相当广。1.1项目背景一、 软件名称学生成绩管理二、 相关单位主要是学校用于学校的成绩管理1.2工作环境A.一台586 以上的微机及兼容B内存16MB(最好32MB内存)CVGA 彩显一台第二章 系统分析2.1系统需求分析随着网络经济时代的到来,社会飞速的发展,人们的生活发生着日新月异的变化,高新技术正驱赶着人们生活的脚步,人们对工作生活的要求也日益提高,特别是计算机的应用及普及到经济和社会生活的各个领域。使原本的旧的管理方法越来越不适应现在社会的发展。许多人还停留在以前的手工操作,随着各个学校的规模增大,有关学生成绩管理工作所涉及的数据量越来越大,有的学校不得不靠增加人力、物力来进行学生成绩管理,但手工管理具有效率底、,这大大地阻碍了人类经济的发展。为了适应现代社会人们高度强烈的时间观念,用计算机对学校学生成绩进行管理已逐步取代了传统的管理方式。学生成绩查询系统对学校加强学生成绩管理有着极其重要的作用。由于各个大学都在持续扩招,学生的数量日益庞大,传统的手工成绩管理不仅工作量大,而且容易出现问题。从而需要对学生成绩管理等工作方面提高精确度。经过我对学校情况和师生需求的的具体分析,初步设计了一套有关“学生成绩管理”的程序,希望可以帮助学校改善以往需求紧张的管理系统,为广大师生提供方便,节省时间,提高工作效率,从而树立良好的办学形象。学校具体需求分析学生:对各科成绩的查询及查看本班成绩排名。老师:输入并维护所教科目的学生成绩,计算本科的成绩排名、本科成绩在班上的排名。班主任:输入并维护本班的基本信息,对本班的各科成绩汇总,计算各科成绩的总分,排名,本班平均分等需求。输出学生的基本信息,各科的成绩及各科成绩的部分,各科成绩的排名,总分的排名情况。 教务处: 学校全体成员的信息管理,对考试科目,时间及对所考科目的编号等进行具体的管理,并对任课老师,班主任等输入的信息进行存库,对学生的信息进行必要的维护,可打印学生的所有信息。2.2 系统功能分析 在本章中,我使用模块等分析法进行系统功能分析。按任意键进入主菜单 合法用户进入各功能模块2-1进入主菜单模块2.2.3 建立学生表格,算法实现模式,如图2-2所示:进行编辑输入1 N返回主模块 Y 信息录入 N 返回主模块 Y继续输入 Y任意键返回主模块2-2建立学生表格模块2.2.4从表中删除原有纪录模块,算法,如图2-3所示:进行删除输入2 N返回主模块 Y 信息录入 N 返回主模块 Y删除成功 Y任意键返回主模块2-3删除原有纪录模块进行输入输入3 N返回主模块 Y 信息输出 N 返回主模块 Y显示信息 Y任意键返回主模块2-4显示纪录模块学生姓名输入4 N返回主模块 Y 信息录入 N 返回主模块 Y查找成功 Y任意键返回主模块2-5查找模块进行计算输入5 N返回主模块 Y 输出结果 Y任意键返回主模块2-6计算模块学号输入6 N返回主模块 Y 信息录入 N 返回主模块 Y成功插入 Y任意键返回主模块2-7插入纪录模块文件地址输入7 N返回主模块 Y 复制 N 返回主模块 Y复制成功 Y任意键返回主模块2-8复制模块进行排序输入8 N返回主模块 Y 排序成功 Y任意键返回主模块 2-9排序模块进行分类输入9 N返回主模块 Y 分类成功 Y任意键返回主模块2-10分类合计模块。第三章 总体设计3.1软件描述 该程序的主要功能为: 0将表格初始化,1建立学生成绩表格,2从表中删除原有纪录,3显示单链表中所有记录,4按照姓名查找纪录, 5计算所有学生的总分和均分,6插入纪录到表中,7复制文件,8将所有学生成绩排序, 9分类合计,10退出。另外,该程序主要调用了:I/O函数(stdio.h),其他说明(stdib.h),字符串函数(string.h),屏幕操作函数(conio.h),内存操作函数(mem.h),字符操作函数(ctype.h),动态地址分配函数(alloc.h),定义常数。3.2设计方法本软件采用传统的软件开发生命周期的方法,采用自定向下,逐步求精的结构化的软件设计方法。3.3软件结构根据以上模块可得到总体结构系统才层次图,如图3-1所示:学生成绩管理初始化建立学生成绩表格删除记录 显示单链表中所有记录按姓名查找记录 计算所有学生成绩的总分和均分插入记录到表中复制文件将所有学生成绩排序分类合计退出3-1总体结构系统层次图3.4文件及函数组成如表1-1所示:表3-1 主要函数函数名功能Init()初始化函数 Create()创建链表Delete(STUDENT *h)删除记录Print(STUDENT *h)显示所有记录Search(STUDENT *h)查找学生成绩Computer(STUDENT *h)计算学生的总分和均分Insert(STUDENT*h)插入记录Copy()复制文件Sort(STUDENT*h)按姓名开头字母排序Total(STUDENT *h)分类合计Menu_select()主菜单函数1.显示内存动态记录数据函数函数原型:void create()功能:显示内存里的记录参数:记录数组和记录条数要求:报告是否有记录及记录成绩内容2.输入信息函数函数原型:int inputs(char *prompt, char *s, int count)功能:添加记录参数:结构体数组.要求: 如果内存已经存在记录.则将新记录追加在记录尾部,如果还没有建立记录链表,则建立链表并从尾部开始追加记录.3.删除记录函数函数原型:int delete(STUDENT *h)功能:删除内存链表中的指定结点参数:记录数组和记录条数,成绩要求:给出相关信息4.按序号显示记录函数函数原型:void print(STUDENT *h)功能:根据用户需求输出记录要求:判断内存中记录的序号与输入的是否相等,如果相等则输出,否则关闭文件5.查找函数函数原型:int search()功能:根据用户需要输出记录参数:记录数组和记录成绩以及姓名s要求:判断内存中记录的名字与输入的是否相等,如果相等则输出,否则提前结束6.计算函数函数原型:int Computer(STUDENT *h)功能:根据用户需要计算总分和学生平均成绩参数:记录数和计算要求:内存中记录数进行相加和平均数运算7.插入记录函数函数原型:int insert(STUDENT *h)功能:根据用户指定将信息插入特定位置参数:结构体数组和记录数要求:输入信息8.复制文件函数函数原型:void copy()功能:复制记录要求:判断所要文件是否能打开,打不开则退出,能打开则读出文件中记录并复制9.排序函数函数原型:void sort(STUDENT *h)功能:将记录进行排序参数:结构体数组和记录数要求:比较内存中记录,判断大小并进行交换,交换后显示排序成功10分类合计函数函数原型:void Total(STUDENT *h)功能:分类存放 参数:结构体数组和记录数要求:在内存中分类存放各班不同的记录数和计算后得到的记录数11.菜单函数函数原型:menu_select()功能:控制程序要求:管理菜单命令并完成初始化第四章 程序调试在设计该程序的时候我采用了结构化程序方法编辑,并在源代码的基础上添加了中文注释。但是在该系统的编写过程中仍然有许多错误,主要的有:注释文字的排版,定义错误,句式的语法错误。在完善程序时,我将源代码先打印下来反复的捉摸和研究,力图在上机运行时先改正一些低级错误.如缺少”;”之类.在仔细检查之后,将源代码上机调试进行编译,在编译和连接过程中发现错误,屏幕上显示了出错信息,根据提示找到出错的位置,加以改正直到顺利显示我预期的。1、首先,在本次调试过程中我碰到了在上机前根本没有想到的错误:在注释的时候,注释文字应写在一起中间不能有中断,不能再其中包含c语言的语句。否则会引起错误,例如格式不正确或是多了字符等。2、缺少变量定义或是定义位置不正确;由于该程序相对来讲稍有些长,前后有些变量很难联系起来,但是在错误信息的提示下一般还是很是可以找到。不过需要注意的是在定义的时候有些函数使用同样的变量名而表示不同的作用,因而使用要很小心,定义及定义的位置要特别留意。为减少这样的错误我后来还是用不同的变量名来表示,结果引起的那些错误解决了。3、句式的语法错误;大多的语法错误在通过书本参考下能够修改。主要是平时看书不仔细、不太注意而产生的。如没有注意具体数据使用是有一定的范围限定;过分重视分号的重要性而在for、if、while语句中画蛇添足加分号;在使用文件的时候忘记将文件先打开,对打开的方式与使用的情况不太注意而造成不匹配;还有漏掉形参的定义是值不能传递等等。这些语法错误有信息框的提示一般是能够排除的。编译、连接的成功并不意味着程序的最终成功。逻辑上的错误机器不易检查出来,这时需要对数据结果进行分析。这种错误的查找是最难的,需要编程序的人有相当的耐心和细心去把问题找出来。这也是本次程序编辑过程中碰到的最大的难题。往往运行之后得不到另人满意的结果,此时解决的方法一则可以用“分段检查”的方法,在程序的不同位置设几个printf函数语句,输出有关变量的值,逐段往下检查,或用debug进行调试,对检查出的错误进行修改,当调试完毕将设置的printf都删去。若在程序中找不到问题,则再来考虑算法是否逻辑严谨,再进行修改。如此循环往复,直到最后程序运行成功。在本次程序编辑过程中,我就是常遇到编译能通过,能够运行程序,但是总在输入、删除等操作完之后再想去看数据文件中存在的数据记录的时候,却一条记录也显示不出来,我怀疑是哪个对方对n变量的定义或使用出错了,于是在每个主要函数的操作过程中添加了printf语句用来显示n的变化,例如在执行某个函数前添加插入语句显示n的起始值,在执行完该个函数后再添加插入语句显示此时n的结果值,观察n的变化是否正确,如果错误了,也就说明该函数编写过程有错。诸如这样的调试方法,不断缩小检查范围,最后将错误找到,进行修改。所以到最后我找到了错误,及时改正,终于把程序完成了,一切功能显示正常。以上是调试的全过程。第五章 使用说明首先进入界面时,根据屏幕上的提示press any key enter menu即是按任意键均可进入主菜单,考虑到学生成绩大多由老师输入和调用,所以这里对使用者没有要求也就没有添加密码的必要。 在进入主菜单时可以看到这样的画面,如图4-1所示:4-1主菜单从0到10共有11个功能键。此时应该根据提示”Enter your choice (0-10):”选择自己需要用的功能,例如:在提示后按1再回车(Enter键)的话就会进入编辑。在主菜单上的11个功能分别是:0 init list将表格初始化:使用0后,系统会将原有的一切记录全部删去,所有的恢复到位使用时。一切在主菜单上完成。1 Enter list建立学生成绩表格:使用1后,在界面上会要求你输入学号no,姓名name 和成绩score1、2、3。如果已经输入完毕只要在下一个no后输入!再按回车键即可,此时就会回到主菜单,如图4-2所示:4-2输入界面2 Delete a record from list从表中删除原有纪录:使用2 后,会进入子界面,提示语会告诉你输入你要删除的信息的学生的学号,然后会出现“ list no * student”这就表示删除成功,如果没有这个学生的信息则会跳过步执行但是还是会输出上述的句子,如图4-3所示:4-3显示删除界面3 print list显示单链表中所有记录:如果是在执行完5以后,那么总分和均分一栏就不会空白,而是会输出计算后的数据,如图4-4所示:4-4打印数出界面4 Search record from list按照姓名查找纪录:根据提示”please enter studentsname for search”输入学生的拼音拼写的姓名,如图4-5所示:4-5查找界面5 compute the score计算所有学生的总分和均分:按5后,系统会自动计算然后输出结果,如图4-6所示:4-6计算界面6 insert record to list插入纪录到表中:使用6 时,要输入你想插到哪一个学生前,只需输入他的学号。然后,在提示语的提醒下输入要插入学生的学号,姓名和成绩。然后再进入打印界面,此时可以看到已经将09插入到02 前。如图4-7所示:4-7插入后界面7 copy the file to new file复制文件:执行完7后,会根据使用者输入的地址和命名生成文本文档存储。8 sort to make new file将所有学生成绩排序:在完成后,会出现”sort success!”如果想看结果的话,可以在执行完这一步后在执行3,这样就可以看到排序后的结果。9 total on nomber分类合计,如图4-9所示:4-9分类合计界面10 Quit退出模块,在主菜单上实行。如图4-10所示:4-10退出界面第六章 工作总结在这次的编程过程中,我不仅在C语言的学习上有了很大的提高而且也培养了我的毅力、耐心、决心和学习能力。短短的两周,我自己都不敢相信可以弄好一个对我而言一个大而功能相对而言还可以的程序。但是不得不说在这个程序中仍然有许多的缺陷,诸如:计算均分时只能计算三门的总均分;无法将文件以文档或是表格形式存储;排序、删除等必须以一种形式先查找学生信息然后再实行操作并不多样化。总之,在这个过程中我还面对了程序无法执行,改错时怎么也找不到错误在哪里的困境;但我还是在老师和同学们的帮助下完成了这个程序。可以说我的心情是相当的激动,相信有了这样的经历后我能够更加娴熟的面对各种情况。注:课程设计以来的感想、心得、经验、收获、有待改进的方面。不超过一页。参考文献(参考书或论文或文章)1 黄明等.21世纪进阶辅导 C语言程序设计.大连理工大学出版社,2005:452082 马靖善等.C语言程序设计.清华大学出版社,2005:23145附录 源代码#include "stdio.h" #include "stdlib.h" #include "string.h" #include "conio.h" #include "mem.h" #include "ctype.h" #include "alloc.h" #define N 3 typedef struct z1 char no11; char name20; int scoreN; float sum; float average; int order; struct z1 *next; STUDENT;STUDENT *init(); STUDENT *create(); STUDENT *delete(STUDENT *h); void print(STUDENT *h); void search(STUDENT *h); void save(STUDENT *h); STUDENT *load(); void computer(STUDENT *h); STUDENT *insert(STUDENT *h); void append(); void copy(); STUDENT *sort(STUDENT *h); void total(STUDENT *h); int menu_select(); main() int i; STUDENT *head; head=init(); clrscr(); for(;) switch(menu_select() case 0:head=init();break; case 1:head=create();break; case 2:head=delete(head);break; case 3:print(head);break; case 4:search(head);break; case 5:computer(head);break; case 6:head=insert(head); break; case 7:copy();break; case 8:head=sort(head);break; case 9:total(head);break; case 10:exit(0); menu_select() char *menu="*MENU*", " 0. init list", " 1. Enter list", " 2. Delete a record from list", " 3. print list ", " 4. Search record on name", " 5. compute the score", " 6. insert record to list ", " 7. copy the file to new file", /*复制文件*/ " 8. sort to make new file", /*排序*/ " 9. total on nomber", /*分类合计*/ " 10. Quit" /*退出*/ char s3; int c,i; gotoxy(1,25); printf("press any key enter menu.n"); getch(); clrscr(); gotoxy(1,1); textcolor(BLUE); textbackground(WHITE); gotoxy(10,2); putch(0xc9); for(i=1;i<44;i+) putch(0xcd); putch(0xbb); for(i=3;i<20;i+) gotoxy(10,i);putch(0xba); gotoxy(54,i);putch(0xba); /*输出右垂直线*/ gotoxy(10,20);putch(0xc8); for(i=1;i<44;i+) putch(0xcd); putch(0xbc); window(11,3,53,19); clrscr(); for(i=0;i<16;i+) gotoxy(10,i+1); cprintf("%s",menui); textbackground(GREEN); window(1,1,80,25); gotoxy(10,21); do printf("n Enter you choice(010):"); scanf("%s",s); c=atoi(s); while(c<0|c>10); return c; STUDENT *init() return NULL;STUDENT *create() int i; int s; STUDENT *h=NULL,*info; for(;) info=(STUDENT *)malloc(sizeof(STUDENT); if(!info) printf("nout of memory"); return NULL; inputs("enter no:",info->no,11); if(info->no0='!') break; inputs("enter students' name:",info->name,20); printf("please input %d score n",N); s=0; for(i=0;i<N;i+) do printf("score%d:",i+1); scanf("%d",&info->scorei); if(info->scorei>100|info->scorei<0) printf("Data is bad ,repeat inputn"); while(info->scorei>100|info->scorei<0); s=s+info->scorei; info->sum=s; info->average=(float)s/N; info->order=0; info->next=h; h=info; return(h); inputs(char *prompt, char *s, int count) char p255; do printf(prompt); scanf("%s",p); if(strlen(p)>count)printf("n too long! n"); while(strlen(p)>count); strcpy(s,p); void print(STUDENT *h) int i=0; STUDENT *p; clrscr(); p=h; printf("nnn*STUDENT*n"); printf("|Rec|No | Name | Sc1| Sc2| Sc3| Sum | Ave |Order|n"); printf("|-|-|-|-|-|-|-|-|-|n"); while(p!=NULL) i+; printf("|%3d |%-10s|%-15s|%4d|%4d|%4d| %4.2f | %4.2f | %3d |n", i, p->no,p->name,p->score0,p->score1,p->score2,p->sum,p->average,p->order); p=p->next; printf("*end*n");STUDENT *delete(STUDENT *h) STUDENT *p,*q; char s11; clrscr(); printf("please deleted non"); scanf("%s",s); q=p=h; while(strcmp(p->no,s)&&p!=NULL) q=p; p=p->next; if(p=NULL) printf("nlist no %s studentn",s); else printf("*have found*n"); printf("|No | Name | Sc1| Sc2| Sc3| Sum | Ave |Order|n"); printf("|-|-|-|-|-|-|-|-|n"); printf("|%-10s|%-15s|%4d|%4d|%4d| %4.2f | %4.2f | %3d |n", p->no, p->name,p->score0,p->score1,p->score2,p->sum, p->average,p->order); printf("*end*n"); getch(); if(p=h) h=p->next; else q->next=p->next; free(p); printf("n have deleted No %s studentn",s); printf("Don't forget saven"); return(h); void search(STUDENT *h) STUDENT *p; char s15; clrscr(); printf("Please enter students' name for searchn"); scanf("%s",s); p=h; while(strcmp(p->name,s)&&p!=NULL) p=p->next; if(p=NULL) printf("nlist no %s studentn",s); else printf("nn*havefound*n"); printf("|No | Name | Sc1| Sc2| Sc3| Sum | Ave |Order|n"); printf("|-|-|-|-|-|-|-|-|n"); printf("|%-10s|%-15s|%4d|%4d|%4d| %4.2f | %4.2f | %3d |n", p->no,p->name,p->score0,p->score1,p->score2,p->sum,p->average,p->order); printf("*end*n"); STUDENT *insert(STUDENT *h) STUDENT *p,*q,*info; char s11; int s1,i; printf("please enter location before the non"); scanf("%s",s); printf("nplease new recordn"); info=(STUDENT *)malloc(sizeof(STUDENT); if(!info) printf("nout of memory"); return NULL; inputs("enter no:",info->no,11); inputs("enter name:",info->name,15); printf("please input %d score n",N); s1=0; for(i=0;i<N;i+) do printf("score%d:",i+1); scanf("%d",&inf