ESERCIZIO IN C - MATRICE

di il
23 risposte

23 Risposte - Pagina 2

  • Re: ESERCIZIO IN C - MATRICE

    Se fai le divisioni dentro al for è normale...
    Prova a risolvere l'esercizio carta e penna per una matrice 3x3
  • Re: ESERCIZIO IN C - MATRICE

    Weierstrass ha scritto:


    Prova a risolvere l'esercizio carta e penna per una matrice 3x3
    ... prima che arrivi Rubik ...
  • Re: ESERCIZIO IN C - MATRICE

    Sono molto soddisfatto dei progressi, il tuo nuovo codice anche se ha dei piccoli errori, ha la sua logica e sopratutto funziona.
    Nel tuo nuovo codice, ho inserito altre indicazioni e spiegazioni.
    
    #include <stdlib.h>
    #include <stdio.h>
    #include <stdlib.h>
    #define RIG 40
    #define COL 10
    
    int main() {
        float M[RIG][COL];
        int R,C,i,j;
        float somma_studente[RIG],somma_compiti[COL];
        float media_studente[RIG],media_compiti[COL],media_totale;
        somma_studente[RIG]=0; // l'indice RIG non esiste (gli indici vanno da 0 a 39), meglio azzerare tutto il vettore
        somma_compiti[COL]=0; // come sopra
        media_studente[RIG]=0; // come sopra
        media_compiti[COL]=0; // come sopra
        media_totale=0;
    
        printf("Inserire il numero di studenti che hanno sostenuto le prove: ");
        scanf("%d",&R);
        printf("Inserire il numero di compiti svolti durante l'anno: ");
        scanf("%d",&C);
    
        /*costruzione della matrice*/
        for(i=0;i<R;i++){
            printf("Immettere le valutazione per il seguente studente %d\n",i+1);
            for(j=0;j<C;j++) {
                printf("Quali sono le valutazioni per il seguente studente %d? ",i+1);
                scanf("%f",&M[i][j]);
            }
        }
    
        /*Calcolare la media di ogni studente*/
        for(i=0;i<R;i++){
            for(j=0;j<C;j++){
                somma_studente[i]=somma_studente[i]+M[i][j];
                media_studente[i]=somma_studente[i]/C; // calcoli inutilmente j volte sempre la stessa media, il risultato è corretto lo stesso
            }
        }
    
        printf("RISULTATO PER STUDENTE\n");
        for(i=0;i<R;i++){ // qui cicli gli studenti ok
            for(j=0;j<C;j++){ // il ciclo j, ti ripete inutilmente l'output, toglilo
                printf("La media dello studente %d e': %2.2f\n",i+1,media_studente[i]);
            }
        }
    
    /*Calcolare la media di ogni compito*/
         for(j=0;j<C;j++){
            for(i=0;i<R;i++){
                somma_compiti[j]=somma_compiti[j]+M[i][j];
                media_compiti[j]=somma_compiti[j]/R; // calcoli inutilmente i volte la stessa media, il risultato è corretto lo stesso
            }
        }
    
        printf("RISULTATO PER COMPITO\n");
        for(j=0;j<C;j++){ // qui cicli i compiti ok
            for(i=0;i<R;i++){ // il ciclo i, ti ripete inutilmente l'output, toglilo
                printf("La media del compito %d e': %2.2f\n",j+1,media_compiti[j]);
            }
        }
    
        // questo è sbagliato, quanto valgono i e J ???
        // per fare la media totale devi fare un nuovo ciclo for o utilizzare uno dei precedenti (media di ogni compito o media di ogni studente)
        media_totale=(media_studente[i]+media_compiti[j])/(R*C);
        printf("La media totale dei compiti svolti dagli studenti durante l'anno e': %2.2f",media_totale);
    
        return 0;
    }
    
    Un vettore è meglio azzerarlo in fase di dichiarazione così:
    
    float somma_studente[RIG] = {0}
    
  • Re: ESERCIZIO IN C - MATRICE

    #include <stdio.h>
    #include <stdlib.h>
    #define RIG 40
    #define COL 10
    
    int main() {
        float M[RIG][COL];
        int R,C,i,j;
        float somma_studente[RIG]={0},somma_compiti[COL]={0};
        float media_studente[RIG]={0},media_compiti[COL]={0},media_totale=0;
    
        printf("Inserire il numero di studenti che hanno sostenuto le prove: ");
        scanf("%d",&R);
        printf("Inserire il numero di compiti svolti durante l'anno: ");
        scanf("%d",&C);
        
        /*costruzione della matrice*/
        for(i=0;i<R;i++){
            printf("Immettere le valutazione per il seguente studente %d\n",i+1);
            for(j=0;j<C;j++) {
                printf("Quali sono le valutazioni per il seguente studente %d? ",i+1);
                scanf("%f",&M[i][j]);
            }
        }
        
        /*Calcolare la media di ogni studente*/
        for(i=0;i<R;i++){
            for(j=0;j<C;j++){
                somma_studente[i]=somma_studente[i]+M[i][j];
                media_studente[i]=somma_studente[i]/C;
            }
        }
        
        printf("RISULTATO PER STUDENTE\n");
        for(i=0;i<R;i++){
            for(j=0;j<C;j++){
                printf("La media dello studente %d e': %2.2f\n",i+1,media_studente[i]);
            }
        }
        
    /*Calcolare la media di ogni compito*/
         for(j=0;j<C;j++){
            for(i=0;i<R;i++){
                somma_compiti[j]=somma_compiti[j]+M[i][j];
                media_compiti[j]=somma_compiti[j]/R;
            }
        }    
        
        printf("RISULTATO PER COMPITO\n");
        for(j=0;j<C;j++){
            for(i=0;i<R;i++){
                printf("La media del compito %d e': %2.2f\n",j+1,media_compiti[j]);
            }
        }
        
        /*calcolare media totale*/
        for(i=0;i<R;i++){
            for(j=0;j<C;j++){
                media_totale=(media_studente[i]+media_compiti[j])/(R*C);
                printf("La media totale dei compiti svolti dagli studenti durante l'anno e': %2.2f",media_totale);
            }
        }
               
        return 0;
    }
  • Re: ESERCIZIO IN C - MATRICE

    Riscontro sempre i stessi problemi per giunta eliminando i ciclici che si ripetono inutilmente ripete all'infinito la media e'
  • Re: ESERCIZIO IN C - MATRICE

    Riscontro che sei arrivato alla fine, l'unico errore sta nel fatto che non consideri che se metti printf all'interno di un ciclo, il printf viene ripetuto.
    Per la media totale devi prima sommare tutti i voti di tutti gli studenti, ma il calcolo che hai impostato è giusto.
    riposto sempre il tuo codice con le indicazioni, vedrai che questa volta ci sei.
    
    #include <stdio.h>
    #include <stdlib.h>
    #define RIG 40
    #define COL 10
    
    int main() {
        float M[RIG][COL];
        int R,C,i,j;
        float somma_studente[RIG]={0},somma_compiti[COL]={0};
        float media_studente[RIG]={0},media_compiti[COL]={0},media_totale=0;
    
        printf("Inserire il numero di studenti che hanno sostenuto le prove: ");
        scanf("%d",&R);
        printf("Inserire il numero di compiti svolti durante l'anno: ");
        scanf("%d",&C);
    
        /*costruzione della matrice*/
        for(i=0;i<R;i++){
            printf("Immettere le valutazione per il seguente studente %d\n",i+1);
            for(j=0;j<C;j++) {
                printf("Quali sono le valutazioni per il seguente studente %d? ",i+1);
                scanf("%f",&M[i][j]);
            }
        }
    
        /*Calcolare la media di ogni studente*/
        float somma_voti = 0; //ti occorre una variabile per parcheggiare tutti i voti
        for(i=0;i<R;i++){
            for(j=0;j<C;j++){
                somma_studente[i]=somma_studente[i]+M[i][j];
                media_studente[i]=somma_studente[i]/C; // questa riga dopo la parentesi graffa, il risultato non cambia ma verrà calcolata una sola volta
            }
            somma_voti=somma_voti+somma_studente[i]; // tutti i voti presi da tutti gli studenti
        }
    
        printf("RISULTATO PER STUDENTE\n");
        for(i=0;i<R;i++){
            for(j=0;j<C;j++){ // questo ciclo è inutile, stampa C volte la media dello studente
                printf("La media dello studente %d e': %2.2f\n",i+1,media_studente[i]);
            }
        }
    
    /*Calcolare la media di ogni compito*/
         for(j=0;j<C;j++){
            for(i=0;i<R;i++){
                somma_compiti[j]=somma_compiti[j]+M[i][j];
                media_compiti[j]=somma_compiti[j]/R; // questa riga dopo la parentesi graffa, il risultato non cambia ma verrà calcolata una sola volta
            }
        }
    
        printf("RISULTATO PER COMPITO\n");
        for(j=0;j<C;j++){
            for(i=0;i<R;i++){ // questo ciclo è inutile, stampa R volte la media del compito
                printf("La media del compito %d e': %2.2f\n",j+1,media_compiti[j]);
            }
        }
    
        /*calcolare media totale
        for(i=0;i<R;i++){
            for(j=0;j<C;j++){
                media_totale=(media_studente[i]+media_compiti[j])/(R*C);
                printf("La media totale dei compiti svolti dagli studenti durante l'anno e': %2.2f",media_totale); // questo printf viene stampato C volte, va alla fine
            }
        } */
        // il calcolo lo avevi fatto giusto, ma non avevi preso tutti i voti
        media_totale=somma_voti/(R*C);
        printf("\nLa media totale dei compiti svolti dagli studenti durante l'anno e': %2.2f\n",media_totale);
    
        return 0;
    }
    
  • Re: ESERCIZIO IN C - MATRICE

    Ti ringrazio infinitamente del tuo aiuto
    #include <stdio.h>
    #include <stdlib.h>
    #define RIG 40
    #define COL 10
    
    int main() {
        float M[RIG][COL];
        int R,C,i,j;
        float somma_studente[RIG]={0},somma_compiti[COL]={0};
        float media_studente[RIG]={0},media_compiti[COL]={0},media_totale=0;
    
        printf("Inserire il numero di studenti che hanno sostenuto le prove: ");
        scanf("%d",&R);
        printf("Inserire il numero di compiti svolti durante l'anno: ");
        scanf("%d",&C);
        
        /*Costruzione della matrice*/
        for(i=0;i<R;i++){
            printf("Immettere le valutazione per il seguente studente %d\n",i+1);
            for(j=0;j<C;j++){
                printf("Quali sono le valutazioni per il seguente studente %d? ",i+1);
                scanf("%f",&M[i][j]);
            }
        }
        
        /*Calcolare la media di ogni studente*/
        float somma_voti=0;
        for(i=0;i<R;i++){
            for(j=0;j<C;j++){
                somma_studente[i]=somma_studente[i]+M[i][j];
            }
            somma_voti=somma_voti+somma_studente[i];
            media_studente[i]=somma_studente[i]/C;
            printf("La media dello studente %d e': %2.2f\n",i+1,media_studente[i]);
        }
        
        /*Calcolare la media di ogni compito*/
        for(j=0;j<C;j++){
            for(i=0;i<R;i++){
                somma_compiti[j]=somma_compiti[j]+M[i][j];
            }
            media_compiti[j]=somma_compiti[j]/R;
            printf("\nLa media del compito %d e': %2.2f",j+1,media_compiti[j]);
        }
        
        /*Calcolare media totale*/
        for(i=0;i<R;i++){
            for(j=0;j<C;j++){
                media_totale=somma_voti/(R*C);
            }
        }
        printf("\nLa media totale dei compiti svolti dagli studenti durante l'anno e': %2.2f\n",media_totale);
        
        return 0;
    }
  • Re: ESERCIZIO IN C - MATRICE

    Il calcolo della media totale va fatto una sola volta. Cosa c'entrano quei due cicli?
  • Re: ESERCIZIO IN C - MATRICE

    MarcoTopone ha scritto:


    Ti ringrazio infinitamente del tuo aiuto
    Il miglioramento si nota, hai anche inglobato la stampa nei for di tua iniziativa, bene così.

    Come già ti ha fatto notare oregon, il ciclo nidificato che fai nel calcolo della media è inutile:
    
        /*Calcolare media totale*/
        for(i=0;i<R;i++){
            for(j=0;j<C;j++){
                media_totale=somma_voti/(R*C);
            }
        }
    
    Listruzione che calcola la media è unica e è sufficiente eseguirla una sola volta, invece con i cicli la riesegui inutilmente R*C volte, metti l'istruzione senza i for e vedrai che il risultato non cambia:
    
    media_totale=somma_voti/(R*C);
    
    Non ti fermare qui, l'ultimo errore denota una non perfetta comprensione del flusso di un programma, o distrazione. Riguarda il codice in modo da assimilare bene quello che fa, se ti va, migliora anche l'output inserendo delle righe vuote tra input e output, e tra output diversi.
Devi accedere o registrarti per scrivere nel forum
23 risposte