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