作业:宿舍管理系统优化

(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++

屏幕截图 2026-03-10 135956

屏幕截图 2026-03-10 141058

屏幕截图 2026-03-10 141148

屏幕截图 2026-03-10 141201

屏幕截图 2026-03-10 141215

屏幕截图 2026-03-10 141230

点击查看代码
#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)主要问题列表,针对问题的改善或者重构思路:

  1. 混合使用cin >>和getline时的缓冲区问题未彻底解决
  2. 无输入合法性校验(如年龄非数字、ID 为空等)
  3. 错误输入导致程序异常
  4. 文件读写格式脆弱(空格分隔)
  5. 无文件操作异常处理(如权限不足)
  6. 未处理文件换行 / 空行问题
  7. systemPause/clearScreen等函数依赖系统命令,跨平台兼容性差
  8. 学生类成员直接暴露,封装性不足

(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)重构的软件的测试截图

屏幕截图 2026-03-10 144639

屏幕截图 2026-03-10 144717

屏幕截图 2026-03-10 144736

屏幕截图 2026-03-10 145019

(6)总结:难点、花时间比较久的、逆向软件工程的一些思考

本次学生宿舍管理系统的优化,难点集中在输入处理、数据持久化、代码封装和跨平台兼容,耗时点主要在全场景测试、细节优化和函数重构。而通过本次逆向软件工程实践,深刻认识到:逆向不是修改错误,而是理解设计、修复缺陷、提升质量,逆向重构过程中,每修改一个模块、每拆分一个函数,都可能引入新的逻辑错误。因此,测试和日志是逆向工程的重要支撑。核心是在复用现有核心逻辑的基础上,通过工程化改造,让代码更健壮、更可维护、更符合用户需求。

对于同类项目的逆向重构,建议先通过逆向分析明确核心逻辑和设计缺陷,再制定系统性的优化方案,重点关注输入校验、异常处理、代码封装和用户体验,同时重视测试和日志,确保重构后的代码既兼容原始功能,又能解决核心问题,实现工程质量的全面提升

posted @ 2026-03-10 14:56  llfii  阅读(10)  评论(0)    收藏  举报