PDA

Visualizza la versione completa : [C] Errore in caricamento voti studente, calcolo delle medie e stampa


elialongoni04
11-05-2012, 17:35
// data la struttura studente con nome cognome voto orale voto scritto voto pratico di informatica,caricare la struttura
//per ogni studente stampare la media,stampare lo studente con la media più alta,studente con voto più alto/basso
//dire pure quelli rimandati

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct{char nome [20];char cognome [20];float votoo;float votos;float votop;}studente;
main()
{
studente studenti[20];
int c,n=1,k,j,u,f,g;
float somma,media[20],media1,votooM,votooB,votosM,votosB,votopM,votopB;
char nome1[20],nome2[20],nome3[20];

for(c=0;c<3;c++)
{
printf("\nInserisci il nome,cognome del %d studente: ",n);
scanf("%s",studenti[c].nome);
scanf("%s",studenti[c].cognome);
printf("\nINserisci il voto:\n-Orale,\n-Scritto,\n-Pratico:\n");
scanf("%f",&studenti[c].votoo);
scanf("%f",&studenti[c].votos);
scanf("%f",&studenti[c].votop);
n++;
}
media[0]=(studenti[0].votoo+studenti[0].votos+studenti[0].votop)/3;
media1=media[0];

votooM=studenti[0].votoo;
votooB=studenti[0].votoo;
votosM=studenti[0].votos;
votosB=studenti[0].votos;
votopM=studenti[0].votop;
votopB=studenti[0].votop;

for(c=0;c<3;c++)
{
media[c]=(studenti[c].votoo+studenti[c].votos+studenti[c].votop)/3;
printf("\nLa media di %s %s e' %.2f",studenti[c].nome,studenti[c].cognome,media[c]);
if(media[c]>media1)
{
media1=media[c];
k=c;
}
}
printf("\nLa media piu' alta e' quella di %s %s con %.2f",studenti[k].nome,studenti[k].cognome,media1);

for(c=0;c<3;c++)
{
if(studenti[c].votoo>votooM)
{
votooM=studenti[c].votoo;
k=c;
}
if(studenti[c].votoo<votooB)
{
votooB=studenti[c].votoo;
n=c;
}
if(studenti[c].votos>votosM)
{
votosM=studenti[c].votos;
j=c;
}
if(studenti[c].votos<votosB)
{
votosB=studenti[c].votos;
u=c;
}
if(studenti[c].votop>votopM)
{
votopM=studenti[c].votop;
f=c;
}
if(studenti[c].votop<votopB)
{
votopB=studenti[c].votop;
g=c;
}
}
printf("\nVoto orale:\n-MAGGIORE: %s %s con %.1f;\n-MINORE: %s %s con %.1f;",studenti[k].nome,studenti[k].cognome,votooM,studenti[n].nome,studenti[n].cognome,votooB);
printf("\nVoto scritto:\n-MAGGIORE: %s %s con %.1f;\n-MINORE: %s %s con %.1f;",studenti[j].nome,studenti[j].cognome,votosM,studenti[u].nome,studenti[u].cognome,votosB);
printf("\nVoto pratico:\n-MAGGIORE: %s %s con %.1f;\n-MINORE: %s %s con %.1f;",studenti[f].nome,studenti[f].cognome,votopM,studenti[g].nome,studenti[g].cognome,votopB);
printf("\n\nSONO RIMANDATI:");
for(c=0;c<3;c++)
{
if(media[c]<5.5)
printf("\n- %s %s con %.2f ",studenti[c].nome,studenti[c ].cognome,media[c]);
}
system("pause");
}

visto che il problema ce l'ho ancora, ho dovuto aprire un'altra discussione visto che l'altra mi è stata chiusa,.il codice spero di averlo inserito giusto questa volta.come detto prima penso che il problema sia intorno alla riga 83 dove il programma va in crash..considerando che è la prima volta che mi succede non ho la minima idea di cosa scrivere come titolo della discussione e non so cosa cercare su google o in discussioni precedenti visto che non so quale sia il problema...spero che qualcuno sia in grado di risolvermi il problema considerando che il mio prof non sapeva nemmeno da dove partire ....

