Università degli Studi di Brescia Fondamenti di Programmazione Docente: Alessandro Saetti A.A. 2012/2013 ESERCITAZIONE SULLE CLASSI Università degli Studi di Brescia A.A. 2012/2013 Definire la classe dei numeri razionali con: - Un costruttore che inizializza il denominatore con un intero casuale compreso tra 1 e 10 ed il numeratore con un numero casuale compreso tra 1 ed il denominatore; - Un costruttore che inizializzi il numero razionale della classe con due dati interi. - Un metodo che produca il numero reale pari al numero razionale della classe; - Un metodo che inizializzi il numero razionale della classe con interi acquisiti da tastiera, riducendo il numero razionale ai minimi termini; - Un metodo che restituisca un numero razionale (ridotto ai minimi termini) ottenuto sommando il numero razionale della classe con un secondo numero razionale; - Un metodo che visualizzi il numero razionale a video. Scrivere un programma C++ che, sfruttando la classe precedentemente definita, inizializzi e visualizzi un vettore di 10 numeri razionali ed infine visualizzi la somma dei 10 numeri razionali. Definire la classe dei numeri razionali con: - Un costruttore che inizializza il denominatore con un intero casuale compreso tra 1 e 10 ed il numeratore con un numero casuale compreso tra 1 ed il denominatore; - Un costruttore che inizializzi il numero razionale della classe con due dati interi. - Un metodo che produca il numero reale pari al numero razionale della classe; - Un metodo che inizializzi il numero razionale della classe con interi acquisiti da tastiera, riducendo il numero razionale ai minimi termini; - Un metodo che restituisca un numero razionale (ridotto ai minimi termini) ottenuto sommando il numero razionale della classe con un secondo numero razionale; - un metodo per visualizzare a video il numero razionale Scrivere un programma C++ che, sfruttando la classe precedentemente definita, inizializzi e visualizzi un vettore di 10 numeri razionali ed infine visualizzi la somma dei 10 numeri razionali. Possiamo compilare per verificare la correttezza sintattica di quello che abbiamo scritto #include <iostream> using namespace std; class Razionale { public: Razionale(); Razionale(int,int); float Reale(); void Leggi(); Razionale Somma(Razionale); void Stampa(); private: int num,den; }; int main() { } Ricordarsi di inserire il tipo restituito da ogni singola funzione-membro Definire la classe dei numeri razionali con: - Un costruttore che inizializza il denominatore con un intero casuale compreso tra 1 e 10 ed il numeratore con un numero casuale compreso tra 1 ed il denominatore; - Un costruttore che inizializzi il numero razionale della classe con due dati interi. - Un metodo che produca il numero reale pari al numero razionale della classe; - Un metodo che inizializzi il numero razionale della classe con interi acquisiti da tastiera, riducendo il numero razionale ai minimi termini; - Un metodo che restituisca un numero razionale (ridotto ai minimi termini) ottenuto sommando il numero razionale della classe con un secondo numero razionale; - un metodo per visualizzare a video il numero razionale Scrivere un programma C++ che, sfruttando la classe precedentemente definita, inizializzi e visualizzi un vettore di 10 numeri razionali ed infine visualizzi la somma dei 10 numeri razionali. Mi invento un main() per testare le funzionalità fino a questo punto implementate int main() { Razionale X(18,24); X.Stampa(); } Definizione esterna alla classe Razionale::Razionale(int n,int d) { num=n; den=d; } cin e cout Oggetti globali di I/O void Razionale::Stampa() { cout << num << "/« << den << endl; } >> e << Operatori di flusso di I/O INIZIO: Consideriamo il numero razionale A/B D=2 D < min(A,B) SI D++; NO AeB divisibili per D? SI A=A/D; B=B/D FINE La procedura di riduzione ai minimi termini di un numero razionale A/B potrebbe essere così implementata. void Razionale::Riduci() { int D=2; while ( (D < num) && (D < den) ) if ( (num % D == 0) && (den % D == 0) ) { NO num=num/D; den=den/D; } else D++; } Ha un difetto non funziona se i numeri sono negativi! INIZIO: Consideriamo il numero razionale A/B Per gestire valori negativi mi basta memorizzare il segno del numeratore e del denominatore ed operare allo stesso modo sui valori assoluti di A e B D=2 Segno_A=A/|A| Segno_B=B/|B| A=A*Segno_A; B=B*Segno_B; D < min(A,B) NO void Razionale::Riduci() { int segno_num=1, segno_den=1; if (num < 0) segno_num = -1; if (den < 0) segno_den = -1; num = num * segno_num; den = den * segno_den; SI D++; NO int D=2; while ( (D < num) && (D < den) ) if ((num % D == 0) && (den % D == 0)) { num=num/D; den=den/D; } else D++; num=segno_num*segno_den*num; AeB divisibili per D? SI A=A/D; B=B/D A=A*Segno_A*Segno_B; FINE } Trasformiamo la funzione Riduci() in una funzionemembro privata… … ed applichiamola tutte le volte che modifichiamo i valori delle 2 variabili private num e den. Razionale::Razionale(int n,int d) { num=n; den=d; Riduci(); } class Razionale { public: Razionale(); Razionale(int,int); float Reale(); void Leggi(); Razionale Somma(Razionale); void Stampa(); private: int num,den; void Riduci(); }; Definire la classe dei numeri razionali con: - Un costruttore che inizializza il denominatore con un intero casuale compreso tra 1 e 10 ed il numeratore con un numero casuale compreso tra 1 ed il denominatore; - Un costruttore che inizializzi il numero razionale della classe con due dati interi. - Un metodo che produca il numero reale pari al numero razionale della classe; - Un metodo che inizializzi il numero razionale della classe con interi acquisiti da tastiera, riducendo il numero razionale ai minimi termini; - Un metodo che restituisca un numero razionale (ridotto ai minimi termini) ottenuto sommando il numero razionale della classe con un secondo numero razionale; - un metodo per visualizzare a video il numero razionale Scrivere un programma C++ che, sfruttando la classe precedentemente definita, inizializzi e visualizzi un vettore di 10 numeri razionali ed infine visualizzi la somma dei 10 numeri razionali. float Razionale::Reale() { return( (float)num/(float) den ); } void Razionale::Leggi() { cout << "Numeratore: "; cin >> num; cout << "Denominatore: "; cin >> den; Riduci(); } Mi invento un main() per testare le funzionalità fino a questo punto implementate int main() { Razionale X(18,-24); X.Leggi(); X.Stampa(); cout << X.Reale() << endl; } Definire la classe dei numeri razionali con: - Un costruttore che inizializza il denominatore con un intero casuale compreso tra 1 e 10 ed il numeratore con un numero casuale compreso tra 1 ed il denominatore; - Un costruttore che inizializzi il numero razionale della classe con due dati interi. - Un metodo che produca il numero reale pari al numero razionale della classe; - Un metodo che inizializzi il numero razionale della classe con interi acquisiti da tastiera, riducendo il numero razionale ai minimi termini; - Un metodo che restituisca un numero razionale (ridotto ai minimi termini) ottenuto sommando il numero razionale della classe con un secondo numero razionale; - un metodo per visualizzare a video il numero razionale Scrivere un programma C++ che, sfruttando la classe precedentemente definita, inizializzi e visualizzi un vettore di 10 numeri razionali ed infine visualizzi la somma dei 10 numeri razionali. Razionale::Razionale() { den = rand() % 10 + 1; num = rand() % den + 1; Riduci(); } int main() { Razionale Y; Y.Stampa(); } Definire la classe dei numeri razionali con: Tenendo presente che: - Un costruttore che inizializza il denominatore con un intero casuale compreso tra 1 e 10 ed il numeratore con un numero casuale compreso tra 1 ed il denominatore; - Un costruttore che inizializzi il numero razionale della classe con due Razionale Razionale::Somma(Razionale Y) dati interi. - Un metodo che produca il numero reale pari al numero razionale { della classe; int n,d; - Un metodo che inizializzi il numero razionale della classe con interi d=den *Y.den; acquisiti da tastiera, riducendo il numero razionale ai minimi termini; n=num*Y.den+Y.num*den; - Un metodo che restituisca un numero razionale (ridotto ai minimi return ( Razionale(n,d)); termini) ottenuto sommando il numero razionale della classe con un } secondo numero razionale; - un metodo per visualizzare a video il numero razionale Scrivere un programma C++ che, sfruttando la classe precedentemente definita, inizializzi e visualizzi un vettore di 10 numeri razionali ed infine visualizzi la somma dei 10 numeri razionali. Non occorre ridurre ai minimo termini poiché il costruttore Razionale(n,d) contiene al suo interno tale istruzione: int main() { Razionale X(3,8), Y(4,7); X=X.Somma(Y); X.Stampa(); } Definire la classe dei numeri razionali con: - Un costruttore che inizializza il denominatore con un intero casuale compreso tra 1 e 10 ed il numeratore con un numero casuale compreso tra 1 ed il denominatore; - Un costruttore che inizializzi il numero razionale della classe con due dati interi. - Un metodo che produca il numero reale pari al numero razionale della classe; - Un metodo che inizializzi il numero razionale della classe con interi acquisiti da tastiera, riducendo il numero razionale ai minimi termini; - Un metodo che restituisca un numero razionale (ridotto ai minimi termini) ottenuto sommando il numero razionale della classe con un secondo numero razionale; - un metodo per visualizzare a video il numero razionale Scrivere un programma C++ che, sfruttando la classe precedentemente definita, inizializzi e visualizzi un vettore di 10 numeri razionali ed infine visualizzi la somma dei 10 numeri razionali. Per inizializzare il generatore di numeri casuali in modo sempre differente possiamo utilizzare la funzione srand() in questo modo. E’ richiesto l’uso dell’header file <time.h> #include <time.h> int main() { srand((unsigned int)time(NULL)) Razionale S(0,1); . . . Razionale S(0,1) corrisponde a zero int main() { Razionale S(0,1); Razionale X[10]; for (int i=0 ; i<10; i++) { X[i].Stampa(); S=S.Somma(X[i]); } S.Stampa(); }