C语言课程设计报告学生成绩管理系统_第1页
C语言课程设计报告学生成绩管理系统_第2页
C语言课程设计报告学生成绩管理系统_第3页
C语言课程设计报告学生成绩管理系统_第4页
C语言课程设计报告学生成绩管理系统_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

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

文档简介

1、c语言课程设计报告学生成绩管理系统 学 院 计算机学院 专 业 软件工程(4)班 年 级 2007级 姓 名 学 号 教 师 一.设计题目学生成绩管理系统二课程设计目的了解软件工程中的一些系统分析,模块分析,代码设计的概念,利用win-tc实现学生成绩管理系统的录入、查询、删除、统计等基本操作,使用单链表结构实现学生成绩管理,了解数据库管理的基本功能,掌握c语言中的结构体、指针、函数(系统函数、自定义函数)、文件操作等知识。通过对系统的分析和设计,进一步巩固c语言的学习,以提高对开发环境的进一步认识和综合编程能力。三 系统功能1学生基本情况录入。2 能够对已经录入的数据进行显示。3能够进行数据

2、的插入。4删除基本数据的相关信息。5复制基本数据的相关信息。6能够从文件中读入记录。7对输入的数据进行保存。8可进行姓名的查询。如:姓陈的同学。9可进行基本数据的统计计算。如:统计每个学生各门功课的平均成绩及总分,根据总分进行名次排列。对数据进行分类合计处理,统计个班级的总分,总平均分。四系统功能模块结构图本程序利用单链表存储结构完成对学生成绩的动态管理,其基本功能模块如下图所示: 0.对表进行初始化1.输入成绩记录2.从表中删除记录3.显示所有记录13.分类合计12.索引11.追加记录10.按分排序9.复制文件8.插入记录到表中7.计算总分和均分6.加载文件5.保存记录到文件4.按姓名查找记

3、录主程序14.退出系统 15.版本信息 图1程序功能模块结构图五程序设计及各模块函数功能简述1数据结构链表是线形表的一种,线形表分为顺序存储结构和链式存储结构。线形表的顺序存储结构的特点是逻辑关系上相邻的两个元素物理位置上也相邻,因此可以随机存取表中任一元素。链式存储结构的特点是用一组任意的存储单元存储线形表的数据元素。链表的最大的优点是对表的添加、删除、查找、排序等操作比较方便,因此采用链表来存储学生相关信息。且对结点的定义如下:typedef struct z1 /*定义数据结构*/ char no11; /*10位学号*/ char name15; /*姓名*/ int scoren;

4、/*成绩*/ float sum; /*总分*/ float average; /*平均分*/ int order; /*排名*/ struct z1 *next; student;2.main()主函数主函数是程序入口,采用模块化设计。首先在主程序中打印欢迎界面,声明一些必要变量,作一无限循环程序,循环体为一开关语句,该语句设置一个断点,其条件值是通过调用主菜单函数得到的返回值,根据该值,调用相应的功能函数,同时设置一个断点,当返回值为一定条件时结束程序。3menu_select()主菜单为了美化界面,制作单边框窗口,在窗口中显示主菜单。通过putch()输出图形符号的ascii码值(十六进

5、制),达到显示的目的。利用windows函数制作显示窗口,该窗口与边框位置,大小基本一致,通过过仔细计算且多次调试后得到其坐标值,用函数gotoxy()来实现光标的移动。设置文本和背景色输出菜单项。恢复原窗口,设计输入选择项,返回主函数。相关的一些函数如下:window、textbackground、clrscr、textcolor、cprintf、bioskey、gotoxy、gettext、puttext、putch。 putch(0xda); /*输出左上角边框*/ putch(0xc4); /*输出上边框水平线*/ putch(0xbf); /*输出右上角边框 */ gotoxy(10

6、,i);putch(0xb3); /*输出左边的垂直线*/ gotoxy(63,i);putch(0xb3); /*输出右边的垂直线*/ putch(0xc0); /*输出左下角边框*/ putch(0xc4); /*输出下边框水平线*/ putch(0xd9); /*输出右下角边框*/ 对菜单选项的选择是利用移动光标按回车键进行选择。4init()初始化单链表需要一个头指针来指向表的第一个结点,对单链表的访问是从头指针开始的。初始化单链表为空,用null表示,该值在头文件stdio.h中定义为常数0。5create()创建链表当用户选择输入增加记录后,进入该函数,输入学生信息,并把信息加入链

