C++ 使用类的分数计算器

C++ 使用类的分数计算器,c++,visual-c++,C++,Visual C++,我想为使用类的分数创建一个四个函数(+、-、/、*)计算器。getinf函数有问题,每当我调用它时,它总是在主函数中返回相同的值。我想不出是什么原因造成的 #include<iostream> #include<conio.h> #include<cmath> #include<process.h> using namespace std; class frac{ long num,dum; public: void ge

我想为使用类的分数创建一个四个函数(+、-、/、*)计算器。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();
}
#包括
#包括
#包括
#包括
使用名称空间std;
分级压裂{
长num,dum;
公众:
void getinf(){
库特南>>杜姆;
if(cin.fail()){
不能查看您的“运算符”功能,例如:

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

  • 创建一个全新的
    frac
    对象,名为
    f3
  • 设置该对象的
    num
    dum
    成员
  • 返回对象
特别是,它在任何时候都不会设置
this
num
dum
成员

当您在main中调用
s3.mul(…)
时,您完全忽略
mul
的返回值。由于
mul
除了对其返回的对象进行操作之外,不做任何其他操作,因此该调用本质上是不可操作的

您应该更改运算符函数,以便它们实际更改对象的字段,如下所示:

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. ";
开关(ch){
格“+”:s3=s3。加(s1,s2);断开;
案例'-':s3=s3.sub(s1,s2);中断;
案例“*”:s3=s3.mul(s1,s2);中断;
案例“/”:s3=s3.div(s1,s2);中断;

默认值:coutMat您能再解释一点吗?我正在尝试从用户那里获取分数s1的分子和分母。语法有什么错误吗?抱歉,误读了您的一个函数。getinf可以。