Eser 7.4

annuncio pubblicitario
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();
}
Scarica