PDA

View Full Version : Aiuto programma C .


omar900
10-02-2016, 14:39
Devo eseguire questo esercizio:
Implementa un programma che, dato un vettore di studenti (il tipo Studente conterrà nome, cognome e i voti scritto, orale e pratica di ogni quadrimestre), individui e ritorni il nome dello studente più bravo nelle diverse materie e con media generale più alta.
Purtroppo dopo aver assegnato un valore allo scritto il programma si chiude a causa di un errore sconosciuto.
ecco il programma:

#include <stdio.h>
main(){
int contamax=0,conta1=0,conta2=0,nq=0,nst=0,nm=0,x=0,p=0;
char materia[nm][30];
struct s_studenti{
char nome[30];
char cognome[30];
float mediatot;
float tempo;
struct s_mediaquad{
float tempo;
float mediaquad;
}mq[2];
struct s_quadrimestre{
struct s_voti{
float orale;
float scritto;
float pratico;
float media;
}voto[nm];
}quad[2];
}studente[nst];
printf("Le materie sono: ");
scanf("%d",&nm);
printf("Gli studenti sono: ");
scanf("%d",&nst);
float max1[nst], max2[nst];
for(conta1=0;conta1<nst;conta1++)
{
printf("\nStudente %d",conta1+1);
printf("\nnome: ");
scanf("%s",&studente[conta1].nome);
printf("cognome: ");
scanf("%s",&studente[conta1].cognome);
{
for(conta2=0;conta2<1;conta2++)
printf("\nMateria: ");
scanf("%s", &materia[conta2]);
for(nq=0;nq<2;nq++)
{
printf("\nQuadrimestre %d",nq+1);
printf("\nOrale: ");
scanf("%f",&studente[conta1].quad[nq].voto[conta2].orale);
printf("\nScritto: ");
scanf("%f",&studente[conta1].quad[nq].voto[conta2].scritto);
printf("\nPratico: ");
scanf("%f",&studente[conta1].quad[nq].voto[conta2].pratico);
printf("\nMedia quadrimestre %d: ", nq+1);
studente[conta1].quad[nq].voto[conta2].media=(studente[conta1].quad[nq].voto[conta2].orale + studente[conta1].quad[nq].voto[conta2].scritto + studente[conta1].quad[nq].voto[conta2].pratico) / 3;
printf("%2.2f",studente[conta1].quad[nq].voto[conta2].media);
}
}
};
for(contamax=0;contamax<nst;contamax++)
{
max1[contamax]=0;
max2[contamax]=0;
};
for(conta1=0;conta1<nst;conta1++)
{
for(conta2=0;conta2<nm;conta2++)
{
for(nq=0;nq<2;nq++)
{
studente[conta1].mq[conta2].tempo = studente[conta1].mq[conta2].tempo + studente[conta1].quad[nq].voto[conta2].media;
}
studente[conta1].mq[conta2].mediaquad = studente[conta1].mq[conta2].tempo / 2;
printf("\nMedia totale materia %s studente %s %s: %d",materia[conta2], studente[conta1].nome, studente[conta1].cognome,studente[conta1].mq[conta2].mediaquad);
studente[conta1].tempo = studente[conta1].tempo + studente[conta1].mq[conta2].mediaquad;
}
studente[conta1].mediatot = studente[conta1].tempo / nm;
printf("\nMedia totale : %f" , studente[conta1].mediatot);
};
for(conta1=0;conta1<nst;conta1++)
{
for(conta2=0;conta2<nm;conta2++)
{
if(studente[conta1].mq[conta2].mediaquad>max1[conta2])
{
x=conta2;
}
}
printf("\nIl migliore in %s e' lo studente %s %s", materia[conta2], studente[x].nome , studente[x].cognome);
if(studente[conta1].mediatot>max2[conta1])
{
p=conta1;
}
};
printf("La media migliore l'ha lo studente %s %s",studente[p].nome,studente[p].cognome);
getch();
}

qual è l'errore secondo voi?

sottovento
10-02-2016, 14:52
A dir la verita' non so come abbia passato la compilazione.
Per esempio:


char materia[nm][30];


oppure

