Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Linguaggio C: errore che non riesco a spiegarmi

Linguaggi e sistemi

Moderatori: Foto UtentePaolino, Foto UtenteMassimoB

0
voti

[1] Linguaggio C: errore che non riesco a spiegarmi

Messaggioda Foto UtenteLuigi97 » 16 lug 2017, 23:02

Eccomi di nuovo alle prese con il linguaggio C, ed ecco un altro errore che non riesco a spiegarmi.
Il programma è il seguente:
Codice: Seleziona tutto
#include <stdio.h>
#include <stdlib.h>

/*Scrivere un programma che chieda di inserire i voti di n studenti per n prove, che visualizzi i voti di ogni
studente e che infine calcoli la media di ogni studente, la media per ogni prova e la media totale*/

#define MAXSTUDENTI 99
#define MAXPROVE 10

int main(void) {
int studenti, prove, x, y;
float matrice[MAXSTUDENTI][MAXPROVE];
float vettore1[MAXSTUDENTI], vettore2[MAXPROVE];/*la variabile vettore2[MAXPROVE] serve per cacolare la media
delle prove. Ho scelto come sua grandezza "MAXPROVE" in modo da evitare che sia più piccolo del valore che
immetterà l'utente tramite la variabile "prove".*/
float mediatotale = 0;

printf("Inserisci il numero totale degli studenti: ");
scanf("%d", &studenti);
if(studenti>MAXSTUDENTI || studenti<2) {
do {
printf("Numero di studenti non valido. Inserisci un numero valido: ");
scanf("%d", &studenti);
}while(studenti>MAXSTUDENTI || studenti<2);   
}
printf("Inserisci il numero di prove per ogni studente: ");
scanf("%d", &prove);
if(prove>MAXPROVE || prove<1) {
do {
printf("Numero di prove non valido. Inserisci un numero valido: ");
scanf("%d", &prove);
}while(prove>MAXPROVE || prove<1);   
}

for(x=0; x<studenti; x++) {
printf("\nStudente n.%2d\n", x+1);   
for(y=0; y<prove; y++) {
printf("Inserisci il voto della prova n.%2d:  ", y+1);
scanf("%f", &matrice[x][y]);
if(matrice[x][y]>10 || matrice[x][y]<0) {
do {
printf("Voto non valido. Inserisci un voto valido:  ");
scanf("%f", &matrice[x][y]);   
}while(matrice[x][y]>10 || matrice[x][y]<0);   
}
mediatotale += matrice[x][y];   
}   
}

printf("\nTABELLA");
for(x=0; x<studenti; x++) {
printf("\nVoti dello studente n.%2d: ", x+1);
for(y=0; y<prove; y++) {
printf("%5.1f", matrice[x][y]);
}   
}

/*Cacolo media dello studente*/
for(x=0; x<studenti; x++) {
for(y=0; y<prove; y++) {
vettore1[x] += matrice[x][y];   
}   
}
printf("\n\nMEDIA DEGLI STUDENTI");
for(x=0; x<studenti; x++) {
printf("\nMedia dello studente n.%2d: %5.1f", x+1, vettore1[x]/prove);      
}

/*Calcolo media per prova*/
/*Inverto le colonne della matrice con le sue righe in modo da portarmi tutti i valori delle colonne sulle righe,
cosicché posso raccogliere i valori delle colonne in vettore2[y]*/
for(y=0; y<prove; y++) {
for(x=0; x<studenti; x++) {
vettore2[y] += matrice[x][y];    
}   
}
printf("\n\nMEDIA DELLE PROVE");
for(y=0; y<prove; y++) {
printf("\nMedia delle prove n.%2d: %5.1f", y+1, vettore2[y]/studenti);   
}

printf("\n\nMEDIA TOTALE\nLa media totale e': %4.1f\n", mediatotale/(prove*studenti));


   return 0;
}

