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)