92 lines
2.6 KiB
Scala
92 lines
2.6 KiB
Scala
package oop
|
|
|
|
import oop.RationalProgram.Rational
|
|
|
|
object RationalProgram:
|
|
case class Rational(val numerator: Int, val denominator: Int);
|
|
|
|
def newRational(num: Int): Rational =
|
|
new Rational(num, 1)
|
|
|
|
def newRational(num: Int, denom:Int = 1): Rational =
|
|
if (denom == 0) throw new Exception("Nenner darf nicht negativ sein")
|
|
reduce(num, denom)
|
|
|
|
def reduce(num:Int, denom:Int): Rational =
|
|
val newnum = if denom < 0 then -num else num
|
|
val newdenom = if denom < 0 then -denom else denom
|
|
val g: Int = ggT(newnum.abs , newdenom)
|
|
new Rational(newnum / g, newdenom /g)
|
|
|
|
def ggT(nom: Int, denom: Int): Int =
|
|
if denom == 0 then nom else ggT(denom, nom % denom)
|
|
|
|
def getNum(r: Rational): Int =
|
|
r.numerator
|
|
|
|
def getDenom(r: Rational): Int =
|
|
r.denominator
|
|
|
|
def add(r1: Rational, r2:Rational): Rational =
|
|
newRational(getNum(r1) * getDenom(r2) + getNum(r2) * getDenom(r1),
|
|
getDenom(r1) * getDenom(r2))
|
|
|
|
def sub(r1: Rational, r2:Rational): Rational =
|
|
newRational(getNum(r1) * getDenom(r2) - getNum(r2) * getDenom(r1),
|
|
getDenom(r1) * getDenom(r2))
|
|
|
|
def add(r: Rational, i: Int): Rational =
|
|
add(r, newRational(i))
|
|
|
|
def sub(r: Rational, i: Int): Rational =
|
|
sub(r, newRational(i))
|
|
|
|
def mult(r1: Rational, r2: Rational): Rational =
|
|
newRational(getNum(r1) * getNum(r2),
|
|
getDenom(r1) * getDenom(r2));
|
|
|
|
def div(r1: Rational, r2: Rational): Rational =
|
|
newRational(getNum(r1) * getDenom(r2),
|
|
getDenom(r1) * getNum(r2));
|
|
|
|
def mult(r1: Rational, num: Int): Rational =
|
|
mult(r1, newRational(num))
|
|
|
|
def div(r1: Rational, num: Int): Rational =
|
|
div(r1, newRational(num))
|
|
|
|
def printRational(r: Rational): Unit =
|
|
if (r.denominator == 1) then println(r.numerator)
|
|
println(r.numerator + "/" + r.denominator)
|
|
|
|
def lessThan(r1: Rational, r2:Rational): Boolean =
|
|
val num1 = r1.numerator * r2.denominator
|
|
val num2 = r1.denominator * r2.numerator
|
|
return num1 < num2
|
|
|
|
def greaterThan(r1: Rational, r2: Rational): Boolean =
|
|
val diff = sub(r2, r1)
|
|
diff.numerator < 0
|
|
|
|
def greaterThanOrEquals(r1: Rational, r2: Rational): Boolean =
|
|
!lessThan(r1,r2)
|
|
|
|
def lessThanOrEquals(r1: Rational, r2: Rational): Boolean =
|
|
!greaterThan(r1, r2)
|
|
|
|
def graterThan(r: Rational, i: Int): Boolean =
|
|
greaterThan(r, newRational(i))
|
|
|
|
def isEqual(r1: Rational, r2: Rational): Boolean =
|
|
lessThanOrEquals(r1,r2) && greaterThanOrEquals(r1,r2)
|
|
|
|
def main(args: Array[String]): Unit =
|
|
val one = newRational(1)
|
|
val two = newRational(2)
|
|
val three = newRational(3)
|
|
val four = newRational(4)
|
|
|
|
val vierdrittel = div(four, three)
|
|
val bruch = div(two, vierdrittel)
|
|
val ergebniss = add(one, bruch)
|
|
printRational(ergebniss) |