Media voti in un vettore

di il
6 risposte

Media voti in un vettore

Salve devo scrivere un programma utilizzando tutte funzioni. il programma dovrebbe prendere un certo numero di voti da tastiera e scritti questi in un vettore mi dovrebbe calcolare la media e il numero di 8 presenti nel vettore.
il programma che ho scritto funziona solo in parte mi riconosce il nuemro di 8 ma non mi calcola la media.

#include <iostream>
#include <cstdlib>

using namespace std;
const int nmax=100;
//prototipi di funzioni
void letturavettore (int v[nmax],int r);
void trovaotto (int v[nmax], int n);
void somma (int v[nmax], float s, int n);
void mediavoti (float s,int n,float media);
void stampamedia (float media);                           
//programma per la media dei voti
int main()
{
int v[nmax];
int n;
float s, media;
do
{
	cout<<" inserisci la dimesione del vettore"<<endl;
	cin>> n;
	}
	while (n>nmax);
	letturavettore (v, n);
	trovaotto (v, n);
        somma (v, s, n);
	mediavoti (s, n, media);
	stampamedia (media);
	system ("PAUSE");
	return 0;
}
//funzione letturea vettore
void letturavettore (int v[nmax], int n)
{
	for(int i=0; i<n; i++)
	{
		cout<< "inserisci il valore "<<i<<" :";
		cin>> v[i];
	}
}
//trova e stampa i valori di 8
void trovaotto (int v[nmax], int n)
{
int j=0;
for (int i=0; i<n; i++)
	{
	if (v[i]==8)
	j++;
}

cout<<"gli otto sono  "<<j<<endl;
}
//somma dei voti
void somma(int v[nmax],float s,int n)
{
	s=0;
	for (int i=0; i<n; i++)
	{
		s=s+v[i];
	}
}


//media voti	
void mediavoti (float s, int n, float media)
{
	media=s/n;
}

//stampa media

void stampamedia (float media)
{
	cout<<"la media dei voti e' "<<media<<endl;
}

