/* Costruire la classe "Razionale" con due dati privati che rappresentano numeratore e denominatore (non dimenticate costruttore/i e distruttore!). Scrivere un programma che chieda all'utente di inserire due numeri razionali (inserendo numeratore e denominatore di ogni numero separatamente) e il simbolo di operazione che si vuole eseguire (somma, sottrazione, moltiplicazione o divisione). Queste operazioni verranno implementate con 4 metodi della classe (somma, prodotto, differenza, divisione). Restituire i risultati (stampando numeratore e denominatore di ogni numero separatamente) semplificati, cioe' con frazioni ridotte ai minimi termini. Ripetere l'esercizio fintanto che il risultato dell'operazione risulta positivo. */ #include #include using namespace std; class Razionale { private: // Numeratore. int n; // Denominatore. int d; // Calcola il massimo comune divisore tra due interi. int mcd(int x, int y); // Riduce ai minimi termini la frazione e, se il numero // e' negativo, lega il segno `-' al numeratore. void semplifica(); public: // Costruttore di default. Razionale(); // Costruttore con parametri. Razionale(int num, int den); // Distruttore. ~Razionale(); // Restituisce il numeratore del numero razionale. int numeratore() const; // Restituisce il denominatore del numero razionale. int denominatore() const; // Esegue la somma tra `x' e l'oggetto di invocazione. Razionale somma(const Razionale& x) const; // Esegue la differenza tra `x' e l'oggetto di invocazione. Razionale differenza(const Razionale& x) const; // Esegue il prodotto tra `x' e l'oggetto di invocazione. Razionale prodotto(const Razionale& x) const; // Esegue la divisione tra `x' e l'oggetto di invocazione. Razionale divisione(const Razionale& x) const; // Stampa il numero razionale nella forma `n/d'. void stampa(ostream& s_out) const; // Legge il numero razionale nella forma `n/d'. void leggi(istream& s_in); }; int Razionale::mcd(int x,int y) { int r = y; while (r != 0){ r = x % y; x = y; y = r; } return x; } Razionale::Razionale() { n = 0; d = 1; } Razionale::Razionale(int num, int den = 1) { n = num; if (den == 0) { cout << "ATTENZIONE!: denominatore nullo (lo pongo uguale ad 1)" << endl; // Mettere `d = 1' e' una scelta // (non bella, vedremo come si puo' migliorare). d = 1; } else d = den; } Razionale::~Razionale() { // eventuali operazioni in chiusura, in questo caso nessuna. } int Razionale::numeratore() const { return n; } int Razionale::denominatore() const { return d; } Razionale Razionale::somma(const Razionale& x) const { Razionale risultato; risultato.d = d * x.d; risultato.n = n * x.d + x.n * d; risultato.semplifica(); return risultato; } Razionale Razionale::differenza(const Razionale& x) const { Razionale risultato; risultato.d = d * x.d; risultato.n = n * x.d - x.n * d; risultato.semplifica(); return risultato; } Razionale Razionale::prodotto(const Razionale& x) const { Razionale risultato; risultato.d = d * x.d; risultato.n = n * x.n; risultato.semplifica(); return risultato; } Razionale Razionale::divisione(const Razionale& x) const { Razionale risultato; risultato.d = d * x.n; risultato.n = n * x.d; risultato.semplifica(); return risultato; } void Razionale::semplifica() { int m = mcd(abs(n), abs(d)); n = n / m; d = d / m; if ((n < 0 && d < 0) || (n > 0 && d < 0)) { n *= -1; d *= -1; } } int main() { Razionale c; char op; do { int num, den; cout << endl << "Immettere numeratore e denominatore (interi) del " << "primo numero razionale:"; cout << endl << "num = "; cin >> num; do { cout << endl << "den = "; cin >> den; if (den == 0) cout << "Il denominatore non puo' essere nullo!!!" << endl; } while (den == 0); Razionale a(num, den); cout << endl << "Immettere numeratore e denominatore (interi) del " << "secondo numero razionale:"; cout << endl << "num = "; cin >> num; do { cout << endl << "den = "; cin >> den; if (den == 0) cout << "Il denominatore non puo' essere nullo!!!" << endl; } while (den == 0); Razionale b(num, den); cout << endl << "Immettere l'operazione aritmetica da eseguire:" << endl; cin >> op; bool operazione_svolta = true; switch (op) { case '+': c = a.somma(b); break; case '-': c = a.differenza(b); break; case '*': c = a.prodotto(b); break; case '/': c = a.divisione(b); break; default: operazione_svolta = false; cout << "Operazione non implementata!" << endl; } if (operazione_svolta) cout << endl << "Il risultato e': " << c.numeratore() << "/" << c.denominatore() << endl; } while (c.numeratore() > 0); cout << endl << "Arrivederci!" << endl; getch(); return 0; }