#include <string>
#include <stdlib.h>
class Rational
{
public:
Rational(int num, int denom);// num = 分子, denom = 分母
Rational operator+(Rational rhs); // rhs == right hand side
Rational operator-(Rational rhs);
Rational operator*(Rational rhs);
Rational operator/(Rational rhs);
void print();
private:
void normalize(); // 负责对分数的简化处理
int numerator; // 分子
int denominator;// 分母
};
Rational::Rational(int num, int denom)
{
numerator = num;
denominator = denom;
normalize();
}
// normalize() 对分数进行简化操作包括:
// 1. 只允许分子为负数,如果分母为负数则把负数挪到分子部分,如 1/-2 == -1/2
// 2. 利用欧几里德算法(辗转求余原理)将分数进行简化:2/10 => 1/5
void Rational::normalize()
{
// 确保分母为正
if( denominator < 0 )
{
numerator = -numerator;
denominator = -denominator;
}
// 欧几里德算法
int a = abs(numerator);
int b = abs(denominator);
// 求出最大公约数
while( b > 0 )
{
int t = a % b;
a = b;
b = t;
}
// 分子、分母分别除以最大公约数得到最简化分数
numerator /= a;
denominator /= a;
}
// a c a*d c*b a*d + c*b
// - + - = --- + --- = ---------
// b d b*d b*d = b*d
Rational Rational::operator+(Rational rhs)
{
int a = numerator;
int b = denominator;
int c = rhs.numerator;
int d = rhs.denominator;
int e = a*b + c*d;
int f = b*d;
return Rational(e, f);
}
// a c a -c
// - - - = - + --
// b d b d
Rational Rational::operator-(Rational rhs)
{
rhs.numerator = -rhs.numerator;
return operator+(rhs);
}
// a c a*c
// - * - = ---
// b d b*d
Rational Rational::operator*(Rational rhs)
{
int a = numerator;
int b = denominator;
int c = rhs.numerator;
int d = rhs.denominator;
int e = a*c;
int f = b*d;
return Rational(e, f);
}
// a c a d
// - / - = - * -
// b d b c
Rational Rational::operator/(Rational rhs)
{
int t = rhs.numerator;
rhs.numerator = rhs.denominator;
rhs.denominator = t;
return operator*(rhs);
}
void Rational::print()// 1/8
{
if( numerator % denominator == 0 )
std::cout << numerator / denominator;
else
std::cout << numerator << "/" << denominator;
}
int main()
{
Rational f1(2, 16);
Rational f2(7, 8);
// 测试有理数加法运算
Rational res = f1 + f2;
f1.print();
std::cout << " + ";
f2.print();
std::cout << " = ";
res.print();
std::cout << "\n";
// 测试有理数减法运算
res = f1 - f2;
f1.print();
std::cout << " - ";
f2.print();
std::cout << " = ";
res.print();
std::cout << "\n";
// 测试有理数乘法运算
res = f1 * f2;
f1.print();
std::cout << " * ";
f2.print();
std::cout << " = ";
res.print();
std::cout << "\n";
// 测试有理数除法运算
res = f1 / f2;
f1.print();
std::cout << " / ";
f2.print();
std::cout << " = ";
res.print();
std::cout << "\n";
return 0;
}
这个文件怎么打不开? 学到了,感谢小甲鱼老师!!!!!!!! 好资料 好贵啊 强烈支持楼主ing…… //实现有理数的加减乘除
//1/8 + 7/8=1
//1/8 * 7/8=7/64
//1/8 / 7/8=1/7
//1/8 - 7/8=-6/8
//思路把分数拆成分子和分母
#include <iostream>
using namespace std;
//operator 重载运算符C++不允许的五个运算符
//.成员访问运算符
//.* 成员指针运算符
//:: 域运算符
//sizeof 尺寸运算符
//?: 条件运算符 三目
class RationalNumber//复数基类
{
public:
RationalNumber();//基类构造器
RationalNumber(int molecular,int denominator);//基类构造器重载
friendRationalNumber operator+(RationalNumber &A,RationalNumber &B);//重载加法
friendRationalNumber operator-(RationalNumber &A,RationalNumber &B);//重载减法
friendRationalNumber operator*(RationalNumber &A,RationalNumber &B);//重载乘法
friendRationalNumber operator/(RationalNumber &A,RationalNumber &B);//重载除法
intFractionalReduction(int n,int m);//分式化简函数
void print();
private://私有变量只有基类的方法才能调用
double mole;//分子
double denom;//分母
};
RationalNumber::RationalNumber()//如果主函数建立类的对象没有参数的话 那么实数部分和虚数部分初始化为0
{
mole =0; //分子初始化为0
denom=0;//分母初始化为0
}
RationalNumber::RationalNumber(int molecular,int denominator)//如果主函数建立类的对象有参数的话 那么实数部分=r;虚数部=i 同一个作用范围是重载
{
mole =molecular; //分子初始化为0
denom=denominator;//分母初始化为0
}
int RationalNumber:: FractionalReduction(int n,int m)//分式化简函数
{
int temp,r,molecular,denominator;
molecular=n;
denominator=m;
//把大的数放在n里面
if(n<m)
{
temp=n;
n=m;
m=temp;
}
while(m!=0)
{
r=n%m;
n=m;
m=r;
}
molecular=molecular/n;
denominator=denominator/n;
std::cout<<"化简结果="<<molecular<<"/"<<denominator<<std::endl;
return n;
}
////类型 作用域重载符号 参数
//Complex Complex::operator-(Complex &d)
//{
// Complex c;//建立Complex类的对象c
// c.real=real+d.real;//在main函数中在建立对象时无参数时real=0;有参数时等于输入参数值
// c.imag=imag+d.imag;
// return c;//这里是返回对象c的值 包括实数部分c.real 和虚数部分 c.imag
//}
//类型 作用域重载符号 参数
RationalNumber operator+(RationalNumber &A,RationalNumber &B)
{
RationalNumber c;//建立Complex类的对象c
c.mole=A.mole*B.denom+A.denom*B.mole;//在main函数中在建立对象时无参数时real=0;有参数时等于输入参数值
c.denom=A.denom*B.denom;
return c;//这里是返回对象c的值 包括实数部分c.real 和虚数部分 c.imag
}
RationalNumber operator-(RationalNumber &A,RationalNumber &B)
{
RationalNumber c;//建立Complex类的对象c
c.mole=A.mole*B.denom-A.denom*B.mole;//在main函数中在建立对象时无参数时real=0;有参数时等于输入参数值
c.denom=A.denom*B.denom;
return c;//这里是返回对象c的值 包括实数部分c.real 和虚数部分 c.imag
}
RationalNumber operator*(RationalNumber &A,RationalNumber &B)
{
RationalNumber c;//建立Complex类的对象c
c.mole=A.mole*B.mole;//在main函数中在建立对象时无参数时real=0;有参数时等于输入参数值
c.denom=A.denom*B.denom;
return c;//这里是返回对象c的值 包括实数部分c.real 和虚数部分 c.imag
}
RationalNumber operator/(RationalNumber &A,RationalNumber &B)
{
RationalNumber c;//建立Complex类的对象c
c.mole=A.mole*B.denom;//在main函数中在建立对象时无参数时real=0;有参数时等于输入参数值
c.denom=A.denom*B.mole;
return c;//这里是返回对象c的值 包括实数部分c.real 和虚数部分 c.imag
}
void RationalNumber::print()//基类的输出函数方法
{
std::cout<<"("<<mole<<"/"<<denom<<")\n";//打印Complex类建立的对象的实数部分 和 虚数部分
FractionalReduction(mole,denom);
}
int main(int argc, char *argv[])
{
RationalNumber c1(1,14),c2(2,7),c3;
c3=c1+c2;
std::cout<<"c1= ";
c1.print();
std::cout<<"c2= ";
c2.print();
std::cout<<"c1+c2= ";
c3.print();
c3=c1-c2;
std::cout<<"c1-c2= ";
c3.print();
c3=c1*c2;
std::cout<<"c1*c2= ";
c3.print();
c3=c1/c2;
std::cout<<"c1/c2= ";
c3.print();
system("pause");
return 0;
} 测试鱼C老师的代码出现问题 Rational f1(5, 14); Rational f2(2, 7);这个参数时加减法得出的结果是错误的大家发面了么? 测试鱼C老师的代码出现问题 Rational f1(5, 14); Rational f2(2, 7);这个参数时加减法得出的结果是错误的大家发面了么?
加法修改如下:
int e = a*d + c*b; //b和d的位置反了
int f = b*d; 小鸟儿 发表于 2016-3-22 17:25
#include
using namespace std;
class Complex
么么哒
小鸟儿 发表于 2016-3-22 17:25
#include
using namespace std;
class Complex
兄弟这是25讲的内容😂 给小甲鱼点一个大大的赞
页:
1
[2]