6 Risposte

  • Re: Media voti in un vettore

    Puntualizzazioni:
    1. nelle dichiarazioni e definizioni di funzioni con argomento un vettore, non devi mettere la dimensione, ma solo le parentesi quadra, ad esempio: int funzione(int v[])
    2. visto che hai curato un controllo sull'input (non posso inserire come n un numero maggiore di 100), potresti controllare anche che l'utente non inserisca un numero negativo o nullo
    3. per la funzione trovaotto() si preferirebbe un tipo int, e usare il cout all'interno del main, questo per semplicità e correttezza nell'uso delle funzioni
    Ora arrivano i veri casini, nelle ultime tre funzioni, e qui non sono solo puntualizzazioni:
    1. queste tre funzioni sono talmente dipendenti l'una dall'altra che potresti svolgere tutto in una sola funzione
    2. per come le hai scritte, queste funzioni non ritornano nessun valore, perciò il valore della media all'interno del main non esiste
    3. le variabili che non "provengono" dal main, è sbagliato usarle come argomenti delle funzioni, vanno dichiarate dentro il corpo della funzione.

    Prova a seguire questi consigli...
  • Re: Media voti in un vettore

    1)hai ragione non dovevo inserire nmax
    2)potrei fare un controllo più completo ma ho pensato che è improbabile che qualcuno inserisca un numero negativo, comunque è di facile aggiunta e potrei farlo.
    3) ci avevo pensato anche io ad usare un tipo int però visto che funziona per adesso preferisco non modificarlo.
    effettivamente ci sono una marea di funzioni inutili ma come scritto nel titolo mi è stato chiesto di usare tutte funzioni altrimenti non l'avrei mai fatto così visto che in questo caso sono inutili e complicano solo la cosa.
    parlando dei problemi seri di questo programma, io ho creato una funzione che mi scriva dentro s (variabile inizializzata nel main) il valore della somma degli elementi del vettore, perchè se dopo aver eseguito la funzione nel programma principale inserisco un cout<<s non ottengo il valore della somma? potrei usare una funzione int coin return s?
  • Re: Media voti in un vettore

    Appunto, non eseguendo il return, il valore non viene riportato nel main. Per questo, alla fine della funzione in cui sommi gli elementi devi aggiungere "return s;", e la funzione deve essere di tipo int, stessa cosa per quella che calcola la media: deve restituire un tipo float
  • Re: Media voti in un vettore

    L'ho modificato così ma comuqnue non va:
    #include <iostream>
    #include <cstdlib>
    
    using namespace std;
    const int nmax=100;
    //prototipi di funzioni
    void letturavettore (int v[],int r);
    void trovaotto (int v[], int n);
    float somma (int v[], float s, int n);
    float mediavoti (float s,int n,float media);
    void stampamedia (float media);                           
    //programma per la media dei voti
    int main()
    {
    int v[nmax];
    int n;
    float s, media;
    do
    {
    	cout<<" inserisci la dimesione del vettore"<<endl;
    	cin>> n;
    	}
    	while (n>nmax);
    	letturavettore (v, n);
    	trovaotto (v, n);
        somma (v, s, n);
    	mediavoti (s, n, media);
    	stampamedia (media);
    	system ("PAUSE");
    	return 0;
    }
    //funzione letturea vettore
    void letturavettore (int v[], int n)
    {
    	for(int i=0; i<n; i++)
    	{
    		cout<< "inserisci il valore "<<i<<" :";
    		cin>> v[i];
    	}
    }
    //trova e stampa i valori di 8
    void trovaotto (int v[], int n)
    {
    int j=0;
    for (int i=0; i<n; i++)
    	{
    	if (v[i]==8)
    	j++;
    }
    
    cout<<"gli otto sono  "<<j<<endl;
    }
    //somma dei voti
    float somma(int v[],float s,int n)
    {
    	s=0;
    	for (int i=0; i<n; i++)
    	{
    		s=s+v[i];
    	}
    return s;
    }
    
    
    
    //media voti	
    float mediavoti (float s, int n, float media)
    {
    	media=s/n;
    return media;
    }
    
    //stampa media
    
    void stampamedia (float media)
    {
    	cout<<"la media dei voti e' "<<media<<endl;
    }
    
    forse non sto capendo bene quello che mi dici?


    EDIT
    non avevo modificato il programma principale
  • Re: Media voti in un vettore

    Ho cambiato il meno possibile per permetterti di capire meglio, questo è funzionante (senza controlli sull'input, non ho aggiunto cose di questo tipo), ho solo modificato i valori di ritorno e di argomento delle funzioni. Per fare come facevi tu avresti dovuto conoscere e usare i puntatori, ma non credo... quindi ti ho lasciato i passaggi di parametri per valore... per spiegazioni e tutto, sono qui
    
    #include <iostream>
    #include <cstdlib>
    
    using namespace std;
    const int nmax=100;
    //prototipi di funzioni
    void letturavettore (int v[],int r);
    void trovaotto (int v[], int n);
    int somma (int v[], int n);
    float mediavoti (float s,int n);
    void stampamedia (float media);                           
    //programma per la media dei voti
    int main()
    {
    int v[nmax];
    int n;
    float s, media;
    do
    {
       cout<<" inserisci la dimesione del vettore"<<endl;
       cin>> n;
       }
       while (n>nmax);
       letturavettore (v, n);
       trovaotto(v, n);
       s=somma(v,n);
       media=mediavoti(s, n);
       stampamedia(media);
       system ("PAUSE");
       return 0;
    }
    
    //funzione letturea vettore
    void letturavettore (int v[], int n)
    {
       for(int i=0; i<n; i++)
       {
          cout<< "inserisci il valore "<<i<<" :";
          cin>> v[i];
       }
    }
    //trova e stampa i valori di 8
    void trovaotto (int v[], int n)
    {
    int j=0;
    for (int i=0; i<n; i++)
       {
       if (v[i]==8)
       j++;
    }
    
    cout<<"gli otto sono  "<<j<<endl;
    }
    
    //somma dei voti, intero: essendo i voti interi, la somma deve essere un intero
    int somma(int v[],int n)
    {
       int s=0;			// non passata come argomento, dichiarata qui e inizializzata a 0
       for (int i=0; i<n; i++)
       {
          s=s+v[i];
       }
    	return s;		// passaggio di ritorno per valore
    }
    
    // media voti: ovviamente float
    float mediavoti (float s, int n)
    {
    	float media;
       media=s/n;			// variabile media dichiarata qui, non passata come argomento!!!
    	return media;
    }
    
    //stampa media
    
    void stampamedia(float media)
    {
       cout<<"la media dei voti e' "<<media<<endl;
    }
    
    
  • Re: Media voti in un vettore

    Ci ho messo troppo ad editare il mio post avevo risolto, non avevo modificato il programma principale adesso funziona ho aggiunto anche un controllo per non far inserire voti sopra il 10; i puntatori non potevo usarli in questo esercizio.
    grazie mille per l'aiuto.
Devi accedere o registrarti per scrivere nel forum
6 risposte