c语言编写的学生成绩管理系统_第1页
c语言编写的学生成绩管理系统_第2页
c语言编写的学生成绩管理系统_第3页
c语言编写的学生成绩管理系统_第4页
c语言编写的学生成绩管理系统_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

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

文档简介

1、 JIANGXI NORMAL UNIVERSITY 软件学院课程设计报告书 项目名称: 学生成绩管理系统 专业班级: 软件技术4班 学 号: 姓 名: 郝志新 指导教师: 李莹 2014年1月 1日目 录 第1章课题背景描述3 第2章 总体设计32.1 任务目标32.2 开发设计思想42.3 主要功能42.4 关键技术5 第3章 代码设计73.1 截图73.2 核心代码12 第4章 总 结25 参考文献26 致 谢26第1章 课题背景描述由于计算机技术的迅速发展和普及,与之紧密相关的管理信息系统 :已经深入到现代社会各行各业中。在高校,学生信息管理系统(SMIS)作为计算机管理信息系统的一个

2、应用,越来越发挥着它重要的作用。本文所介绍的学生信息管理系统是用C语言开发的。本系统完成了对学生的成绩管理,包括对学生信息的添加、修改、排序、删除等计算机管理工作。本文对采用的相关技术进行了描述,对各个子系统的功能、设计思路及设计 方法都作了详细的描述。学生信息管理系统(SMIS)是大学信息管理系统建设的重要组成部分, 是提高教学管理的 质量和效益乃至建设知名高水平大学的关键环节。学生信息处理的电脑化、网络化,也是实 现学校管理现代化和信息化的重要内容。 学生信息管理系统的内容对于学校的决策者和管理者来说都至关重要,所以学生信息管理系统应该能够为用户提供充足的信息和快捷的查询手段。但一直以来人

3、们使用传统人工的方式管理文件档案,这种管理方式存在着许多缺点,如: 效率低、保密性差,另外时间一长,将产生大量的文件和数据,这对于查找、更新和维护都带来 了不少的困难。随着科学技术的不断提高,计算机科学日渐成熟,其强大的功能已为人们深刻认识,它已进入人类社会的各个领域并发挥着越来越重要的作用。作为计算机应用的一部分, 使用计算机对学生信息进行管理,具有手工管理所无法比拟的优点.例如:检索迅速、查找方便、可靠性高、存储量大、保密性好、寿命长、成本低等。这些优点能够极大地提高学生信息管理的效率,也是进行科学化、正规化管理的重要条件。第2章 总体设计2.1 任务目标随着学校的规模不断扩大,学生数量急

4、剧增加,有关学生的各种信息量也成倍增长。面对庞大的信息量需要有学生管理系统来提高学生管理工作的效率。 通过这样的系统可以做到信息的规范管理、科学统计和快速查询、 修改、 增加、删除等,从而减少管理方面的工作量。 本系统主要用于学校学生信息管理, 总体任务是实现学生信息关系的系统化、 规范化和自动化,其主要任务是用计算机对学生各种信息进行日常管理。2.2 开发设计思想程序总体框架如图: main() 菜单1 输入 2 输出3 查找 4 删除5 排序 6 插入7 保存 8 读取9 退出 菜单代码1添加学生信息2按序输出信息3按姓名查找信息4按学号删除信息5对学生信息排序6插入新的信息7保存信息到文

5、件8从文件中读取9退出2.3 主要功能1、每一条记录包括一个学生的学号、姓名、3门成绩、平均成绩。2、输入功能:可以一次完成无数条记录的输入。3、显示功能:完成全部学生记录的显示。4、查找功能:完成按姓名查找学生记录,并显示。5、排序功能:按学生平均成绩进行排序。6、插入功能:按平均成绩高低插入一条学生记录。7、保存功能:将学生记录保存在任何自定义的文件中,如保存在:c:score。8、读取功能:将保存在文件中的学生记录读取出来。9、有一个清晰美观界面来调用各个功能2.4 关键技术1、查找函数void search(STUDENT *head) ; N-S流程图如下:输入要查找的学生的学号sp

6、=head,使p指向第一结点当记录的学号不是要找的,或指针不为空时p=p-next p!=NULL如果指针不为空是否显示没有该输出p所指向的结点学生2、删除函数STUDENT *delete(STUDENT *head); N-S流程图如下:p1=head;输入入要删除的学号s当(strcmp(p1-num,s))& p1 != NULLp2=p1 p1=p1-nextp1是要删除的结点是否p1所指是头结点是否输出”找不到”head=p1-nextp2-next=p1-next的信息“(删除头结点)3、排序函数STUDENT *sort(STUDENT *head); N-S流程图:temp=

