高清宁 发表于 2025-6-1 21:47:11

软件逆向设计开发——学生管理系统

此项目源自CSDN的Java大作业项目(学生管理系统)https://blog.csdn.net/qq_46162008/article/details/140255206?sharetype=blog&shareId=140255206&sharerefer=APP&sharesource=qq_61323695&sharefrom=link。
这是基于JAVA的环境下运行的学生管理系统,主要功能有学生信息的添加、删除、查找单个学生、查看所有学生信息、以及修改学生个人信息。附程序运行截图:

添加学生个人信息:

修改个人信息后查看个人信息:

删除个人信息:

功能大致如上。
附本程序源代码:

点击查看代码package demo3; // 声明包名

import java.util.Scanner; // 从java.util包中导入Scanner类
import java.util.ArrayList; // 从java.util包中导入ArrayList类

public class StudentManagementSystem { // 声明公共类StudentManagementSystem
    //思路

    public static void main(String[] args) { // 声明主方法

      //定义属性
      boolean loop = true; // 声明一个布尔变量来控制循环
      Scanner scanner = new Scanner(System.in); // 创建一个Scanner对象,用来获取用户输入
      String key = ""; // 声明一个字符串变量,用来存储用户输入
      ArrayList<Student> students = new ArrayList<>(); // 声明一个ArrayList,用来存储Student对象

      do{ // 开始do-while循环
            //显示菜单
            new Menu().menu(); // 显示菜单
            key = scanner.next(); // 获取用户输入
            switch (key){ // 开始switch语句
                case "1": // 情况1:添加学生
                  System.out.println("请输入学生信息:"); // 提示用户输入学生信息
                  Student student = new Student(); // 创建一个新的Student对象
                  System.out.println("请输入学号:"); // 提示用户输入学生ID
                  student.id = scanner.nextInt(); // 从用户输入中获取学生ID
                  System.out.println("请输入姓名:"); // 提示用户输入学生姓名
                  student.name = scanner.next(); // 从用户输入中获取学生姓名
                  System.out.println("请输入语文成绩:"); // 提示用户输入语文成绩
                  student.chinese = scanner.nextDouble(); // 从用户输入中获取语文成绩
                  System.out.println("请输入高数成绩:"); // 提示用户输入数学成绩
                  student.math = scanner.nextDouble(); // 从用户输入中获取数学成绩
                  System.out.println("请输入C语言成绩:"); // 提示用户输入C语言成绩
                  student.c_language = scanner.nextDouble(); // 从用户输入中获取C语言成绩
                  System.out.println("请输入数据结构成绩:"); // 提示用户输入数据结构成绩
                  student.data_structure = scanner.nextDouble(); // 从用户输入中获取数据结构成绩
                  students.add(student); // 将Student对象添加到ArrayList中
                  System.out.println("学生信息添加成功!"); // 打印成功消息
                  break; // 结束情况1

                case "2": // 情况2:删除学生
                  System.out.println("请输入要删除的学生学号:"); // 提示用户输入要删除的学生ID
                  int deleteId = scanner.nextInt(); // 从用户输入中获取学生ID
                  for (int i = 0; i < students.size(); i++) { // 遍历ArrayList
                        if (students.get(i).id == deleteId) { // 如果找到了要删除的学生
                            students.remove(i); // 从ArrayList中删除学生
                            System.out.println("学生信息删除成功!"); // 打印成功消息
                            break; // 结束循环
                        }
                  }
                  break; // 结束情况2
                case "3": // 情况3:修改学生
                  System.out.println("请输入要修改的学生学号:"); // 提示用户输入要修改的学生ID
                  int modifyId = scanner.nextInt(); // 从用户输入中获取学生ID
                  for (Student s : students) { // 遍历ArrayList
                        if (s.id == modifyId) { // 如果找到了要修改的学生
                            System.out.println("请输入新的学生姓名:"); // 提示用户输入新的学生姓名
                            s.name = scanner.next(); // 从用户输入中获取新的学生姓名
                            System.out.println("请输入新的语文成绩:"); // 提示用户输入新的语文成绩
                            s.chinese = scanner.nextDouble(); // 从用户输入中获取新的语文成绩
                            System.out.println("请输入新的高数成绩:"); // 提示用户输入新的数学成绩
                            s.math = scanner.nextDouble(); // 从用户输入中获取新的数学成绩
                            System.out.println("请输入新的C语言成绩:"); // 提示用户输入新的C语言成绩
                            s.c_language = scanner.nextDouble(); // 从用户输入中获取新的C语言成绩
                            System.out.println("请输入新的数据结构成绩:"); // 提示用户输入新的数据结构成绩
                            s.data_structure = scanner.nextDouble(); // 从用户输入中获取新的数据结构成绩
                            System.out.println("学生信息修改成功!"); // 打印成功消息
                            break; // 结束循环
                        }
                  }
                  break; // 结束情况3
                case "4": // 情况4:查找学生
                  System.out.println("请输入要查找的学生学号:"); // 提示用户输入要查找的学生ID
                  int searchId = scanner.nextInt(); // 从用户输入中获取学生ID
                  for (Student s : students) { // 遍历ArrayList
                        if (s.id == searchId) { // 如果找到了要查找的学生
                            System.out.println("找到学生信息:"); // 打印消息
                            System.out.println("学号:" + s.id); // 打印学生ID
                            System.out.println("姓名:" + s.name); // 打印学生姓名
                            System.out.println("语文成绩:" + s.chinese); // 打印语文成绩
                            System.out.println("高数成绩:" + s.math); // 打印数学成绩
                            System.out.println("C语言成绩:" + s.c_language); // 打印C语言成绩
                            System.out.println("数据结构成绩:" + s.data_structure); // 打印数据结构成绩
                            break; // 结束循环
                        }
                  }
                  break; // 结束情况4
                case "5": // 情况5:查看所有学生
                  System.out.println("以下是所有学生的信息:"); // 打印消息
                  for (Student s : students) { // 遍历ArrayList
                        System.out.println("学号:" + s.id); // 打印学生ID
                        System.out.println("姓名:" + s.name); // 打印学生姓名
                        System.out.println("语文成绩:" + s.chinese); // 打印语文成绩
                        System.out.println("高数成绩:" + s.math); // 打印数学成绩
                        System.out.println("C语言成绩:" + s.c_language); // 打印C语言成绩
                        System.out.println("数据结构成绩:" + s.data_structure); // 打印数据结构成绩
                  }
                  break; // 结束情况5
                case "6": // 情况6:退出程序
                  loop = false; // 设置loop为false,结束循环
                  System.out.println("退出程序"); // 打印消息
                  break; // 结束情况6
            }

      }while(loop); // 结束do-while循环

    }



}


