2301_81294415 2024-05-04 10:20 采纳率: 0%
浏览 17
已结题

帮我写一个c++工程

要求:分数计算器
信息类型和属性
声明一个整数类,然后派生出一个分数类。
功能描述
分数的加、减、乘和除运算。
把分数化简为最简分数。
异常处理:分数中分母不能为零。
在屏幕上显示计算式和计算结果。
将计算式和计算结果写入到历史记录文件中(只保留最新的10条记录)
退出系统。

  • 写回答

24条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-05-04 10:20
    关注
    获得0.30元问题酬金

    引自免费微信小程序:皆我百晓生

    为了实现这个分数计算器的C++工程,我们将分步骤进行。首先,定义基本的数据结构和类,然后实现所需的功能,最后添加异常处理、屏幕显示、文件记录和程序退出逻辑。

    1. 分数类定义

    我们从定义一个整数类Integer开始,尽管在这个场景中直接使用C++的int类型可能更直接有效,但为了遵循你的要求,我们先定义一个简单的Integer类,然后派生出Fraction(分数)类。

    #include <iostream>
    #include <fstream>
    #include <vector>
    #include <algorithm>
    #include <gcd>
    
    class Integer {
    public:
        int value;
        Integer(int v = 0) : value(v) {}
    };
    
    class Fraction : public Integer {
    private:
        Integer denominator; // 分母
    public:
        Fraction(Integer numerator, Integer denominator) 
            : Integer(numerator.value), denominator(denominator.value) 
        {
            if (denominator.value == 0) throw std::invalid_argument("Denominator cannot be zero.");
            simplify();
        }
    
        void simplify() {
            int gcd_val = std::__gcd(value, denominator.value);
            value /= gcd_val;
            denominator.value /= gcd_val;
        }
    
        Fraction operator+(const Fraction& other) const {
            Integer newNumerator(value * other.denominator.value + other.value * denominator.value);
            Integer newDenominator(denominator.value * other.denominator.value);
            return Fraction(newNumerator, newDenominator);
        }
    
        // 类似地,定义减法、乘法、除法运算符重载
        // ... 略
    
        friend std::ostream& operator<<(std::ostream& os, const Fraction& f);
    };
    

    2. 运算符重载和输出格式调整

    继续完成分数类中剩余的运算符重载,并定义输出格式以便于屏幕显示。

    3. 异常处理

    在分数类构造函数中已处理了分母为零的情况。其他潜在的异常处理应根据具体实现细节添加。

    4. 屏幕显示

    定义一个函数来显示计算式和结果:

    void display(const std::string& operation, const Fraction& result) {
        std::cout << operation << " = " << result << std::endl;
    }
    

    5. 历史记录文件

    维护一个文件,存储最新的10条记录。这里使用std::vector来暂存记录,并定期写入文件,每次写入前清空旧记录并加入新记录。

    void saveToHistory(const std::string& operation, const Fraction& result) {
        static std::vector<std::pair<std::string, Fraction>> history(10);
        static size_t index = 0;
        
        history[index] = {operation, result};
        index = (index + 1) % 10; // 循环更新索引
    
        std::ofstream file("history.txt");
        if (file.is_open()) {
            for (const auto& entry : history) {
                file << entry.first << " = " << entry.second << "\n";
            }
            file.close();
        } else {
            std::cerr << "Unable to open history file." << std::endl;
        }
    }
    

    6. 主函数及用户交互

    最后,编写主函数来实现用户输入、计算、显示和记录功能,并提供退出选项。

    int main() {
        try {
            Fraction f1(3, 4), f2(1, 2);
            Fraction sum = f1 + f2;
            
            display("3/4 + 1/2", sum);
            saveToHistory("3/4 + 1/2", sum);
    
            // 示例结束,实际应用中需添加循环以持续接受用户输入和操作
        } catch (const std::exception& e) {
            std::cerr << "Error: " << e.what() << std::endl;
        }
    
        return 0;
    }
    

    以上代码框架实现了分数类的基本定义、运算、简化、屏幕显示和历史记录保存功能。请根据实际需求调整和完善,比如添加更多用户交互逻辑来接受用户输入,以及完成减法、乘法、除法的运算符重载等。

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 5月12日
  • 创建了问题 5月4日

悬赏问题

  • ¥15 TLS1.2协议通信解密
  • ¥40 图书信息管理系统程序编写
  • ¥20 Qcustomplot缩小曲线形状问题
  • ¥15 企业资源规划ERP沙盘模拟
  • ¥15 树莓派控制机械臂传输命令报错,显示摄像头不存在
  • ¥15 前端echarts坐标轴问题
  • ¥15 ad5933的I2C
  • ¥15 请问RTX4060的笔记本电脑可以训练yolov5模型吗?
  • ¥15 数学建模求思路及代码
  • ¥50 silvaco GaN HEMT有栅极场板的击穿电压仿真问题