• Regolamento Macrocategoria DEV
    Prima di aprire un topic nella Macrocategoria DEV, è bene leggerne il suo regolamento. Sei un'azienda o un hosting/provider? Qui sono anche contenute informazioni per collaborare con Sciax2 ed ottenere l'accredito nella nostra community!

Problema risolto Programma in C

Stato
Discussione chiusa ad ulteriori risposte.

Giuseppe.

Utente Esperto
Autore del topic
24 Gennaio 2009
1.066
58
Miglior risposta
0
Salve ragazzi, vi spiego l'esercizio da svolgere e i relativi problemi che sto riscontrando.


Implementare un programma in C che, dato un fil di testo chiamato studenti.dat consenta di:

1- visualizzare l'elenco degli studenti presenti ordinati alfabeticamente per cognome
2- ricercare uno studente per cognome e visualizzarne i dati anagrafici e la media (usare la ricerca binaria con le opportune asserzioni)
3- Calcolare la media degli esami svolti
4- Scrivere in un nuovo file binario (media.dat) l'elenco degli studenti ordinato in maniera decrescente in base alla loro media e visualizzarne il contenuto
5- visualizzare il contenuto del file media.dat

Il file studenti.dat conterrà i dati relativi ai seguenti campi:
Cognome Nome Matricola Esami
Esami sarà un vettore di esame (struttura con campi nome esame e voto)
Il file media.dat conterrà i seguenti campi:
Cognome Nome MediaEsami
Concettualmente il programma mi è chiaro.
Il problema nasce innanzitutto nell'acquisizione di Nome, Cognome e Esami con relativo voto.
Ho bisogno di capire come effettivamente acquisire il nome e metterlo nella variabile nome della struttura, poi spostarmi su cognome e fare la stessa cosa. Altrettanto con esami.

N.B. il file si compone in questa maniera
Rossi Mario Inglese(27) Programmazione(22) Calcolo(23)
Bianchi Francesco Inglese(25) Programmazione(21) Calcolo(25)

Vorrei capire come definire le strutture relative a Nome e Cognome e in questa metterci la struttura relativa ai voti.
 
Ecco una possibile soluzione, magari un po' rustica dato che non scrivo in C da mesi:
C:
Perfavore, Entra oppure Registrati per vedere i codici!

Il fatto che l'utente abbia solo 3 esami è in realtà un limite: max materie che l'utente può dare.
 
Ecco una possibile soluzione, magari un po' rustica dato che non scrivo in C da mesi:
C:
Perfavore, Entra oppure Registrati per vedere i codici!

Il fatto che l'utente abbia solo 3 esami è in realtà un limite: max materie che l'utente può dare.

Dato che mi riesce un po' complicato capire come hai utilizzato le variabili e quale significato hanno, riusciresti a scrivere l'intero progetto così che io possa rendermi conto dell'effettiva funzione che ricoprono?
Ti ringrazio anticipatamente! sant0 sant0
 
Ultima modifica:
Dato che mi riesce un po' complicato capire come hai utilizzato le variabili e quale significato hanno, riusciresti a scrivere l'intero progetto così che io possa rendermi conto dell'effettiva funzione che ricoprono?
Ti ringrazio anticipatamente!
Cosa intendi? Il programma che ho scritto legge tutto il file .dat. Per leggere quello che ha letto, ti basta scrivere una cosa simile:
C:
Perfavore, Entra oppure Registrati per vedere i codici!
 
Su Windows? Perché se la risposta è sì, ti consiglio di inserire un getchar() giusto prima del return 0.
Si, lo metto nel main scrivendo solo getchar(); ? sant0 sant0
 
Ultima modifica:
Si, lo metto nel main scrivendo solo getchar(); ? sant0 sant0
Sì. In pratica la funzione può essere utilizzata anche come scanf(): prende un carattere da input e lo immagazzina in una variabile.
 
Sì. In pratica la funzione può essere utilizzata anche come scanf(): prende un carattere da input e lo immagazzina in una variabile.
Continua a non funzionare. Ho anche aggiunto le librerie che potevano servire, niente.. sant0 sant0
 
Prova a inserire un input a fine codice (prima del return), dato che getchar() non ti funziona.
Codice:
Perfavore, Entra oppure Registrati per vedere i codici!
mentre nella riga successiva al main() inserisci char char_fine;.
Al limite, se non dovesse funziona, prova a cambiare IDE.
 
C:
Perfavore, Entra oppure Registrati per vedere i codici!

Questa la mia versione, anche qui per vedere l'output alla fine aggiungi getchar() oppure (solo su windows) system("pause").
Devo dire che ci ho perso un po' di tempo perché bisognava leggere carattere per carattere, mentre il mio professore di programmazione 2 ci dava file formattati così:
Nome Cognome Matricola NumEsami Esame1 Voto1 Esame2 Voto2 Ecc
il che rendeva più facile la lettura da file (bastava una fscanf).
Ho commentato il codice della lettura da file in modo che spero sia più chiaro. Le variabili i,j,k sono:
i numero studenti
j numero esami dello studente
k usato per la lunghezza delle stringhe (per questo viene azzerato ogni volta che ne leggo una nuova)

drunkercode ho testato il tuo codice e va in Segmentation fault, probabilmente c'è un errore da qualche parte o, come capitava anche a me, alla fine del file non legge il newline e prova a leggere ancora.
 
C:
Perfavore, Entra oppure Registrati per vedere i codici!

Questa la mia versione, anche qui per vedere l'output alla fine aggiungi getchar() oppure (solo su windows) system("pause").
Devo dire che ci ho perso un po' di tempo perché bisognava leggere carattere per carattere, mentre il mio professore di programmazione 2 ci dava file formattati così:
Nome Cognome Matricola NumEsami Esame1 Voto1 Esame2 Voto2 Ecc
il che rendeva più facile la lettura da file (bastava una fscanf).
Ho commentato il codice della lettura da file in modo che spero sia più chiaro. Le variabili i,j,k sono:
i numero studenti
j numero esami dello studente
k usato per la lunghezza delle stringhe (per questo viene azzerato ogni volta che ne leggo una nuova)

drunkercode ho testato il tuo codice e va in Segmentation fault, probabilmente c'è un errore da qualche parte o, come capitava anche a me, alla fine del file non legge il newline e prova a leggere ancora.
Questo codice funziona, ti ringrazio davvero tanto. Se dovessi avere altri dubbi scrivo qui
 
Stato
Discussione chiusa ad ulteriori risposte.