Ciò che non funziona bene è quando stampa il valore della media delle prove numero 3. La media delle altre prove le stampa bene, mentre riguardo alla media delle prove numero 3 stampa un numero che non centra niente.
Esempio:
Immagine.png
Immagine.png (9.88 KiB) Osservato 788 volte

Da che dipende? Computer stregato o cosa?

Tale programma è dato come esercizio in un pdf che sto leggendo (è sempre lo stesso pdf :-P), il quale, suggeriva di: "si utilizzi una matrice di 19 linee e 9 colonne dove nelle prime otto vengono memorizzati in ciascuna linea i voti di uno studente e nella nona la rispettiva media; nella diciannovesima linea viene invece memorizzata la media per prova."
Alla fine però non ho capito cosa intendeva... di conseguenza ho fatto a modo mio... e a quanto pare non è andata a buon fine! Aiutino?
Avatar utente
Foto UtenteLuigi97
40 4
 
Messaggi: 49
Iscritto il: 17 giu 2017, 16:35

0
voti

[2] Re: Linguaggio C: errore che non riesco a spiegarmi

Messaggioda Foto Utentewruggeri » 16 lug 2017, 23:42

Non hai inizializzato gli elementi dei vettori che usi per il calcolo delle medie.
Un errore banale, ma che purtroppo capita anche a programmatori esperti... ti propongo il codice corretto (ho commentato le poche parti che ho modificato):

Codice: Seleziona tutto
#include <stdio.h>
#include <stdlib.h>

/*Scrivere un prgramma che chieda di inserire i voti di n studenti per n prove, che visualizzi i voti di ogni
studente e che infine calcoli la media di ogni studente, la media per ogni prova e la media totale*/

#define MAXSTUDENTI 99
#define MAXPROVE 10

int main(void) {
int studenti, prove, x, y;
float matrice[MAXSTUDENTI][MAXPROVE];
float vettore1[MAXSTUDENTI], vettore2[MAXPROVE];/*la variabile vettore2[MAXPROVE] serve per cacolare la media
delle prove. Ho scelto come sua grandezza "MAXPROVE" in modo da evitare che sia più piccolo del valore che
immetterà l'utente tramite la variabile "prove".*/
float mediatotale = 0;

printf("Inserisci il numero totale degli studenti: ");
scanf("%d", &studenti);
if(studenti>MAXSTUDENTI || studenti<2) {
do {
printf("Numero di studenti non valido. Inserisci un numero valido: ");
scanf("%d", &studenti);
}while(studenti>MAXSTUDENTI || studenti<2);   
}
printf("Inserisci il numero di prove per ogni studente: ");
scanf("%d", &prove);
if(prove>MAXPROVE || prove<1) {
do {
printf("Numero di prove non valido. Inserisci un numero valido: ");
scanf("%d", &prove);
}while(prove>MAXPROVE || prove<1);   
}

for(x=0; x<studenti; x++) {
printf("\nStudente n.%2d\n", x+1);   
for(y=0; y<prove; y++) {
printf("Inserisci il voto della prova n.%2d:  ", y+1);
scanf("%f", &matrice[x][y]);
if(matrice[x][y]>10 || matrice[x][y]<0) {
do {
printf("Voto non valido. Inserisci un voto valido:  ");
scanf("%f", &matrice[x][y]);   
}while(matrice[x][y]>10 || matrice[x][y]<0);   
}
mediatotale += matrice[x][y];   
}   
}

printf("\nTABELLA");
for(x=0; x<studenti; x++) {
printf("\nVoti dello studente n.%2d: ", x+1);
for(y=0; y<prove; y++) {
printf("%5.1f", matrice[x][y]);
}   
}

/*Cacolo media dello studente*/
for(x=0; x<studenti; x++) {
for(y=0; y<prove; y++) {
vettore1[x] += matrice[x][y];   
}   
}
printf("\n\nMEDIA DEGLI STUDENTI");
for(x=0; x<studenti; x++) {
printf("\nMedia dello studente n.%2d: %5.1f", x+1, vettore1[x]/prove);     
}

/*Calcolo media per prova*/
/*Inverto le colonne della matrice con le sue righe in modo da portarmi tutti i valori delle colonne sulle righe,
cosicché posso raccogliere i valori delle colonne in vettore2[y]*/
for(y=0; y<prove; y++) {
for(x=0; x<studenti; x++) {
vettore2[y] += matrice[x][y];   
}   
}
printf("\n\nMEDIA DELLE PROVE");
for(y=0; y<prove; y++) {
printf("\nMedia delle prove n.%2d: %5.1f", y+1, vettore2[y]/studenti);   
}

printf("\n\nMEDIA TOTALE\nLa media totale e': %4.1f\n", mediatotale/(prove*studenti));


   return 0;
}



