使用类计算分数

Calculator for fractions using classes

本文关键字:计算      更新时间:2023-10-16

我想用类为分数创建一个四个函数(+,-,/,*)计算器。getinf函数有问题,每当我调用它时,它总是在主函数中返回相同的值。我搞不清是什么原因造成的。

#include<iostream>
#include<conio.h>
#include<cmath>
#include<process.h>
using namespace std;
class frac{
    long num,dum;
    public:
    void getinf(){                              
        cout<<"Enter the fraction = ";
        cin>>num>>dum;
        if(cin.fail()) {
            cout<<"Invalid data entered. "<<"nTry again. ";getch();exit(0);
        }
    }
    frac add(frac f1,frac f2){
        frac f3;
        f3.num=((f1.num*f2.dum)+(f1.dum*f2.dum));
        f3.dum=f1.dum*f2.dum;
        return f3;
    }
    frac sub(frac f1,frac f2){
        frac f3;
        f3.num=((f2.num*f2.dum)-(f1.dum*f2.dum));
        f3.dum=f1.dum*f2.dum;
        return f3;
    }
    frac mul(frac f1,frac f2){          
        frac f3;
        f3.num=f1.num*f2.num;
        f3.dum=f1.dum*f2.dum;
        return f3;
    }
    frac div(frac f1,frac f2){
        frac f3;
        f3.num=f1.num*f2.dum;
        f3.dum=f1.dum*f2.num;
        return f3;
    }
    void lowterm(){
        long tnum,tdum,temp,gcd;
        tnum=labs(num);
        tdum=labs(dum);
        if(tdum==0) {
            cout<<"Illegal fraction division by 0";exit(1);
        } else if(tnum==0) {
            num=0;dum=1;return;
        }
        while(tnum!=0){
            if(tnum<tdum) {
                temp=tnum;tnum=tdum;tdum=temp;
            }
            tnum=tnum-tdum;
        }
        gcd=tdum;
        num=num/gcd;
        dum=dum/gcd;
    }
    void showinf(){
        cout <<"The result is "<<num<<"/"<<dum;getch();
    }
};

void main(){
    frac s1,s2,s3;char ch = 'a' ;
    s1.getinf();
    s2.getinf();
    cout<<"Enter the function you want to perform on the fractions (+,-,*,/): ";
    cin>>ch;
    if(cin.fail()){
        cout<<"Invalid operation entered. "<<"nNo such operation exist. " <<"nTry again. ";
        getch();
        exit(0);
    }
    switch(ch){
        case'+':s3.add(s1,s2);break;
        case'-':s3.sub(s1,s2);break;
        case'*':s3.mul(s1,s2);break;
        case'/':s3.div(s1,s2);break;
        default:cout<<"Wrong information entered. "<<"nTry again. ";
    }
    s3.lowterm();
    s3.showinf();
    getch();
}

查看您的"运算符"函数,例如:

frac mul(frac f1,frac f2){
    frac f3;
    f3.num=f1.num*f2.dum;
    f3.dum=f1.dum*f2.num;
    return f3;
}

此功能:

  • 创建一个名为f3的全新frac对象
  • 设置该对象的numdum成员
  • 返回对象

特别是,它在任何时候都不会设置thisnumdum成员。

当您在main中调用s3.mul(...)时,您完全忽略了mul的返回值。由于mul除了对它返回的对象进行操作之外,什么都不做,所以该调用本质上是一个no-op。

你应该改变你的操作员功能,这样他们才能真正改变对象的字段,如下所示:

void mul(frac f1,frac f2){
    num=f1.num*f2.dum;
    dum=f1.dum*f2.num;
}

或者让它们成为自由函数(或静态成员),并用之类的东西调用它们

frac result = mul(s1, s2); // or frac::mul(s1, s2) for a static member

(还要注意,div函数的代码与mul函数的代码相同,这可能是一个错误。)

只需将开关块更改为:

switch(ch){
    case'+':s3=s3.add(s1,s2);break;
    case'-':s3=s3.sub(s1,s2);break;
    case'*':s3=s3.mul(s1,s2);break;
    case'/':s3=s3.div(s1,s2);break;
    default:cout<<"Wrong information entered. "<<"nTry again. ";

你的代码会很好。