|
|
|
|
Strumenti |
10-02-2016, 13:39 | #1 |
Junior Member
Iscritto dal: Feb 2016
Messaggi: 4
|
Aiuto programma C .
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: Codice:
#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(); } Ultima modifica di omar900 : 10-02-2016 alle 13:46. |
10-02-2016, 13:52 | #2 |
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
A dir la verita' non so come abbia passato la compilazione.
Per esempio: Codice:
char materia[nm][30]; Codice:
struct s_quadrimestre{ struct s_voti{ float orale; float scritto; float pratico; float media; }voto[nm]; 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.
__________________
In God we trust; all others bring data |
10-02-2016, 14:47 | #3 |
Junior Member
Iscritto dal: Feb 2016
Messaggi: 4
|
Ok primo problema risolto grazie.
Però dopo non mi visualizza correttamente gli studenti con le medie maggiori. |
10-02-2016, 14:50 | #4 |
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
posta il nuovo codice, cosi' possiamo darci un'occhiata
__________________
In God we trust; all others bring data |
10-02-2016, 15:00 | #5 |
Junior Member
Iscritto dal: Feb 2016
Messaggi: 4
|
Codice:
#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(); } |
10-02-2016, 15:09 | #6 |
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
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: Codice:
char materia[nm][30]; Quale compilatore stai utilizzando? Tuttavia, il calcolo della media non e' ancora corretto perche' lo fai cosi': Codice:
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;
__________________
In God we trust; all others bring data |
10-02-2016, 19:19 | #7 | |
Senior Member
Iscritto dal: Jul 2008
Città: Roma
Messaggi: 541
|
Quote:
|
|
17-02-2016, 18:21 | #8 |
Junior Member
Iscritto dal: Feb 2016
Messaggi: 4
|
Grazie a tutti per l'aiuto, sono riuscito a risolvere tutto pochi giorni fa
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? |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 20:04.