您好,欢迎来到五一七教育网。
搜索
您的当前位置:首页学生管理系统

学生管理系统

来源:五一七教育网
学生管理系统(图形界面)——Java

数据结构

学生成绩管理系统 课程设计报告

页脚内容 学生管理系统(图形界面)——Java

一、 需求分析

1. 构建学生成绩管理系统,每个学生的信息为:基本信息(学号、姓名、年龄、性别),

课程1(课程1、成绩、教师),课程2(课程2、成绩、教师)。

2. 采用Hash表加课程链表的结构:Hash表存放每个学生的基本信息,课程指针指向课

程链表。

3. 程序应有如下功能:(1)建立哈希表:输入十个人的信息,哈希函数为H=(学号后三

位)MOD11,用线性探测再散列的方法处理冲突(2)查询:显示全部信息,可以实现按学号、姓名、性别、某年级全部课程、听某教师课的学生、选择某门课程的学生查找(3)排序:按学号从小到大、按年龄从大到小、按学生总成绩从大到小排序(4)统计:可以实现统计:男女生人数、个人平均成绩和总成绩、各年级平均年龄、各门课程的平均成绩(5)系统维护:可以实现插入、删除、修改一个记录的功能。

4. 演示程序以用户和计算机的对话方式执行,即在计算机上显示提示信息,由用户进行操

作,显示各种指标值。测试数据见附录。

二、概要设计

抽象数据定义: 课程结构体的定义: typedef struct Class{

char name[20]; int score;

char teacher[20]; Class *next;

}Class,*ClassList;课程结构体的定义 学生信息结构体的定义: typedef struct {

页脚内容 学生管理系统(图形界面)——Java char number[10]; char name[20]; int age; char sex[10];

struct Class *classes;

}Student; 数据类型的定义: struct ElemType {

int key;

Student student; };

哈希结构体的定义: typedef struct { ElemType *elem; int count;

int sizeindex;

}HashTable;

用于排序的结构体的定义: typedef struct { ElemType r[MAXSIZE+1];

int length;

}SqList; 基本操作:

InitHashTable(HashTable &H)操作结果:初始化一个哈希表

页脚内容 学生管理系统(图形界面)——Java Hash(int K)

操作结果:哈希函数,返回计算得的结果 collision(int &p,int c)

操作结果:处理冲突,返回计算得的结果

SearchHash(HashTable H,int K,int &p,int &c) 操作结果:查找哈希表,返回查找到的结果 RecreateHashTable(HashTable &H) 操作结果:开辟更大空间,重新构造一个哈希表 InsertHash(HashTable &H,ElemType e) 操作结果:哈希表的插入,插入一个数据

SeInsertHash(HashTable &H,ElemType e,fstream dataFile) 操作结果:初始哈希表插入,从文件中将数据拷贝到哈希表中 ListTraverse(ClassList L) 操作结果:遍历线性链表,打印输出 TraverseHash(HashTable H) 操作结果:遍历哈希表,打印输出

Partition(SqList &L,int low,int high) 操作结果:一趟快速排序,并返回枢轴所在位置 QSort(SqList &L,int low,int high)

操作结果:对顺序表L中的子序列L.r[low…high]作快速排序 QuickSort(SqList &L) 操作结果:对顺序表L作快速排序 HeapAdjust(SqList &H,int s,int m)

操作结果:调整H.r[s]的关键字,使H.r[s…m]成为一个小顶堆 HeapSort(SqList &H)

操作结果:对顺序表H进行堆排序

页脚内容 学生管理系统(图形界面)——Java Merge(ElemType SR[],ElemType TR[],int i,int m,int n) 操作结果:将有序的SR[i…m]和SR[m+1…n]归并为有序的TR[i…n] MSort(ElemType SR[],ElemType TR1[],int s,int t) 操作结果:将SR[s…t]归并为TR1[s…t] MergeSort(SqList &L) 操作结果:对顺序表L作归并排序

CreateList(ClassList &L,fstream dataFile,int n) 操作结果:初始从文件中读数据创建课程链表 Pricreat(HashTable &people) 操作结果:初始化从文件读入构造哈希表 print(ElemType e)

操作结果:打印输出单个学生信息 Isvalue(char a[],int n)

操作结果:判断数组a的前n个字符是否为数字 NumSearch(HashTable H) 操作结果:按学号查找,打印输出 NameSearch(HashTable H) 操作结果:按姓名查找,打印输出 SexSearch(HashTable H) 操作结果:按性别查找,打印输出 GradeSearch(HashTable H) 操作结果:按年级查找,打印输出 TeacherSearch(HashTable H) 操作结果:按教师查找,打印输出 ClassSearch(HashTable H) 操作结果:按课程查找,打印输出

页脚内容 学生管理系统(图形界面)——Java ShowQSort(SqList people1,HashTable people) 操作结果:显示快速排序后的结果

ShowHSort(SqList people1,HashTable people) 操作结果:显示堆排序后的结果

ShowMSort(SqList people1,HashTable people) 操作结果:显示归并排序后的结果 AddSex(HashTable H) 操作结果:统计男/女生人数 PerAverage(HashTable H) 操作结果:计算个人平均成绩、总成绩 GradeAverage(HashTable H) 操作结果:计算某年级平均年龄 ClassAverage(HashTable H) 操作结果:计算某课程平均成绩 AddCreateList(ClassList &L,int n) 操作结果:添加数据时创建课程链表 AddHash(HashTable &H) 操作结果:添加一个数据 ClearList(ClassList &L) 操作结果:删除数据时清空课程链表 DeleteHash(HashTable &H) 操作结果:删除一个记录 EditHash(HashTable &H) 操作结果:修改一个记录 headshow(void) 操作结果:显示主菜单

