#include <iostream>
using namespace std;
class CFraction
{
public:
CFraction(int=0,int=1,int=1);
void set(int=0,int =1);//改变初值。
void input();
void simplify();//化简。
void amplify();//放大n倍。
void output(int=0);
void get_gcd();
private:
int nume_s;//化简后的分子。
int deno_s;//化简后的分母。
int nume;//分子。
int deno;//分母。
int gcd;//最大公约数。
};
int main()
{
CFraction cf;
int s=0;
char c;
cf.input();
cout<<"是否需要放大?(y/n)";
cin>>c;
if(c=='y')
{
cf.amplify();
cf.output(s);
}
cout<<"style为0时,原样输出"<<endl;
cout<<"style为1时,输出化简后形式"<<endl;
cout<<"style为2时,输出带分数形式"<<endl;
cout<<"style为3时,用小数形式输出"<<endl;
cout<<"请选择输出形式(输入-1时退出)style="<<endl;
while(cin>>s&&s!=-1)
{
cf.output(s);
}
cout<<"请输入一个改变后的新分数(m/n):";
int m,n;
cin>>m>>n;
cf.set(m,n);
cf.output(s);
return 0;
}
CFraction::CFraction(int nu,int de,int gc):nume(nu),deno(de),gcd(gc){}
void CFraction::set(int nu,int de)
{
nume=nu;
deno=de;
}
void CFraction::input()
{
cout<<"请输入分子与分母:";
cin>>nume>>deno;
}
void CFraction::simplify()
{
int p=deno,q=nume,r;
do
{
r=p%q;
p=q;
q=r;
}
while(r!=0);
gcd=p;
nume_s=nume/gcd;
deno_s=deno/gcd;
}
void CFraction::amplify()
{
int n;
cout<<"输入扩大倍数:";
cin>>n;
cout<<n*nume<<"/"<<deno;
}
void CFraction::output(int style)
{
switch(style)
{
case 0:
cout<<nume<<"/"<<deno<<endl;
break;
case 1:
simplify();
cout<<nume_s<<"/"<<deno_s<<endl;
break;
case 2:
simplify();
if(nume_s/deno_s==0)
cout<<nume_s<<"/"<<deno_s<<endl;
else
{
if((nume_s-deno_s*(nume_s/deno_s))!=0)
cout<<nume_s/deno_s<<"("<<nume_s-deno_s*(nume_s/deno_s)<<"/"<<deno_s<<")"<<endl;
else
cout<<nume_s/deno_s<<"(1/"<<deno_s<<")"<<endl;
}
break;
case 3:
cout<<(double(nume)/double(deno))<<endl;
break;
default:
cout<<nume<<"/"<<deno<<endl;
break;
}
}
解决了由于化简而导致私有数据成员数值的变化的问题。