📄 fractexop.cpp
字号:
/****************************************
* 代分数演示程序(继承、多态、运算符重载)
* 达内,陈宗权,2006/8
****************************************/
#include <iostream>
using namespace std;
//定义分数类(基类)
class Fract{
int n;//分子
int d;//分母
public:
Fract( int x=0, int y=1 );//构造函数
virtual int getn()const{return n;}
void setn( int x ){n=x;}
int getd()const{return d;}
void setd( int y ){d=(y==0?1:y);}
friend ostream& operator<<( ostream& os, const Fract& cf );//输出
friend istream& operator>>( istream& is, Fract& f );//输入
void adjust();//约分
virtual Fract operator+( const Fract& f )const;//相加
};
ostream& operator<<( ostream& os, const Fract& cf )
{
os << cf.n;
if( cf.n!=0 && cf.d!=1 )
os << '/' << cf.d;
return os;
}
istream& operator>>( istream& is, Fract& f )
{
char ch;//用来保存‘/’字符
is >> f.n >> ch >> f.d;
return is;
}
Fract::Fract( int x, int y )
{
setn( x );
setd( y );
adjust();
}
void Fract::adjust()
{
if( d<0 )
{
n = -n;
d = -d;
}
int an = (n<0?-n:n);
for( int i=an; i>1; i-- )
{
if( an%i==0 && d%i==0 )
{
n /= i;
d /= i;
break;
}
}
}
Fract Fract::operator+( const Fract& f )const
{
int x = n*f.d+d*f.n;
int y = d*f.d;
Fract result( x, y );
return result;
}
//代分数类,继承分数类
class FractEx : public Fract{
int i;//整数部分
public:
FractEx( int z=0, int x=0, int y=1 );//构造函数
FractEx( const Fract& f );//用分数来构造一个代分数
void seti( int z ){i=z;}//设置整数部分
int geti()const{return i;}//取得整数部分
int getn()const{return i*getd()+Fract::getn();}//取得分子
friend ostream& operator<<( ostream& os, const FractEx& cf );//输出
friend istream& operator>>( istream& is, FractEx& f );//输入
Fract operator+( const Fract& f )const;//加上一个分数
};
ostream& operator<<( ostream& os, const FractEx& cf )
{
os << cf.i;
if( cf.Fract::getn()!=0 )
os << ')' << cf.Fract::getn() << '/' << cf.getd();
return os;
}
istream& operator>>( istream& is, FractEx& f )
{
char ch;//用来保存')'和'/'字符
is >> f.i >> ch >> (Fract&)f;
return is;
}
FractEx::FractEx( int z, int x, int y )
:Fract(x,y), i(z)
{}
FractEx::FractEx( const Fract& f )
{
i = ( f.getn()/f.getd() );
setn( f.getn()%f.getd() );
setd( f.getd() );
}
Fract FractEx::operator+( const Fract& f )const
{
int x = getn()*f.getd()+getd()*f.getn();
int y = getd()*f.getd();
return Fract(x,y);
}
int main()
{
FractEx f1( 3, 2, 6 ), f2( 1, 4, 24 ), f3;
Fract f(7,6);
cout << "f1=" << f1 << endl;
cout << "f2=" << f2 << endl;
f3 = f1+f2;//两个代分数相加
cout << f1+f2 << endl;;//输出结果,分数
cout << f3 << endl;//输出结果,代分数
Fract* p = &f1;//基类指针
f3 = *p + f2;//利用多态实现
cout << *p + f2 << endl;
cout << f3 << endl;
cout << f1 + f << endl;
f3 = f1 + f;
cout << f3 << endl;
cout << "input a extend-fraction[format:i)n/d]:";
cin >> f1;
cout << "input a fraction[format:n/d]:";
cin >> f;
f3 = f1 + f;
cout << f1 << '+' << f << '=' << f3 << endl;
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -