软件逆向设计开发——学生管理系统
此项目源自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]