//菜单类
class Menu{
    public void menu(){
      System.out.println("\n========学生管理系统========"); //打印主菜单
      System.out.println("\t\t1.添加学生");
      System.out.println("\t\t2.删除学生");
      System.out.println("\t\t3.修改学生");
      System.out.println("\t\t4.查找学生");
      System.out.println("\t\t5.查看所有学生");
      System.out.println("\t\t6.退出程序");
      System.out.println("请输入你的选择:");

    }
}


//学生类
class Student{
    //创建学生的基本属性
    //1.学号//唯一标识
    //2.姓名
    //3.语文成绩
    //4.高数成绩
    //5.C语言成绩
    //6.数据结构成绩

    int id; // 学生ID
    String name; // 学生姓名
    double chinese; // 语文成绩
    double math; // 数学成绩
    double c_language; // C语言成绩
    double data_structure; // 数据结构成绩


}此程序中出现的问题:
1.输入后的信息不能保存到本地,每一次打开都需要重新输入信息。
更新代码后实现
保存功能:在退出程序时,会自动将学生信息保存到 students.txt 文件中。
加载功能:在程序启动时,会自动从 students.txt 文件中加载之前保存的学生信息。
保存格式如图:

2.缺少输入错误提示
在删除或修改学生信息时,如果用户输入的学号不存在,程序不会提示用户。
更新后实现了在删除、修改、查找学生信息时,增加提示信息。

增加了提示信息,提醒用户输入的信息是否正确。
3.代码中存在重复的输入代码,可能会导致输入异常,无法正确读取输入
在使用 Scanner 时,混合使用 nextInt()、nextDouble() 和 next() 导致输入异常,无法正确读取用户输入。

