直接贴代码,我想注释已经够全面了
//备注:分数的定义全程可用一个包含两个元素的整型数组代替,为了方便理解和代码的通用,本代码采用分开定义的方法
#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;//结束
}
贴这个案例是想让新手能快速理解友元函数的作用,也算是自己对类的练习吧,菜鸟成长史的一个记录~