[C++] Soluzione esercizio: numeri razionali
Salve a tutti, sono alle prese con un altro esercizio che stavolta ho risolto per conto mio . Dato un main, devo scrivermi una classe che rappresenti i numeri razionali.
Allora questa è la soluzione proposta. Mi torna tutto ma la soluzione da errore perche i vari operator restituiscono un int mentre lui si aspetta un rat in uscita.
Allora io ho risolto cosi:
Ovvero visto che restituisco i valori "by-value" mi creo due variabili temporanee in cui storo numeratore e denominatore e poi invoco il costruttore passando questi due valori.
Questa soluzione è corretta secondo voi o ci sarebbero anche altre soluzioni? Se avessi restituito un reference (rat&) cosa sarebbe cambiato? Grazie!
main.cpp
#include "rat.hpp"
#include <iostream>
using namespace std;
int main() {
rat r1(2,7);
rat r2(8,6);
rat r3(4,14);
int n, d;
r3.unpack(n,d);
cout << "r3=" << n << "/" << d << endl; // 2/7
(r1+r2).print(); // prints 34/21
(r1-r2).print(); // prints -22/21
(r1*r2).print(); // prints 8/21
(r1/r2).print(); // prints 3/14
return 0;
}
rat.hpp--> Header file
class rat {
int n, d;
public:
rat(int a, int b);
rat operator+(const rat&);
rat operator-(const rat&);
rat operator*(const rat&);
rat operator/(const rat&);
void unpack(int&, int&);
void print();
};
rat.cpp
#include <iostream>
#include "rat.hpp"
static int gcd(int x, int y) {
if (y == 0) return x;
return gcd(y, x % y);
}
rat::rat(int a, int b) {
int sgn = (a < 0) ^ (b < 0);
if (a < 0) a = -a;
if (b < 0) b = -b;
int g = gcd(a,b);
n = sgn ? -a/g : a/g;
d = b/g;
}
rat rat::operator+(const rat& o) {
return rat(o.d*n+d*o.n, d*o.d);
}
rat rat::operator-(const rat& o) {
return rat(o.d*n-d*o.n, d*o.d);
}
rat rat::operator*(const rat& o) {
return rat(n*o.n, d*o.d);
}
rat rat::operator/(const rat& o) {
return rat(n*o.d, d*o.n);
}
void rat::unpack(int& a, int& b) {
a = n;
b = d;
}
void rat::print() {
std::cout << n << "/" << d << std::endl;
}
Allora questa è la soluzione proposta. Mi torna tutto ma la soluzione da errore perche i vari operator restituiscono un int mentre lui si aspetta un rat in uscita.
Allora io ho risolto cosi:
rat rat::operator+(const rat& o)
{
int f=((o.d*n)+(o.n*d));
int g=d*o.d;
rat temp(f,g);
return temp;
//return ((o.d*n)+(o.n*d),d*o.d);
//this->n=((o.d*n)+(o.n*d));
//this->d=(d*o.d);
//return this->n;
//return this->d;
}
rat rat::operator-(const rat& o)
{
//return ((o.d*n)-(o.n*d),d*o.d);
int f=(o.d*n)-(o.n*d);
int g=d*o.d;
rat temp(f,g);
return temp;
}
rat rat::operator*(const rat& o)
{
//return((o.n*n),(o.d*d));
int f=(o.n*n);
int g=(o.d*d);
rat temp(f,g);
return temp;
}
rat rat::operator/(const rat& o)
{
//return ((n*o.d),(d*o.n));
int f=(n*o.d);
int g=(d*o.n);
rat temp(f,g);
return temp;
}
Ovvero visto che restituisco i valori "by-value" mi creo due variabili temporanee in cui storo numeratore e denominatore e poi invoco il costruttore passando questi due valori.
Questa soluzione è corretta secondo voi o ci sarebbero anche altre soluzioni? Se avessi restituito un reference (rat&) cosa sarebbe cambiato? Grazie!
Risposte
Non mi è chiaro l'errore che ti viene restituito. Non posso in questo momento provare a compilare il codice, ma mi sembra strano tu debba fare qualcosa del genere per farlo funzionare. Posta l'errore che ti fornisce il compilatore.
L'errore è in corrispondenza di ogni return di ogni funzione operator
Ecco qua l'errore restituito:
http://imgur.com/a/S2Nqt
Ecco qua l'errore restituito:
http://imgur.com/a/S2Nqt
Ma da errore perché non stai chiamando il costruttore di rat, ma stai restituendo un intero (in quel caso d*o.d). Ma la soluzione postata era quella del tuo professore? Il codice alla fine è del tutto identico dal punto di vista del compilatore a quello che ha scritto il tuo professore sopra restituendo semplicemente rat(..). L'unica differenza è che tu hai separato tutte le espressioni e gli hai dato un nome.
Si ho capito solo ora, infatti se scrivessi return rat(....) il codice verrebbe eseguito senza problemi! Meglio cosi allora ! Grazie