找回密码
 立即注册
首页 业界区 安全 软件逆向设计开发——学生管理系统

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

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

添加学生个人信息:
2.png

修改个人信息后查看个人信息:
3.png

删除个人信息:
4.png

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

点击查看代码
  1. package demo3; // 声明包名
  2. import java.util.Scanner; // 从java.util包中导入Scanner类
  3. import java.util.ArrayList; // 从java.util包中导入ArrayList类
  4. public class StudentManagementSystem { // 声明公共类StudentManagementSystem
  5.     //思路
  6.     public static void main(String[] args) { // 声明主方法
  7.         //定义属性
  8.         boolean loop = true; // 声明一个布尔变量来控制循环
  9.         Scanner scanner = new Scanner(System.in); // 创建一个Scanner对象,用来获取用户输入
  10.         String key = ""; // 声明一个字符串变量,用来存储用户输入
  11.         ArrayList<Student> students = new ArrayList<>(); // 声明一个ArrayList,用来存储Student对象
  12.         do{ // 开始do-while循环
  13.             //显示菜单
  14.             new Menu().menu(); // 显示菜单
  15.             key = scanner.next(); // 获取用户输入
  16.             switch (key){ // 开始switch语句
  17.                 case "1": // 情况1:添加学生
  18.                     System.out.println("请输入学生信息:"); // 提示用户输入学生信息
  19.                     Student student = new Student(); // 创建一个新的Student对象
  20.                     System.out.println("请输入学号:"); // 提示用户输入学生ID
  21.                     student.id = scanner.nextInt(); // 从用户输入中获取学生ID
  22.                     System.out.println("请输入姓名:"); // 提示用户输入学生姓名
  23.                     student.name = scanner.next(); // 从用户输入中获取学生姓名
  24.                     System.out.println("请输入语文成绩:"); // 提示用户输入语文成绩
  25.                     student.chinese = scanner.nextDouble(); // 从用户输入中获取语文成绩
  26.                     System.out.println("请输入高数成绩:"); // 提示用户输入数学成绩
  27.                     student.math = scanner.nextDouble(); // 从用户输入中获取数学成绩
  28.                     System.out.println("请输入C语言成绩:"); // 提示用户输入C语言成绩
  29.                     student.c_language = scanner.nextDouble(); // 从用户输入中获取C语言成绩
  30.                     System.out.println("请输入数据结构成绩:"); // 提示用户输入数据结构成绩
  31.                     student.data_structure = scanner.nextDouble(); // 从用户输入中获取数据结构成绩
  32.                     students.add(student); // 将Student对象添加到ArrayList中
  33.                     System.out.println("学生信息添加成功!"); // 打印成功消息
  34.                     break; // 结束情况1
  35.                 case "2": // 情况2:删除学生
  36.                     System.out.println("请输入要删除的学生学号:"); // 提示用户输入要删除的学生ID
  37.                     int deleteId = scanner.nextInt(); // 从用户输入中获取学生ID
  38.                     for (int i = 0; i < students.size(); i++) { // 遍历ArrayList
  39.                         if (students.get(i).id == deleteId) { // 如果找到了要删除的学生
  40.                             students.remove(i); // 从ArrayList中删除学生
  41.                             System.out.println("学生信息删除成功!"); // 打印成功消息
  42.                             break; // 结束循环
  43.                         }
  44.                     }
  45.                     break; // 结束情况2
  46.                 case "3": // 情况3:修改学生
  47.                     System.out.println("请输入要修改的学生学号:"); // 提示用户输入要修改的学生ID
  48.                     int modifyId = scanner.nextInt(); // 从用户输入中获取学生ID
  49.                     for (Student s : students) { // 遍历ArrayList
  50.                         if (s.id == modifyId) { // 如果找到了要修改的学生
  51.                             System.out.println("请输入新的学生姓名:"); // 提示用户输入新的学生姓名
  52.                             s.name = scanner.next(); // 从用户输入中获取新的学生姓名
  53.                             System.out.println("请输入新的语文成绩:"); // 提示用户输入新的语文成绩
  54.                             s.chinese = scanner.nextDouble(); // 从用户输入中获取新的语文成绩
  55.                             System.out.println("请输入新的高数成绩:"); // 提示用户输入新的数学成绩
  56.                             s.math = scanner.nextDouble(); // 从用户输入中获取新的数学成绩
  57.                             System.out.println("请输入新的C语言成绩:"); // 提示用户输入新的C语言成绩
  58.                             s.c_language = scanner.nextDouble(); // 从用户输入中获取新的C语言成绩
  59.                             System.out.println("请输入新的数据结构成绩:"); // 提示用户输入新的数据结构成绩
  60.                             s.data_structure = scanner.nextDouble(); // 从用户输入中获取新的数据结构成绩
  61.                             System.out.println("学生信息修改成功!"); // 打印成功消息
  62.                             break; // 结束循环
  63.                         }
  64.                     }
  65.                     break; // 结束情况3
  66.                 case "4": // 情况4:查找学生
  67.                     System.out.println("请输入要查找的学生学号:"); // 提示用户输入要查找的学生ID
  68.                     int searchId = scanner.nextInt(); // 从用户输入中获取学生ID
  69.                     for (Student s : students) { // 遍历ArrayList
  70.                         if (s.id == searchId) { // 如果找到了要查找的学生
  71.                             System.out.println("找到学生信息:"); // 打印消息
  72.                             System.out.println("学号:" + s.id); // 打印学生ID
  73.                             System.out.println("姓名:" + s.name); // 打印学生姓名
  74.                             System.out.println("语文成绩:" + s.chinese); // 打印语文成绩
  75.                             System.out.println("高数成绩:" + s.math); // 打印数学成绩
  76.                             System.out.println("C语言成绩:" + s.c_language); // 打印C语言成绩
  77.                             System.out.println("数据结构成绩:" + s.data_structure); // 打印数据结构成绩
  78.                             break; // 结束循环
  79.                         }
  80.                     }
  81.                     break; // 结束情况4
  82.                 case "5": // 情况5:查看所有学生
  83.                     System.out.println("以下是所有学生的信息:"); // 打印消息
  84.                     for (Student s : students) { // 遍历ArrayList
  85.                         System.out.println("学号:" + s.id); // 打印学生ID
  86.                         System.out.println("姓名:" + s.name); // 打印学生姓名
  87.                         System.out.println("语文成绩:" + s.chinese); // 打印语文成绩
  88.                         System.out.println("高数成绩:" + s.math); // 打印数学成绩
  89.                         System.out.println("C语言成绩:" + s.c_language); // 打印C语言成绩
  90.                         System.out.println("数据结构成绩:" + s.data_structure); // 打印数据结构成绩
  91.                     }
  92.                     break; // 结束情况5
  93.                 case "6": // 情况6:退出程序
  94.                     loop = false; // 设置loop为false,结束循环
  95.                     System.out.println("退出程序"); // 打印消息
  96.                     break; // 结束情况6
  97.             }
  98.         }while(loop); // 结束do-while循环
  99.     }
  100. }
  101. //菜单类
  102. class Menu{
  103.     public void menu(){
  104.         System.out.println("\n========学生管理系统========"); //打印主菜单
  105.         System.out.println("\t\t1.添加学生");
  106.         System.out.println("\t\t2.删除学生");
  107.         System.out.println("\t\t3.修改学生");
  108.         System.out.println("\t\t4.查找学生");
  109.         System.out.println("\t\t5.查看所有学生");
  110.         System.out.println("\t\t6.退出程序");
  111.         System.out.println("请输入你的选择:");
  112.     }
  113. }
  114. //学生类
  115. class Student{
  116.     //创建学生的基本属性
  117.     //1.学号//唯一标识
  118.     //2.姓名
  119.     //3.语文成绩
  120.     //4.高数成绩
  121.     //5.C语言成绩
  122.     //6.数据结构成绩
  123.     int id; // 学生ID
  124.     String name; // 学生姓名
  125.     double chinese; // 语文成绩
  126.     double math; // 数学成绩
  127.     double c_language; // C语言成绩
  128.     double data_structure; // 数据结构成绩
  129. }
复制代码
此程序中出现的问题:
1.输入后的信息不能保存到本地,每一次打开都需要重新输入信息。
更新代码后实现
保存功能:在退出程序时,会自动将学生信息保存到 students.txt 文件中。
加载功能:在程序启动时,会自动从 students.txt 文件中加载之前保存的学生信息。
保存格式如图:
5.png

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

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

点击查看代码
  1. student.id = scanner.nextInt();
  2. student.name = scanner.next();
  3. student.chinese = scanner.nextDouble();
复制代码
解决方法为在每次读取输入数据后添加scanner.nextLine()清除输入缓冲区点击查看代码
  1. private static Student createStudent(Scanner scanner) {
  2.     Student student = new Student();
  3.     System.out.println("请输入学号:");
  4.     student.id = scanner.nextInt();
  5.     scanner.nextLine(); // 清除缓冲区
  6.     System.out.println("请输入姓名:");
  7.     student.name = scanner.nextLine();
  8.     System.out.println("请输入语文成绩:");
  9.     student.chinese = scanner.nextDouble();
  10.     scanner.nextLine(); // 清除缓冲区
  11.     System.out.println("请输入高数成绩:");
  12.     student.math = scanner.nextDouble();
  13.     scanner.nextLine(); // 清除缓冲区
  14.     System.out.println("请输入C语言成绩:");
  15.     student.c_language = scanner.nextDouble();
  16.     scanner.nextLine(); // 清除缓冲区
  17.     System.out.println("请输入数据结构成绩:");
  18.     student.data_structure = scanner.nextDouble();
  19.     return student;
  20. }
