Per completezza, si rimanda al primo post del sito per ulteriori informazioni.

Si ricorda che dello stesso esercizio possono esistere più varianti.

I numeri razionali

Come sapete, i numeri razionali (o frazioni) sono definiti da un numeratore e un denominatore che sono a loro volta numeri interi. Sono numeri razionali ¾, ⅞, ½, ecc. Qualunque numero espresso in notazione decimale finita è un numero razionale; per esempio, 3.1415 è esprimibile come 31415/10000 o anche come 6283/2000. La forma semplificata è di solito considerata più comoda. I numeri irrazionali come 𝛑, √2 o e non sono invece esprimibili come razionali (ovviamente - è per questo che si chiamano irrazionali!).

Il vostro progettino per il weekend è il seguente:

Si scriva una classe Javascript (chiamiamola Rational) che possa costruire oggetti che rappresentano numeri razionali (preferibilmente usando il numeratore e denominatore più piccoli possibile, facendo le necessarie semplificazioni).

Definire, per questi oggetti, le quattro operazioni aritmetiche: somma, sottrazione, moltiplicazione, divisione. Le operazioni su numeri razionali devono restituire altri numeri razionali.

Lo svolgimento è libero, ma ecco un esempio di uso.

Esempio:

var tq = new Rational(3,4) tq → 3/4

var so = new Rational(7,8) tq.plus(so) → 13/8

tq.minus(so) → -1/8

so.minus(tq) → 1/8

so.times(new Rational(2,1)) → 7/4

tq.div(so) → 6/7

new Rational(31415,10000) → 6283/2000

class Rational {
  constructor(num,den=1) {
    this.num=num
    this.den=den
    this.simplify()
  }

  simplify() {
    var m=this.mcd(this.num,this.den)
    var s=this.den<0?-1:1
    this.num /= m*s
    this.den /= m*s
  }

  mcd(a,b) {
    var c
    a=Math.abs(a); b=Math.abs(b)
    while (b) { c=a%b; a=b; b=c; }
    return a
  }

  plus(r) { return new Rational(this.num*r.den+r.num*this.den, this.den*r.den) }
  minus(r) { return new Rational(this.num*r.den-r.num*this.den, this.den*r.den) }
  times(r) { return new Rational(this.num*r.num, this.den*r.den) }
  div(r) { return new Rational(this.num*r.den, this.den*r.num) }

  abs() { return new Rational(Math.abs(this.num),this.den)}

  toString() { return `${this.num}/${this.den}`}
}