C++ 用strtok代替C++中沒有的split發揮作用

源心鎖發表於2020-10-13

完成下列分數類的實現:

class CFraction
{
private:
     int fz, fm;
public:
     CFraction(int fz_val, int fm_val) ;
     CFraction add(const CFraction &r);
     CFraction sub(const CFraction &r);
     CFraction mul(const CFraction &r);
     CFraction div(const CFraction &r);
     int getGCD();   // 求物件的分子和分母的最大公約數
     void print();
};

求兩數a、b的最大公約數可採用輾轉相除法,又稱歐幾里得演算法,其步驟為:

  1. 交換a, b使a > b;
  2. 用a除b得到餘數r,若r=0,則b為最大公約數,退出.
  3. 若r不為0,則用b代替a, r代替b,此時a,b都比上一次的小,問題規模縮小了;
  4. 繼續第2步。

輸入
測試資料的組數 t

第一組第一個分數

第一組第二個分數

第二組第一個分數

第二組第二個分數

輸出

第一組兩個分數的和

第一組兩個分數的差

第一組兩個分數的積

第一組兩個分數的商

第二組兩個分數的和

第二組兩個分數的差

第二組兩個分數的積

第二組兩個分數的商

#include <iostream>
#include <iomanip>
#include<math.h>
#include<string.h>
 
using namespace::std;
 
class CFraction
{
private:
    int fz, fm;
public:
    CFraction(int fz_val, int fm_val);
    CFraction add(const CFraction& r);
    CFraction sub(const CFraction& r);
    CFraction mul(const CFraction& r);
    CFraction div(const CFraction& r);
    int getGCD();   // 求物件的分子和分母的最大公約數
    void print();
};
/*********************/
CFraction::CFraction(int fz_val, int fm_val) {
    fz = fz_val; fm = fm_val;
}
CFraction CFraction::add(const CFraction& r) {
    int a = fz, b = fm;
    a = a * r.fm;
    b = b * r.fm;
    int rfz = r.fz, rfm = r.fm;
    rfz = rfz * fm;
    rfm = rfm * fm;
    CFraction ddd(a + rfz, b);
    return ddd;
}
CFraction CFraction::sub(const CFraction& r) {
    int a = fz, b = fm;
    a = a * r.fm;
    b = b * r.fm;
    int rfz = r.fz, rfm = r.fm;
    rfz = rfz * fm;
    rfm = rfm * fm;
    CFraction ddd(a - rfz, b);
    return ddd;
}
CFraction CFraction::mul(const CFraction& r) {
    CFraction ddd(fz * r.fz, fm * r.fm);
    return ddd;
}
CFraction CFraction::div(const CFraction& r) {
    CFraction ddd(fz * r.fm, fm * r.fz);
    return ddd;
}
int CFraction::getGCD() {
    int y = 1, n = 0;
    int b = fm, a = fz;
    if (b < a)
    {
        a = a ^ b; b = a ^ b; a = a ^ b;
    }
    while (y != 0)
    {
        if (n != 0)
        {
            a = b, b = y;
        }
        y = a % b;
        n = 1;
    }
    return b;
}
void CFraction::print() {
    int a = abs(getGCD());
    fz = fz / a;
    fm = fm / a;
    cout << fz << "/" << fm << endl;
}
/********************/
int main()
{
    int t;
    cin >> t;
    for (int i = 0; i < t; i++)
    {
        char fsa[50], fsb[50];
        char* p;//fm
        char* ptr[2];
        char* p0;//fm
        char* ptr0[2];
        cin >> fsa >> fsb;
        ptr[0] = strtok(fsa, "/");
        ptr[1] = strtok(NULL, "/");
        ptr0[0] = strtok(fsb, "/");
        ptr0[1] = strtok(NULL, "/");
        int fzz = atoi(ptr[0]), fmm = atoi(ptr[1]), fzzz = atoi(ptr0[0]), fmmm = atoi(ptr0[1]);
        CFraction fsfs(fzz, fmm);
        CFraction fsfs0(fzzz, fmmm);
        CFraction a = fsfs.add(fsfs0);
        CFraction b = fsfs.sub(fsfs0);
        CFraction c = fsfs.mul(fsfs0);
        CFraction d = fsfs.div(fsfs0);
        a.print(); b.print(); c.print(); d.print();
        cout << endl;
    }
}

相關文章