SPIEGAZIONE ESERCIZIO SVOLTO

di il
6 risposte

SPIEGAZIONE ESERCIZIO SVOLTO

#include <iostream>
#define MAX 100
using namespace std;

class Voti {
double voti[MAX]; // campo private
int n; //numero dei voti inseriti
public:
bool inserisci ( double v); // funzione di inserimento
void inizializza (); // funzione che inizializza i campi privati
double media(); // funzione che ritorna la media dei voti
double max(); // funzione che ritorna il massimo dei voti
double min(); // funzione che ritorna il minimo dei voti
};
bool Voti:: inserisci (double v) {
if ( n >= MAX || v <0 )
return false;
voti[n++] = v;
return true;
}
void Voti:: inizializza (){
for( int i =0; i < MAX; i++)
voti[i]= 0;
n=0;
}
double Voti:: media () {
if (n ==0) return -1; // errore: nessun dato !
double somma = 0;
for (int i=0; i < n; i++)
somma += voti[i];
return (somma /n);
}
double Voti:: max () {
if (n ==0) return -1; // errore: nessun dato !
double m = voti[0];
for (int i=1; i < n; i++)
if ( voti[i]> m)
m= voti[i];
return m;
}
double Voti:: min () {
if (n ==0) return -1; // errore: nessun dato !
double m = voti[0];
for (int i=1; i < n; i++)
if ( voti[i] < m)
m= voti[i];
return m;
}
#include <iostream>
using namespace std;
int main()
{
Voti v;
v.inizializza ();
cout << “scrivi un numero negativo per terminare” << endl;
for (int i=0; i < MAX; i++) {
double voto;
cout << “?”;
cin >> voto;
if ( voto < 0)
break;
v.inserisci (voto);
}
cout << endl<<“media : ” << v.media() << endl << “massimo : ” << v.max();
cout << endl << “minimo : ” << v.min() << endl;
return 0;
}

OUTPUT
scrivi un numero per terminare
? 26
? 30
? 30
? -1
media : 28.66
massimo: 30
minimo: 26

CHI MI SA SPIEGARE PASSAGGIO PER PASSAGGIO COSA FA QUESTO ESERCIZIO?

6 Risposte

  • Re: SPIEGAZIONE ESERCIZIO SVOLTO

    IL TUO PROFESSORE?
  • Re: SPIEGAZIONE ESERCIZIO SVOLTO

    PS ma che caspita è "inizializza" ?
  • Re: SPIEGAZIONE ESERCIZIO SVOLTO

    +m+ ha scritto:


    PS ma che caspita è "inizializza" ?
    guarda ti ho scritto l'esercizio dalle slide che ho letto cosi come stava speravo che quelcuno lo capisse piuù di me
  • Re: SPIEGAZIONE ESERCIZIO SVOLTO

    Inizializza è un metodo che serve ad azzerare il vettore ed n che sono gli elementi privati della classe Voti, tutta roba che potrebbe essere svolta dal costruttore che invece manca.

    Comunque non ha senso chiedere di spiegare tutto un codice perché qui non siamo a scuola.

    Studialo l'esercizio e solo di quello che non capisci (non tutto!) chiedi chiarimenti.
  • Re: SPIEGAZIONE ESERCIZIO SVOLTO

    oregon ha scritto:


    inizializza è un metodo che serve ad azzerare il vettore ed n che sono gli elementi privati della classe Voti, tutta roba che potrebbe essere svolta dal costruttore che invece manca.
    Sostituirei "potrebbe" con "dovrebbe"
    E poi cos'è C++ con un define per un array statico?

    Diciamo che chi ha fatto quell'esercizio non sa niente di C++
  • Re: SPIEGAZIONE ESERCIZIO SVOLTO

    Siccome ho avuto altre pessime notizie e mi sento ispirato, ecco...
    
    #include <iostream>
    #define MAX 100 // roba ridicola, nel senso che avendo C++ puoi benissimo usare un vector con template
    using namespace std;
    
    class Voti {
    double voti[MAX]; // campo private //roba ridicola come detto, vettore di dimensione statica. Perchè poi DOUBLE? i voti sono INTERI!!!!
    int n; //numero dei voti inseriti // int o unsigned int ?
    public:
    bool inserisci ( double v); // funzione di inserimento . come dett operchè DOUBLE? inoltre meglio mettere un parametro in notazione simil-ungherese, tipo i_voto
    void inizializza (); // funzione che inizializza i campi privati. cosa ridicola (ci vuole il costruttore)
    double media(); // funzione che ritorna la media dei voti
    double max(); // funzione che ritorna il massimo dei voti
    double min(); // funzione che ritorna il minimo dei voti
    };
    bool Voti:: inserisci (double v) { // non si sa se n è signed o unsigned
    if ( n >= MAX || v <0 ) // mancano parentesi a forte rischio ererore. Inoltre un test su un double <0 è ridicolo come stabilità. A parte che ci vuole un intero, proprio al massimo ci vorrà un |v|<eps con eps precisione fissata per gli arrotondamenti IEEE, o visto che non è continua un v^2<eps (norma 2 ridicola, ma meglio del modulo)
    return false;
    voti[n++] = v;
    return true;
    }
    void Voti:: inizializza (){ // come detto è un pseudo-costruttore
    for( int i =0; i < MAX; i++)
    voti[i]= 0;
    n=0;
    }
    double Voti:: media () { 
    if (n ==0) return -1; // errore: nessun dato ! con n intero ci vuole <=0, non ==0
    double somma = 0; // siccome sono sempre interi è sbagliato usare double
    for (int i=0; i < n; i++)
    somma += voti[i];
    return (somma /n); // qui ci andava la divisione per ritornare il double
    }
    double Voti:: max () {
    if (n ==0) return -1; // errore: nessun dato ! stessa cosa sopra <=0 oppure n unsigned int
    double m = voti[0];
    for (int i=1; i < n; i++)
    if ( voti[i]> m) // di nuovo confronto > non si fa coi double per la stabilità numerica
    m= voti[i];
    return m;
    }
    double Voti:: min () {
    if (n ==0) return -1; // errore: nessun dato ! // uguale a quanto sopra. Normalmente si potrebbe usare una singola funzione generica che ritorna massimo e minimo (costa uguale) e che setta attributi poi ritornati
    double m = voti[0];
    for (int i=1; i < n; i++)
    if ( voti[i] < m)
    m= voti[i];
    return m;
    }
    #include <iostream>
    using namespace std;
    int main()
    {
    Voti v;
    v.inizializza (); // come detto ridicolo
    cout << “scrivi un numero negativo per terminare” << endl;
    for (int i=0; i < MAX; i++) {
    double voto;
    cout << “?”;
    cin >> voto;
    if ( voto < 0)
    break;
    v.inserisci (voto);
    }
    cout << endl<<“media : ” << v.media() << endl << “massimo : ” << v.max();
    cout << endl << “minimo : ” << v.min() << endl;
    return 0;
    }
    
Devi accedere o registrarti per scrivere nel forum
6 risposte