23 条题解

  • 0
    @ 2025-5-24 15:34:10
    
    #include <iostream>
    #include <fstream>
    #include <string>
    #include <stdexcept>
    #include <ctime>
    #include <vector>
    #include <sstream>
    #include <limits>
    
    class MathUtils {
    public:
        static int add(int a, int b) {
            return a + b;
        }
        
        static bool validateInput(int num) {
            return num >= 0 && num <= 10000;
        }
    };
    
    class Logger {
    private:
        std::string filename;
        
    public:
        Logger(const std::string& fname) : filename(fname) {}
        
        void log(const std::string& message) {
            std::ofstream file(filename, std::ios::app);
            if (file.is_open()) {
                time_t now = time(0);
                file << "[" << ctime(&now) << "] " << message << "\n";
            }
        }
        
        std::vector<std::string> readLogs() {
            std::vector<std::string> logs;
            std::ifstream file(filename);
            if (file.is_open()) {
                std::string line;
                while (getline(file, line)) {
                    logs.push_back(line);
                }
            }
            return logs;
        }
    };
    
    class InputHandler {
    public:
        static int getInteger(const std::string& prompt) {
            int value;
            while (true) {
                std::cout << prompt;
                if (std::cin >> value) {
                    if (MathUtils::validateInput(value)) {
                        break;
                    } else {
                        std::cout << "输入必须在0-10000范围内\n";
                    }
                } else {
                    std::cin.clear();
                    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
                    std::cout << "无效输入,请输入整数\n";
                }
            }
            return value;
        }
    };
    
    class TestRunner {
    public:
        static void runTests() {
            testAddition();
            testInputValidation();
            std::cout << "所有测试通过\n";
        }
        
    private:
        static void testAddition() {
            if (MathUtils::add(2, 3) != 5) {
                throw std::runtime_error("加法测试失败");
            }
            if (MathUtils::add(0, 0) != 0) {
                throw std::runtime_error("零加法测试失败");
            }
        }
        
        static void testInputValidation() {
            if (!MathUtils::validateInput(5000)) {
                throw std::runtime_error("输入验证测试失败");
            }
            if (MathUtils::validateInput(-1)) {
                throw std::runtime_error("负输入验证测试失败");
            }
        }
    };
    
    void displayMenu() {
        std::cout << "\n===== 高级加法计算器 =====\n";
        std::cout << "1. 计算两个数的和\n";
        std::cout << "2. 查看计算历史\n";
        std::cout << "3. 运行测试\n";
        std::cout << "4. 退出\n";
        std::cout << "选择: ";
    }
    
    int main() {
        Logger logger("calculator.log");
        
        while (true) {
            displayMenu();
            int choice;
            std::cin >> choice;
            
            try {
                switch (choice) {
                    case 1: {
                        int a = InputHandler::getInteger("输入第一个数: ");
                        int b = InputHandler::getInteger("输入第二个数: ");
                        int result = MathUtils::add(a, b);
                        
                        std::ostringstream oss;
                        oss << a << " + " << b << " = " << result;
                        logger.log(oss.str());
                        
                        std::cout << "结果: " << oss.str() << "\n";
                        break;
                    }
                    case 2: {
                        auto logs = logger.readLogs();
                        std::cout << "\n=== 计算历史 ===\n";
                        for (const auto& log : logs) {
                            std::cout << log << "\n";
                        }
                        break;
                    }
                    case 3:
                        TestRunner::runTests();
                        break;
                    case 4:
                        return 0;
                    default:
                        std::cout << "无效选择\n";
                }
            } catch (const std::exception& e) {
                std::cerr << "错误: " << e.what() << "\n";
                logger.log(std::string("错误: ") + e.what());
            }
        }
    }
    
    

    信息

    ID
    1
    时间
    1000ms
    内存
    128MiB
    难度
    1
    标签
    递交数
    4482
    已通过
    1251
    上传者