Già che ci siamo: posso farti un appunto? Non scrivi del brutto codice (forse è un po' verboso, ma per un programmatore poco esperto è naturale), e lo commenti adeguatamente (forse qualche commento in più sarebbe gradito, ma tutto sommato ci siamo)... ma dai alle variabili dei nomi assolutamente impropri: roba come "vettore1" o "matrice" non dovrebbe mai e poi mai comparire nel codice. I nomi delle variabili devono far capire subito il loro significato.
Rispondo solo a chi si esprime correttamente in italiano.
Se non conosci un argomento, non parlarne.
Gli unici fatti sono quelli dimostrabili, il resto è opinione.
Non dirò una parola sulla politica e sul M5S, del quale aspetto solo l'estinzione.
Avatar utente
Foto Utentewruggeri
3.882 1 6 13
Expert EY
Expert EY
 
Messaggi: 707
Iscritto il: 25 nov 2016, 18:46

0
voti

[3] Re: Linguaggio C: errore che non riesco a spiegarmi

Messaggioda Foto Utentebanjoman » 17 lug 2017, 0:00

Come dice Foto Utentewruggeri, non hai inizializzato gli array, che nel tuo caso devono contenere tutti zeri.
Nel tuo caso puoi scrivere ad esempio:

Codice: Seleziona tutto
float vettore1[MAXSTUDENTI] = {0.};


E cosi' via.

Solo le variabili statiche o globali sono automaticamente inizializzate a zero.

O_/
Se funziona quasi bene, è tutto sbagliato. A.Savatteri/M.Mazza
Avatar utente
Foto Utentebanjoman
6.358 5 8 11
Master EY
Master EY
 
Messaggi: 1018
Iscritto il: 19 set 2013, 19:27

1
voti

[4] Re: Linguaggio C: errore che non riesco a spiegarmi

Messaggioda Foto UtenteLuigi97 » 17 lug 2017, 8:47

wruggeri ha scritto:Non hai inizializzato gli elementi dei vettori che usi per il calcolo delle medie.

#-o di solito le variabili per calcolare una media le inizializzo sempre a zero, non so perché con quelle due ho fatto un'eccezione! E io che pensavo chissà che errore fosse...

wruggeri ha scritto:ti propongo il codice corretto (ho commentato le poche parti che ho modificato):
Codice: Seleziona tutto
#include <stdio.h>
#include <stdlib.h>

/*Scrivere un prgramma che chieda di inserire i voti di n studenti per n prove, che visualizzi i voti di ogni
studente e che infine calcoli la media di ogni studente, la media per ogni prova e la media totale*/

#define MAXSTUDENTI 99
#define MAXPROVE 10

int main(void) {
int studenti, prove, x, y;
float matrice[MAXSTUDENTI][MAXPROVE];
float vettore1[MAXSTUDENTI], vettore2[MAXPROVE];/*la variabile vettore2[MAXPROVE] serve per cacolare la media
delle prove. Ho scelto come sua grandezza "MAXPROVE" in modo da evitare che sia più piccolo del valore che
immetterà l'utente tramite la variabile "prove".*/
float mediatotale = 0;

printf("Inserisci il numero totale degli studenti: ");
scanf("%d", &studenti);
if(studenti>MAXSTUDENTI || studenti<2) {
do {
printf("Numero di studenti non valido. Inserisci un numero valido: ");
scanf("%d", &studenti);
}while(studenti>MAXSTUDENTI || studenti<2);   
}
printf("Inserisci il numero di prove per ogni studente: ");
scanf("%d", &prove);
if(prove>MAXPROVE || prove<1) {
do {
printf("Numero di prove non valido. Inserisci un numero valido: ");
scanf("%d", &prove);
}while(prove>MAXPROVE || prove<1);   
}

for(x=0; x<studenti; x++) {
printf("\nStudente n.%2d\n", x+1);   
for(y=0; y<prove; y++) {
printf("Inserisci il voto della prova n.%2d:  ", y+1);
scanf("%f", &matrice[x][y]);
if(matrice[x][y]>10 || matrice[x][y]<0) {
do {
printf("Voto non valido. Inserisci un voto valido:  ");
scanf("%f", &matrice[x][y]);   
}while(matrice[x][y]>10 || matrice[x][y]<0);   
}
mediatotale += matrice[x][y];   
}   
}

printf("\nTABELLA");
for(x=0; x<studenti; x++) {
printf("\nVoti dello studente n.%2d: ", x+1);
for(y=0; y<prove; y++) {
printf("%5.1f", matrice[x][y]);
}   
}

/*Cacolo media dello studente*/
for(x=0; x<studenti; x++) {
for(y=0; y<prove; y++) {
vettore1[x] += matrice[x][y];   
}   
}
printf("\n\nMEDIA DEGLI STUDENTI");
for(x=0; x<studenti; x++) {
printf("\nMedia dello studente n.%2d: %5.1f", x+1, vettore1[x]/prove);     
}

/*Calcolo media per prova*/
/*Inverto le colonne della matrice con le sue righe in modo da portarmi tutti i valori delle colonne sulle righe,
cosicché posso raccogliere i valori delle colonne in vettore2[y]*/
for(y=0; y<prove; y++) {
for(x=0; x<studenti; x++) {
vettore2[y] += matrice[x][y];   
}   
}
printf("\n\nMEDIA DELLE PROVE");
for(y=0; y<prove; y++) {
printf("\nMedia delle prove n.%2d: %5.1f", y+1, vettore2[y]/studenti);   
}

printf("\n\nMEDIA TOTALE\nLa media totale e': %4.1f\n", mediatotale/(prove*studenti));


   return 0;
}


Il codice sembra essere lo stesso che ho postato io. Comunque ho capito cosa dicevi, ho inizializzato i vettori a 0 e adesso il programma funziona bene :ok:

Grazie a tutti, grazie anche per i consigli.

O_/
Avatar utente
Foto UtenteLuigi97
40 4
 
Messaggi: 49
Iscritto il: 17 giu 2017, 16:35

0
voti

[5] Re: Linguaggio C: errore che non riesco a spiegarmi

Messaggioda Foto Utentewruggeri » 17 lug 2017, 9:09

Luigi97 ha scritto:Il codice sembra essere lo stesso che ho postato io.


Lo è: ho solo aggiunto un paio di righe per la corretta inizializzazione, così da farlo funzionare e mostrarti dove avevi sbagliato :ok:

EDIT: avevo ricopiato il tuo codice, invece della mia versione corretta :mrgreen: Ecco qui il codice "giusto", anche se ormai non serve più:

Codice: Seleziona tutto
#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <stdlib.h>

/*Scrivere un prgramma che chieda di inserire i voti di n studenti per n prove, che visualizzi i voti di ogni
studente e che infine calcoli la media di ogni studente, la media per ogni prova e la media totale*/

#define MAXSTUDENTI 99
#define MAXPROVE 10

int main(void) {
   int studenti, prove, x, y;
   float matrice[MAXSTUDENTI][MAXPROVE];
   float vettore1[MAXSTUDENTI], vettore2[MAXPROVE];/*la variabile vettore2[MAXPROVE] serve per cacolare la media
                                       delle prove. Ho scelto come sua grandezza "MAXPROVE" in modo da evitare che sia più piccolo del valore che
                                       immetterà l'utente tramite la variabile "prove".*/
   float mediatotale = 0;

   printf("Inserisci il numero totale degli studenti: ");
   scanf("%d", &studenti);
   if (studenti>MAXSTUDENTI || studenti<2) {
      do {
         printf("Numero di studenti non valido. Inserisci un numero valido: ");
         scanf("%d", &studenti);
      } while (studenti>MAXSTUDENTI || studenti<2);
   }
   printf("Inserisci il numero di prove per ogni studente: ");
   scanf("%d", &prove);
   if (prove>MAXPROVE || prove<1) {
      do {
         printf("Numero di prove non valido. Inserisci un numero valido: ");
         scanf("%d", &prove);
      } while (prove>MAXPROVE || prove<1);
   }

   for (x = 0; x<studenti; x++) {
      printf("\nStudente n.%2d\n", x + 1);
      for (y = 0; y<prove; y++) {
         printf("Inserisci il voto della prova n.%2d:  ", y + 1);
         scanf("%f", &matrice[x][y]);
         if (matrice[x][y]>10 || matrice[x][y]<0) {
            do {
               printf("Voto non valido. Inserisci un voto valido:  ");
               scanf("%f", &matrice[x][y]);
            } while (matrice[x][y]>10 || matrice[x][y]<0);
         }
         mediatotale += matrice[x][y];
      }
   }

   printf("\nTABELLA");
   for (x = 0; x<studenti; x++) {
      printf("\nVoti dello studente n.%2d: ", x + 1);
      for (y = 0; y<prove; y++) {
         printf("%5.1f", matrice[x][y]);
      }
   }

   /*Cacolo media dello studente*/
   for (x = 0; x<studenti; x++) {
      for (y = 0; y<prove; y++) {
         if (y != 0)
            vettore1[x] += matrice[x][y];
         else
            vettore1[x] = matrice[x][y]; /*Se stiamo valutando il primo numero da sommare, usiamolo per inizializzare la cella del vettore*/
      }
   }
   printf("\n\nMEDIA DEGLI STUDENTI");
   for (x = 0; x<studenti; x++) {
      printf("\nMedia dello studente n.%2d: %5.1f", x + 1, vettore1[x] / prove);
   }

   /*Calcolo media per prova*/
   /*Inverto le colonne della matrice con le sue righe in modo da portarmi tutti i valori delle colonne sulle righe,
   cosicché posso raccogliere i valori delle colonne in vettore2[y]*/
   for (y = 0; y<prove; y++) {
      vettore2[y] = 0; /*Inizializziamo l'elemento del vettore*/
      for (x = 0; x<studenti; x++) {
         vettore2[y] += matrice[x][y];
      }
   }
   printf("\n\nMEDIA DELLE PROVE");
   for (y = 0; y<prove; y++) {
      printf("\nMedia delle prove n.%2d: %5.1f", y + 1, vettore2[y] / studenti);
   }

   printf("\n\nMEDIA TOTALE\nLa media totale e': %4.1f\n", mediatotale / (prove*studenti));


   return 0;
}
Rispondo solo a chi si esprime correttamente in italiano.
Se non conosci un argomento, non parlarne.
Gli unici fatti sono quelli dimostrabili, il resto è opinione.
Non dirò una parola sulla politica e sul M5S, del quale aspetto solo l'estinzione.
Avatar utente
Foto Utentewruggeri
3.882 1 6 13
Expert EY
Expert EY
 
Messaggi: 707
Iscritto il: 25 nov 2016, 18:46


Torna a PC e informatica

Chi c’è in linea

Visitano il forum: Nessuno e 2 ospiti