c++实现分数的加减乘除(面相对象编程)

#include<iostream>
using namespace std;//实现分数的运算
#include<string>


class Fraction_cal
{
    public:

    Fraction_cal();
    bool detect(string a); //检测输入的数据中是否存在“/”,这是用来判断一个数据是否为分数的标准
    int position(string a); //返回"/"的位置
    int max_divisor(int a,int b) ; //进行最大公约数的寻找,原理上就是利用辗转相除法
    void seg_number(string a,string b); //将接收到的分数进行预处理,切割为分子、分母
    string f_plus(string a,string b); //分数的加法
    string f_subtraction(string a,string b); //分数的减法
    string f_multiply(string a,string b); //分数的乘法
    string f_division(string a,string b); //分数的除法
    string change_form(string numerator,string multiply); //将输出数据表示得更加规范,比如0/1,12/1等数字
     ~Fraction_cal(){};


    private:  //相较于静态成员变量,普通成员变量每一个实例化对象都有独自的属性
        string a1 ; //第一个分数的分子
        string a2 ; //第一个分数的分母
        string b1 ; //第二个分数的分子
        string b2 ; //第二个分数的分母
    
};
Fraction_cal::Fraction_cal() //构造函数
{
    string a1 = " ";
    string a2 = " ";
    string b1 = " ";
    string b2 = " ";
}
bool Fraction_cal:: detect(string a) 
{
    for(unsigned int i = 0;i<a.length();i++)
    {
        if(a[i]=='/')
        {
            return true;   //是分数
        }
    }
    return false;  //是整数
}
int Fraction_cal:: position(string a)   
{
    for(unsigned int i = 0;i<a.length();i++) //无符号整型和有符号整型最好不要比较
    {
        if(a[i]=='/')
        {
            return i;
        }
    }
    return a.length();
}
int Fraction_cal::max_divisor(int a,int b)  //辗转相除法,不断用除数除以余数,直至余数为0
{
    int remainder  = 1;
    int num1 = abs(a);
    int num2 = abs(b);
    while(remainder!=0)
    {     
        remainder = num1 % num2;
        num1 = num2;
        num2 = remainder;        
    }
    return num1;
}
void Fraction_cal::seg_number(string a,string b)
{
    
    if(detect(a))//说明a是分数
    {
        int p1 = position(a);   //记录分数符号的位置
        a1 = a.substr(0,p1);
        a2 = a.substr(p1+1,a.length());
    }
    else
    {
        a1 = a;
        a2 = "1";
    }
    if(detect(b)) //说明b是一个分数
    {
        int p2 = position(b); //记录分数符号出现的位置
        b1 = b.substr(0,p2);
        b2 = b.substr(p2+1,b.length());
    }
    else
    {
        //cout<<"test1"<<endl;
        b1 = b;
        b2 = "1";
    }

}
string Fraction_cal::f_plus(string a,string b) //相加运算
{
    seg_number(a,b);//进行数据的预处理,确定好输入的分子和分母
    
    //cout<<a1<<" "<<a2<<" "<<b1<<" "<<b2<<endl;
    int num1 = stoi(a1);
    int num2  =stoi(a2);
    int num3 = stoi(b1);
    int num4 = stoi(b2);
    //cout<<num1<<" "<<num2<<" "<<num3<<" "<<num4<<endl;
    int com_multiply = num2*num4; //确认分母的公倍数
    int sum_numerator = num1*num4+num3*num2;//确认分子的和

    int max_div = (max_divisor(com_multiply,sum_numerator));//确认分子分母的最大公约数
    int final_com_multiply = com_multiply / max_div;
    int final_sum_numerator = sum_numerator / max_div;

    string final_r_denominator = to_string(final_com_multiply);//将分母转化为字符串类型
    string final_r_numerator = to_string(final_sum_numerator); //将分子转化为字符串
     
    //string result = final_r_numerator +"/"+final_r_denominator; //将最终结果进行拼接
    string result = change_form(final_r_numerator,final_r_denominator);
    return result;

}
string  Fraction_cal::f_subtraction(string a,string b) //分数的减法    a1,a2,b1,b2
{
    seg_number(a,b); //数据预处理
    int num1 = stoi(a1);
    int num2  =stoi(a2);
    int num3 = stoi(b1);
    int num4 = stoi(b2);

    int com_multiply = num2*num4; //确认分母的公倍数
    int sum_numerator = num1*num4-num3*num2;//确认分子的差
    int max_div = (max_divisor(com_multiply,sum_numerator));//确认分子分母的最大公约数

    int final_com_multiply = com_multiply / max_div;  //约分操作
    int final_sum_numerator = sum_numerator / max_div;

    string final_r_denominator = to_string(final_com_multiply);//将分母转化为字符串类型
    string final_r_numerator = to_string(final_sum_numerator); //将分子转化为字符串
     
    //string result = final_r_numerator +"/"+final_r_denominator; //将最终结果进行拼接
    string result = change_form(final_r_numerator,final_r_denominator);
    return result;
}
string Fraction_cal::f_multiply(string a,string b)
{
    seg_number(a,b);
    int num1 = stoi(a1);
    int num2  =stoi(a2);
    int num3 = stoi(b1);
    int num4 = stoi(b2);
    string result = " "; 

    int sum_numerator = num1*num3; //分子分子相乘
    int sum_multiply = num2*num4; //分母分母相乘

    int max_div = (max_divisor(sum_numerator,sum_multiply));

    int final_numerator = sum_numerator / max_div;  //约分操作
    int final_multiply = sum_multiply / max_div;
    string final_r_numerator = to_string(final_numerator);
    string final_r_multiply = to_string(final_multiply);
    //result = final_r_numerator + "/" + final_r_multiply;
    result = change_form(final_r_numerator,final_r_multiply);
    return result;
}
string Fraction_cal::f_division(string a,string b)
{
    seg_number(a,b);
    int num1 = stoi(a1);
    int num2  =stoi(a2);
    int num3 = stoi(b1);
    int num4 = stoi(b2);
    string result = " ";

    int sum_numerator = num1*num4; //分子分子相乘
    int sum_multiply = num2*num3; //分母分母相乘

    int max_div = (max_divisor(sum_numerator,sum_multiply));

    int final_numerator = sum_numerator / max_div;  //约分操作
    int final_multiply = sum_multiply / max_div;
    
    if(final_numerator*final_multiply>=0)
    {
        string final_r_numerator = to_string(abs(final_numerator));
        string final_r_multiply = to_string(abs(final_multiply));
        //result = final_r_numerator + "/" + final_r_multiply;
        result = change_form(final_r_numerator,final_r_multiply);
    }
    else
    {
        string final_r_numerator = to_string(abs(final_numerator));
        string final_r_multiply = to_string(abs(final_multiply));
       // result = "-" + final_r_numerator + "/" + final_r_multiply;
        result = change_form("-"+final_r_numerator,final_r_multiply);
    }
    return result;
}
string Fraction_cal::change_form(string numerator,string multiply)
{
    string result;
    if(numerator == "0"||numerator== "-0")   //-0/1
    {
        result = "0";
    }
    else if(multiply == "1")
    {
        result = numerator;
    }
    else
    {
        result = numerator + "/" + multiply;
    }
    return result;


}

// int main()
// {
//     Fraction_cal c1;

//     cout<<c1.f_plus("-32/3","23")<<endl;//-32 3 23 45
//     cout<<c1.f_subtraction("-33/3","-23")<<endl;
//     cout<<c1.f_multiply("-0/18","-3/5")<<endl;
//     cout<<c1.f_division("6/2","-1/5")<<endl;
//     return 0;
// }

第一次发CSDN博客,写的一般般,还请见谅。想用的伙伴们拿走不谢,记得点个赞就行。直接使用的话把main函数的注释取消就行了。整个代码已经封装好了,也可直接作为第三方库使用。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值