Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Ricerca personalizzata

Linguaggio C: errore che non riesco a spiegarmi

Linguaggi e sistemi

Moderatore: Foto UtentePaolino

0
voti

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

Messaggioda Foto UtenteLuigi97 » 16 lug 2017, 22: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 487 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
20 3
 
Messaggi: 35
Iscritto il: 17 giu 2017, 15:35

0
voti

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

Messaggioda Foto Utentewruggeri » 16 lug 2017, 22: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.
Si, nei limiti delle mie capacità ti rispondo... ma per favore, impara l'italiano!
Se non conosci un argomento, non parlarne.
Gli unici fatti scientifici sono quelli accertati dagli studi. Il resto è opinione.
GATTINI A TORINO
Avatar utente
Foto Utentewruggeri
2.368 1 5 13
Expert EY
Expert EY
 
Messaggi: 448
Iscritto il: 25 nov 2016, 17:46

0
voti

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

Messaggioda Foto Utentebanjoman » 16 lug 2017, 23: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.003 3 8 11
Master EY
Master EY
 
Messaggi: 964
Iscritto il: 19 set 2013, 18:27

1
voti

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

Messaggioda Foto UtenteLuigi97 » 17 lug 2017, 7: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
20 3
 
Messaggi: 35
Iscritto il: 17 giu 2017, 15:35

0
voti

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

Messaggioda Foto Utentewruggeri » 17 lug 2017, 8: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;
}
Si, nei limiti delle mie capacità ti rispondo... ma per favore, impara l'italiano!
Se non conosci un argomento, non parlarne.
Gli unici fatti scientifici sono quelli accertati dagli studi. Il resto è opinione.
GATTINI A TORINO
Avatar utente
Foto Utentewruggeri
2.368 1 5 13
Expert EY
Expert EY
 
Messaggi: 448
Iscritto il: 25 nov 2016, 17:46


Torna a PC e informatica

Chi c’è in linea

Visitano il forum: Nessuno e 4 ospiti