7、表。在输入过程中,有相关提示,如学号是十位,格式为字符型。同时对某些信息作了限定,如输入分数(0100) ,若输入分数不在这个范围内,则系统 提示重新输入,但是要求输入分数输入了非数字的代码,如“z”,则会出现死循环。因此在输入基本信息时,若要返回主菜单,请在“enter no:”时输入*以便返回主菜单。当输入结束后,系统自动计算该生的总分和平均分,并将名次置0,待排序结束后赋予新值。数据输入结束后返回链表的头指针到方函数。在生成链表时,每次新输入的结点放在表头,这样最先输入的结点存放在最后。6delete()删除结点删除指定学号的学生记录。输入要删除的结点的学号,根据学号顺序查找结点,如果没

8、找到,则输出没有找到的信息;否则显示找到的结点信息。如果删除的是头结点,则修改头指针,将该结点的前趋指针指向其后继结点,然后释放该结点。7append()追加记录到文件尾当想要在文件尾增加一条记录时使用该函数,首先输入新结点信息,然后输入要追加的文件名,按追加方式打开文件,将新信息写入文件。8insert()插入结点在指定结点前面插入新结点,申请空间得到指针info,输入新结点信息,存放info中,设链表头指针为h,p为指定结点的指针,q为p的前趋指针。从头结点开始循环移动指针p查找指定结点,查找和插入时分两种情况处理:1).指针p为空,如果p等于h,说明链表为空,则新结点即为头结点,修改指针

9、h=info。否则,说明表中没有指定结点,则新结点插入在表尾部,此是q把指的结点是最后一个结点,所以修改指针q-next=info。2).指针p不为空,如果p等于h,说明新结点插入在当前第一个结点之前,为新的头结点,修改指针info-next=p,h=info。否则,说明新结点的位置应在q和p两个结点之间,修改指针info-next=p,q-next=info。9print()显示所有记录采用顺序访问的方法显示和查找记录,定义一个指向结点的临时变量p,初值为单链表的头指针,输出指针所记录的数据后,将指针后移一个记录,直到p指针值为空,则所有记录输出完毕。10.search()查找结点按照 姓名

10、 来查找记录。从头结点开始顺序查找, 若没有相同记录显示没有,遇到 一个匹配的记录则显示此记录, 后到尾结点结束。11.save()保存记录到文件将学生信息保存到指定的文件中。按照文件读写要求,先定义一个指向文件的指针,输入要保存的磁盘文件名,如果输入的是绝对路径,则文件保存到指定的位置;如果只要文件名,则文件保存在tc默认的路径。如果文件打不开,则退出程序,否则选择一种写文件方式,打开文件。如果文件打不开,则退出程序,否则选择一种写文件方式,从链表的头指针开始,顺序将记录写入文件,直到所有记录写完,标志就是移动指针为空。12.load()从文件中加载记录按照文件读写要求,先定义一个指向文件的

11、指针,输入要读入数据的磁盘文件名,然后确定文件的打开方式。如果文件打不开,则退出函数,否则选择一种读文件方式,从文件头开始,将记录读入内存,直到文件尾。文件打开方式和读入方式的确定要依据输出文件的打开方式和写入方式,以名数据读入错误。如果输出文件是二进制文件,块写操作,读入也应设置为二进制打开方式,块读取方式。每读入一条记录,都要做好指针链接关系,本函数将新结点链接到当前链表的尾部,链表的顺序和文件保存的顺序一致。13.copy()备份文件将文件读写功能结合到一起,先输入源文件名,再输入目标文件名,然后利用文件读写函数将源文件中的信息写到目标文件中,以达到备份文件的目的。puter()计算所有

12、学生课程的总成绩成绩和总平均成绩 15.sort()排序本函数实现按总分排序的功能。在算法上,选择直接插入算法,即:每步将一个待排序的按其排序码值的大小插到前面已经排好序的表中,直到全部插入为止。先将链表的头结点看作是已经排好序的结点,然后取下一个结点作为待排序的结点,插入到已排好序的表中。其具体做法为:(1).先将原表头结点作为新排好序表的头结点h,原表下一个结点作为原表头结点h1。(2).原表头结点为待排序结点,将其总分与新表结点的总分进行比较,如果待排序结点总分大,则插在表头,否则插入在其后,原表头结点后移一位。(3).重复第二步,即将原表头结点的总分和新表结点的总分进行比较,如果待排序

