学生成绩管理系统实验报告----廖鹏
更新时间:2023-06-12 07:18:01 阅读量: 实用文档 文档下载
- 学生成绩管理系统推荐度:
- 相关推荐
学生管理系统,有三部分
题 目: 库存管理系统——类定义、文
件读写、主菜单、出入库管理
学生姓名: 廖鹏
学 号: 200917010204
专业班级: 计科09102班
同组姓名: 周波,张开友 指导教师: 易 明 设计时间: 2009年下学期第3~4周
学生管理系统,有三部分
1系统需求与功能分析
1.1 系统需求分析
(1) 能完成学生成绩的插入、查询、修改、删除、输出等功能; (2)采用单链表存储结构实现; (3) 所有数据以外部文件方式保存。
1.2系统功能分析
(1)要设计一个学生成绩管理系统,其功能包括: ①插入函数Add():将学生成绩信息插入到链表中;
②查询函数Search():分别可以按学号和按姓名进行学生成绩查询; ③删除函数Delete():当需要删除的学号和姓名一致时则删除对应的学生记录;
④修改函数Modify():修改指定的学生成绩信息; ⑤输出函数Show():输出全部学生成绩信息;
⑥菜单函数Menu():为程序的菜单函数为实现各种功能提供便捷; ⑦读取数据函数Read():从外部文件读取学生成绩信息; ⑧保存数据函数Save():将数据保存到外部文件中。
(2)线性表的链接存储结构称为单链表,单链表使用一组任意的存储单元存放线性表的元素,这组存储单元可以连续也可以不连续,甚至可以零散分布在内存中的任意位置。为了正确表示元素之间逻辑关系,每个存储单元在存储数据元素的同时,还必须存储其后继元素所在地址信息,这个地址信息称为指针,这两部分组成了数据元素的存储映像,称为结点,结点结构如图2.1所示。
图2.1单链表的结点构造
设p是一个指针变量,则p的值是一个指针。设指针p指向某个结点,则该结点用*p表示,在单链表中,结点p由两个域组成:存放数据元素的部分和存放后继结点地址的指针部分,分别用p->data和p->next来标识,p->next指向结点ai+1,其指针与结点之间关系如图2.2所示。
学生管理系统,有三部分
图2.2指针与结点之间关系的示意图
2总体结构设计
2.1系统的结构设计
通过对学生成绩信息管理系统的功能分析,可以定义出系统的总体结构模块图,如图3.1所示。
图2.1学生成绩管理系统总体结构设计
2.2系统管理流程图
前面的分析中已经定义了系统各个模块,属于静态建模的范围。在系统运行
时刻的动态模型应该由系统的流程决定。当用户运行该系统后可以来进行学生成绩信息插入管理、学生成绩信息查询管理、学生成绩信息删除管理、学生成绩信息修改管理及学生成绩信息输出等操作,具体的流程如图3.2所示。
学生管理系统,有三部分
图2.2系统流程图
主模块应负责应用程序的主界面,由它调用其他模块.因此主模块应具有操作性好、界面清晰的特点,使用户能够很方便地找到所需功能。
根据功能需求的结果分析,主界面应该由学生成绩信息插入管理,学生成绩信息查询管理、学生成绩信息修改管理、学生成绩信息删除管理和学生成绩信息输出管理组成,可以通过输入相应的数字进入相应的功能模块。
学生管理系统,有三部分
3 系统详细设计和系统实现
系统总体设计完成后,就可以根据需求对各个模块来进行实现了。在本系统中需要编码实现的主要有学生成绩信息插入、学生成绩信息查询、学生成绩信息修改、学生成绩信息删除和学生成绩信息输出等5个模块。
(1)学生成绩插入模块
添加的信息包括学号(不允许重复)、姓名(不允许重复)、成绩1、成绩2和成绩3。流程图如下图3.1所示。
图3.1插入模块流程图
本程序采用的是尾插法,就是每次将新申请的结点插在终端结点的后面,其执行过程如图3.2所示。
学生管理系统,有三部分
图3.2尾插法建立单链表操作示意图
(2)学生成绩查询模块
按姓名和学号查找学生成绩的流程图分别如下图4.3所示。
图3.3按姓名查找学生成绩信息流程图
在单链表中,即使知道被访问结点的位置i,也不能像顺序表那样直接按序号访问,而只能从头指针出发,设置一个工作指针p,顺next域逐个结点往下搜索。当p指向某个结点时判断是否为第i个结点,若是则查找成功;否则,将工
学生管理系统,有三部分
作指针p后移,即将p指向原来所指结点的后继结点。直到p为NULL时查找失败。单链表查找过程如图3.4所示。
图3.4单链表查找过程的示意图
按学号查询学生成绩信息同按姓名查找学生成绩信息,此处不再详细列出。 (3)学生成绩修改模块
首先要查找与要修改数据相匹配的信息,若没有则返回失败。否则把相应的信息输出,然后再重新输入新的数据并保存到单链表。
(4)学生成绩删除模块
当选择删除功能时,首先输入要删除的同学的姓名,然后输入要删除的同学的学号,如果该同学存在并且姓名与学号匹配的上,则进行删除操作,否则返回失败。其流程图3.5如下:
图3.5删除学生信息模块流程图
删除操作定义为将单链表的第i个结点删去。因为在单链表中结点ai存储地址在其前驱结点ai-1的指针域,所以必须首先找到ai-1的存储地址p,然后令p的next域指向ai 的后继结点,即把结点ai 从链上摘下来,最后释放结点ai的存储空间,如图3.6所示。
学生管理系统,有三部分
图3.6在单链表中删除结点指针的变化情况
(5)学生成绩输出模块
从单链表表头遍历整个单链表,将所有数据输出。其部分代码如下:
/************************************ 函数功能:显示优秀和不及格学生成绩 ************************************/ void DesplayMarkSegment(void) {
STUDENT *p; int count=0;
p=headLink->next;
printf("有一门60分以下(不及格)的学生成绩如下:\n");
printf("学号\t姓名\t班级\t成绩1\t成绩1\t成绩3\t总成绩\t平均成绩\n\n"); while(p) {
if((6>((int)(p->mark1/10)))||(6>((int)(p->mark2/10)))||(6>((int)(p->mark3/10))))/*只要有一科不及格就认为该生不及格*/ {
count++;
DesplayOneNode(p); }
p=p->next; }
printf("不及格的学生一共有%d人\n",count); p=headLink->next;
printf("成绩优秀的学生成绩如下:\n");
printf("学号\t姓名\t班级\t成绩1\t成绩1\t成绩3\t总成绩\t平均成绩\n\n"); count=0; while(p) {
if((8<=((int)(p->mark1/10)))&&(8<=((int)(p->mark2/10)))&&(8<=((int)(p->mark3/10)))) {
count++;
DesplayOneNode(p); }
p=p->next; }
学生管理系统,有三部分
printf("成绩优秀的学生一共有%d人\n",count); }
5 系统测试
(1) 运行主界面:
(2) 学生成绩插入模块
(3)学生成绩修改模块
(4)学生成绩删除模块
学生管理系统,有三部分
(5)学生成绩输出模块
6 结束语
在本次课程设计过程中,曾遇到过不少问题,单靠我个人的努力,很难按时完成该课程设计,在此,我衷心感谢我的指导老师——易明。易明老师认真负责的工作态度,严谨的治学精神和深厚的理论水平都使我获益非浅。从一遍一遍得修改到最后定稿的各个环节给予细心指导,使我在知识和能力上都得到了极大的提高,在此表示衷心地感谢。在整个过程中,我查阅了大量的关于学生成绩管理系统的资料和网站,在老师的指导和自己的努力下,终于完成了本次课程设计。
通过这次数据结构课程设计的实验,在解决问题的过程中,充分体会到了数据结构这门课程对于软件设计的重要性,也体会到了数据结构+算法=程序这句话的真正含义,一个实际问题的解决第一步就是要依赖于良好的抽象思维的,将实际问题转化为相应的数据结构,只有这一步做好了,才能采取相应的算法和优化方法解决问题和解决好问题。
同时我还要感谢指导过我的每一位老师,他们给了我很大的指导和帮助,还有在我陷入困境时帮助过我的同学们。另外,还要感谢学校领导、辅导员,为我们提供了良好的设计环境以及各方面的支持。
学生管理系统,有三部分
附录1:结构化设计源程序清单
// 程序名称:Student.CPP
// 程序功能:采用链表与文件实现一个简单的学生成绩管理系统。
#include<stdio.h> #include<iostream> #include<conio.h> #include<malloc.h> #include<string.h>
typedef struct STUDENT {
char studentNumber[10];/*学生学号*/ char studentName[20];/*学生姓名*/ char className[20];/*班级名称*/ float mark1;/*第1门成绩*/ float mark2;/*第2门成绩*/ float mark3;/*第3门成绩*/ struct STUDENT *next; }STUDENT;
STUDENT *headLink;/*链表表头指针*/
void ReadInfoFormFile(void); /*以下是函数声明*/ void DesplayMenu(void); void CreateHeadLink(void); STUDENT *MallocNode(void); void GetInformation(STUDENT *t); void OutputInformation(void);
void DesplayInfoBystudentNumber(void); void DesplayOneNode(STUDENT *t); void InsertOneNode(STUDENT *t);
void DeleteNodeBystudentNumber(void); void ChangeMarkByNumber(void); void SaveLinkToFile(void);
void DesplayMarkSegment(void); void CompositorByTotalMark(void); int choose;/*用于接受用户的选择*/ void yonghudenglu(void); void putong(void); void pass(void);
void main() /*主函数*/ {
CreateHeadLink(); ReadInfoFormFile(); yonghudenglu();
学生管理系统,有三部分
DesplayMenu(); }
void yonghudenglu(void) { int choose1;
printf("****************MUNE***************\n\n"); printf("* 用户登陆 *\n"); printf("* 1 管理员登陆 *\n"); printf("* 2 普通用户登陆 *\n"); printf("* 3 退出 *\n"); puts("****************END******************\n"); puts("请输入你的账号:"); scanf("%d",&choose1); putchar('*');
puts("请输入你的密码:"); putchar('*');
scanf("%d",&choose); switch(choose) { case 1:
DesplayMenu(); getch(); break; case 2: putong(); getch(); break; case 3:
SaveLinkToFile();/*保存数据后再退出*/ free(headLink); exit(1); break; default: break; }
system("cls");
DesplayMenu();/*递归调用*/ }
/************************************ 函数功能:从文件中读学生信息到链表中 ************************************/ void ReadInfoFormFile(void) {
学生管理系统,有三部分
STUDENT *p;
fp=fopen("c:\\snow.txt","rb"); if(!fp) {
printf("文件不存在\n"); return; }
p=MallocNode();
while(fscanf(fp,"%s %s %s %f%f %f",p->studentNumber,p->studentName,p->className,&(p->mark1),&(p->mark2),&(p->mark3))>0) {
InsertOneNode(p); p=MallocNode(); }
fclose(fp); }
/************************************ 函数功能:显示菜单,根据用户的输入 完成相应的功能
************************************/
void DesplayMenu(void) {
STUDENT *p;
printf("****************MUNE***************\n\n"); printf("* 1 显示所有学生的信息 *\n"); printf("* 2 按学号查询 *\n"); printf("* 3 增加学生 *\n"); printf("* 4 删除学生 *\n"); printf("* 5 按学号修改学生成绩 *\n"); printf("* 6 保存所有学生信息 *\n"); printf("* 7 显示优秀和不及格学生成绩 *\n"); printf("* 8 排序结果并输出绩 *\n"); printf("* 0 退出 *\n"); puts("****************END******************\n"); puts("please input your choose (0~8)"); scanf("%d",&choose);/*取得用户的选择*/ switch(choose) {
case 1:
OutputInformation();/*显示所有学生的信息*/
学生管理系统,有三部分
break; case 2:
DesplayInfoBystudentNumber();/*根据用户输入的学号显示该学生的信息*/ getch(); break; case 3:
p=MallocNode();/*先申请一个新结点*/
GetInformation(p);/*要求用户输入信息到新结点中*/ InsertOneNode(p);/*将新结点加到链表中*/ break; case 4:
DeleteNodeBystudentNumber();/*根据用户输入的学号删除该学生*/ getch(); break; case 5:
ChangeMarkByNumber();/*根据用户输入的学号修改学生成绩*/ getch(); break; case 6:
SaveLinkToFile();/*保存数据*/ break; case 7:
DesplayMarkSegment();/*显示各分数段的学生成绩*/ getch(); break; case 8:
CompositorByTotalMark(); getch(); break; case 0:
SaveLinkToFile();/*保存数据后再退出*/ free(headLink); exit(1); break; default: break; }
system("cls");
DesplayMenu();/*递归调用*/ }
/************************************ 函数功能:建立链表表头
学生管理系统,有三部分
************************************/ void putong(void) {
printf("****************MUNE***************\n\n"); printf("* 1 显示所有学生的信息 *\n"); printf("* 2 按学号查询 *\n"); printf("* 3 按学号修改学生成绩 *\n"); printf("* 4 显示优秀和不及格学生成绩 *\n"); printf("* 5 排序结果并输出绩 *\n"); printf("* 0 退出 *\n"); puts("****************END******************\n"); puts("please input your choose (0~5)"); scanf("%d",&choose);/*取得用户的选择*/ switch(choose) {
case 1:
OutputInformation();/*显示所有学生的信息*/ getch(); break; case 2:
DesplayInfoBystudentNumber();/*根据用户输入的学号显示该学生的信息*/ getch(); break; case 3:
ChangeMarkByNumber();/*根据用户输入的学号修改学生成绩*/ getch(); break; case 4:
DesplayMarkSegment();/*显示各分数段的学生成绩*/ getch(); break;
case 5:
CompositorByTotalMark(); getch(); break; case 0:
SaveLinkToFile();/*保存数据后再退出*/ free(headLink); exit(1); break; default: break; }
学生管理系统,有三部分
}
void CreateHeadLink(void) {
STUDENT *p;
p=(STUDENT*)malloc(sizeof(STUDENT)); headLink=p; p->next=NULL; }
/************************************ 函数功能:申请一个新结点,并将其初始化 ************************************/ STUDENT *MallocNode(void) {
STUDENT *p; int i;
p=(STUDENT*)malloc(sizeof(STUDENT)); if(p==NULL) return NULL; for(i=0;i<10;i++)
p->studentNumber[i]='\0'; for(i=0;i<20;i++)
p->studentName[i]='\0'; for(i=0;i<20;i++) p->className[i]='\0'; p->mark1=0.0; p->mark2=0.0; p->mark3=0.0; p->next=NULL; return p; }
/************************************ 函数功能:取得用户输入的学生信息
************************************/ void GetInformation(STUDENT *t) {
printf("请输入学生学号:\n"); scanf("%s",t->studentNumber); printf("请输入学生姓名:\n"); scanf("%s",t->studentName);
printf("请输入该生所在班级:\n"); scanf("%s",t->className);
printf("请输入第1门成绩:\n"); scanf("%f",&(t->mark1));
printf("请输入第2门成绩:\n");
学生管理系统,有三部分
scanf("%f",&(t->mark2));
printf("请输入第3门成绩:\n"); scanf("%f",&(t->mark3)); puts("SUCCESS"); getch(); }
/************************************ 函数功能:在链表的结尾处增加一个结点 ************************************/ void InsertOneNode(STUDENT *t) {
STUDENT *p; p=headLink; while(p->next) {
p=p->next; }
p->next=t; }
/************************************
函数功能:根据用户输入的学号显示该学生的信息 ************************************/ void DesplayInfoBystudentNumber(void) {
STUDENT *p;
char studentNumber[10]; char flag=0;
p=headLink->next;
printf("请输入学生学号:\n"); scanf("%s",studentNumber); while(p) {
if(strcmp(p->studentNumber,studentNumber)==0) {
printf("学号\t姓名\t班级\t成绩1\t成绩1\t成绩3\t总成绩\t平均成绩\n\n"); DesplayOneNode(p); flag=1; break; }
p=p->next; }
if(!flag)
printf("对不起,不存在学号为 %s 的学生\n",studentNumber); }
学生管理系统,有三部分
/************************************ 函数功能:输出一个结点的信息
************************************/ void DesplayOneNode(STUDENT *t) {
printf("%s\t",t->studentNumber); printf("%s\t",t->studentName); printf("%s\t",t->className); printf("%.2f\t",t->mark1); printf("%.2f\t",t->mark2); printf("%.2f\t",t->mark3);
printf("%.2f\t",t->mark1+t->mark2+t->mark3);
printf("%.2f\t\n",(t->mark1+t->mark2+t->mark3)/3); }
/************************************ 函数功能:根据用户输入的学号删除该学生 ************************************/ void DeleteNodeBystudentNumber(void) {
char studentNumber[10]; STUDENT *p,*q; char flag=0;
printf("请输入要删除的学生学号:"); scanf("%s",studentNumber); p=headLink;
q=headLink->next; while(q) {
if(strcmp(q->studentNumber,studentNumber)==0) {
p->next=q->next; free(q); flag=1; break; }
p=p->next; q=q->next; }
if(!flag) {
printf("不存在该学号的学生\n"); return; }
printf("成功删除\n");
学生管理系统,有三部分
getch(); }
/************************************ 函数功能:显示所有学生的信息
************************************/ void OutputInformation(void) {
STUDENT *p; p=headLink->next; if(p==NULL) {
printf("现在没有学生信息,请先输入学生信息\n\n"); return; }
printf("学号\t姓名\t班级\t成绩1\t成绩1\t成绩3\t总成绩\t平均成绩\n\n"); while(p) {
DesplayOneNode(p); p=p->next; } }
/************************************ 函数功能:根据输入的学号修改成绩
************************************/ void ChangeMarkByNumber(void) {
STUDENT *p;
char studentNumber[20]; char flag=0;
float mark1,mark2,mark3; p=headLink->next;
printf("请输入学生学号:\n"); scanf("%s",studentNumber); while(p) {
if(strcmp(p->studentNumber,studentNumber)==0) {
printf("请输入新的第1门成绩:\n"); scanf("%f",&mark1);
printf("请输入新的第2门成绩:\n"); scanf("%f",&mark2);
printf("请输入新的第3门成绩:\n"); scanf("%f",&mark3); p->mark1=mark1;
学生管理系统,有三部分
p->mark2=mark2; p->mark3=mark3; flag=1;
printf("修改成功\n"); break; }
p=p->next; }
if(!flag)
printf("对不起,不存在学号为 %s 的学生\n",studentNumber); }
/************************************ 函数功能:保存链表数据到文件中
************************************/ void SaveLinkToFile(void) {
STUDENT *p; FILE *fp;
p=headLink->next; if(p==NULL) {
printf("现在没有学生信息,请先输入学生信息\n\n"); return; }
fp=fopen("c:\\snow.txt","w+"); if(!fp) {
printf("文件不存在\n"); return; }
while(p) {
fprintf(fp,"%s %s %s %f %f %f\n",p->studentNumber,p->studentName,p->className,p->mark1,p->mark2,p->mark3); p=p->next; }
fclose(fp); }
/************************************ 函数功能:显示优秀和不及格学生成绩 ************************************/ void DesplayMarkSegment(void) {
STUDENT *p;
学生管理系统,有三部分
int count=0;
p=headLink->next;
printf("有一门60分以下(不及格)的学生成绩如下:\n");
printf("学号\t姓名\t班级\t成绩1\t成绩1\t成绩3\t总成绩\t平均成绩\n\n"); while(p) {
if((6>((int)(p->mark1/10)))||(6>((int)(p->mark2/10)))||(6>((int)(p->mark3/10))))/*只要有一科不及格就认为该生不及格*/ {
count++;
DesplayOneNode(p); }
p=p->next; }
printf("不及格的学生一共有%d人\n",count); p=headLink->next;
printf("成绩优秀的学生成绩如下:\n");
printf("学号\t姓名\t班级\t成绩1\t成绩1\t成绩3\t总成绩\t平均成绩\n\n"); count=0; while(p) {
if((8<=((int)(p->mark1/10)))&&(8<=((int)(p->mark2/10)))&&(8<=((int)(p->mark3/10)))) {
count++;
DesplayOneNode(p); }
p=p->next; }
printf("成绩优秀的学生一共有%d人\n",count); }
/************************************ 函数功能:按总成绩排序
************************************/ void CompositorByTotalMark(void) {
STUDENT exchange,*r,*p,*q; r=headLink->next; if(r==NULL) {
printf("现在还没学生信息,请先输入学生信息\n"); return; }
while(r)/*两层while循环实现排序*/ {
正在阅读:
学生成绩管理系统实验报告----廖鹏06-12
城镇居民社会养老保险01-15
《我爱秋天》阅读及答案06-24
朔城区公安消防大队“两节、 两会”消防安全保卫工作汇报04-14
cmts组网方案04-05
河南卢乐源流及其迁徙初探03-26
新北师大初三三角函数知识点总结及中考真题汇总有答案09-19
祝福祖国73周年的话(精选120句)03-25
- 教学能力大赛决赛获奖-教学实施报告-(完整图文版)
- 互联网+数据中心行业分析报告
- 2017上海杨浦区高三一模数学试题及答案
- 招商部差旅接待管理制度(4-25)
- 学生游玩安全注意事项
- 学生信息管理系统(文档模板供参考)
- 叉车门架有限元分析及系统设计
- 2014帮助残疾人志愿者服务情况记录
- 叶绿体中色素的提取和分离实验
- 中国食物成分表2020年最新权威完整改进版
- 推动国土资源领域生态文明建设
- 给水管道冲洗和消毒记录
- 计算机软件专业自我评价
- 高中数学必修1-5知识点归纳
- 2018-2022年中国第五代移动通信技术(5G)产业深度分析及发展前景研究报告发展趋势(目录)
- 生产车间巡查制度
- 2018版中国光热发电行业深度研究报告目录
- (通用)2019年中考数学总复习 第一章 第四节 数的开方与二次根式课件
- 2017_2018学年高中语文第二单元第4课说数课件粤教版
- 上市新药Lumateperone(卢美哌隆)合成检索总结报告
- 管理系统
- 成绩
- 实验
- 报告
- 学生
- 廖鹏
- 第五章建设工程工程量计算(建筑工程)
- 电焊工理论知识考试题
- 市六届人大二次会议开幕 陈新作政府工作报告
- 西南石油大学油层物理复习资料3
- 中餐摆台训练计划
- 线性代数特征值、特征向量与二次型
- 高中化学必修一第二章单元测试题及答案
- 广西农村信用社考试历年真题(2007-2011)1
- 大工13秋《建筑施工》在线测试3及答案
- 信息技术教学反思
- 绝对值与相反数(3)
- 光伏逆变系统中的ZVS升压变换器
- 略谈堤坝工程出险种类及施工方案
- 杰诚多媒体展示系统方案书_
- 微波技术_第三章_传输线和波导
- 德州市基准地价修正体系
- 0-36月儿童中医药健康管理服务记录表 填写说明及示例
- 星密码“开网店专家”实至名归
- 2013最新水工实习报告
- 空气-蒸汽给热系数测定_实验报告