Gestione Esami Universitari
Inviato: mar 18 mag 2010, 16:34
Salve ragazzi, sono qui a postare un piccolo programmino scritto da me in C, per la gestione tramite file, di esami universitari.
Una specie di libretto universitario per intenderci, con la possibilità di:
Aggiungere esami
Visualizzare esami
Calcolare la media dei voti, somma dei CFU e somma totale degli esami sostenuti
Questo è il codice sorgente:
Devo ancora risolvere un paio di cose...Ad esempio nella funzione "main" il while viene ripetuto finquando non viene premuto il numero 5,
però se inserisco una lettera il programma va in errore.
L'altra cosa da risolvere è nelle funzioni visualizza,calcola ecc.. dopo aver mostrato i risultati ho dovuto inserire uno sleep al posto di getchar
perchè non si fermava la schermata ma rientrava subito alla main.
Accetto qualsiasi consiglio per perfezionare il codice. Grazie a tutti
Una specie di libretto universitario per intenderci, con la possibilità di:
Aggiungere esami
Visualizzare esami
Calcolare la media dei voti, somma dei CFU e somma totale degli esami sostenuti
Questo è il codice sorgente:
Codice: Seleziona tutto
/* Semplice programma per calcolare la media degli
esami sostenuti
*/
#include <stdio.h>
#include <string.h>
#include <ctype.h>
// Struttura dati Esami
struct esami {
char nome[50];
int voto;
int cfu;
char data[10];
};
struct esami libretto;
// Funzione Aggiungi Esame
// Aggiunge un esame a libretto
add_esame(){
FILE *esami;
int scelta, controllo;
char libretto_file[20];
char rsp[1];
system("/bin/ls -1");
printf("Scrivi il nome del libretto da aprire: ");
scanf("%s",&libretto_file);
if((esami=fopen(libretto_file,"r"))==NULL){
printf("Il libretto non esiste!\n");
sleep(1);
return;
}
esami=fopen(libretto_file,"a");
system("clear");
// Inserimento Esame
do{
printf("Inserimento nuovo esame: \n\n");
printf("Inserisci il nome dell'esame: ");
scanf("%s",&libretto.nome);
printf("Inserisci il voto (min 18 max 30): ");
scanf("%d",&libretto.voto);
printf("Inserisci i crediti (CFU): ");
scanf("%d",&libretto.cfu);
printf("Inserisci la data (gg/mm/aaaa): ");
scanf("%s",&libretto.data);
// Controllo dati inseriti
if(libretto.voto<18 || libretto.voto>30){
printf("Hai inserito un voto non valido!\n");
sleep(1);
return;
}else if(libretto.cfu<3 || libretto.cfu >12){
printf("Hai inserito CFU non validi!\n");
sleep(1);
return;
}
fprintf(esami,"Esame: %s - Voto: %d - CFU: %d - Data: %s\n",libretto.nome,libretto.voto,libretto.cfu,libretto.data);
printf("Esame aggiunto con successo.\n");
printf("Vuoi inserire un altro esame? (s/n): ");
scanf("%s",&rsp);
if(strlen(rsp)>1) return;
controllo=strcmp(rsp,"n");
}while(controllo!=0);
fclose(esami);
return;
}
// Funzione Crea Libretto
// Crea un nuovo libretto universitario
crea_libretto(){
FILE *libretto;
char nome_libretto[20];
int confronto;
system("clear");
printf("ATTENZIONE: \tNel caso il libretto esiste già, esso verrà sovrascritto!\n");
printf("Inserire \'esci\' per tornare al menu principale\n\n");
printf("Inserisci il nome del libretto: ");
scanf("%s",&nome_libretto);
confronto=strcmp(nome_libretto,"esci");
if(confronto==0) return;
libretto=fopen(nome_libretto,"w");fclose(libretto);
printf("Libretto creato con successo.\n ");
sleep(1);
}
// Funzione Visualizza Libretto
// Visualizza gli esami del libretto
visualizza_libretto(){
FILE *libretto;
char nome_libretto[20];
char buffer[300];
system("clear;ls -1");
printf("Inserisci il nome del libretto: ");
scanf("%s",&nome_libretto);
if((libretto=fopen(nome_libretto,"r"))==0){
printf("Il libretto non esiste!\n");
sleep(1);
return;
}else {
while(!feof(libretto)){
fgets(buffer,300,libretto);
printf("%s \n",buffer);
}
fclose(libretto);
}
sleep(5);
}
// Funzione Calcola Media esami
// Calcola la media degli esami sostenuti
calcola_media(){
FILE *libretto;
FILE *media_file;
char nome_libretto[20];
char buffer[100];
float media=0;
int i=0,cfu=0;
char cmd_media[50]="cat ", cmd_cfu[50]="cat ";
system("clear;ls -1");
printf("Inserisci il nome del libretto: ");
scanf("%s",&nome_libretto);
if((libretto=fopen(nome_libretto,"r"))==0){
printf("Il libretto non esiste!\n");
sleep(1);
return;
}else{
// Crea il file media.txt per
// per il calcolo della media
strcat(cmd_media,nome_libretto);
strcat(cmd_media," | sed 's/.*Voto: //' | awk '{print $1}' > media.txt");
system(cmd_media);
// Crea il file cfu.txt per
// per il calcolo dei cfu
strcat(cmd_cfu,nome_libretto);
strcat(cmd_cfu," | sed 's/.*CFU: //' | awk '{print $1}' > cfu.txt");
system(cmd_cfu);
if((media_file=fopen("media.txt","r"))==NULL){
printf("Errore apertura del file!\n");
sleep(3);
return;
}
while(!feof(media_file)){
fgets(buffer,100,media_file);
media=media+atoi(buffer);
i++;
}
fclose(media_file);
media=media / i;
if((media_file=fopen("cfu.txt","r"))==NULL){
printf("Errore apertura del file!\n");
sleep(3);
return;
}
i=0;
while(!feof(media_file)){
fgets(buffer,100,media_file);
cfu=cfu+atoi(buffer);
i++;
}
fclose(media_file);
printf("Hai sostenuto %d esami con una media di %2.1f per un totale di %d CFU\n\n",i-1,media,cfu);
system("rm -rf media.txt cfu.txt");
char c=getchar();
//sleep(10);
}
}
// Funzione Principale MAIN
main(){
int scelta;
do{
system("clear");
printf("Gestione Libretto Esami Universitari\n\n");
printf("Menu Principale: \n");
printf("1) - Crea un libretto esami\n");
printf("2) - Aggiungi un esame ad un libretto\n");
printf("3) - Visualizza esami di libretto\n");
printf("4) - Calcola la media degli esami sostenuti\n");
printf("5) - Esci dal programma\n\n");
printf("Scegli una opzione: ");
scanf("%d",&scelta);
// Controllo inserimento
switch(scelta){
case 1:
crea_libretto();
break;
case 2:
add_esame();
break;
case 3:
visualizza_libretto();
break;
case 4:
calcola_media();
break;
}
}while(scelta!=5);
}
però se inserisco una lettera il programma va in errore.
L'altra cosa da risolvere è nelle funzioni visualizza,calcola ecc.. dopo aver mostrato i risultati ho dovuto inserire uno sleep al posto di getchar
perchè non si fermava la schermata ma rientrava subito alla main.
Accetto qualsiasi consiglio per perfezionare il codice. Grazie a tutti