13、结点总分小,则移动新表指针,直到找到合适的位置将其插入。当原表为空时,所有结点排序完毕。排好序后,系统自动将名次数据写入结点数据域的order中。16.index()索引定义临时指针后,将原表的头指针所指的下一个结点作头指针,再使第一个结点定为新表的头结点。当原表不为空时,进行排序。17.total()分类合计追加班别信息,对各班的总成绩和总平均成绩进行统计并显示。18.exit()退出程序 19.auther()版本信息 显示与本系统相关的信息。六结果欢迎界面 主菜单输入界面删除界面显示界面搜索界面加载界面统计界面版本界面七心得体会 在本次课程设计中,先使用结构化分析方法对系统进行分析,将整

14、个系统细分为几个模块,再针对每个小模块编写代码。通过本次课程设计的学习,学会了很多东西,了解了开发一个系统的一些步骤。尽管大部分都参考权威书籍的代码,但是在编写代码过程中还是加深了对链表的了解程度。开发工具用的是win-tc ,而目前用得比较多的应用程序的开发系统都是可视化的集成开发环境,比如visual c+等,但是在底层开发比如硬件驱动程序的开发上,直接写出优秀的源代码还是一个程序员必须掌握的。所以 ,作为计算机软件专业的学生,我们都应该努力去做好! 源代码/*11.3.2 源程序*/*xue sheng guan li xi tong.c*/*头文件(.h)*/#include stdi

15、o.h /*i/o函数*/# include bios.h /*rom基本输入输出函数*/#include stdlib.h /*其它说明*/#include dos.h /*dos接口函数*/#include string.h /*字符串函数*/#include conio.h /*屏幕操作函数*/#include mem.h /*内存操作函数*/#include ctype.h /*字符操作函数*/#include alloc.h /*动态地址分配函数*/#define n 3 /*定义常数*/typedef struct z1 /*定义数据结构*/ char no11; char nam

16、e15; 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(); /*读入记录*/

17、void computer(student *h); /*计算总分和平均分*/student *insert(student *h); /*插入记录*/void append(); /*追加记录*/void copy(); /*复制文件*/student *sort(student *h); /*排序*/student *index(student *h); /*索引*/void auther(); /*版本信息*/ void total(student *h); /*分类合计*/int menu_select(); /*菜单函数*/*主函数开始*/main() int i; student

