有理数操作 ** (1)定义一个有理数类Rational,该类存放分数形式的有理数,定义私有变量x和y分别存放分子

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了有理数操作 ** (1)定义一个有理数类Rational,该类存放分数形式的有理数,定义私有变量x和y分别存放分子相关的知识,希望对你有一定的参考价值。

有理数操作 **
(1)定义一个有理数类Rational,该类存放分数形式的有理数,定义私有变量x和y分别存放分子和分母,同时分子和分母要以最简单的形式存放。例如分数3/9的存放形式应该是1/3
(2)定义带默认参数值的构造函数,默认有理数为0,即分子0,分母1
(3)定义成员函数Add、Sub、Mul、Div,分别完成两个有理数的加、减、乘、除运算,结果仍以最简形式存放
(4)以X/Y形式输出有理数
(5)以小数形式输出有理数

参考技术A class Rational
private: int numerator ;
int denominator;
public: Rational(): numerator(0),denominator(1) //默认构造函数
Rational(int num,int denom); //自定义构造函数
int Gcd(int denom,int num); //计算分子与分母的最大公约数
void Add(int add1_num,int add1_denom,int add2_num,int add2_denom,int result_num,int result_denom);
void Sub(int sub1_num,int sub1_denom,int sub2_num,int sub2_denom,int result_num,int result_denom);
void Mul(int mul1_num,int mul1_denom,int mul2_num,int mul2_denom,int result_num,int result_denom);
void Div(int div1_num,int div1_denom,int div2_num,int div2_denom,int result_num,int result_denom);
void Display1(int num,int denom); //以分式形式输出
void Display2(int num,int denom); //以小数形式输出
;

int Rational::Gcd(int denom,int num)
if( denom < num )

while(num%denom != 0)

num = denom;
denom = num%denom;

return denom;

else

while(denom%num != 0)

denom = num;
num = denom%num;

return num;



Rational::Rational(int num,int denom)
int gcd = Gcd(denom,num);
numerator = num/gcd;
denominator = denom/gcd;


void Rational:: Add(int add1_num,int add1_denom,int add2_num,int add2_denom,int result_num,int result_denom)
result_num = add1_num*add2_denom + add2_num*add1_denom;
result_denom = add1_denom*add2_denom;
result_num /= Gcd(result_denom,result_num);
result_denom /= Gcd(result_denom,result_num);


void Rational::Sub(int sub1_num,int sub1_denom,int sub2_num,int sub2_denom,int result_num,int result_denom)
result_num = sub1_num*sub2_denom - sub2_num*sub1_denom;
result_denom = sub1_denom*sub2_denom;
result_num /= Gcd(result_denom,result_num);
result_denom /= Gcd(result_denom,result_num);


void Rational::Mul(int mul1_num,int mul1_denom,int mul2_num,int mul2_denom,int result_num,int result_denom)
result_num = mul1_num*mul2_num;
result_denom = mul1_denom*mul2_denom;
result_num /= Gcd(result_denom,result_num);
result_denom /= Gcd(result_denom,result_num);


void Rational::Div(int div1_num,int div1_denom,int div2_num,int div2_denom,int result_num,int result_denom)
result_num = div1_num*div2_denom;
result_denom = div1_denom*div2_num;
result_num /= Gcd(result_denom,result_num);
result_denom /= Gcd(result_denom,result_num);


void Rational::Display1(int num,int denom)
std::cout<<num<<"/"<<denom<<std::endl;


void Rational::Display2(int num,int denom)
std::cout<<(double)num/denom<<endl;


(未经编译,供参考)追问

可不可以不要用指针啊,写简单点,写全点。我看不懂

追答

没有指针,那是乘号

类和对象

   Scala类定义的几个特性:类参数和构造函数,方法,操作符,私有成员,重载,过载,条件检查,引用自身.

   Rational类定义规范 首先,我们回忆下有理数的定义:一个有理数(rational)可以表示成个分数形式: n/d, 其中n和d都是整数(d不可以为0),n称为分子(numberator),d为分母(denominator)。和浮点数相比,有理数可以精确表达一个分数,而不会有误差。 因此我们定义的Rational类支持上面的有理数的定义。支持有理数的加减乘除,并支持有理数的规范表示,比如2/10,其规范表示为1/5.分子和分母的最小公倍数为1. 定义Rational 有了有理数定义的实现规范,我们可以开始设计类Rational,一个好的起点是考虑用户如何使用这个类,我们已经决定使用“Immutable”方式来使用Rational对象,我们需要用户在定义Rational对象时提供分子和分母。因此我们可以开始定义Rational类如下:

class Rational( n:Int, d:Int)

可以看到和Java不同的,Scala的类定义可以有参数,称为类参数,如上面的n,d。Scala使用类参数,并把类定义和主构造函数合并在一起,在定义类的同时也定义了类的主构造函数。因此Scala的类定义相对要简洁些。 Scala编译器会编译Scala类定义包含的任何不属于类成员和类方法的其它代码,这些代码将作为类的主构造函数,比如我们定义一条打印消息作为类定义的代码:

scala> class Rational (n:Int, d:Int) {
     |    println("Created " + n + "/" +d)
     | }
defined class Rational

scala> new Rational(1,2)
Created 1/2
res0: Rational = [email protected]

可以看到创建Ratiaonal对象时,自动执行类定义的代码(主构造函数)。 重新定义类的toString 方法 上面的代码创建Rational(1,2),Scala 编译器打印出[email protected],这是因为使用了缺省的类的toString()定义(Object对象的),缺省实现是打印出对象的类名称+“@”+16进制数(对象的地址),显示结果不是很直观,因此我们可以重新定义类的toString()方法以显示更有意义的字符。 在Scala中,你也可以使用override来重载基类定义的方法,而且必须使用override关键字表示重新定义基类中的成员。比如:

scala> class Rational (n:Int, d:Int) {
     |    override def toString = n + "/" +d
     | }
defined class Rational

scala> val x= new Rational(1,3)
x: Rational = 1/3

scala> val y=new Rational(5,7)
y: Rational = 5/7

前提条件检查 前面说过有理数可以表示为 n/d (其中d,n为证书,而d不能为0),对于前面的Rational定义,我们如果使用0,也是可以的

scala> new Rational(5,0)
res0: Rational = 5/0

怎么解决分母不能为0的问题了,面向对象编程的一个优点是实现了数据的封装,你可以确保在其生命周期过程中是有效的。对于有理数的一个前提条件是分母不可以为0,Scala中定义为传入构造函数和方法的参数的限制范围,也就是调用这些函数或方法的调用者需要满足的条件。Scala中解决这个问题的一个方法是使用require方法(require方法为Predef对象的定义的一个方法,Scala环境自动载入这个类的定义,因此无需使用import引入这个对象),因此修改Rational定义如下:

scala> class Rational (n:Int, d:Int) {
     |    require(d!=0)
     |    override def toString = n + "/" +d
     | }
defined class Rational

scala> new Rational(5,0)
java.lang.IllegalArgumentException: requirement failed
  at scala.Predef$.require(Predef.scala:211)
  ... 33 elided

可以看到如果再使用0作为分母,系统将抛出IllegalArgumentException异常。

参见:http://blog.csdn.net/hellozpc/article/details/45193359

以上是关于有理数操作 ** (1)定义一个有理数类Rational,该类存放分数形式的有理数,定义私有变量x和y分别存放分子的主要内容,如果未能解决你的问题,请参考以下文章

函数式对象

week01-绪论作业

第三回. 实数域

有理数分解-数论

Algs4-1.2.16有理数

csharp 分数类的基础。可以用来精确地表示有理数。