作业:宿舍管理系统优化
(1)来源:CSDN
https://blog.csdn.net/vlokl/article/details/136748303?ops_request_misc=elastic_search_misc&request_id=e7f4d53d40a887cbad6be9738d6cd6b4&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_positive~default-1-136748303-null-null.142v102pc_search_result_base9&utm_term=%E5%AE%BF%E8%88%8D%E7%AE%A1%E7%90%86%E7%B3%BB%E7%BB%9F%E4%BB%A3%E7%A0%81&spm=1018.2226.3001.4187
(2)运行环境+运行结果的截图(附伸缩源代码)
c++






点击查看代码
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <algorithm>
#include <cstdlib> // 用于清屏
// 学生类(对应原Python的Student类)
class Student {
public:
std::string id; // 学生ID
std::string name; // 姓名
std::string gender; // 性别
std::string age; // 年龄
std::string department;// 院系
std::string dormitory; // 宿舍号
// 构造函数
Student() = default;
Student(std::string id_, std::string name_, std::string gender_,
std::string age_, std::string dept_, std::string dorm_)
: id(id_), name(name_), gender(gender_), age(age_),
department(dept_), dormitory(dorm_) {}
};
// 学生宿舍管理系统类(对应原Python的StudentManagementSystem)
class StudentManagementSystem {
private:
std::vector<Student> students; // 存储所有学生数据
const std::string filename = "students.txt"; // 数据文件
// 清屏函数(跨平台)
void clearScreen() {
#ifdef _WIN32
system("cls");
#else
system("clear");
#endif
}
// 从文件加载数据到vector
void loadFromFile() {
students.clear(); // 清空现有数据
std::ifstream file(filename);
if (!file.is_open()) {
return; // 文件不存在则直接返回
}
std::string id, name, gender, age, dept, dorm;
while (file >> id >> name >> gender >> age >> dept >> dorm) {
students.emplace_back(id, name, gender, age, dept, dorm);
}
file.close();
}
// 将vector数据保存到文件
void saveToFile() {
std::ofstream file(filename);
if (!file.is_open()) {
std::cerr << "文件打开失败!" << std::endl;
return;
}
for (const auto& stu : students) {
file << stu.id << " " << stu.name << " " << stu.gender << " "
<< stu.age << " " << stu.department << " " << stu.dormitory << std::endl;
}
file.close();
}
// 查找学生(返回迭代器,未找到返回end())
std::vector<Student>::iterator findStudent(const std::string& id) {
return std::find_if(students.begin(), students.end(),
[&](const Student& s) { return s.id == id; });
}
public:
// 构造函数:初始化时加载文件数据
StudentManagementSystem() {
loadFromFile();
}
// 显示主菜单
void showMenu() {
clearScreen();
std::cout << "====================学生宿舍管理系统====================" << std::endl;
std::cout << "1. 添加学生信息" << std::endl;
std::cout << "2. 删除学生信息" << std::endl;
std::cout << "3. 修改学生信息" << std::endl;
std::cout << "4. 查询学生信息" << std::endl;
std::cout << "0. 退出系统" << std::endl;
std::cout << "========================================================" << std::endl;
std::cout << "请输入操作序号:";
}
// 1. 添加学生信息
void addStudent() {
clearScreen();
std::cout << "----------添加学生信息----------" << std::endl;
std::string id, name, gender, age, dept, dorm;
std::cout << "请输入学生ID:";
std::cin >> id;
std::cout << "请输入姓名:";
std::cin >> name;
std::cout << "请输入性别:";
std::cin >> gender;
std::cout << "请输入年龄:";
std::cin >> age;
// 处理带空格的院系名称(如"计算机科学与技术")
std::cin.ignore(); // 吸收换行符
std::cout << "请输入院系:";
std::getline(std::cin, dept);
std::cout << "请输入宿舍号:";
std::cin >> dorm;
// 检查ID是否重复
if (findStudent(id) != students.end()) {
std::cout << "该学生ID已存在!" << std::endl;
systemPause();
return;
}
// 添加到vector并保存
students.emplace_back(id, name, gender, age, dept, dorm);
saveToFile();
std::cout << "学生信息添加成功!" << std::endl;
systemPause();
}
// 2. 删除学生信息
void deleteStudent() {
clearScreen();
std::cout << "----------删除学生信息----------" << std::endl;
std::string id;
std::cout << "请输入要删除的学生ID:";
std::cin >> id;
auto it = findStudent(id);
if (it == students.end()) {
std::cout << "未找到该学生信息!" << std::endl;
systemPause();
return;
}
// 删除并保存
students.erase(it);
saveToFile();
std::cout << "学生信息删除成功!" << std::endl;
systemPause();
}
// 3. 修改学生信息
void modifyStudent() {
clearScreen();
std::cout << "----------修改学生信息----------" << std::endl;
std::string id;
std::cout << "请输入要修改的学生ID:";
std::cin >> id;
auto it = findStudent(id);
if (it == students.end()) {
std::cout << "未找到该学生信息!" << std::endl;
systemPause();
return;
}
// 显示原有信息
std::cout << "当前信息:" << std::endl;
std::cout << "ID:" << it->id << " 姓名:" << it->name
<< " 性别:" << it->gender << " 年龄:" << it->age
<< " 院系:" << it->department << " 宿舍号:" << it->dormitory << std::endl;
// 输入新信息(ID不可修改)
std::cout << "请输入新姓名:";
std::cin >> it->name;
std::cout << "请输入新性别:";
std::cin >> it->gender;
std::cout << "请输入新年龄:";
std::cin >> it->age;
std::cin.ignore();
std::cout << "请输入新院系:";
std::getline(std::cin, it->department);
std::cout << "请输入新宿舍号:";
std::cin >> it->dormitory;
// 保存修改
saveToFile();
std::cout << "学生信息修改成功!" << std::endl;
systemPause();
}
// 4. 查询学生信息
void queryStudent() {
clearScreen();
std::cout << "----------查询学生信息----------" << std::endl;
std::string id;
std::cout << "请输入要查询的学生ID:";
std::cin >> id;
auto it = findStudent(id);
if (it == students.end()) {
std::cout << "未找到该学生信息!" << std::endl;
} else {
std::cout << "\n==========查询结果==========" << std::endl;
std::cout << "学生ID:" << it->id << std::endl;
std::cout << "姓名:" << it->name << std::endl;
std::cout << "性别:" << it->gender << std::endl;
std::cout << "年龄:" << it->age << std::endl;
std::cout << "院系:" << it->department << std::endl;
std::cout << "宿舍号:" << it->dormitory << std::endl;
std::cout << "===========================" << std::endl;
}
systemPause();
}
// 暂停函数(按任意键继续)
void systemPause() {
std::cout << "\n按任意键返回菜单...";
#ifdef _WIN32
system("pause > nul");
#else
std::cin.ignore();
std::cin.get();
#endif
}
};
// 主函数
int main() {
StudentManagementSystem system;
int choice;
while (true) {
system.showMenu();
std::cin >> choice;
switch (choice) {
case 1:
system.addStudent();
break;
case 2:
system.deleteStudent();
break;
case 3:
system.modifyStudent();
break;
case 4:
system.queryStudent();
break;
case 0:
std::cout << "感谢使用,再见!" << std::endl;
return 0;
default:
std::cout << "输入错误,请重新选择!" << std::endl;
system.systemPause();
break;
}
}
return 0;
(3)主要问题列表,针对问题的改善或者重构思路:
- 混合使用cin >>和getline时的缓冲区问题未彻底解决
- 无输入合法性校验(如年龄非数字、ID 为空等)
- 错误输入导致程序异常
- 文件读写格式脆弱(空格分隔)
- 无文件操作异常处理(如权限不足)
- 未处理文件换行 / 空行问题
- systemPause/clearScreen等函数依赖系统命令,跨平台兼容性差
- 学生类成员直接暴露,封装性不足
(4)新代码附上(可以只放你自己改进的地方或完整源代码伸缩模式上传)
点击查看代码
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <algorithm>
#include <limits>
#include <iomanip>
#include <cctype>
#include <stdexcept>
#include <ctime>
#include <sstream>
// ===================== 常量定义(解硬编码) =====================
namespace Config {
// 文件配置
constexpr const char* DATA_FILE = "students.csv";
constexpr const char* LOG_FILE = "system.log";
// 菜单选项
enum MenuOption {
EXIT = 0,
ADD = 1,
DELETE = 2,
MODIFY = 3,
QUERY_BY_ID = 4,
QUERY_BY_NAME = 5,
SHOW_ALL = 6,
BATCH_DELETE = 7
};
// 界面文本
constexpr const char* MENU_TITLE = "====================学生宿舍管理系统====================";
constexpr const char* MENU_OPTIONS =
"1. 添加学生信息\n"
"2. 删除学生信息\n"
"3. 修改学生信息\n"
"4. 按ID查询学生信息\n"
"5. 按姓名查询学生信息\n"
"6. 展示所有学生信息\n"
"7. 批量删除学生信息\n"
"0. 退出系统";
constexpr const char* MENU_PROMPT = "请输入操作序号:";
}
// ===================== 日志工具类(精细化操作反馈) =====================
class Logger {
public:
static void log(const std::string& message) {
std::ofstream logFile(Config::LOG_FILE, std::ios::app);
if (logFile.is_open()) {
// 获取当前时间
std::time_t now = std::time(nullptr);
char timeStr[20];
std::strftime(timeStr, sizeof(timeStr), "%Y-%m-%d %H:%M:%S", std::localtime(&now));
// 写入日志
logFile << "[" << timeStr << "] " << message << std::endl;
logFile.close();
}
}
};
// ===================== 学生类(完整封装) =====================
class Student {
private:
std::string id;
std::string name;
std::string gender;
std::string age;
std::string department;
std::string dormitory;
public:
Student() = default;
Student(std::string id_, std::string name_, std::string gender_,
std::string age_, std::string dept_, std::string dorm_)
: id(std::move(id_)), name(std::move(name_)), gender(std::move(gender_)),
age(std::move(age_)), department(std::move(dept_)), dormitory(std::move(dorm_)) {}
// Getter(只读,保证数据安全)
[[nodiscard]] const std::string& getId() const { return id; }
[[nodiscard]] const std::string& getName() const { return name; }
[[nodiscard]] const std::string& getGender() const { return gender; }
[[nodiscard]] const std::string& getAge() const { return age; }
[[nodiscard]] const std::string& getDepartment() const { return department; }
[[nodiscard]] const std::string& getDormitory() const { return dormitory; }
// Setter(仅允许修改非ID字段)
void setName(const std::string& newName) { name = newName; }
void setGender(const std::string& newGender) { gender = newGender; }
void setAge(const std::string& newAge) { age = newAge; }
void setDepartment(const std::string& newDept) { department = newDept; }
void setDormitory(const std::string& newDorm) { dormitory = newDorm; }
// 序列化(转为CSV行)
[[nodiscard]] std::string toCsvLine() const {
return id + "," + name + "," + gender + "," + age + "," + department + "," + dormitory;
}
// 反序列化(从CSV行创建对象)
static Student fromCsvLine(const std::string& line) {
std::vector<std::string> fields = splitCsvLine(line);
if (fields.size() != 6) {
throw std::invalid_argument("无效的CSV行:字段数量错误");
}
return Student(fields[0], fields[1], fields[2], fields[3], fields[4], fields[5]);
}
private:
// 分割CSV行(处理逗号分隔)
static std::vector<std::string> splitCsvLine(const std::string& line) {
std::vector<std::string> fields;
std::string field;
bool inQuotes = false;
for (char c : line) {
if (c == '"' && !inQuotes) {
inQuotes = true;
} else if (c == '"' && inQuotes) {
inQuotes = false;
} else if (c == ',' && !inQuotes) {
fields.push_back(field);
field.clear();
} else {
field += c;
}
}
fields.push_back(field);
return fields;
}
};
// ===================== 核心管理类 =====================
class StudentManagementSystem {
private:
std::vector<Student> students;
// ===================== 输入处理工具(解决缓冲区+合法性问题) =====================
void clearInputBuffer() {
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
bool inputNonEmptyString(const std::string& prompt, std::string& out) {
while (true) {
std::cout << prompt;
clearInputBuffer();
std::getline(std::cin, out);
if (!out.empty()) return true;
std::cerr << "❌ 错误:输入不能为空!" << std::endl;
}
}
bool inputNumber(const std::string& prompt, std::string& out) {
while (true) {
if (!inputNonEmptyString(prompt, out)) continue;
if (std::all_of(out.begin(), out.end(), ::isdigit)) return true;
std::cerr << "❌ 错误:请输入纯数字!" << std::endl;
}
}
int getValidMenuChoice() {
int choice = -1;
while (true) {
std::cout << Config::MENU_PROMPT;
if (std::cin >> choice) {
clearInputBuffer();
if (choice >= 0 && choice <= 7) return choice;
} else {
clearInputBuffer();
}
std::cerr << "❌ 错误:请输入0-7之间的有效数字!" << std::endl;
}
}
// ===================== 跨平台界面工具(解决系统命令依赖) =====================
void clearScreen() {
// ANSI转义序列(兼容99%终端,Windows需开启ANSI支持)
std::cout << "\033[2J\033[1;1H";
std::cout.flush();
}
void systemPause() {
std::cout << "\n按Enter键返回菜单...";
clearInputBuffer();
std::cin.get();
}
// ===================== 数据持久化(解决CSV+异常+空行问题) =====================
void loadFromFile() {
students.clear();
std::ifstream file(Config::DATA_FILE);
if (!file.is_open()) {
Logger::log("数据文件不存在,将创建新文件:" + std::string(Config::DATA_FILE));
return;
}
std::string line;
int lineNum = 0;
while (std::getline(file, line)) {
lineNum++;
if (line.empty()) continue; // 跳过空行
try {
Student stu = Student::fromCsvLine(line);
students.push_back(stu);
} catch (const std::exception& e) {
std::cerr << "⚠️ 第" << lineNum << "行数据无效:" << e.what() << "(已跳过)" << std::endl;
Logger::log("加载数据失败-第" + std::to_string(lineNum) + "行:" + e.what());
}
}
file.close();
Logger::log("成功加载" + std::to_string(students.size()) + "条学生数据");
}
void saveToFile() {
std::ofstream file(Config::DATA_FILE);
if (!file.is_open()) {
std::cerr << "❌ 错误:无法打开文件 " << Config::DATA_FILE << "(权限不足/路径不存在)" << std::endl;
Logger::log("保存数据失败:无法打开文件 " + std::string(Config::DATA_FILE));
return;
}
try {
for (const auto& stu : students) {
file << stu.toCsvLine() << "\n";
}
file.close();
Logger::log("成功保存" + std::to_string(students.size()) + "条学生数据");
} catch (const std::exception& e) {
std::cerr << "❌ 文件写入失败:" << e.what() << std::endl;
Logger::log("保存数据失败:" + std::string(e.what()));
}
}
// ===================== 核心业务逻辑(单一职责) =====================
std::vector<Student>::iterator findStudentById(const std::string& id) {
return std::find_if(students.begin(), students.end(),
[&](const Student& s) { return s.getId() == id; });
}
std::vector<std::vector<Student>::iterator> findStudentsByName(const std::string& name) {
std::vector<std::vector<Student>::iterator> matches;
for (auto it = students.begin(); it != students.end(); ++it) {
if (it->getName().find(name) != std::string::npos) {
matches.push_back(it);
}
}
return matches;
}
bool confirmOperation(const std::string& operation) {
char confirm;
while (true) {
std::cout << "🔍 确认要" << operation << "吗?(Y/N):";
std::cin >> confirm;
clearInputBuffer();
if (confirm == 'Y' || confirm == 'y') return true;
if (confirm == 'N' || confirm == 'n') return false;
std::cerr << "❌ 错误:请输入Y或N!" << std::endl;
}
}
// 展示单个学生信息
void showStudentInfo(const Student& stu) {
std::cout << "\n==========学生信息==========" << std::endl;
std::cout << "学生ID:" << stu.getId() << std::endl;
std::cout << "姓名:" << stu.getName() << std::endl;
std::cout << "性别:" << stu.getGender() << std::endl;
std::cout << "年龄:" << stu.getAge() << std::endl;
std::cout << "院系:" << stu.getDepartment() << std::endl;
std::cout << "宿舍号:" << stu.getDormitory() << std::endl;
std::cout << "===========================" << std::endl;
}
// 展示学生列表(格式化表格)
void showStudentTable(const std::vector<std::vector<Student>::iterator>& studentsList) {
if (studentsList.empty()) {
std::cout << "📄 暂无学生信息!" << std::endl;
return;
}
std::cout << "\n================================================================" << std::endl;
std::cout << std::left
<< std::setw(12) << "学生ID"
<< std::setw(10) << "姓名"
<< std::setw(8) << "性别"
<< std::setw(8) << "年龄"
<< std::setw(20) << "院系"
<< std::setw(10) << "宿舍号" << std::endl;
std::cout << "---------------------------------------------------------------" << std::endl;
for (auto it : studentsList) {
std::cout << std::left
<< std::setw(12) << it->getId()
<< std::setw(10) << it->getName()
<< std::setw(8) << it->getGender()
<< std::setw(8) << it->getAge()
<< std::setw(20) << it->getDepartment()
<< std::setw(10) << it->getDormitory() << std::endl;
}
std::cout << "================================================================" << std::endl;
std::cout << "总计:" << studentsList.size() << "条记录" << std::endl;
}
public:
StudentManagementSystem() {
loadFromFile();
Logger::log("系统初始化完成");
}
~StudentManagementSystem() {
Logger::log("系统退出");
}
// ===================== 菜单与功能入口(单一职责) =====================
void showMenu() {
clearScreen();
std::cout << Config::MENU_TITLE << std::endl;
std::cout << Config::MENU_OPTIONS << std::endl;
std::cout << "========================================================" << std::endl;
}
void addStudent() { // 仅负责添加逻辑
clearScreen();
std::cout << "----------添加学生信息----------" << std::endl;
std::string id, name, gender, age, dept, dorm;
if (!inputNonEmptyString("请输入学生ID:", id)) return;
if (!inputNonEmptyString("请输入姓名:", name)) return;
if (!inputNonEmptyString("请输入性别:", gender)) return;
if (!inputNumber("请输入年龄:", age)) return;
if (!inputNonEmptyString("请输入院系:", dept)) return;
if (!inputNonEmptyString("请输入宿舍号:", dorm)) return;
if (findStudentById(id) != students.end()) {
std::cerr << "❌ 错误:该学生ID已存在!" << std::endl;
Logger::log("添加学生失败:ID重复 - " + id);
systemPause();
return;
}
if (!confirmOperation("添加该学生信息")) {
std::cout << "✅ 添加操作已取消。" << std::endl;
systemPause();
return;
}
students.emplace_back(id, name, gender, age, dept, dorm);
saveToFile();
std::cout << "✅ 学生信息添加成功!" << std::endl;
Logger::log("添加学生成功:ID - " + id + ",姓名 - " + name);
systemPause();
}
void deleteStudent() { // 仅负责单条删除逻辑
clearScreen();
std::cout << "----------删除学生信息----------" << std::endl;
std::string id;
if (!inputNonEmptyString("请输入要删除的学生ID:", id)) return;
auto it = findStudentById(id);
if (it == students.end()) {
std::cerr << "❌ 错误:未找到该学生信息!" << std::endl;
Logger::log("删除学生失败:ID不存在 - " + id);
systemPause();
return;
}
showStudentInfo(*it);
if (!confirmOperation("删除该学生信息")) {
std::cout << "✅ 删除操作已取消。" << std::endl;
systemPause();
return;
}
std::string delName = it->getName();
students.erase(it);
saveToFile();
std::cout << "✅ 学生信息删除成功!" << std::endl;
Logger::log("删除学生成功:ID - " + id + ",姓名 - " + delName);
systemPause();
}
void batchDeleteStudents() { // 批量删除逻辑
clearScreen();
std::cout << "----------批量删除学生信息----------" << std::endl;
std::string ids;
inputNonEmptyString("请输入要删除的学生ID(用逗号分隔,如:001,002):", ids);
// 分割ID列表
std::vector<std::string> idList;
std::stringstream ss(ids);
std::string temp;
while (std::getline(ss, temp, ',')) {
if (!temp.empty()) idList.push_back(temp);
}
// 检查并收集待删除学生
std::vector<std::vector<Student>::iterator> toDelete;
for (const auto& id : idList) {
auto it = findStudentById(id);
if (it != students.end()) {
toDelete.push_back(it);
} else {
std::cerr << "⚠️ 提示:ID " << id << " 不存在(已跳过)" << std::endl;
}
}
if (toDelete.empty()) {
std::cerr << "❌ 错误:无有效可删除的学生ID!" << std::endl;
systemPause();
return;
}
// 展示待删除列表
std::cout << "\n📋 待删除学生列表:" << std::endl;
showStudentTable(toDelete);
if (!confirmOperation("批量删除以上学生信息")) {
std::cout << "✅ 批量删除操作已取消。" << std::endl;
systemPause();
return;
}
// 执行删除
for (auto it = toDelete.rbegin(); it != toDelete.rend(); ++it) {
Logger::log("批量删除学生:ID - " + (*it)->getId() + ",姓名 - " + (*it)->getName());
students.erase(*it);
}
saveToFile();
std::cout << "✅ 批量删除成功!共删除" << toDelete.size() << "条学生信息" << std::endl;
Logger::log("批量删除完成:共删除" + std::to_string(toDelete.size()) + "条记录");
systemPause();
}
void modifyStudent() { // 仅负责修改逻辑
clearScreen();
std::cout << "----------修改学生信息----------" << std::endl;
std::string id;
if (!inputNonEmptyString("请输入要修改的学生ID:", id)) return;
auto it = findStudentById(id);
if (it == students.end()) {
std::cerr << "❌ 错误:未找到该学生信息!" << std::endl;
Logger::log("修改学生失败:ID不存在 - " + id);
systemPause();
return;
}
showStudentInfo(*it);
std::string name, gender, age, dept, dorm;
if (!inputNonEmptyString("请输入新姓名:", name)) return;
if (!inputNonEmptyString("请输入新性别:", gender)) return;
if (!inputNumber("请输入新年龄:", age)) return;
if (!inputNonEmptyString("请输入新院系:", dept)) return;
if (!inputNonEmptyString("请输入新宿舍号:", dorm)) return;
if (!confirmOperation("修改该学生信息")) {
std::cout << "✅ 修改操作已取消。" << std::endl;
systemPause();
return;
}
Logger::log("修改学生信息:ID - " + id + ",原姓名 - " + it->getName() + ",新姓名 - " + name);
it->setName(name);
it->setGender(gender);
it->setAge(age);
it->setDepartment(dept);
it->setDormitory(dorm);
saveToFile();
std::cout << "✅ 学生信息修改成功!" << std::endl;
systemPause();
}
void queryStudentById() { // 仅负责ID查询逻辑
clearScreen();
std::cout << "----------按ID查询学生信息----------" << std::endl;
std::string id;
if (!inputNonEmptyString("请输入要查询的学生ID:", id)) return;
auto it = findStudentById(id);
if (it == students.end()) {
std::cerr << "❌ 错误:未找到该学生信息!" << std::endl;
Logger::log("查询学生失败:ID不存在 - " + id);
} else {
showStudentInfo(*it);
}
systemPause();
}
void queryStudentByName() { // 仅负责姓名查询逻辑
clearScreen();
std::cout << "----------按姓名查询学生信息----------" << std::endl;
std::string name;
if (!inputNonEmptyString("请输入要查询的学生姓名(支持模糊匹配):", name)) return;
auto matches = findStudentsByName(name);
if (matches.empty()) {
std::cerr << "❌ 错误:未找到匹配的学生信息!" << std::endl;
Logger::log("查询学生失败:无匹配姓名 - " + name);
} else {
showStudentTable(matches);
}
systemPause();
}
void showAllStudents() { // 仅负责展示所有学生逻辑
clearScreen();
std::cout << "----------所有学生信息----------" << std::endl;
std::vector<std::vector<Student>::iterator> allStudents;
for (auto it = students.begin(); it != students.end(); ++it) {
allStudents.push_back(it);
}
showStudentTable(allStudents);
systemPause();
}
void run() {
int choice;
while (true) {
showMenu();
choice = getValidMenuChoice();
switch (choice) {
case Config::ADD: addStudent(); break;
case Config::DELETE: deleteStudent(); break;
case Config::MODIFY: modifyStudent(); break;
case Config::QUERY_BY_ID: queryStudentById(); break;
case Config::QUERY_BY_NAME: queryStudentByName(); break;
case Config::SHOW_ALL: showAllStudents(); break;
case Config::BATCH_DELETE: batchDeleteStudents(); break;
case Config::EXIT:
std::cout << "👋 感谢使用,再见!" << std::endl;
Logger::log("用户主动退出系统");
return;
default:
std::cerr << "❌ 错误:无效的菜单选项!" << std::endl;
systemPause();
break;
}
}
}
};
// ===================== 主函数 =====================
int main() {
try {
StudentManagementSystem system;
system.run();
} catch (const std::exception& e) {
std::cerr << "💥 系统异常:" << e.what() << std::endl;
Logger::log("系统崩溃:" + std::string(e.what()));
return 1;
}
return 0;
}
(5)重构的软件的测试截图




(6)总结:难点、花时间比较久的、逆向软件工程的一些思考
本次学生宿舍管理系统的优化,难点集中在输入处理、数据持久化、代码封装和跨平台兼容,耗时点主要在全场景测试、细节优化和函数重构。而通过本次逆向软件工程实践,深刻认识到:逆向不是修改错误,而是理解设计、修复缺陷、提升质量,逆向重构过程中,每修改一个模块、每拆分一个函数,都可能引入新的逻辑错误。因此,测试和日志是逆向工程的重要支撑。核心是在复用现有核心逻辑的基础上,通过工程化改造,让代码更健壮、更可维护、更符合用户需求。
对于同类项目的逆向重构,建议先通过逆向分析明确核心逻辑和设计缺陷,再制定系统性的优化方案,重点关注输入校验、异常处理、代码封装和用户体验,同时重视测试和日志,确保重构后的代码既兼容原始功能,又能解决核心问题,实现工程质量的全面提升

浙公网安备 33010602011771号