文章目录
一、实验任务及其实现功能
- 学生信息录入,信息包括学号、姓名、专业、四门课成绩、总分、名次;
- 系统可对学生信息浏览、增加、删除和修改;
- 按学生成绩确定名次及信息输出,双向冒泡排序、希尔排序、快速排序、堆排序。
- 要求可对学生信息查询, 根据学号或姓名进行查找;
- 信息修改仅可修改四门课成绩;
- 文件存取学生信息。
需求分析
- 录入所有学生的基本信息:即打印学生的基本信息,包括学号(ID)、姓名(studentName)、专业(major)、4科成绩(score1、score2、score3、score4)、总分(total)、名次(rank);
- 新增学生信:输入新增学生的学号、姓名、专业和4门学科成绩,使之新增到已有的学生信息中,并重新打印;
- 删除学生信息:通过输入待删学生的学号找到该同学的所有信息,从而进行删除操作;
- 修改学生信息:限定只能修改学生的4科成绩,其他的不允许修改,然后通过学生学号找到该同学的所有记录,从而进行修改操作;
- 查询学生信息:分别通过按学号查询、按性名查询2种方式查询已有学生的相应信息记录,并将该条信息记录进行打印;
- 学生总分排序:以总分为关键字,分别用双向冒泡排序、希尔排序、快速排序、堆排序4种排序对学生进行排名,并打印出相应的排名;
- 文件存储:将学生的成绩信息档案保存到文本文件中。
二、开发工具及编程语言
1.开发工具
IntelliJ IDEA
编程语言
Java语言
三、算法分析
1.双向冒泡排序
1)算法设计
- 冒泡排序:每次比较两个相邻的元素,如果反序则交换,直到没有反序记录为止,在一趟排序中,只从前往后排序。
- 双向冒泡排序:冒泡排序的升级,即在一趟排序中,先从左往右排序,再从右往左排序,直至所有元素都排序完成。
2)流程描述
- 用left、right两个指针分别标记左右两端已经排完序的元素位置;用i、j两个指针分别标记左右两端未排序的元素位置;
- 在一趟排序中,先从左往右地比较两个相邻的元素,直到所有元素都比较完为止;再从右往左地比较两个相邻的元素,直至所有元素都比较完为止;
- 重复步骤2),直至排序结束。
2.希尔排序
1)算法设计
先将整个待排序记录序列分割成若干个子序列,在子序列内分别进行直接插入排序,待整个序列基本有序时,再对全体记录进行一次直接插入排序。
直接插入排序的改进
- 是指通过一个不断缩小的增量序列,对无序序列反复的进行拆分并且对拆分后的序列使用插入排序的一种算法,是插入排序的一种进阶排序算法。
- 通过设置一个gap值(初始为数组长度的一半,每次循环变为原来的一半,直到0为止),实现大幅度的数字位置跳转,提高运算效率。
2)流程描述
- 将所有相距为d的记录作为一组(d<待排序的序列长度,一般d的初始值为待排序序列长度的一半),从而将待排序的序列分成d个子序列;
- 对每一个子序列进行直接插入排序,缩小d;
- 重复步骤1)、2),直至d=1时将所有记录放在一组中进行一次直接插入排序,即排序完成。
3.快速排序
1)算法设计
先选择一个轴值(povit),将待排序记录划分为独立的两部分,左侧记录的关键码小于或等于轴值,右侧记录的关键码大于或等于轴值,然后分别对这两部分重复上述过程,直至排序完成。
2)流程描述
- 选一个元素(povit)作为基点,一般为待排序列的第一个数据;
- 若是升序,则将其他元素中比基点小放在左边,比基点大的放在右边;降序则相反;
- 然后将基点左右两边的序列当成新的两段序列,重复步骤1)、2),直至排序结束。
4.堆排序
1)算法设计
- 是一种逻辑结构类似于完全二叉树的算法,有小根堆和大根堆两种类型
- 以大根堆为例,先将待排序的记录序列构造成一个堆,选出堆中所有记录中的最大值为堆顶,然后将堆顶记录移走,将剩下的记录调整成堆再次选出最大值,以此类推直至排序完成;小根堆相反。
2)流程描述
- 找到二叉树的最后一个非叶结点,从这个结点开始逐个遍历前面的结点,直到根节点遍历完;
- 对比某个节点的左右子树,让该结点与较小的子节点进行交换;
- 让被交换的子节点重复步骤2,直到叶节点为止。
参考资料
四、源代码
Pojo
Student类
package pojo;
/**
* 学生类,包含学生的各种属性
*/
public class Student {
//学号
private int ID;
//姓名
private String studentName;
//专业
private String major;
//课程1的成绩
private double score1;
//课程2的成绩
private double score2;
//课程3的成绩
private double score3;
//课程4的成绩
private double score4;
//总分
private double total;
//名次
private int rank;
/**
* 构造函数
* @param ID
* @param studentName
* @param major
* @param score1
* @param score2
* @param score3
* @param score4
*/
public Student(int ID, String studentName, String major, double score1, double score2, double score3, double score4) {
this.ID = ID;
this.studentName = studentName;
this.major = major;
this.score1 = score1;
this.score2 = score2;
this.score3 = score3;
this.score4 = score4;
this.total = score1+score2+score3+score4;
}
public int getID() {
return ID;
}
public void setID(int ID) {
this.ID = ID;
}
public String getStudentName() {
return studentName;
}
public void setStudentName(String studentName) {
this.studentName = studentName;
}
public String getMajor() {
return major;
}
public void setMajor(String major) {
this.major = major;
}
public double getScore1() {
return score1;
}
public void setScore1(double score1) {
this.score1 = score1;
}
public double getScore2() {
return score2;
}
public void setScore2(double score2) {
this.score2 = score2;
}
public double getScore3() {
return score3;
}
public void setScore3(double score3) {
this.score3 = score3;
}
public double getScore4() {
return score4;
}
public void setScore4(double score4) {
this.score4 = score4;
}
public double getTotal() {
return total;
}
public void setTotal(double total) {
this.total = total;
}
public int getRank() {
return rank;
}
public void setRank(int rank) {
this.rank = rank;
}
}
Dao
StudentDao类
package dao;
import WriteToFile.WriteToFile;
import data.Database;
import pojo.Student;
import java.util.ArrayList;
import java.util.List;
public class StudentDao {
private Database database;
/**
* 构造函数
* @param database
*/
public StudentDao(Database database) {
this.database = database;
}
/**
* 已有的学生信息
*/
public void printTable(){
System.out.println();
System.out.println("***********************************学生信息管理**********************************");
System.out.println("学号\t"+"姓名\t"+"专业\t\t"+"成绩1\t\t"+"成绩2\t\t"+"成绩3\t\t"+"成绩4\t\t"+"总分");
for(int i=0;i<database.getStudentList().size();i++){
int count=i;
printStudentNext(count);
save();
}
}
/**
* 保存信息
*/
public void save() {
WriteToFile rw = new WriteToFile();
List<Student> list = new ArrayList<>();
// List<String> list1 = rw.reader();
ArrayList<String> list1 = new ArrayList<>();
for (Student s :list) {
String s1 = s.getID() + " " + s.getStudentName() + " " + s.getMajor() + " " + s.getScore1() + " " +
s.getScore2() + " " + s.getScore3() + " " + s.getScore4() + " " +
s.getTotal() + " " + s.getRank();
list1.add(s1);
}
rw.writer(list1);
}
/**
* 输出结果的显示
* @param count
*/
private void printStudentNext(int count) {
System.out.println(database.getStudentList().get(count).getID()+"\t\t"+database.getStudentList().get(count).getStudentName()+"\t\t"+database.getStudentList().get(count).getMajor()+"\t\t"+database.getStudentList().get(count).getScore1()+"\t\t"+database.getStudentList().get(count).getScore2()+"\t\t"+database.getStudentList().get(count).getScore3()+"\t\t"+database.getStudentList().get(count).