《数据结构课程设计》——学生成绩档案管理系统(代码实现)
文章目录
前言
本文是学生成绩档案管理系统的代码实现
用户包:
一、学生类
/**
* 学生用户类
*/
public class Student implements Serializable {
//学号
private String id;
//姓名
private String name;
//专业
private String profession;
//java课程成绩
private double java;
//cpp课程成绩
private double cpp;
//sql课程成绩
private double sql;
//web课程成绩
private double web;
//总分
private double sumScore;
//排名
private int rank;
public Student(String id, String name, String profession, double java, double cpp, double sql, double web) {
this.id = id;
this.name = name;
this.profession = profession;
this.java = java;
this.cpp = cpp;
this.sql = sql;
this.web = web;
this.sumScore = java+cpp+sql+web;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getProfession() {
return profession;
}
public void setProfession(String profession) {
this.profession = profession;
}
public double getJava() {
return java;
}
public void setJava(double java) {
this.java = java;
}
public double getCpp() {
return cpp;
}
public void setCpp(double cpp) {
this.cpp = cpp;
}
public double getSql() {
return sql;
}
public void setSql(double sql) {
this.sql = sql;
}
public double getWeb() {
return web;
}
public void setWeb(double web) {
this.web = web;
}
public double getSumScore() {
return sumScore;
}
public void setSumScore(double sumScore) {
this.sumScore = sumScore;
}
public int getRank() {
return rank;
}
public void setRank(int rank) {
this.rank = rank;
}
}
二、管理员类
public class User implements Serializable {
//用户名
private String username;
//密码
private String password;
public User(String username, String password) {
this.username = username;
this.password = password;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
Dao包:
三、学生操作类:
public class StudentDao {
DataBase dataBase;
public StudentDao(DataBase dataBase) {
this.dataBase = dataBase;
}
/**
* 新增学生信息
* @param student
*/
public void insertStudent(Student student){
dataBase.getStudentList().add(student);
}
/**
* 浏览学生信息
*/
public void display(){
List<Student>list=dataBase.getStudentList();
//序号
int num=0;
//遍历学生信息并输出
for (Student student : list) {
System.out.println("序号:"+(num+1)+"\t学号:"+student.getId()+"\t姓名:"+student.getName()+"\t专业:"+student.getProfession()
+"\tjava成绩:"+student.getJava()+"\tc++成绩:"+student.getCpp()+"\tsql成绩:"+student.getSql()+"\tweb成绩:"+student.getWeb()
+"\t总分:"+student.getSumScore());
num++;
}
}
/**
* 删除学生信息
* @param student
*/
public void deleteStudent(Student student){
Student stu=null;
for (Student student1 : dataBase.getStudentList()) {
if(student.getId().equals(student1.getId())){
stu=student1;
}
}
dataBase.getStudentList().remove(stu);
}
/**
* 通过学号查询学生信息
* @param id
* @return
*/
public Student searchById(String id){
Student stu=null;
for (Student student1 : dataBase.getStudentList()) {
if(id.equals(student1.getId())){
stu=student1;
}
}
return stu;
}
/**
* 通过姓名查询学生信息
* @param name
* @return
*/
public Student searchByName(String name){
Student stu=null;
for (Student student : dataBase.getStudentList()) {
if(name.equals(student.getName())){
stu=student;
}
}
return stu;
}
/**
* 双向冒泡排序
* @param studentList
* @return
*/
public List<Student>doubleBubbleSort(List<Student>studentList){
List<Student>list=studentList;
Student stu=null;
int left=0;
int right=studentList.size()-1;
while(left<right){
for(int i=left+1;i<right;i++){
if(list.get(left).getSumScore()<list.get(i).getSumScore()){
stu=list.get(i);
list.set(i,list.get(left));
list.set(left,stu);
}
}
left++;
for(int i=right-1;i>=left;i--){
if(list.get(right).getSumScore()>list.get(i).getSumScore()){
stu=list.get(i);
list.set(i,list.get(right));
list.set(right,stu);
}
}
right--;
}
return list;
}
/**
* 快速排序
* @param studentList
* @return
*/
public List<Student>quickSort(List<Student>studentList){
List<Student>list=studentList;
quickSort1(list,0,list.size()-1);
return list;
}
public void quickSort1(List<Student>studentList,int left,int right){
if(left<right){
int i=left,j=right;
Student student=studentList.get(left);
double x=student.getSumScore();
while(i<j){
while((i<j)&&(studentList.get(j).getSumScore()<x)){
j--;
}
if(i<j){
studentList.set(i,studentList.get(j));
i++;
}
while((i<j)&&(studentList.get(i).getSumScore()>x)){
i++;
}
if(i<j){
studentList.set(j,studentList.get(i));
j--;
}
}
studentList.set(i,student);
quickSort1(studentList,left,i-1);
quickSort1(studentList,i+1,right);
}
}
/**
* 希尔排序
* @param studentList
* @return
*/
public List<Student>shellSort(List<Student>studentList){
List<Student>list=studentList;
Student student=null;
int j=0;
for(int gap=list.size()/2;gap>0;gap/=2){
for(int i=gap;i<list.size();i++){
student =list.get(i);
double tmp=student.getSumScore();
for(j=i;j>gap&&tmp>list.get(j-gap).getSumScore();j-=gap){
list.set(j,list.get(j-gap));
}
list.set(j,student);
}
}
return list;
}
/**
* 堆排序
* @param studentList
* @return
*/
public List<Student>heapSort(List<Student>studentList){
List<Student>list=studentList;
int len=list.size();
buildMaxHeap(list,len);
for(int i=len-1;i>0;i--){
swap(list,0,1);
len--;
heapify(list,0,len);
}
return list;
}
/**
* 构造大根堆
* @param studentList
* @param len
*/
private void buildMaxHeap(List<Student>studentList,int len){
for(int i=(int)Math.floor(len/2);i>=0;i--){
heapify(studentList,i,len);
}
}
private void heapify(List<Student>studentList,int i,int len){
int left=2*i+1;
int right=2*i+2;
int largest=i;
if (left < len && studentList.get(left).getSumScore() <studentList.get(largest).getSumScore()) {
largest = left;
}
if (right < len && studentList.get(right).getSumScore() < studentList.get(largest).getSumScore()) {
largest = right;
}
if (largest != i) {
swap(studentList, i, largest);
heapify(studentList, largest, len);
}
}
/**
* 交换节点
* @param studentList
* @param i
* @param j
*/
private void swap(List<Student>studentList,int i,int j){
Student student=studentList.get(i);
studentList.set(i,studentList.get(j));
studentList.set(j,student);
}
/**
* 排名赋值、信息输出
* @param studentList
*/
public void printRank(List<Student>studentList){
for(int i=0;i<studentList.size();i++){
studentList.get(i).setRank(i+1);
}
int i=1;
for (Student student : studentList) {
System.out.println(i+" "+"\t学号:"+student.getId()+"\t姓名:"+student.getName()+"\t专业:"+student.getProfession()
+"\tjava成绩:"+student.getJava()+"\tc++成绩:"+student.getCpp()+"\tsql成绩:"+student.getSql()+"\tweb成绩:"+student.getWeb()
+"\t总分:"+student.getSumScore()+"\t排名:"+student.getRank());
i++;
}
}
}
四、管理员操作类:
public class UserDao {
DataBase dataBase;
public UserDao(DataBase dataBase) {
this.dataBase = dataBase;
}
/**
* 新增新用户
* @param user
*/
public void add(User user){
dataBase.getUserList().add(user);
}
}
文档保存包:
五、学生信息保存类:
public class StudentSave {
/**
* 写入学生信息
* @param list
*/
public void writeStudent(List<Student> list){
File file=new File("F://大二下//数据结构实践课//student.txt");
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
try {
FileOutputStream fs=new FileOutputStream(file);
ObjectOutputStream op=new ObjectOutputStream(fs);
op.writeObject(list);
op.flush();
op.close();
fs.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 学生信息读取
* @return list
*/
public List<Student>fileRead() throws IOException, ClassNotFoundException {
File file=new File("F://大二下//数据结构实践课//student.txt");
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
FileInputStream fs=new FileInputStream(file);
ObjectInputStream os=new ObjectInputStream(fs);
List<Student>list1= (List<Student>) os.readObject();
os.close();
fs.close();
return list1;
}
}
六、管理员信息保存类:
public class UserSave {
/**
* 写入用户登陆信息
*
* @param list
*/
public void write(List<User> list) {
File file = new File("F://大二下//数据结构实践课//user.txt");
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
try {
FileOutputStream fs = new FileOutputStream(file);
ObjectOutputStream os = new ObjectOutputStream(fs);
//User user1 = new User("moon", "123");
// list.add(user1);
os.writeObject(list);
os.flush();
os.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 用户登录信息读取
*
* @return
*/
public List<User> fileRead() throws IOException, ClassNotFoundException {
File file = new File("F://大二下//数据结构实践课//user.txt");
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
FileInputStream is = new FileInputStream(file);
ObjectInputStream oi = new ObjectInputStream(is);
List<User> list1 = (List<User>) oi.readObject();
oi.close();
is.close();
return list1;
}
}
数据库包:
七、数据库类
public class DataBase implements Serializable {
List<User>userList=new ArrayList<>();
List<Student>studentList=new ArrayList<>();
StudentSave ss=new StudentSave();
UserSave us=new UserSave();
public DataBase() {
try {
userList = us.fileRead();
studentList = ss.fileRead();
}catch(Exception e){
System.out.println(e.getMessage());
}
}
public void ss(List<Student>list){
ss.writeStudent(list);
}
public void us(List<User>list){
us.write(list);
}
public List<User> getUserList() {
return userList;
}
public void setUserList(List<User> userList) {
this.userList = userList;
}
public List<Student> getStudentList() {
return studentList;
}
public void setStudentList(List<Student> studentList) {
this.studentList = studentList;
}
}
八、系统实现类:
public class SystemService {
//键盘扫描器
private Scanner sc = new Scanner(System.in);
//验证码生成器
private Random random = new Random();
DataBase dataBase;
StudentDao studentDao;
UserDao userDao;
public SystemService(DataBase dataBase) {
this.dataBase = dataBase;
studentDao = new StudentDao(dataBase);
userDao = new UserDao(dataBase);
}
/**
* 起始菜单
*/
public void startMenu() {
System.out.println("************************************学生成绩档案管理系统入口******************************");
System.out.println("1.登陆");
System.out.println("2.注册");
System.out.println("3.退出系统");
System.out.println("请选择:");
String choice = sc.next();
switch (choice) {
case "1":
login();
break;
case "2":
registerSys();
login();
break;
case "3":
System.out.println("系统即将退出!");
System.exit(0);
break;
default:
System.out.println("非法输入!");
login();
}
}
/**
* 登陆
*/
public void login() {
User user = null;
Boolean find = false;
System.out.println("请输入账号:");
String username = sc.next();
List<User> list = dataBase.getUserList();
for (User user1 : list) {
if (username.equals(user1.getUsername())) {
user = user1;
find = true;
break;
}
}
if (find) {
System.out.println("请输入密码:");
String passward = sc.next();
if (passward.equals(user.getPassword())) {
boolean jud = verifyNumber();
if (jud) {
System.out.println("登陆成功!");
mainMenu();
} else {
System.out.println("验证码输入错误!");
startMenu();
}
} else {
System.out.println("密码错误!");
startMenu();
}
} else {
System.out.println("账号不存在!请先进行注册");
startMenu();
}
}
/**
* 验证码生成以及验证器
*/
public boolean verifyNumber() {
//获取4位验证码
int[] verify = new int[4];
for (int i = 0; i < verify.length; i++) {
verify[i] = random.nextInt(10);
System.out.print(verify[i] + "\t");
}
System.out.println();
//验证码计数器
int count = 0;
System.out.println("请输入验证码:");
for (int i = 0; i < verify.length; i++) {
int number1 = 0;
int number = errorMessage(number1);
if (number == verify[i])
count++;
}
if (count == verify.length)
return true;
else
return false;
}
/**
* 输入不匹配问题InputMismatchException
*/
public int errorMessage(int choice) {
while (true) {
try {
choice = sc.nextInt();
break;
} catch (Exception e) {
System.out.println("输入类型错误,请重新输入!");
sc = new Scanner(System.in);
}
}
return choice;
}
/**
* 注册
*/
public void registerSys() {
System.out.println("请输入账号:");
String username = sc.next();
for (User user : dataBase.getUserList()) {
if(user.getUsername().equals(username)){
System.out.println("管理员已存在!");
System.out.println("是否继续注册?(Y/N)");
String result=sc.next();
if(result.equalsIgnoreCase("Y")){
registerSys();
}else{
login();
}
}
}
System.out.println("请输入密码:");
String password = sc.next();
User u = new User(username, password);
userDao.add(u);
System.out.println("注册成功!");
dataBase.us(dataBase.getUserList());
}
/**
* 主菜单
*/
public void mainMenu() {
System.out.println("1.新增学生信息");
System.out.println("2.浏览学生信息");
System.out.println("3.查找学生信息");
System.out.println("4.删除学生信息");
System.out.println("5.退出登陆");
System.out.println("请输入你的选择:(输入0返回上一层菜单!)");
String choice = sc.next();
switch (choice) {
case "1":
insertStudent();
mainMenu();
break;
case "2":
display();
mainMenu();
break;
case "3":
searchStudent();
break;
case "4":
delete();
mainMenu();
break;
case "0":
login();
break;
case "5":
System.out.println("系统即将退出!");
System.exit(0);
break;
default:
System.out.println("非法输入!");
startMenu();
}
}
/**
* 新增学生信息
*/
public void insertStudent() {
System.out.println("学生学号:");
String id = sc.next();
for (Student student : dataBase.getStudentList()) {
if (student.getId().equals(id)) {
System.out.println("该学生已存在!");
System.out.println("是否继续添加?(Y/N)");
String result = sc.next();
if (result.equalsIgnoreCase("Y")) {
insertStudent();
} else {
mainMenu();
}
}
}
System.out.println("学生姓名:");
String name = sc.next();
System.out.println("学生专业:");
String profession = sc.next();
System.out.println("java成绩:");
double java = sc.nextDouble();
System.out.println("c++成绩:");
double cpp = sc.nextDouble();
System.out.println("sql成绩:");
double sql = sc.nextDouble();
System.out.println("web成绩:");
double web = sc.nextDouble();
studentDao.insertStudent(new Student(id, name, profession, java, cpp, sql, web));
dataBase.ss(dataBase.getStudentList());
System.out.println("添加成功!");
System.out.println("是否继续添加?(Y/N)");
String result = sc.next();
if (result.equalsIgnoreCase("Y")) {
insertStudent();
} else {
mainMenu();
}
}
/**
* 浏览学生信息
*/
public void display() {
List<Student> list = null;
studentDao.display();
System.out.println("选择排序方法:");
System.out.println("1.双向冒泡排序:");
System.out.println("2.希尔排序");
System.out.println("3.快速排序");
System.out.println("4.堆排序");
System.out.println("请选择:(输入0返回上一层菜单!)");
String choice = sc.next();
switch (choice) {
case "1":
list = studentDao.doubleBubbleSort(dataBase.getStudentList());
studentDao.printRank(list);
break;
case "2":
list = studentDao.shellSort(dataBase.getStudentList());
studentDao.printRank(list);
break;
case "3":
list = studentDao.quickSort(dataBase.getStudentList());
studentDao.printRank(list);
break;
case "4":
list = studentDao.heapSort(dataBase.getStudentList());
studentDao.printRank(list);
break;
case "0":
mainMenu();
break;
default:
System.out.println("非法输入!");
display();
}
}
/**
* 查询学生信息
*/
public void searchStudent() {
studentDao.display();
System.out.println("1.按学号查找:");
System.out.println("2.按姓名查找");
System.out.println("请选择:(输入0返回上一层菜单!)");
String choice = sc.next();
switch (choice) {
case "1":
searchById();
break;
case "2":
searchByName();
break;
case "0":
mainMenu();
break;
default:
System.out.println("非法输入!");
searchStudent();
}
}
/**
* 删除学生信息
*/
public void delete() {
studentDao.display();
System.out.println("请输入要删除的学号:(输入0返回上一层菜单!)");
String id = sc.next();
if(id.equals("0")) {
mainMenu();
}
for (Student stu : dataBase.getStudentList()) {
if(stu.getId().equals(id)){
Student student = studentDao.searchById(id);
studentDao.deleteStudent(student);
System.out.println("删除成功!");
System.out.println("是否继续进行删除?(Y/N)");
String result=sc.next();
if(result.equalsIgnoreCase("Y")){
delete();
}else{
mainMenu();
}
}
}
System.out.println("此学生不存在!");
System.out.println("是否继续进行删除?(Y/N)");
String result=sc.next();
if(result.equalsIgnoreCase("Y")){
delete();
}else{
mainMenu();
}
}
/**
* 按姓名查找
*/
public void searchByName() {
System.out.println("请输入要查找的姓名:");
String name = sc.next();
Student student;
student = studentDao.searchByName(name);
System.out.println("学号:" + student.getId() + "\t姓名:" + student.getName() + "\t专业:" + student.getProfession() +
"\tjava成绩:" + student.getJava() + "\tc++成绩:" + student.getCpp() + "\tsql成绩:" + student.getSql() + "\tweb成绩:" + student.getWeb());
System.out.println("是否修改成绩?(Y/N)");
String result = sc.next();
if (result.equalsIgnoreCase("Y")) {
System.out.println("1.java");
System.out.println("2.c++");
System.out.println("3.sql");
System.out.println("4.web");
System.out.println("请输入要修改的课程的编号:(输入0返回上一层菜单!)");
String option = sc.next();
double score;
switch (option) {
case "1":
score = sc.nextDouble();
student.setJava(score);
break;
case "2":
score = sc.nextDouble();
student.setCpp(score);
break;
case "3":
score = sc.nextDouble();
student.setSql(score);
break;
case "4":
score = sc.nextDouble();
student.setWeb(score);
break;
case "0":
searchStudent();
break;
default:
System.out.println("非法输入!");
searchByName();
}
student.setSumScore(student.getJava() + student.getCpp() + student.getSql() + student.getWeb());
mainMenu();
} else {
mainMenu();
}
}
/**
* 按学号修改成绩
*/
public void searchById() {
System.out.println("请输入要查找的学号:");
String id = sc.next();
Student student;
student = studentDao.searchById(id);
System.out.println("学号:" + student.getId() + "姓名:" + student.getName() + "专业:" + student.getProfession() +
"java成绩:" + student.getJava() + "c++成绩:" + student.getCpp() + "sql成绩:" + student.getSql() + "web成绩:" + student.getWeb());
System.out.println("是否修改成绩?(Y/N)");
String result = sc.next();
if (result.equalsIgnoreCase("Y")) {
System.out.println("1.java");
System.out.println("2.c++");
System.out.println("3.sql");
System.out.println("4.web");
System.out.println("请输入要修改的课程的编号:(输入0返回上一层菜单!)");
String option = sc.next();
double score;
switch (option) {
case "1":
score = sc.nextDouble();
student.setJava(score);
break;
case "2":
score = sc.nextDouble();
student.setCpp(score);
break;
case "3":
score = sc.nextDouble();
student.setSql(score);
break;
case "4":
score = sc.nextDouble();
student.setWeb(score);
break;
case "0":
searchStudent();
break;
default:
System.out.println("非法输入!");
searchById();
}
student.setSumScore(student.getJava() + student.getCpp() + student.getSql() + student.getWeb());
mainMenu();
} else {
mainMenu();
}
}
}
九、主方法测试:
public class Main {
public static void main(String[] args) {
DataBase dataBase=new DataBase();
SystemService sys=new SystemService(dataBase);
sys.startMenu();
}
}
十、运行截图(部分截图)
1.登陆界面:
2.功能界面:
2.1新增学生信息:
2.2.浏览学生信息:
2.3查找学生信息:
2.4删除学生信息:
十一、总结
本文主要实现了对学生信息的增删改查,其中主要用到的算法有:双向冒泡排序、快速排序、希尔排序、堆排序,在实现本项目的过程中,出现了一个巨大的问题,一开始,我采用的是链表进行实现,用链表实现的过程中,是非常麻烦的,尤其是在处理成绩排名这个问题时,很多算法用链表来操作都是非常困难的,尽管如此,我还是使用冒泡排序、快速排序、归并排序进行实现,如有对链表实现感兴趣,可以和我进行交流沟通,所以,这个问题也是给我一个很大的警醒,那就是,在项目开始实现之前,一定要对项目进行深刻的剖析,将框架打好之后,再进行操作。