alka
11-05-2012, 17:40
Originariamente inviato da elialongoni04
non ho la minima idea di cosa scrivere come titolo della discussione

A me non pare difficile inserire nel titolo il contesto di ciò che si sta facendo o una descrizione sommaria del contenuto della discussione, al posto di "non riesco a capire il problema", ma siccome non ce la facciamo proprio ho provveduto io. :facepalm:

elialongoni04
11-05-2012, 18:15
Originariamente inviato da alka
A me non pare difficile inserire nel titolo il contesto di ciò che si sta facendo o una descrizione sommaria del contenuto della discussione, al posto di "non riesco a capire il problema", ma siccome non ce la facciamo proprio ho provveduto io. :facepalm:
non mi sembra nemmeno difficile capire che non sapevo il problema visto che non sono così esperto :| ...ora almeno so che è un problema di caricamento.

Scara95
11-05-2012, 18:34
A mio parere non hai inizializzato una variabile, tuttavia non ho voglia di cercarla...
Io ho semplicemente messo un'inizializzazione all'inizio e tolto un pezzo di inizializzazione inutile e ripetitivo, funziona correttamente, questo è il codice:

// data la struttura studente con nome cognome voto orale voto scritto voto pratico di informatica,caricare la struttura
//per ogni studente stampare la media,stampare lo studente con la media più alta,studente con voto più alto/basso
//dire pure quelli rimandati

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct{char nome [20];char cognome [20];float votoo;float votos;float votop;}studente;
main()
{
studente studenti[20];
int c,n=1,k,j,u,f,g;
float somma,media[20],media1=0,votooM=-1,votooB=111,votosM=-1,votosB=111,votopM=-1,votopB=111;

for(c=0;c<3;c++)
{
printf("\nInserisci il nome,cognome del %d studente: ",n);
scanf("%s",studenti[c].nome);
scanf("%s",studenti[c].cognome);
printf("\nINserisci il voto:\n-Orale,\n-Scritto,\n-Pratico:\n");
scanf("%f",&studenti[c].votoo);
scanf("%f",&studenti[c].votos);
scanf("%f",&studenti[c].votop);
n++;
}
for(c=0;c<3;c++)
{
media[c]=(studenti[c].votoo+studenti[c].votos+studenti[c].votop)/3;
printf("\nLa media di %s %s e' %.2f",studenti[c].nome, studenti[c].cognome, media[c]);
if(media[c]>media1)
{
media1=media[c];
k=c;
}
}
printf("\nLa media piu' alta e' quella di %s %s con %.2f",studenti[k].nome,studenti[k].cognome,media1);

for(c=0;c<3;c++)
{
if(studenti[c].votoo>votooM)
{
votooM=studenti[c].votoo;
k=c;
}
if(studenti[c].votoo<votooB)
{
votooB=studenti[c].votoo;
n=c;
}
if(studenti[c].votos>votosM)
{
votosM=studenti[c].votos;
j=c;
}
if(studenti[c].votos<votosB)
{
votosB=studenti[c].votos;
u=c;
}
if(studenti[c].votop>votopM)
{
votopM=studenti[c].votop;
f=c;
}
if(studenti[c].votop<votopB)
{
votopB=studenti[c].votop;
g=c;
}
}
printf("\nVoto orale:\n-MAGGIORE: %s %s con %.1f;\n-MINORE: %s %s con %.1f;",studenti[k].nome,studenti[k].cognome,votooM,studenti[n].nome,studenti[n].cognome,votooB);
printf("\nVoto scritto:\n-MAGGIORE: %s %s con %.1f;\n-MINORE: %s %s con %.1f;",studenti[j].nome,studenti[j].cognome,votosM,studenti[u].nome,studenti[u].cognome,votosB);
printf("\nVoto pratico:\n-MAGGIORE: %s %s con %.1f;\n-MINORE: %s %s con %.1f;",studenti[f].nome,studenti[f].cognome,votopM,studenti[g].nome,studenti[g].cognome,votopB);
printf("\n\nSONO RIMANDATI:");
for(c=0;c<3;c++)
{
if(media[c]<5.5)
printf("\n- %s %s con %.2f ",studenti[c].nome, studenti[c].cognome, media[c]);
}
getchar();
}

Comunque non accontentarti di sapere che funziona, cerca dove hai sbagliato nel tuo programma.

P.s. io ne approfitterei per fare un po' di pulizia e mettere qualche commento, magari il codice diventa più chiaro e facile da gestire/correggere

Scara95
11-05-2012, 18:39
Riformulo, ho trovato l'errore:
manca l'inizializzazione delle variabili n k j u f g (che hanno dei nomi orribili e scollegati) che nella mia versione si inizializzano per forza da sole.
Nella tua invece, se non c'è un voto maggiore o minore di quello iniziale, restano con un valore indefinito...

elialongoni04
11-05-2012, 18:44
Originariamente inviato da Scara95
A mio parere non hai inizializzato una variabile, tuttavia non ho voglia di cercarla...
Io ho semplicemente messo un'inizializzazione all'inizio e tolto un pezzo di inizializzazione inutile e ripetitivo, funziona correttamente, questo è il codice:


Comunque non accontentarti di sapere che funziona, cerca dove hai sbagliato nel tuo programma.

P.s. io ne approfitterei per fare un po' di pulizia e mettere qualche commento, magari il codice diventa più chiaro e facile da gestire/correggere
grazie molto gentile! confrontandolo con il mio hai semplicemente dato dei valori iniziali alle variabili, mentre io assegnavo come valori iniziali il primo valore inserito dall'utente...va be, concettualmente ritengo siano uguali, c'era solo il problema del caricamento che non so a cosa sia dovuto. grazie ancora!
ps:la prossima volta scriverò anche qualche commento xD

Scara95
11-05-2012, 18:46
Originariamente inviato da elialongoni04
grazie molto gentile! confrontandolo con il mio hai semplicemente dato dei valori iniziali alle variabili, mentre io assegnavo come valori iniziali il primo valore inserito dall'utente...va be, concettualmente ritengo siano uguali, c'era solo il problema del caricamento che non so a cosa sia dovuto. grazie ancora!
ps:la prossima volta scriverò anche qualche commento xD
Leggi il post che ho fatto subito dopo e capisci dov'è la differenza concettuale...

elialongoni04
11-05-2012, 18:51
Originariamente inviato da Scara95
Riformulo, ho trovato l'errore:
manca l'inizializzazione delle variabili n k j u f g (che hanno dei nomi orribili e scollegati) che nella mia versione si inizializzano per forza da sole.
Nella tua invece, se non c'è un voto maggiore o minore di quello iniziale, restano con un valore indefinito...
a ok credo di aver capito...nel senso che non è detto che ci sia PER FORZA un valore che verifichi la condizione dell'if, dunque la variabile resta senza valore e dunque al momento di andare a stampare la parola contenuta nell'array non sa che indice prendere.ho capito bene??

elialongoni04
11-05-2012, 18:54
Originariamente inviato da Scara95
Leggi il post che ho fatto subito dopo e capisci dov'è la differenza concettuale...
ok perfetto ho capito giusto! ho corretto il mio programma semplicemente mettendo nelle condizioni degli IF un (maggiore/uguale)o (minore/uguale)così entra per forza in ogni IF..
grazie per l'aiuto!

Scara95
11-05-2012, 18:54
Esatto, nel tuo codice succede proprio quello, nel mio invece, essendo i valori di inizializzazione dei voti fasulli, vengono cambiati al primo giro del loop e con loro anche le variabili k, j, n, ...

Non c'è di che...

Loading