Domanda Media voti c++

Stato
Discussione chiusa ad ulteriori risposte.

ImNotDici™

Utente Bronze
30 Aprile 2016
2
1
0
30
Ultima modifica:
Salve, sto studiano c++ a scuola. L'Esercizio è questo: Tramite un menù, usando funzioni e/o procedure, calcola la media inserendo voti di informatica scritti e pratici ed infine visualizza e calcola la media dei voti totale. Ho fatto tutto, l'unico problema sta nel fatto che se non inserisco per esempio i voti scritti, la media totale me la calcola anche tra i voti scritti e quindi divide i voti pratici per due. Vi faccio vedere cosa ho fatto.

Codice:
#include<iostream>
#include<stdlib.h>

void VotoScritto();
void VotoPratico();
void MediaVoti();

int op,num,i;
float medias, mediap;
float somma=0;
float sommas=0;
float sommap=0;
float media=0;

using namespace std;

int main()
{
   cout<<"***** PROGRAMMA DI CALCOLO DELLA MEDIA DEI VOTI DI INFORMATICA *****"<<endl;
    do{
        cout<<"Scegliere quale operazione si desidera effettuare: "<<endl;
        cout<<"1 - Inserire voto scritto"<<endl;
        cout<<"2 - Inserire voto pratica"<<endl;
        cout<<"3 - Visualizzare la media dei voti"<<endl;
        cout<<"0 - Termina programma"<<endl;
        cout<<"Operazione: ";
        cin>>op;
    switch(op)
    {
        case 0:
            cout<<"Fine del programma"<<endl;
            break;
        case 1:
            cout<<"Inserire numeri dei compiti svolti: "<<endl;
            cin>>num;
            VotoScritto();
            break;
        case 2:
            cout<<"Inserire numeri dei compiti svolti: "<<endl;
            cin>>num;
            VotoPratico();
            break;
        case 3:
            MediaVoti();
            break;
        default:
            cout<<"Operazione non prevista!"<<endl;
        }
    }while(op>0);
    system("PAUSE");
    return 0;
}

void VotoScritto()
{
    float votos;
    if( num == 0 )
        cout<<"Inserire un numero maggiore di 0"<<endl;
    else {
        for(i=0; i<num; i++){
            cout<<"Inserire un voto: "<<endl;
            cin>>votos;
        
            sommas = sommas + votos;
            }
        }
            medias = sommas / num;
            cout<<"La media dei tuoi voti scritti e' "<<medias<<endl;
}

void VotoPratico()
{
    float votop;
    if( num == 0 )
        cout<<"Inserire un numero maggiore di 0"<<endl;
    else {
        for(i=0; i<num; i++){
            cout<<"Inserire un voto: "<<endl;
            cin>>votop;

            sommap = sommap + votop;
            }
            mediap = sommap / num;
            cout<<"La media dei tuoi voti pratici e' "<<mediap<<endl;
        }
}

void MediaVoti()
{
    somma = mediap + medias;
    media = somma / num;
    cout<<"La media dei voti scritti e' "<<medias<<endl;
    cout<<"La media dei voti pratici e' "<<mediap<<endl;
    cout<<"La media totale dei voti e' "<<media<<endl;
}
 
Ciao !
1) Innanzitutto ti consiglio di non usare tutte queste variabili globali , soprattutto se stai facendo questo sorgente a livello didattico
2) Ciò che fa la variabile media nella funzione MediaVoti() è quella di prende mediap+medias/num . Dovresti fare mediap+medias/2 , considerando che devi fare la media tra le medie dei voti dello scritto e del pratico (inoltre il valore di num cambia ogni volta che scegli se aggiungere un voto pratico o scritto , quindi se inserisci un voto al pratico , poi uno allo scritto e poi un altro al pratico avrai un errore sia nella media totale , che nella media del pratico) , e dovresti trovare un modo per far si che anche se non hai inserito voti in una delle due categorie , la media finale sia corretta . Ti posso consigliare di usare due if , per controllare se la media del pratico e dello scritto siano state inserite , e ti consiglio anche di rivederti come utilizzi la variabile num , poichè dà almeno 2 problemi (MediaVoti() e la media dei voti pratici/scritto se inserisci i voti due volte)

P.S : Per inserire il codice nella discussione utilizza l'apposita funzione , così rendi il sorgente più leggibile
 
Si, in effetti all'inizio avevo messo che la media = mediap+medias / 2, poi non so il perchè ho provato a mettere num al posto del 2.
Comunque, si l'altro problema che non ho scritto è proprio quello che hai detto tu. Quando inserisco i voti due volte la media è sbagliata.
Grazie della risposta!
 
Ciao , proprio poco fa ho finito di scrivere un programma che credo sia quello che volevi fare pure te .
Questo programma ti permette di inserire la materia e i voti della materia . Successivamente stampa la materia scelta e la media dei voti inseriti . Poi si può scegliere la propria media da raggiungere . Se la media scelta è maggiore alla media dei voti allora il programma di dice che voto devi prendere per raggiungerla ; mentre se il la media scelta è inferiore alla media dei voti ti dirà un voto che non devi prendere per scendere sotto la media precedentemente scelta .
E' molto completo come programma se ti interessa ho messo la reposity su Github , questo è il link https://github.com/blackdeath37/Average-grade.git
Fammi sapere che ne peni ;)
 
Ultima modifica:
Ciao,
il problema non è affatto difficile! Tieni traccia del numero complessivo di compiti svolti e nel calcolo della media totale dividi la somma dei voti con il numero dei compiti svolti.

Dichiari una variabile di tipo intero: int compiti_svolti = 0;
Nelle funzioni VotoScritto ed VotoPratico inserisci: compiti_svolti += num;
Alla variabile media nella funzione MediaVoti assegni: media = somma / compiti_svolti;

Allo stesso modo dovresti fare per i voti scritti e pratici, altrimenti la media non verrebbe calcolata correttamente se i voti verranno inseriti in tempi diversi.
 
Stato
Discussione chiusa ad ulteriori risposte.