关于#c++#的问题:关于c++的一道运算符重载计算器的问题

img


关于c++的一道运算符重载计算器的问题,最好加一点注释,代码清晰

封装两个函数,求公约数和公倍数,然后进行各项计算


#include <iostream>
#include <fstream>
#include <time.h>
#include <stdlib.h>
#include <cstring>
using namespace std;

class Rational
{
private:
    int mFz, mFm;
public:
    Rational(int fz=0, int fm=1)
    {
        if (fz < 0 && fm < 0) //都是负数,抵消负号,都变成正数
        {
            mFz = -fz;
            mFm = -fm;
        }
        else if (fz > 0 && fm < 0) //分子正,分母负,互换符号,保证分母为正
        {
            mFz = -fz;
            mFm = -fm;
        }
        else
        {
            mFz = fz;
            mFm = fm;
        }


        if (fm == 0)
            cout << "分母为0,创建失败!" << endl;
    }

    Rational operator +(const Rational& a) 
    {
        long long fm = gbs(mFm, a.mFm);
        long long fz = fm / mFm * mFz + fm / a.mFm * a.mFz;
        long long g = gys(fm, fz);
        fm /= g;
        fz /= g;
        return Rational(fz, fm);
    }

    Rational operator -(const Rational& a)
    {
        long long fm = gbs(mFm, a.mFm);
        long long fz = fm / mFm * mFz - fm / a.mFm * a.mFz;
        long long g = gys(fm, fz);
        fm /= g;
        fz /= g;
        return Rational(fz, fm);
    }

    Rational operator *(const Rational& a)
    {
        long long fm = mFm * a.mFm;
        long long fz = mFz * a.mFz;
        long long g = gys(fm, fz);
        fm /= g;
        fz /= g;
        return Rational(fz, fm);
    }

    Rational operator /(const Rational& a)
    {
        if (a.mFz == 0 || a.mFm == 0)
        {
            cout << "除数不能为0!" << endl;
            return Rational(0, 1);
        }
        long long fm = mFm * a.mFz;
        long long fz = mFz * a.mFm;
        long long g = gys(fm, fz);
        fm /= g;
        fz /= g;
        return Rational(fz, fm);
    }

    void show()
    {
        cout << mFz << "/" << mFm;
    }


    int getFz() { return mFz; }
    int getFm() { return mFm; }


    //公约数
    long long gys(const long long a, const long long b)
    {
        long long t = a > b ? b : a;
        for (; t >= 1; t--)
        {
            if (a % t == 0 && b % t == 0)
                return t;
        }
        return 1;
    }

    //公倍数
    long long gbs(const long long a, const long long b)
    {
        return a * b / gys(a, b);
    }

};

struct StRecord
{
    char userName[30]; //用户名
    int total; //总答题数
    int success;  //正确个数
};

//读文件
void ReadFile(const char* filename, StRecord record[], int& n)
{
    ifstream is(filename);
    if (is.is_open())
    {
        n = 0;
        while (!is.eof())
        {
            record[n].userName[0] = 0;
            is >> record[n].userName >> record[n].total >> record[n].success;
            if (strlen(record[n].userName) > 0)
                n++;
        }
        is.close();
    }
    else
        cout << "文件读取失败!" << endl;
    
}

//写文件
void WriteFile(const char* filename, const char* userName,int total,int suc)
{
    ofstream os(filename, ios::app); //以追加方式打开
    os << userName << " " << total << " " << suc << endl;
    os.close();
    cout << "记录成功写入文件!" << endl;
}


Rational Caculate( Rational& r1,  Rational& r2,char op)
{
    if (op == '+')
    {
        Rational r3 = r1 + r2;
        return r3;
    }
    else if (op == '-')
    {
        Rational r3 = r1 - r2;
        return r3;
    }
    else if (op == '*')
    {
        Rational r3 = r1 * r2;
        return r3;
    }
    else
    {
        Rational r3 = r1 / r2;
        return r3;
    }
}


int main()
{
    int a, b, c, d;
    int op;
    int count = 0; //总题数
    int suc = 0; //答对的个数
    char tmp;

    char name[30] = { 0 };

    StRecord re[100];
    int n = 0;
    const char* filename = "record.txt";
    //读取文件
    ReadFile(filename, re, n);
    cout << "请输入用户名:";
    cin >> name;
    //查找改用户记录
    int flag = 0;
    for (int i=0; i < n; i++)
    {
        if (strcmp(name, re[i].userName) == 0)
        {
            if (flag == 0)
                cout << "用户名    总答题数     正确个数" << endl;
            cout << re[i].userName << " " << re[i].total << " " << re[i].success << endl;
            flag = 1;
        }
    }
    if (flag == 0)
        cout << "该用户暂无成绩记录!" << endl;


    srand((unsigned int)time(0)); //生成随机数种子
    while (1)
    {
        cout << "1.出题" << endl;
        cout << "0.退出" << endl;
        cin >> op;
        if (op == 0)
            break;
        else if (op == 1)
        {
            cout << "1.手动输入" << endl;
            cout << "2.随机生成" << endl;
            cin >> op;
            if (op == 1)
            {
                cout << "请输入第一个有理数(a/b):";
                cin >> a >> tmp >> b;
                cout << "请输入第二个有理数(c/d):";
                cin >> c >> tmp >> d;
                Rational r1(a, b);
                Rational r2(c, d);
                cin.get(); //吸收回车符
                cout << "请输入操作符:";
                tmp = cin.get();
                Rational r3 = Caculate(r1, r2, tmp);
                int e, f;
                cout << "请输入结果(e/f):";
                cin >> e >> tmp >> f;
                count++;
                if (e == r3.getFz() && f == r3.getFm())
                {
                    cout << "正确!" << endl;
                    suc++;
                }
                else
                    cout << "错误!" << endl;
            }
            else if(op == 2)
            {
                a = rand() % 100; //生成[0,100)的随机数
                b = rand() % 100;
                c = rand() % 100;
                d = rand() % 100;
                int t = rand() % 4;//生成[0,4)的随机数,分别对应加减乘除
                if (t == 0)
                    tmp = '+';
                else if (t == 1)
                    tmp = '-';
                else if (t == 2)
                    tmp = '*';
                else
                    tmp = '/';
                Rational r1(a, b);
                Rational r2(c, d);
                r1.show();
                cout << " " << tmp << " ";
                r2.show();
                cout << " = ";
                Rational r3 = Caculate(r1, r2, tmp);
                int e, f;
                cout << "请输入结果(e/f):";
                cin >> e >> tmp >> f;
                count++;
                if (e == r3.getFz() && f == r3.getFm())
                {
                    cout << "正确!" << endl;
                    suc++;
                }
                else
                    cout << "错误!" << endl;
            }
        }
    }
    cout << "总答题数:" << count << ",正确数:" << suc << endl;
    WriteFile(filename, name, count, suc); //写入文件
    return 0;
}




您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632