18、*head; /*链表定义头指针*/ head=init(); /*初始化链表*/ printf(nnnnnnnnn); printf(tt 444444444444444444444444444444444444444444444444n); printf(tt 6 welcome to the students-score system! 6 n); printf(tt 6 -chen tian lin- 6 n); printf(tt 444444444444444444444444444444444444444444444444n); for(;) /*无限循环*/ switch(me

19、nu_select() /*调用主菜单函数,返回值整数作开关语句的条件*/ /*值不同,执行的函数不同,break 不能省略*/ 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:save(head);break; /*保存文件*/ case 6:head=lo

20、ad(); break; /*读文件*/ case 7:computer(head);break; /*计算总分和均分*/ case 8:head=insert(head); break; /*插入记录*/ case 9:copy();break; /*复制文件*/ case 10:head=sort(head);break; /*排序*/ case 11:append();break; /*追加记录*/ case 12:head=index(head);break; /*索引*/ case 13:total(head);break; /*分类合计*/ case 14:exit(0); /*如

21、菜单返回值为14程序结束*/ case 15:auther(); /*版本信息*/ /*菜单函数,返回值为整数*/menu_select() char *f=22111111111 scores menu 11111111122, /*定义菜单字符串数组*/ 0. init list , /*初始化*/ 1. enter list , /*输入记录*/ 2. delete a record from list , /*从表中删除记录*/ 3. print list , /*显示单链表中所有记录*/ 4. search record on name , /*按照姓名查找记录*/ 5. save

22、the file , /*将单链表中记录保存到文件中*/ 6. load the file , /*从文件中读入记录*/ 7. computer the score, /*计算所有学生的总分和均分*/ 8. insert record to list , /*插入记录到表中*/ 9. copy the file to new file, /*复制文件*/ 10. sort to make new file, /*排序*/ 11. append record to file, /*追加记录到文件中*/ 12. index on nomber, /*索引*/ 13. total on nomber

23、, /*分类合计*/ 14. quit , /*退出*/ 15. auther , /*版本信息*/ 535 enter the * to return when need ! 535, ; char s80; /*以字符形式保存选择号*/ int i; int key=0; /*记录所压键值*/ int c=0; gotoxy(25,25); /*移动光标*/ printf(press any key enter menu.n);/*压任意键进入主菜单*/ getch(); clrscr(); /*清屏*/ textcolor(yellow ); /*设置文本颜色为黄色*/ textback

24、ground(blue ); /*设置背景颜色为蓝色*/ gotoxy(10,2); putch(0xda); /*输出左上角边框*/ for(i=1;i53;i+) putch(0xc4); /*输出上边框水平线*/ putch(0xbf); /*输出右上角边框 */ for(i=3;i22;i+)/*输出左右两边的垂直线*/ gotoxy(10,i);putch(0xb3); gotoxy(63,i);putch(0xb3); gotoxy(10,22);putch(0xc0); /*输出左下角边框*/ for(i=1;i53;i+) putch(0xc4); /*输出下边框水平线*/ p

25、utch(0xd9); /*输出右下角边框*/ window(11,3,62,21); /* 制作显示菜单的窗口,大小根据菜单条数设计*/ clrscr(); /*清屏*/ for(i=0;i8; /*对所压的键进行判断*/ gotoxy(10,i+1); textbackground(blue);/*设置背景颜色为蓝色*/ cprintf(%s,fi); /*输出菜单项*/ if(key=72) i=i=1?16:i-1; /*如压向上光标键,i减1,如已到第一行再上移,则到最后一行*/ if(key=80)i=i=16?1:i+1; /*如压向下光标键,i加1,如已到最后一行再下移,则到第

26、一行*/ gotoxy(10,i+1); /*光标移动i的下一项*/ textbackground(lightred); /*将背景颜色设为浅红*/ cprintf(%s,fi); /*输出菜单项*/ c=i-1; /*给代表菜单选项的整数赋值*/ textbackground(cyan ); /*设置背景颜色为青色*/ window(1,1,80,25); /*恢复原窗口大小*/ return c; /*返回代表菜单选项的整数值*/ student *init() return null; /*1创建链表*/student *create() int i; int s; student *h

27、=null,*info; /* student指向结构体的指针*/ for(;) info=(student *)malloc(sizeof(student); /*申请空间*/ if(!info) /*如果指针info为空*/ printf(nout of memory); /*输出内存溢出*/ return null; /*返回空指针*/ inputs(enter no:,info-no,11); /*输入学号并校验*/ if(info-no0=*) break; /*如果学号首字符为则结束输入*/ inputs(enter name:,info-name,15); /*输入姓名,并进行校

28、验*/ printf(please input %d score n,n); /*提示开始输入成绩*/ s=0; /*计算每个学生的总分,初值为0*/ for(i=0;iscorei); /*输入成绩*/ if(info-scorei100|info-scoreiscorei100|info-scoreiscorei; /*累加各门课程成绩*/ info-sum=s; /*将总分保存*/ info-average=(float)s/n; /*求出平均值*/ info-order=0; /*未排序前此值为0*/ info-next=h; /*将头结点做为新输入结点的后继结点*/ h=info;

29、/*新输入结点为新的头结点*/ return(h); /*返回头指针*/*2输入字符串,并进行长度验证*/inputs(char *prompt, char *s, int count) char p255; clrscr(); /*清屏*/ doprintf(no. name yu wen shu xue ying yu /enter the * to return when needn); printf(prompt); /*显示提示信息*/ scanf(%s,p); /*输入字符串*/ if(strlen(p)count)printf(n too long! n); /*进行长度校验,超

30、过count值重输入*/ while(strlen(p)count); strcpy(s,p); /*将输入的字符串拷贝到字符串s中*/*3输出链表中结点信息*/void print(student *h) int i=0; /* 统计记录条数*/ student *p; /*移动指针*/ clrscr(); /*清屏*/ p=h; /*初值为头指针*/ printf(nnn*student scores*n); printf(| rec|no | name |yu wen|shu xue|ying yu| sum | ave |order|n); printf(|-|-|-|-|-|-|-|

31、-|-|n); while(p!=null) i+; printf(|%3d |%-10s|%-15s|%6d|%7d|%7d| %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);/*4删除记录*/student *delete(student *h) student *p,*q; /*p为查找到要删除的结点指针,q为其前驱指针*/ char s11; /*存放学号*/ clrscr(); /*清屏*/ prin

32、tf(please deleted no n); /*显示提示信息*/ scanf(%s,s); /*输入要删除记录的学号*/ q=p=h; /*给q和p赋初值头指针*/ while(strcmp(p-no,s)&p!=null) /*当记录的学号不是要找的,或指针不为空时*/ q=p; /*将p指针值赋给q作为p的前驱指针*/ p=p-next; /*将p指针指向下一条记录*/ if(p=null) /*如果p为空,说明链表中没有该结点*/ printf(nlist no %s studentn,s); else /*p不为空,显示找到的记录信息*/ printf(*have found*n

33、); printf(|no | name |yu wen|shu xue|ying yu| sum | ave |order|n); printf(|-|-|-|-|-|-|-|-|n); printf(|%-10s|%-15s|%6d|%7d|%7d| %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) /*如果p=h,说明被删结点是头结点*/ h=p-next; /*

34、修改头指针指向下一条记录*/ else q-next=p-next; /*不是头指针,将p的后继结点作为q的后继结点*/ free(p); /*释放p所指结点空间*/ printf(n have deleted no %s studentn,s); printf(dont forget saven);/*提示删除后不要忘记保存文件*/ return(h); /*返回头指针*/*5查找记录*/void search(student *h) student *p; /* 移动指针*/ char s15; /*存放姓名的字符数组*/ clrscr(); /*清屏幕*/ printf(please e

35、nter name for searchn); scanf(%s,s); /*输入姓名*/ p=h; /*将头指针赋给p*/ 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 |yu wen|shu xue|ying yu| sum

36、 | ave |order|n); printf(|-|-|-|-|-|-|-|-|n); printf(|%-10s|%-15s|%6d|%7d|%7d| %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); /*6插入记录*/student *insert(student *h) student *p,*q,*info; /*p指向插入位置,q是其前驱,info指新插入记录*/ char s11; /*保存插入点位置的学号*/ int

37、s1,i; clrscr(); /*清屏幕*/ printf(please enter location before the no /enter the * to return when needn); scanf(%s,s); /*输入插入点学号*/ printf(nplease new recordn); /*提示输入记录信息*/ info=(student *)malloc(sizeof(student); /*申请空间*/ if(!info) printf(nout of memory); /*如没有申请到,内存溢出*/ return null; /*返回空指针*/ inputs(e

38、nter no:,info-no,11); /*输入学号*/ inputs(enter name:,info-name,15); /*输入姓名*/ printf(please input %d score n,n); /*提示输入分数*/ s1=0; /*保存新记录的总分,初值为0*/ for(i=0;iscorei); if(info-scorei100|info-scoreiscorei100|info-scoreiscorei; /*计算总分*/ info-sum=s1; /*将总分存入新记录中*/ info-average=(float)s1/n; /*计算均分*/ info-orde

39、r=0; /*名次赋值0*/ info-next=null; /*设后继指针为空*/ p=h; /*将指针赋值给p*/ q=h; /*将指针赋值给q*/ while(strcmp(p-no,s)&p!=null) /*查找插入位置*/ q=p; /*保存指针p,作为下一个p的前驱*/ p=p-next; /*将指针p后移*/ if(p=null) /*如果p指针为空,说明没有指定结点*/ if(p=h) /*同时p等于h,说明链表为空*/ h=info; /*新记录则为头结点*/ else q-next=info; /*p为空,但p不等于h,将新结点插在表尾*/ else if(p=h) /*

40、p不为空,则找到了指定结点*/ info-next=p; /*如果p等于h,则新结点插入在第一个结点之前*/ h=info; /*新结点为新的头结点*/ else info-next=p; /*不是头结点,则是中间某个位置,新结点的后继为p*/ q-next=info; /*新结点作为q的后继结点*/ printf(n -have inserted %s student-n,info-name); printf(-dont forget save-n); /*提示存盘*/ return(h); /*返回头指针*/*7保存数据到文件*/void save(student *h) file *fp

41、; /*定义指向文件的指针*/ student *p; /* 定义移动指针*/ char outfile10; /*保存输出文件名*/ clrscr(); /*清屏*/ printf(enter outfile name,for example c:f1te.txt: /enter the * to return when need n); /*提示文件名格式信息*/ scanf(%s,outfile); if(fp=fopen(outfile,wb)=null) /*为输出打开一个二进制文件,如没有则建立*/ printf(can not open filen); exit(1); printf(nsaving file.n); /*打开文件,提示正在保存*/ p=h; /*移动指针从头指针开始*/ while(p!=null) /*如p不为空*/ fwrite(p,sizeof(student),1,fp);/*写入一条记录*/ p=p-next; /*指针后移*/ fclose(fp); /*关闭文件*/ printf(-save success!-n); /*显示保存成功*/* 8从文件读数据*/student *load() student *p,*q,*h=null; /*定义记录指针变量*/

温馨提示

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

评论

0/150

提交评论