点击查看代码student.id = scanner.nextInt();
student.name = scanner.next();
student.chinese = scanner.nextDouble();解决方法为在每次读取输入数据后添加scanner.nextLine()清除输入缓冲区点击查看代码private static Student createStudent(Scanner scanner) {
    Student student = new Student();
    System.out.println("请输入学号:");
    student.id = scanner.nextInt();
    scanner.nextLine(); // 清除缓冲区
    System.out.println("请输入姓名:");
    student.name = scanner.nextLine();
    System.out.println("请输入语文成绩:");
    student.chinese = scanner.nextDouble();
    scanner.nextLine(); // 清除缓冲区
    System.out.println("请输入高数成绩:");
    student.math = scanner.nextDouble();
    scanner.nextLine(); // 清除缓冲区
    System.out.println("请输入C语言成绩:");
    student.c_language = scanner.nextDouble();
    scanner.nextLine(); // 清除缓冲区
    System.out.println("请输入数据结构成绩:");
    student.data_structure = scanner.nextDouble();
    return student;
}4.菜单显示不够美观:
修改后如下:

修改的代码如下:

点击查看代码package demo3; // 声明包名

import java.util.Scanner;      // 从java.util包中导入Scanner类
import java.util.ArrayList;      // 从java.util包中导入ArrayList类
import java.io.File;            // 导入File类
import java.io.FileWriter;      // 导入FileWriter类
import java.io.BufferedWriter;// 导入BufferedWriter类
import java.io.BufferedReader;// 导入BufferedReader类
import java.io.FileReader;       // 导入FileReader类
import java.io.IOException;   // 导入IOException类

public class StudentManagementSystem { // 声明公共类StudentManagementSystem

    public static void main(String[] args) { // 声明主方法
      boolean loop = true; // 声明一个布尔变量来控制循环
      Scanner scanner = new Scanner(System.in); // 创建一个Scanner对象,用来获取用户输入
      ArrayList<Student> students = new ArrayList<>(); // 声明一个ArrayList,用来存储Student对象

      try {
            students = loadFromFile(new File("students.txt")); // 从文件加载学生信息
      } catch (IOException e) {
            System.out.println("加载文件时出错:文件可能不存在或无法访问。");
            e.printStackTrace();
      }

      do { // 开始do-while循环
            new Menu().menu(); // 显示菜单

            String key = scanner.next(); // 获取用户输入
            switch (key) { // 开始switch语句
                case "1": // 添加学生
                  Student student = createStudent(scanner);
                  students.add(student); // 将Student对象添加到ArrayList中
                  System.out.println("学生信息添加成功!");
                  break;
                case "2": // 删除学生
                  System.out.println("请输入要删除的学生学号:");
                  int deleteId = scanner.nextInt();
                  scanner.nextLine(); // 清除缓冲区
                  boolean found = false;
                  for (int i = 0; i < students.size(); i++) {
                        if (students.get(i).id == deleteId) {
                            students.remove(i);
                            System.out.println("学生信息删除成功!");
                            found = true;
                            break;
                        }
                  }
                  if (!found) {
                        System.out.println("找不到该学生信息!");
                  }
                  break;
                case "3": // 修改学生
                  System.out.println("请输入要修改的学生学号:");
                  int modifyId = scanner.nextInt();
                  scanner.nextLine(); // 清除缓冲区
                  found = false;
                  for (Student s : students) {
                        if (s.id == modifyId) {
                            System.out.println("请输入新的学生姓名:");
                            s.name = scanner.nextLine();
                            System.out.println("请输入新的语文成绩:");
                            s.chinese = scanner.nextDouble();
                            scanner.nextLine(); // 清除缓冲区
                            System.out.println("请输入新的高数成绩:");
                            s.math = scanner.nextDouble();
                            scanner.nextLine(); // 清除缓冲区
                            System.out.println("请输入新的C语言成绩:");
                            s.c_language = scanner.nextDouble();
                            scanner.nextLine(); // 清除缓冲区
                            System.out.println("请输入新的数据结构成绩:");
                            s.data_structure = scanner.nextDouble();
                            System.out.println("学生信息修改成功!");
                            found = true;
                            break;
                        }
                  }
                  if (!found) {
                        System.out.println("找不到该学生信息!");
                  }
                  break;
                case "4": // 查找学生
                  System.out.println("请输入要查找的学生学号:");
                  int searchId = scanner.nextInt();
                  scanner.nextLine(); // 清除缓冲区
                  found = false;
                  for (Student s : students) {
                        if (s.id == searchId) {
                            System.out.println("找到学生信息:");
                            System.out.println("学号:" + s.id);
                            System.out.println("姓名:" + s.name);
                            System.out.println("语文成绩:" + s.chinese);
                            System.out.println("高数成绩:" + s.math);
                            System.out.println("C语言成绩:" + s.c_language);
                            System.out.println("数据结构成绩:" + s.data_structure);
                            found = true;
                            break;
                        }
                  }
                  if (!found) {
                        System.out.println("找不到该学生信息!");
                  }
                  break;
                case "5": // 查看所有学生
                  System.out.println("以下是所有学生的信息:");
                  for (Student s : students) {
                        System.out.println(
                              "学号:" + s.id + ",姓名:" + s.name +
                              ",语文成绩:" + s.chinese +
                              ",高数成绩:" + s.math +
                              ",C语言成绩:" + s.c_language +
                              ",数据结构成绩:" + s.data_structure
                        );
                  }
                  break;
                case "6": // 退出程序
                  loop = false;
                  System.out.println("退出程序");
                  try {
                        saveToFile(students, new File("students.txt")); // 保存学生信息到文件
                  } catch (IOException e) {
                        System.out.println("保存文件时出错:文件可能无法访问。");
                        e.printStackTrace();
                  }
                  break;
                default:
                  System.out.println("无效选项,请重新选择!");
            }
      } while (loop); // 结束do-while循环
    }

