直接贴代码,我想注释已经够全面了
//备注:分数的定义全程可用一个包含两个元素的整型数组代替,为了方便理解和代码的通用,本代码采用分开定义的方法
#include <iostream>
using namespace std;
class Rational{
    private:
        int fenzi;
        int fenmu;
        //若采用数组的形式 可以为 fenshu[2],其中fenshu[0]表示分子,fenshu[1]表示分母 下面的运算过程结果全程替换即可
    public:
        Rational(int pfenzi,int pfenmu);
        //这边的&表示C++特有的引用,C语言并不具备此特性,下同
        friend void JiSuan(Rational &num1,char ysf,Rational &num2,Rational &result);
        friend void CheckAnswer(Rational &result);
        friend void ShowAnswer(Rational &result);
        /使用友元函数的时候用引用可以完整的将数据传输,
        但是使用过程中也需要注意 传的是Rational类而不是平时练习使用的int
        所以参数列表的Rational请勿写成int /
};
Rational::Rational(int pfenzi,int pfenmu){
    fenzi=pfenzi;
    fenmu=pfenmu;
}
//核心,分数计算友元函数
void JiSuan(Rational &num1,char ysf,Rational &num2,Rational &result){
    switch(ysf){
        case ‘+’:{
            if(num2.fenmu==num1.fenmu){//如果两数分母相同  直接进行分子的运算符操作即可,下减同
                result.fenmu=num2.fenmu;
                result.fenzi=num1.fenzi+num2.fenzi;
            }else{//分母不同,通分计算,下减同
                result.fenmu=num2.fenmu  num1.fenmu;
                num2.fenzi = num1.fenmu;
                num1.fenzi = num2.fenmu;
                result.fenzi = num1.fenzi+num2.fenzi;
            }
            break;
        }
        case ‘-‘:{
            if(num2.fenmu==num1.fenmu){
                result.fenmu=num2.fenmu;
                result.fenzi=num1.fenzi-num2.fenzi;
            }else{
                result.fenmu=num2.fenmunum1.fenmu;
                num2.fenzi = num1.fenmu;
                num1.fenzi = num2.fenmu;
                result.fenzi = num1.fenzi-num2.fenzi;
            }
            break;
        }
        case ‘‘:{//分数的相乘不用我多说,直接分子分母相乘即可
            result.fenmu=num1.fenmunum2.fenmu;
            result.fenzi=num1.fenzinum2.fenzi;
            break;
        }
        case ‘/‘:{
            //分子与分母的调换相乘就是除法啦
            result.fenmu=num1.fenmunum2.fenzi;
            result.fenzi=num1.fenzi*num2.fenmu;
            break;
        }
    }
}
//约分友元函数
void CheckAnswer(Rational &result){
    int i,temp;//为保证负数的约分正常进行,我们定义一个临时变量来储存负数(分子)的相反数
    if(result.fenzi<0){
        temp = 0 - result.fenzi;
    }else{
        temp = result.fenzi;
    }
    for(i=2;i<=temp&&i<=result.fenmu;i++){//约分
        if(result.fenzi%i==0&&result.fenmu%i==0){
            result.fenzi /= i;
            result.fenmu /= i;
            CheckAnswer(result);//再执行 约分到最简
        }
    }
}
//结果输出友元函数
void ShowAnswer(Rational &result){
    CheckAnswer(result);
    //输出结果前对结果进行约分处理,然后执行以下判断并根据情况输出结果
    if(result.fenmu==1){//分母为1的情况
        cout<<result.fenzi<<endl;
    }else if(result.fenzi==0){//分子为0的情况
        cout<<0<<endl;
    }else{//除开上述条件外的 正常显示分数
        cout<<result.fenzi<<”/“<<result.fenmu<<endl;
    }
}
int main(){
    int fenzi1,fenzi2,fenmu1,fenmu2;//两个参与运算的分数 分子分母的定义
    //同理 这边定义分数的时候也可以用数组代替 fenshu1[2] fenshu2[2] 结构同 Rational 类
    char ysf,temp;//运算符和储存‘/’的临时变量
    cout<<”请按照格式输入需要运算的式子’1/2+1/3’:”<<endl<<”PS:输入Q可退出程序!”<<endl;
    while(1){
    cin>>fenzi1>>temp>>fenmu1>>ysf>>fenzi2>>temp>>fenmu2;//不用我多说,数据的输入 
    Rational num1(fenzi1,fenmu1);//实例化类(对象)第一个参与运算的分数num1 
    Rational num2(fenzi2,fenmu2);//实例化类(对象)第二个参与运算的分数num2 
    Rational result(0,0);//实例化类(对象)储存结果的分数 result 初始化为分子分母都为 0 
    JiSuan(num1,ysf,num2,result); //使用友元函数对分数进行运算 
    if(getchar()=='q'||getchar()=='Q'){
        return 0;
    }else{
        cout<<"计算结果:"; 
        ShowAnswer(result);//使用友元函数对结果进行化简并输出结果 
    }
}
return 0;//结束 
}
贴这个案例是想让新手能快速理解友元函数的作用,也算是自己对类的练习吧,菜鸟成长史的一个记录~
 
          