CAlcolare somma e media voti con due funzioni diverse- linguaggio C

di il
8 risposte

CAlcolare somma e media voti con due funzioni diverse- linguaggio C

Salve ragazzi, ho un dubbio più che un problema!
void AddGrades( int*ptr ){
	int i,grade[4];
 int total=0;

for(i=0;i<4;i++){
		printf("Inserisci voto num[%d]: ",i+1);
	scanf("%d",&grade[i]);
	}
	for(i=0;i<4;i++){
		total+=grade[i];
	}
	ptr=&total;
printf("\nIl totale dei voti inseriti e': %d",total);

return ;
}	

void Media( int *ptr){
	int media;

	media=(*ptr/4);
	printf("\nLa media dei voti vale: %d",media);
	return;
}
Il mio dubbio è questo: in questo codice devo usare due funzioni diverse una che calcoli la somma dei voti ed una altra che mi restituisca la media dei voti inseriti. I ho pensato che per ottenere lo stesso valore di "total" in Media(la funzione) avrei dovuto utilizzare un puntatore ma nell'esecuzione del programma la somma dei voti è corretta mentre la media risulta sballata! Potreste dirmi dove risiede lo sbaglio e se è giusto passare il parametro a Media per riferimento?

8 Risposte

  • Re: CAlcolare somma e media voti con due funzioni diverse- linguaggio C

    Per fare un'analisi dettagliata dovresti mostrare anche come e quando chiami la funzione Media.

    Penso comunque che parte dell'errore sia dovuto a questa assegnazione sbagliata nella funzione AddGrades:
    ptr=&total;
    Dovrebbe essere:
    
    *ptr=total;
  • Re: CAlcolare somma e media voti con due funzioni diverse- linguaggio C

    Grazie mille a chi ha risposto, posto il codice funzionante!
    
    //Programma che calcola somma e media voti, inseriti dall'utente, con  due funzioni separate
    
    #include<stdio.h>
    #include<stdlib.h>
     //il nome del vettore è un punatore al primo elemento
     //posso scrivere sia int *garde oppure int garde[] senza dimensioni però
    void AddGrades( int grade[], int *total,int n ){ 
    	
    	int i;
    
    for(i=0;i<n;i++){
    		printf("Inserisci voto num[%d]: ",i+1);
    	scanf("%d",&grade[i]);
    	*total+=garde[i];
    }
    	
    printf("\nIl totale dei voti inseriti e': %d",*total);
    
    return ;
    }	
    
    void Media( int *total){
    	
    	printf("\nLa media dei voti vale: %d",*total/4);
    	return;
    }
    
    int main(){
    int grade[4];
    int total=0;
    int n;
    
    printf("Digita quanti voti vuoi inserire: ");
    scanf("%d",&n);
    
    	AddGrades(grade,&total,n); //devo passare l'indirizzo di total perchè esso viene modificato da
                                 //0 ad un valore qualsiasi
    	Media(&total); //anche qui devo passare l'indirizzo di total
    	return 0;
    }
    
    
  • Re: CAlcolare somma e media voti con due funzioni diverse- linguaggio C

    Non funziona ... Ho inserito 3 voti e la media è sbagliata
  • Re: CAlcolare somma e media voti con due funzioni diverse- linguaggio C

    Andrebbero fatte delle correzioni, effettivamente anche io ho provato con 3 voti e la media è sbagliata.

    Inizierei da questo (ma penso sia un refuso altrimenti non capisco come potrebbe compilare) nome sbagliato dell'array che contiene i voti nella funzione AddGrades:

    *total+=garde;


    Nel main dovresti controllare che n non superi 4 dato che hai dichiarato che l'array grade ha una dimensione di 4:
    
    printf("Digita quanti voti vuoi inserire: ");
    	scanf("%d", &n);
    	
    	//aggiungere il controllo
    	//n supera 4?
    
    Per come è scritto il tuo codice non puoi inserire più di 4 voti altrimenti il programma va in crash, se vuoi renderlo davvero configurabile devi allocare l'array grade dinamicamente in base alla dimensione che inserisce l'utente quando leggi n.

    Ultimo consiglio che dovrebbe farti capire dove sbagli: La funzione media dovrebbe prendere il numero di voti altrimenti la divisione viene fatta sempre per 4.
  • Re: CAlcolare somma e media voti con due funzioni diverse- linguaggio C

    In realtà il codice andrebbe scritto diversamente.

    L'input dei dati non va fatto nelle funzioni ma nel main.

    Le funzioni devono restituire il valore richiesto, non devi utilizzare puntatori tra i parametri.
    Le funzioni devono accettare

    - vettore e numero di voti (la prima)
    - totale voti e numero voti (la seconda)

    Puoi chiamare la prima passando il risultato alla seconda.
  • Re: CAlcolare somma e media voti con due funzioni diverse- linguaggio C

    Si potrebbe anche evitare di usare l'array, sommando i valori man mano che vengono immessi. Inoltre, visto che si deve calcolare una media che difficilmente sarà un valore intero, credo che sarebbe meglio usare un double o, al limite, un float.
    double inserimento_voti( unsigned int qVoti ) {
        double voto, totale;
        unsigned int i;
    
        for( totale=0.0, i=0; i<qVoti; ++i ) {
            printf( "Inserisci voto num[%u]: ", i+1 );
            scanf( "%lf", &voto );
            totale += voto; /* accumula il nuovo voto nel totale */
        }
    
        return totale;
    }
  • Re: CAlcolare somma e media voti con due funzioni diverse- linguaggio C

    @AldoBaldo, di potrebbe, MA:
    1) cosi' non usi il vettore
    2) cosi' non puoi calcolare un'altra quantita' importante in statistica (non e' un esercizio di statistica, ma la quantita' e' importante lo stesso quando si parla di media), e cioe' la deviazionr standard (Wikipedia!)
    3) oltre a: quale 'e il voto massimo, il minimo, la moda, la mediana, ecc...

    Tutti valori che si potrebbero calcolare nel ciclo, MA

    4) dove sta scritto che l'UNICO MODO per ottenere quei valori, su cui calcolare la media) sia da tastiera?

    Conviene avere funzioni diverse
  • Re: CAlcolare somma e media voti con due funzioni diverse- linguaggio C

    Vero, la possibilità che evidenziavo serve solo nel caso specifico. Ne sono consapevole. Difficilmente questi esercizi hanno una vera utilità, credo siano più che altro stimoli per spingere a fare delle "prove" e capire certi meccanismi. Per dire, io eviterei addirittura l'input da tastiera e lo sostituirei con la lettura di dati da un file di testo, però magari la consegna dell'esercizio non lo prevedeva.
Devi accedere o registrarti per scrivere nel forum
8 risposte