    private static Student createStudent(Scanner scanner) {
      Student student = new Student();
      System.out.println("请输入学号:");
      student.id = scanner.nextInt();
      scanner.nextLine(); // 清除缓冲区
      System.out.println("请输入姓名:");
      student.name = scanner.nextLine();
      System.out.println("请输入语文成绩:");
      student.chinese = scanner.nextDouble();
      scanner.nextLine(); // 清除缓冲区
      System.out.println("请输入高数成绩:");
      student.math = scanner.nextDouble();
      scanner.nextLine(); // 清除缓冲区
      System.out.println("请输入C语言成绩:");
      student.c_language = scanner.nextDouble();
      scanner.nextLine(); // 清除缓冲区
      System.out.println("请输入数据结构成绩:");
      student.data_structure = scanner.nextDouble();
      return student;
    }

    // 将学生信息保存到文件
    private static void saveToFile(ArrayList<Student> students, File file) throws IOException {
      try (BufferedWriter writer = new BufferedWriter(new FileWriter(file))) {
            for (Student student : students) {
                writer.write(student.id + "|" + student.name + "|" + student.chinese + "|" + student.math + "|" + student.c_language + "|" + student.data_structure);
                writer.newLine();
            }
      }
    }

    // 从文件加载学生信息
    private static ArrayList<Student> loadFromFile(File file) throws IOException {
      ArrayList<Student> students = new ArrayList<>();
      try (BufferedReader reader = new BufferedReader(new FileReader(file))) {
            String line;
            while ((line = reader.readLine()) != null) {
                String[] parts = line.split("\\|");
                if (parts.length == 6) {
                  Student student = new Student();
                  student.id = Integer.parseInt(parts);
                  student.name = parts;
                  student.chinese = Double.parseDouble(parts);
                  student.math = Double.parseDouble(parts);
                  student.c_language = Double.parseDouble(parts);
                  student.data_structure = Double.parseDouble(parts);
                  students.add(student);
                }
            }
      }
      return students;
    }
}

//菜单类
class Menu {
    public void menu() {
      System.out.println("\n******************************");
      System.out.println("****   学生管理系统   ****");
      System.out.println("****   1. 添加学生      ****");
      System.out.println("****   2. 删除学生      ****");
      System.out.println("****   3. 修改学生      ****");
      System.out.println("****   4. 查找学生      ****");
      System.out.println("****   5. 查看所有学生****");
      System.out.println("****   6. 退出程序      ****");
      System.out.println("******************************");
      System.out.println("请输入你的选择:");
    }
}上述代码省略了学生类的声明。重构的代码截图已在上述问题陈述中展示。总结

在修改代码和逆向软件分析的过程中,难点主要在于理解代码、定位错误代码。理解代码逻辑需要花费大量时间阅读代码,梳理变量、函数和类之间的关系。定位问题则需要通过调试跟踪代码执行过程,找出错误的代码。修改代码时还需注意避免引入新的错误,这需要对更改的代码进行测试。花时间比较久的是需要重构代码,对源代码结构进行改进、减少冗余代码,还要通过改进算法等优化程序的性能。逆向软件工程中,代码分析是关键,需要使用工具和技术来理解代码结构和功能。功能推测是在没有文档或注释的情况下,通过代码行为和输出来推断其功能。代码重构旨在改进代码质量,提高可读性和可维护性,这需要考虑代码的结构、可扩展性和可测试性。整个过程耗时较长,尤其是学习新技术、重构代码和优化性能等方面。

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: 软件逆向设计开发——学生管理系统