Files
upo-rust/src/es02_rational.rs
2024-04-30 19:08:31 +02:00

59 lines
1.7 KiB
Rust
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#![allow(dead_code)]
/** Es.2
* Si definisca un modulo razionali che contiene una implementazione dei numeri razionali,
* cioe una struttura Razionali con i due campi interi num e denum (per numeratore e denominatore)
* i metodi di somma, prodotto, e riduzione ai minimi termini (dividere num e denum per il massimo comun divisore)
* le funzioni new che ritorna un Razionale (con 2 parametri) e int_to_raz che prende un intero
* e ritorna il numero razionale che ha quellintero come numeratore e 1 come denominatore.
*/
#[derive(Debug, PartialEq, Clone)]
pub struct Rational {
num: i32,
den: i32,
}
impl Rational {
pub fn new(num: i32, den: i32) -> Self {
assert!(den != 0, "Cannot divide by zero!");
let mut numero = Rational { num, den };
numero.reduce();
numero
}
pub fn from(int: i32) -> Self {
Rational { num: int, den: 1 }
}
pub fn multiplication(&mut self, other: &Rational) -> &mut Self {
self.num *= other.num;
self.den *= other.den;
self.reduce()
}
pub fn addition(&mut self, other: &Rational) -> &mut Self {
self.num = (self.num * other.den) + (other.num * self.den);
self.den *= other.den;
self.reduce()
}
fn reduce(&mut self) -> &mut Self {
if self.den < 0 {
self.num *= -1;
self.den *= -1;
}
let mcd = Self::mcd(self.num, self.den);
self.num /= mcd;
self.den /= mcd;
self
}
fn mcd(a: i32, b: i32) -> i32 {
// mcd Euclideo https://en.wikipedia.org/wiki/Euclidean_algorithm#Implementations
if b == 0 {
a
} else {
Self::mcd(b, a % b)
}
}
}