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;
}