复制代码
4.菜单显示不够美观:
修改后如下:
7.png

修改的代码如下

点击查看代码
  1. package demo3; // 声明包名
  2. import java.util.Scanner;        // 从java.util包中导入Scanner类
  3. import java.util.ArrayList;      // 从java.util包中导入ArrayList类
  4. import java.io.File;            // 导入File类
  5. import java.io.FileWriter;      // 导入FileWriter类
  6. import java.io.BufferedWriter;  // 导入BufferedWriter类
  7. import java.io.BufferedReader;  // 导入BufferedReader类
  8. import java.io.FileReader;       // 导入FileReader类
  9. import java.io.IOException;     // 导入IOException类
  10. public class StudentManagementSystem { // 声明公共类StudentManagementSystem
  11.     public static void main(String[] args) { // 声明主方法
  12.         boolean loop = true; // 声明一个布尔变量来控制循环
  13.         Scanner scanner = new Scanner(System.in); // 创建一个Scanner对象,用来获取用户输入
  14.         ArrayList<Student> students = new ArrayList<>(); // 声明一个ArrayList,用来存储Student对象
  15.         try {
  16.             students = loadFromFile(new File("students.txt")); // 从文件加载学生信息
  17.         } catch (IOException e) {
  18.             System.out.println("加载文件时出错:文件可能不存在或无法访问。");
  19.             e.printStackTrace();
  20.         }
  21.         do { // 开始do-while循环
  22.             new Menu().menu(); // 显示菜单
  23.             String key = scanner.next(); // 获取用户输入
  24.             switch (key) { // 开始switch语句
  25.                 case "1": // 添加学生
  26.                     Student student = createStudent(scanner);
  27.                     students.add(student); // 将Student对象添加到ArrayList中
  28.                     System.out.println("学生信息添加成功!");
  29.                     break;
  30.                 case "2": // 删除学生
  31.                     System.out.println("请输入要删除的学生学号:");
  32.                     int deleteId = scanner.nextInt();
  33.                     scanner.nextLine(); // 清除缓冲区
  34.                     boolean found = false;
  35.                     for (int i = 0; i < students.size(); i++) {
  36.                         if (students.get(i).id == deleteId) {
  37.                             students.remove(i);
  38.                             System.out.println("学生信息删除成功!");
  39.                             found = true;
  40.                             break;
  41.                         }
  42.                     }
  43.                     if (!found) {
  44.                         System.out.println("找不到该学生信息!");
  45.                     }
  46.                     break;
  47.                 case "3": // 修改学生
  48.                     System.out.println("请输入要修改的学生学号:");
  49.                     int modifyId = scanner.nextInt();
  50.                     scanner.nextLine(); // 清除缓冲区
  51.                     found = false;
  52.                     for (Student s : students) {
  53.                         if (s.id == modifyId) {
  54.                             System.out.println("请输入新的学生姓名:");
  55.                             s.name = scanner.nextLine();
  56.                             System.out.println("请输入新的语文成绩:");
  57.                             s.chinese = scanner.nextDouble();
  58.                             scanner.nextLine(); // 清除缓冲区
  59.                             System.out.println("请输入新的高数成绩:");
  60.                             s.math = scanner.nextDouble();
  61.                             scanner.nextLine(); // 清除缓冲区
  62.                             System.out.println("请输入新的C语言成绩:");
  63.                             s.c_language = scanner.nextDouble();
  64.                             scanner.nextLine(); // 清除缓冲区
  65.                             System.out.println("请输入新的数据结构成绩:");
  66.                             s.data_structure = scanner.nextDouble();
  67.                             System.out.println("学生信息修改成功!");
  68.                             found = true;
  69.                             break;
  70.                         }
  71.                     }
  72.                     if (!found) {
  73.                         System.out.println("找不到该学生信息!");
  74.                     }
  75.                     break;
  76.                 case "4": // 查找学生
  77.                     System.out.println("请输入要查找的学生学号:");
  78.                     int searchId = scanner.nextInt();
  79.                     scanner.nextLine(); // 清除缓冲区
  80.                     found = false;
  81.                     for (Student s : students) {
  82.                         if (s.id == searchId) {
  83.                             System.out.println("找到学生信息:");
  84.                             System.out.println("学号:" + s.id);
  85.                             System.out.println("姓名:" + s.name);
  86.                             System.out.println("语文成绩:" + s.chinese);
  87.                             System.out.println("高数成绩:" + s.math);
  88.                             System.out.println("C语言成绩:" + s.c_language);
  89.                             System.out.println("数据结构成绩:" + s.data_structure);
  90.                             found = true;
  91.                             break;
  92.                         }
  93.                     }
  94.                     if (!found) {
  95.                         System.out.println("找不到该学生信息!");
  96.                     }
  97.                     break;
  98.                 case "5": // 查看所有学生
  99.                     System.out.println("以下是所有学生的信息:");
  100.                     for (Student s : students) {
  101.                         System.out.println(
  102.                                 "学号:" + s.id + ",姓名:" + s.name +
  103.                                 ",语文成绩:" + s.chinese +
  104.                                 ",高数成绩:" + s.math +
  105.                                 ",C语言成绩:" + s.c_language +
  106.                                 ",数据结构成绩:" + s.data_structure
  107.                         );
  108.                     }
  109.                     break;
  110.                 case "6": // 退出程序
  111.                     loop = false;
  112.                     System.out.println("退出程序");
  113.                     try {
  114.                         saveToFile(students, new File("students.txt")); // 保存学生信息到文件
  115.                     } catch (IOException e) {
  116.                         System.out.println("保存文件时出错:文件可能无法访问。");
  117.                         e.printStackTrace();
  118.                     }
  119.                     break;
  120.                 default:
  121.                     System.out.println("无效选项,请重新选择!");
  122.             }
  123.         } while (loop); // 结束do-while循环
  124.     }
  125.     private static Student createStudent(Scanner scanner) {
  126.         Student student = new Student();
  127.         System.out.println("请输入学号:");
  128.         student.id = scanner.nextInt();
  129.         scanner.nextLine(); // 清除缓冲区
  130.         System.out.println("请输入姓名:");
  131.         student.name = scanner.nextLine();
  132.         System.out.println("请输入语文成绩:");
  133.         student.chinese = scanner.nextDouble();
  134.         scanner.nextLine(); // 清除缓冲区
  135.         System.out.println("请输入高数成绩:");
  136.         student.math = scanner.nextDouble();
  137.         scanner.nextLine(); // 清除缓冲区
  138.         System.out.println("请输入C语言成绩:");
  139.         student.c_language = scanner.nextDouble();
  140.         scanner.nextLine(); // 清除缓冲区
  141.         System.out.println("请输入数据结构成绩:");
  142.         student.data_structure = scanner.nextDouble();
  143.         return student;
  144.     }
  145.     // 将学生信息保存到文件
  146.     private static void saveToFile(ArrayList<Student> students, File file) throws IOException {
  147.         try (BufferedWriter writer = new BufferedWriter(new FileWriter(file))) {
  148.             for (Student student : students) {
  149.                 writer.write(student.id + "|" + student.name + "|" + student.chinese + "|" + student.math + "|" + student.c_language + "|" + student.data_structure);
  150.                 writer.newLine();
  151.             }
  152.         }
  153.     }
  154.     // 从文件加载学生信息
  155.     private static ArrayList<Student> loadFromFile(File file) throws IOException {
  156.         ArrayList<Student> students = new ArrayList<>();
  157.         try (BufferedReader reader = new BufferedReader(new FileReader(file))) {
  158.             String line;
  159.             while ((line = reader.readLine()) != null) {
  160.                 String[] parts = line.split("\\|");
  161.                 if (parts.length == 6) {
  162.                     Student student = new Student();
  163.                     student.id = Integer.parseInt(parts[0]);
  164.                     student.name = parts[1];
  165.                     student.chinese = Double.parseDouble(parts[2]);
  166.                     student.math = Double.parseDouble(parts[3]);
  167.                     student.c_language = Double.parseDouble(parts[4]);
  168.                     student.data_structure = Double.parseDouble(parts[5]);
  169.                     students.add(student);
  170.                 }
  171.             }
  172.         }
  173.         return students;
  174.     }
  175. }
  176. //菜单类
  177. class Menu {
  178.     public void menu() {
  179.         System.out.println("\n******************************");
  180.         System.out.println("****     学生管理系统     ****");
  181.         System.out.println("****     1. 添加学生      ****");
  182.         System.out.println("****     2. 删除学生      ****");
  183.         System.out.println("****     3. 修改学生      ****");
  184.         System.out.println("****     4. 查找学生      ****");
  185.         System.out.println("****     5. 查看所有学生  ****");
  186.         System.out.println("****     6. 退出程序      ****");
  187.         System.out.println("******************************");
  188.         System.out.println("请输入你的选择:");
  189.     }
  190. }
复制代码
上述代码省略了学生类的声明。重构的代码截图已在上述问题陈述中展示。总结

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

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册