页脚内容 学生管理系统(图形界面)——Java show1(void)

操作结果:显示子菜单1 Show2(void)

操作结果:显示子菜单2 Show3(void)

操作结果:显示子菜单3 Show4(void)

操作结果:显示子菜单4

三、调试分析

1.初始化采用文件操作,且选取的数据需要作冲突处理,测试数据具有较好的典型性,通过运行对哈希表有了具体的认识和实践。

2.查找时按学号、性别查找对用户的输入有查错处理,另外根据实际情况将个人平均成绩强制转换为了整数(采用四舍五入)。

3.排序时分别采用了快速排序、堆排序和归并排序,其中归并排序是稳定的,选取的数据也基本是无序的,且排序后不影响原来数据的结构。

4.插入、删除、修改数据在程序未关闭时是会表现出来的,但并不改变测试数据文件中的内容,这三个操作只是起一个演示作用。

5.在读文件中的数据的时候,起初我是将数据从文件中读到一个结构体数组中,然后再将结构体中的数据用哈希表的形式存下来,但这样明显浪费了空间,所以我写了两个哈希表的插入函数,一个用来作初始化的插入,另一个用来添加数据时的哈希插入,同样的理由我也写了两个建立课程链表的函数。这样无需过渡,直接从文件中将记录读入了哈希表中。 6.为了区别哈希表中的一个单位有无数据,在初始化哈希表时我将关键字全部赋为了NULLKEY即为0,另外为了凸显关键字,我新定义了一个数据类型:ElemType作为哈希表中的数据类型,事实上这种做法在使我在后来的编程中方便了不少。

7.在处理哈希表的容量的问题时,我定义了一个整型数组hashsize[]用来表示哈希表的容

页脚内容 学生管理系统(图形界面)——Java 量的递增,另外定义了一个全局变量m来记录当前哈希表的最大容量。

8.在处理冲突时采用的是线性探测再散列的方法,当冲突次数过多时就重建哈希表,重建哈希表时,我先将原来哈希表中的数据用数组记录下来,在为哈希表开辟了更大的空间后,再调用InsertHash函数将原有数据插入到新的哈希表中。

9.我所遇到的最大问题是空间分配出错的问题,在创建课程链表时由于没有处理好空间分配的问题,没有对课程链表的头结点分配空间,导致遍历时学生课程数据读不出来,在处理好空间分配的问题后,以后的编程就顺畅多了。

10.在排序阶段由于我写的排序是将数组的1号位作为数据存放的首位置,而哈希表中是将0号位作为数据存放的首位置,这样在调用的时候就出问题了,为此在排序时我多分配了一个空间,将哈希表中的数据按顺序连续的赋到一个新的结构体数组中(从1号位开始赋值)。

四、用户手册

1.本程序的运行环境为DOS操作系统。

2.进入演示程序后,即显示用户界面(如图1),有五种操作可选择,选择这五种操作中的前四个的任何一个即进入相关子菜单(如图2,3,4,5所示),有另外的具体操作供选择。 3.如前面的调试分析所述,插入、删除、修改数据在程序未关闭时是会表现出来的,但并不改变测试数据文件中的内容,这三个操作只是起一个演示作用。

图1

页脚内容 学生管理系统(图形界面)——Java

图2

图3

图4

页脚内容 学生管理系统(图形界面)——Java

图5

五、测试结果

对初始数据进行了测试,程序运行正常,基本实现了预先所要求的各种操作。

1.查询部分:测试数据的全部显示如图1-1所示,按学号查找的显示结果如图1-2所示。 其他排序显示结果也正常,篇幅有限就不显示截图了。

2.排序部分:按学号排序的结果如图2-1所示,按年龄排序的结果如图2-2所示,按总成绩排序的结果如图2-3所示。

3.统计部分:按男女生统计的结果如图3-1所示。其他统计结果经检验也是正确的。

页脚内容 学生管理系统(图形界面)——Java 4.系统维护:插入删除一个数据的结果分别如图4-1和4-2所示。执行插入删除后关于查询、排序和统计的部分显示如图4-3,4-4,4-5所示。 5.退出:选择退出后的显示如图5-1所示。

图1-1

页脚内容 学生管理系统(图形界面)——Java 图1-2

图2-1

图2-2

页脚内容 学生管理系统(图形界面)——Java

图2-3

图3-1

页脚内容 学生管理系统(图形界面)——Java

图4-1

图4-2

页脚内容 学生管理系统(图形界面)——Java

图4-3

图4-4

页脚内容 学生管理系统(图形界面)——Java

图4-5

图5-1

六、附录

源程序文件名: student.cpp

存放初始数据的文件名: students.txt

页脚内容 学生管理系统(图形界面)——Java 其内容为:

080710308 朱啸天 23 男 数据结构 99 叶延风 数学分析 97 陈芳启 080810310 徐若寒 21 女 综合英语 王素敏 数学分析 90 王泽军 080810313 何展风 20 男 综合英语 90 王素敏 数学分析 95 王泽军 080710314 刘伊蓝 22 女 数据结构 87 叶延风 数学分析 91 陈芳启 080710320 郎雨筝 24 女 数据结构 90 叶延风 数学分析 88 陈芳启 080710315 李文风 22 男 数据结构 93 叶延风 数学分析 98 陈芳启 080810312 龙轩风 21 男 数据结构 99 叶延风 数学分析 陈芳启 080810319 杨天纵 20 男 综合英语 99 王素敏 数学分析 99 王泽军 080810309 王逸宇 21 男 综合英语 87 王素敏 数学分析 96 王泽军

080710318 谭兴霸 22 男 数据结构 97 叶延风 数学分析 99 陈芳启

页脚内容

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- 517ttc.cn 版权所有 赣ICP备2024042791号-8

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务