struct s_quadrimestre{
struct s_voti{
float orale;
float scritto;
float pratico;
float media;
}voto[nm];


(dove nm e' una variabile inizializzata a 0) avrebbe dovuto generare un errore di compilazione.

Devi prima leggere il valore per le variabili nm ed nst; poi, utilizzando tale valore, vai ad allocare dinamicamente i vettori che dovranno contenere tale numero di valori.
In alternativa, potresti dichiarare delle costanti (MAX_NUM_STUDENTS, ...) e verificare che nm ed nst siano inferiori a dette costanti.

omar900
10-02-2016, 15:47
Ok primo problema risolto grazie.
Però dopo non mi visualizza correttamente gli studenti con le medie maggiori.
:muro:

sottovento
10-02-2016, 15:50
posta il nuovo codice, cosi' possiamo darci un'occhiata

omar900
10-02-2016, 16:00
#include <stdio.h>
main(){
int contamax=0,conta1=0,conta2=0,nq=0,nst=0,nm=0,x=0,p=0;
printf("Le materie sono: ");
scanf("%d",&nm);
printf("Gli studenti sono: ");
scanf("%d",&nst);
char materia[nm][30];
struct s_studenti{
char nome[30];
char cognome[30];
float mediatot;
float tempo;
struct s_mediaquad{
float tempo;
float mediaquad;
}nq[2];
struct s_quadrimestre{
struct s_voti{
float orale;
float scritto;
float pratico;
float media;
}voto[nm];
}quad[2];
}studente[nst];
float max1[nst], max2[nst];
for(conta1=0;conta1<nst;conta1++)
{
printf("\nStudente %d",conta1+1);
printf("\nnome: ");
scanf("%s",&studente[conta1].nome);
printf("cognome: ");
scanf("%s",&studente[conta1].cognome);
{
for(conta2=0;conta2<1;conta2++)
printf("\nMateria: ");
scanf("%s", &materia[conta2]);
for(nq=0;nq<2;nq++)
{
printf("\nQuadrimestre %d",nq+1);
printf("\nOrale: ");
scanf("%f",&studente[conta1].quad[nq].voto[conta2].orale);
printf("\nScritto: ");
scanf("%f",&studente[conta1].quad[nq].voto[conta2].scritto);
printf("\nPratico: ");
scanf("%f",&studente[conta1].quad[nq].voto[conta2].pratico);
printf("\nMedia quadrimestre %d: ", nq+1);
studente[conta1].quad[nq].voto[conta2].media=(studente[conta1].quad[nq].voto[conta2].orale + studente[conta1].quad[nq].voto[conta2].scritto + studente[conta1].quad[nq].voto[conta2].pratico) / 3;
printf("%2.2f",studente[conta1].quad[nq].voto[conta2].media);
}
}
};
for(contamax=0;contamax<nst;contamax++)
{
max1[contamax]=0;
max2[contamax]=0;
};
for(conta1=0;conta1<nst;conta1++)
{
for(conta2=0;conta2<nm;conta2++)
{
for(nq=0;nq<2;nq++)
{
studente[conta1].nq[conta2].tempo = studente[conta1].nq[conta2].tempo + studente[conta1].quad[nq].voto[conta2].media;
}
studente[conta1].nq[conta2].mediaquad = studente[conta1].nq[conta2].tempo / 2;
printf("\nMedia totale materia %s studente %s %s: %d",materia[conta2], studente[conta1].nome, studente[conta1].cognome,studente[conta1].nq[conta2].mediaquad);
studente[conta1].tempo = studente[conta1].tempo + studente[conta1].nq[conta2].mediaquad;
}
studente[conta1].mediatot = studente[conta1].tempo / nm;
printf("\nMedia totale : %f" , studente[conta1].mediatot);
};
for(conta1=0;conta1<nst;conta1++)
{
for(conta2=0;conta2<nm;conta2++)
{
if(studente[conta1].nq[conta2].mediaquad>max1[conta2])
{
x=conta2;
}
}
printf("\nIl migliore in %s e' lo studente %s %s", materia[conta2], studente[x].nome , studente[x].cognome);
if(studente[conta1].mediatot>max2[conta1])
{
p=conta1;
}
};
printf("La media migliore l'ha lo studente %s %s",studente[p].nome,studente[p].cognome);
getch();
}

sottovento
10-02-2016, 16:09
Continuo a non capire come possa essere compilabile quel codice, visto che non effettui allocazioni dinamiche ma allochi i vettori a seconda del valore di una variabile.
Per esempio:

char materia[nm][30];


Ho visto che hai letto nm prima di scrivere questa dichiarazione, ma in teoria dovresti allocare la memoria dinamicamente, mediante la malloc().
Quale compilatore stai utilizzando?

Tuttavia, il calcolo della media non e' ancora corretto perche' lo fai cosi':

studente[conta1].quad[nq].voto[conta2].media=(studente[conta1].quad[nq].voto[conta2].orale + studente[conta1].quad[nq].voto[conta2].scritto + studente[conta1].quad[nq].voto[conta2].pratico) / 3;


dando quindi per scontato di essere all'interno di 3 cicli for controllato dalle variabili conta1, nq e conta2; in realta' sei solo all'interno di 2 cicli for perche' il ciclo controllato da conta2 e' stato gia' completato, quindi conta2 ha il valore fisso a 1 quando (apparentemente) vorresti farlo scorrere per tutte le materie che hai letto

lorenzo001
10-02-2016, 20:19
Continuo a non capire come possa essere compilabile quel codice, visto che non effettui allocazioni dinamiche ma allochi i vettori a seconda del valore di una variabile.
Per esempio:

char materia[nm][30];


Ho visto che hai letto nm prima di scrivere questa dichiarazione, ma in teoria dovresti allocare la memoria dinamicamente, mediante la malloc().
Quale compilatore stai utilizzando?


In realtà quello è un VLA (Variable Length Array) e il suo compilatore lo supporta, sebbene personalmente non mi piacciono tanto ...

omar900
17-02-2016, 19:21
Grazie a tutti per l'aiuto, sono riuscito a risolvere tutto pochi giorni fa :D
Avrei però un'altra domanda: mettiamo che io abbia una struttura s_studenti contenente nome, cognome .... e la media a fine anno e che io debba trovare lo studente con la media più alta. Fino a qui nessun problema. Ma se ci fossero due o più studenti con la stessa media e se tale media risultasse la più alta?
Come faccio a visualizzare tutte le medie più alte?:muro: