PDA

View Full Version : [C++] Media voti


Vincenzoflaminio
26-10-2011, 23:36
Salve , ho bisogno di un aiuto...
ho scritto il seguente programma che mi calcola la media aritmetica dei voti

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


class Voti {
double voti[MAX]; // campo private
int crediti[MAX]; //crediti dei voti
int n; //numero dei voti inseriti
public:
bool inserisci ( double v, int c); // funzione di inserimento
void inizializza (); // funzione che inizializza i voti
void inizializza_c (); //inizializza crediti
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, int c) {
if ( n >= MAX || v <0 )
return false;
voti[n++] = v;
crediti[c++] = c;
return true;
}
void Voti:: inizializza (){
for( int i =0; i < MAX; i++)
voti[i]= 0;
n=0;
}
void Voti:: inizializza_c (){
for( int i =0; i < MAX; i++)
crediti[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;
}

int main()
{
Voti v;
v.inizializza ();
cout <<"scrivi un numero negativo per terminare" << endl;
for (int i=0; i < MAX; i++) {
double voto;
int crediti;
cout << "voto?";
cin >> voto;
cout<< "crediti?";
cin >> crediti;
if ( voto < 0)
break;
v.inserisci (voto, crediti);
}
cout << endl<<"media : " << v.media() << endl << "massimo : " << v.max();
cout << endl << "minimo : " << v.min() << endl;
system("PAUSE");

return 0;
}


Quello che dovrei fare ora č modificarlo in modo che la media sia data dalla media aritmetica dei voti esclusi i due voti piu bassi. Quindi ho bisogno prima di ordinarli e poi eliminare i due voti piu bassi (e in caso di pari voto elimina quello da piu crediti) ... nn so bene come farlo :confused: un aiutino??

!fazz
27-10-2011, 12:01
Salve , ho bisogno di un aiuto...
ho scritto il seguente programma che mi calcola la media aritmetica dei voti

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


class Voti {
double voti[MAX]; // campo private
int crediti[MAX]; //crediti dei voti
int n; //numero dei voti inseriti
public:
bool inserisci ( double v, int c); // funzione di inserimento
void inizializza (); // funzione che inizializza i voti
void inizializza_c (); //inizializza crediti
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, int c) {
if ( n >= MAX || v <0 )
return false;
voti[n++] = v;
crediti[c++] = c;
return true;
}
void Voti:: inizializza (){
for( int i =0; i < MAX; i++)
voti[i]= 0;
n=0;
}
void Voti:: inizializza_c (){
for( int i =0; i < MAX; i++)
crediti[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;
}

int main()
{
Voti v;
v.inizializza ();
cout <<"scrivi un numero negativo per terminare" << endl;
for (int i=0; i < MAX; i++) {
double voto;
int crediti;
cout << "voto?";
cin >> voto;
cout<< "crediti?";
cin >> crediti;
if ( voto < 0)
break;
v.inserisci (voto, crediti);
}
cout << endl<<"media : " << v.media() << endl << "massimo : " << v.max();
cout << endl << "minimo : " << v.min() << endl;
system("PAUSE");

return 0;
}


Quello che dovrei fare ora č modificarlo in modo che la media sia data dalla media aritmetica dei voti esclusi i due voti piu bassi. Quindi ho bisogno prima di ordinarli e poi eliminare i due voti piu bassi (e in caso di pari voto elimina quello da piu crediti) ... nn so bene come farlo :confused: un aiutino??
implementa uno della miriade di algoritmi di ordinamento e fai la somma da 1 a numero elementi -1

Vincenzoflaminio
27-10-2011, 15:43
Grazie della risposta, ho da poco iniziato il corso di c++ .
Volevo utilizzare l'algoritmo insertion_sort per attenermi a quanto studiato , perņ mi chiedo quando passo i parametri alla function di ordinamento , come faccio a passare voti[] se č un attributo privato ?

!fazz
27-10-2011, 16:14
Grazie della risposta, ho da poco iniziato il corso di c++ .
Volevo utilizzare l'algoritmo insertion_sort per attenermi a quanto studiato , perņ mi chiedo quando passo i parametri alla function di ordinamento , come faccio a passare voti[] se č un attributo privato ?

io non lavoro in OO ma a memoria

set e get come dovresti fare per ogni variabile?

SerMagnus
29-10-2011, 11:56
ma perchč avresti bisogno di un algoritmo di ordinamento per la media dei voti?

per me ti complichi la vita inutilemnte. puoi farlo comunque senza alcun ordinamento: quando effettui il calcolo della media all'interno del ciclo che somma tutti i voti ad ogni passo individui di volta in volta i due voti minimi e poi al termine del ciclo li sottrai al totale

lishi
29-10-2011, 13:11
Come ha detto sermagnus modica


double Voti:: media () {
if (n ==0) return -1; // errore: nessun dato !
if ( n == 1)
return voti[0]
if (n == 2)
return (voti[0] + voti[1]) / 2;
double somma = 0;
for (int i=0; i < n; i++)
somma += voti[i];

return (somma - max() - min()) / n - 2;
}


Se sei pigro, altrimenti puoi evitare di richiamarare max e min salvandoti nel ciclo di somma il minimo e il massimo