2 minutes
Progettino 1
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}`}
}