7、head-next,head-next=NULL 当temp!=NULL时t=temp;temp=temp-next;p1=head;p2=head;当t-averageaverage&p1!=NULL时p2=p1;p1=p1-next; p1=p2是否t-next=p1;t-next=p1;head=t;p2-next=t;p1=head;当p1!=NULL时i+;p1-order=i;p1=p1-next;输出“排序成功”4、插入函数STUDENT *insert(STUDENT *head,STUDENT *new); N-S流程图:P1=head, p0=new原来的链表是空表是否将p

8、0所指当p0-averageaverage 以及p1所指向的不是表尾结的结点作为点唯一结点p2指向p1位置 p1向后移一个结点p0-average=p1-average是 否p1指向头结点p1-next=p0是否p0-next=NULLhead=p0p2-next=p0(插到表尾之后)p0 -next=p1 p0-next=p1(插到表头之前) (插到表中间)n=n+1;(结点加1)head=sort(hear);(将成绩重新排序)5、保存函数void save(STUDENT *head); N-S流程图如下:输入要保存记录的文件地址outfile文件不能打开否是p=head;输出一个出错信

9、当p不为空时息,并返回菜单fwrite(p,LEN,1,fp); (写入一条记录)p=p-next; (指针后移)fclose(fp); (关闭文件)第3章 代码设计3.1 截图菜单界面: 图1.菜单1、创建信息: 图2.输入(已输入三个学生的学号及成绩)2、输出界面: 图3.输出(按输入顺序输出)3、查找界面: 图4.查找(输入名字ZSan)4、删除界面: 图5.删除成功(输入学号1001选择Y)5、排序界面: 图6-1.排序成功(按总分降序排列) 图6-2.菜单2输出查看排序6、插入界面: 图7-1.插入成功(插入1个学生学号及成绩)图7-2.菜单2输出数据查看7、保存数据: 图8.保存成

10、功(输入文件名称xscjxx)8、读取数据: 图9.读取成功(输入文件名称xscjxx)9、退出。3.2 核心代码/*头文件*/#include #include#include /*其它说明*/#include /*字符串函数*/#include /*内存操作函数*/#include /*字符操作函数*/#include /*动态地址分配函数*/#define LEN sizeof(STUDENT)typedef struct stu /*定义结构体数组用于缓存数据*/char num6; char name5; int score3; int sum; float average; int

11、 order; struct stu *next;STUDENT;/*函数原型*/STUDENT *init(); /*初始化函数*/int menu_select(); /*菜单函数*/STUDENT *create(); /*创建链表*/void print(STUDENT *head); /* 显示全部记录*/void search(STUDENT *head); /*查找记录*/STUDENT *delete(STUDENT *head); /*删除记录*/STUDENT *sort(STUDENT *head); /*排序*/STUDENT *insert(STUDENT *head

12、,STUDENT *new); /*插入记录*/void save(STUDENT *head); /*保存文件*/STUDENT *load(); /*读文件*/*主函数界面*/main()STUDENT *head,new; head=init(); /*链表初始化,使head的值为NULL*/ for(;) /*循环无限次*/ switch(menu_select() case 1:head=create();break; case 2:print(head);break; case 3:search(head);break; case 4:head=delete(head);break

13、; case 5:head=sort(head);break; case 6:head=insert(head,&new);break; /*&new表示返回地址*/ case 7:save(head);break; case 8:head=load(); break; case 9:exit(0); /*如菜单返回值为9则程序结束*/ /*初始化函数*/STUDENT *init() return NULL; /*返回空指针*/*菜单选择函数*/menu_select()int n; struct date d; /*定义时间结构体*/ getdate(&d); /*读取系统日期并把它放到结

14、构体d中*/ printf(press any key to enter the menu.); /*按任一键进入主菜单*/ getch(); /*从键盘读取一个字符,但不显示于屏幕*/ clrscr(); /*清屏*/ printf(*n); printf(tt Welcome ton); printf(ntt The student score manage systemn); printf(*MENU*n); printf(ttt1. Enter the recordn); /*输入学生成绩记录*/ printf(ttt2. Print the recordn); /*显示*/ prin

15、tf(ttt3. Search record on namen); /*寻找*/ printf(ttt4. Delete a recordn); /*删除*/ printf(ttt5. Sort to make new a filen); /*排序*/ printf(ttt6. Insert record to listn); /*插入*/ printf(ttt7. Save the filen); /*保存*/ printf(ttt8. Load the filen); /*读取*/ printf(ttt9. Quitn); /*退出*/ printf(ntt Made by Wang Do

16、ngsheng.n); printf(*n); printf(tttt%d%d%dn,d.da_year,d.da_mon,d.da_day); /*显示当前系统日期*/ do printf(ntttEnter your choice(19):); scanf(%d,&n); while(n9); /*如果选择项不在19之间则重输*/ return(n); /*返回选择项,主函数根据该数调用相应的函数*/*输入函数*/STUDENT *create()int i,s; STUDENT *head=NULL,*p; /* 定义函数.此函数带回一个指向链表头的指针*/ clrscr(); for(

17、;) p=(STUDENT *)malloc(LEN); /*开辟一个新的单元*/ if(!p) /*如果指针p为空*/ printf(nOut of memory.); /*输出内存溢出*/ return (head); /*返回头指针,下同*/ printf(Enter the num(0:list end):); scanf(%s,p-num); if(p-num0=0) break; /*如果学号首字符为0则结束输入*/ printf(Enter the name:); scanf(%s,p-name); printf(Please enter the %d scoresn,3); /

18、*提示开始输入成绩*/ s=0; /*计算每个学生的总分,初值为0*/ for(i=0;iscorei); if(p-scoreiscorei100) /*确保成绩在0100之间*/ printf(Data error,please enter again.n); while(p-scoreiscorei100); s=s+p-scorei; /*累加各门成绩*/ p-sum=s; /*将总分保存*/ p-average=(float)s/3; /*先用强制类型转换将s转换成float型,再求平均值*/ p-order=0; /*未排序前此值为0*/ p-next=head; /*将头结点做为

19、新输入结点的后继结点*/ head=p; /*新输入结点为新的头结点*/ return(head); /* 显示全部记录函数*/void print(STUDENT *head)int i=0; /* 统计记录条数*/ STUDENT *p; /*移动指针*/ clrscr(); p=head; /*初值为头指针*/ printf(n*STUDENT*n); printf(-n); printf(| Rec | Num | Name | Sc1 | Sc2 | Sc3 | Sum | Ave | Order |n); printf(-n); while(p!=NULL) i+; printf(

20、| %3d | %4s | %-4s | %3d | %3d | %3d | %3d | %4.2f | %-5d|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);/*查找记录函数*/void search(STUDENT *head)STUDENT *p; /* 移动指针*/ char s5; /*存放姓名用的字符数组*/ clrscr(); printf(Please enter name for searching.n)

21、; scanf(%s,s); p=head; /*将头指针赋给p*/ while(strcmp(p-name,s) & p != NULL) /*当记录的姓名不是要找的,或指针不为空时*/ p=p-next; /*移动指针,指向下一结点*/ if(p!=NULL) /*如果指针不为空*/ printf(n*FOUND*n); printf(-n); printf(| Num | Name | sc1 | sc2 | sc3 | Sum | Ave | Order |n); printf(-n); printf(| %4s | %4s | %3d | %3d | %3d | %3d | %4.2

22、f | %-5d|n, p-num,p-name,p-score0,p-score1,p-score2,p-sum,p-average,p-order); printf(-n); printf(*END*n); else printf(nThere is no num %s student on the list.n,s); /*显示没有该学生*/*删除记录函数*/STUDENT *delete(STUDENT *head)int n; STUDENT *p1,*p2; /*p1为查找到要删除的结点指针,p2为其前驱指针*/ char c,s6; /*s6用来存放学号,c用来输入字母*/ cl

23、rscr(); printf(Please enter the deleted num: ); scanf(%s,s); p1=p2=head; /*给p1和p2赋初值头指针*/ while(strcmp(p1-num,s) & p1 != NULL) /*当记录的学号不是要找的,或指针不为空时*/ p2=p1; /*将p1指针值赋给p2作为p1的前驱指针*/ p1=p1-next; /*将p1指针指向下一条记录*/ if(strcmp(p1-num,s)=0) /*学号找到了*/ printf(*FOUND*n); printf(-n); printf(| Num | Name | sc1

24、| sc2 | sc3 | Sum | Ave | Order |n); printf(-n); printf(| %4s | %4s | %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(Are you sure to delete the student Y/N ?); /*提示是否要删除,输入Y删除,N则退出*/ for(;) scanf(%c

25、,&c); if(c=n|c=N) break; /*如果不删除,则跳出本循环*/ if(c=y|c=Y) if(p1=head) /*若p1=head,说明被删结点是首结点*/ head=p1-next; /*把第二个结点地址赋予head*/ else p2-next=p1-next; /*否则将一下结点地址赋给前一结点地址*/ n=n-1; printf(nNum %s student have been deleted.n,s); printf(Dont forget to save.n);break; /*删除后就跳出循环*/ else printf(nThere is no num

26、%s student on the list.n,s); /*找不到该结点*/ return(head);/*排序函数*/STUDENT *sort(STUDENT *head)int i=0; /*保存名次*/ STUDENT *p1,*p2,*t,*temp; /*定义临时指针*/ temp=head-next; /*将原表的头指针所指的下一个结点作头指针*/ head-next=NULL; /*第一个结点为新表的头结点*/ while(temp!=NULL) /*当原表不为空时,进行排序*/ t=temp; /*取原表的头结点*/ temp=temp-next; /*原表头结点指针后移*

27、/ p1=head; /*设定移动指针p1,从头指针开始*/ p2=head; /*设定移动指针p2做为p1的前驱,初值为头指针*/ while(t-averageaverage&p1!=NULL) /*作成绩平均分比较*/ p2=p1; /*待排序点值小,则新表指针后移*/ p1=p1-next; if(p1=p2) /*p1=p2,说明待排序点值大,应排在首位*/ t-next=p1; /*待排序点的后继为p*/ head=t; /*新头结点为待排序点*/ else /*待排序点应插入在中间某个位置p2和p1之间,如p为空则是尾部*/ t-next=p1; /*t的后继是p1*/ p2-n

28、ext=t; /*p2的后继是t*/ p1=head; /*已排好序的头指针赋给p1,准备填写名次*/ while(p1!=NULL) /*当p1不为空时,进行下列操作*/ i+; /*结点序号*/ p1-order=i; /*将结点序号赋值给名次*/ p1=p1-next; /*指针后移*/ printf(Sorting is sucessful.n); /*排序成功*/ return (head);/*插入记录函数*/STUDENT *insert(STUDENT *head,STUDENT *new)STUDENT *p0,*p1,*p2; int n,sum1,i; p1=head;

29、/*使p1指向第一个结点*/ p0=new; /*p0指向要插入的结点*/ printf(nPlease enter a new record.n); /*提示输入记录信息*/ printf(Enter the num:); scanf(%s,new-num); printf(Enter the name:); scanf(%s,new-name); printf(Please enter the %d scores.n,3); sum1=0; /*保存新记录的总分,初值为0*/ for(i=0;iscorei); if(new-scorei100|new-scoreiscorei100|ne

30、w-scoreiscorei; /*累加各门成绩*/ new-sum=sum1; /*将总分存入新记录中*/ new-average=(float)sum1/3; new-order=0; if(head=NULL) /*原来的链表是空表*/ head=p0;p0-next=NULL; /*使p0指向的结点作为头结点*/ else while(p0-averageaverage)&(p1-next!=NULL) p2=p1; /*使p2指向刚才p1指向的结点*/ p1=p1-next; /*p1后移一个结点*/ if(p0-average=p1-average) if(head=p1)head

31、=p0; /*插到原来第一个结点之前*/ else p2-next=p0; /*插到p2指向的结点之后*/ p0-next=p1; else p1-next=p0;p0-next=NULL; /*插到最后的结点之后*/ n=n+1; /*结点数加1*/ head=sort(head); /*调用排序的函数,将学生成绩重新排序*/ printf(nStudent %s have been inserted.n,new-name); printf(Dont forget to save the new file.n); return(head);/*保存数据到文件函数*/void save(STU

32、DENT *head)FILE *fp; /*定义指向文件的指针*/ STUDENT *p; /* 定义移动指针*/ char outfile10; printf(Enter outfile name,for example c:scoren); scanf(%s,outfile); if(fp=fopen(outfile,wb)=NULL) /*为输出打开一个二进制文件,为只写方式*/ printf(Cannot open the filen); return; /*若打不开则返回菜单*/ printf(nSaving the file.n); p=head; /*移动指针从头指针开始*/

33、while(p!=NULL) /*如p不为空*/ fwrite(p,LEN,1,fp); /*写入一条记录*/ p=p-next; /*指针后移*/ fclose(fp); /*关闭文件*/ printf(Save the file successfully!n);/* 从文件读数据函数*/STUDENT *load()STUDENT *p1,*p2,*head=NULL; /*定义记录指针变量*/ FILE *fp; /* 定义指向文件的指针*/ char infile10; printf(Enter infile name,for example c:scoren); scanf(%s,infile); if(fp=fopen(infile,rb)=NULL) /*打开一个二进制文件,为只读方式*/ printf(Can not open the file.n); return(head); printf(nLoading the file!n); p1=(STUDENT *)malloc(LEN); /*开辟一个新单元*/ if(!p1) printf(Out of memory!n); re

温馨提示

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

评论

0/150

提交评论