Es3 Lab02
unknown
plain_text
2 years ago
8.8 kB
3
Indexable
#include "stdio.h" #include "string.h" #include "ctype.h" #include "time.h" #include "stdlib.h" #define MAX_STR 30 typedef struct{ char codice_tratta[MAX_STR],partenza[MAX_STR],destinazione[MAX_STR]; struct tm data, ora_partenza,ora_arrivo; int ritardo; } struttura_corsa; typedef enum { ordinamento_data,ordinamento_codice_tratta,ordinamento_partenza,ordinamento_destinazione,nuovo_file, } type_comando; void stampaRisultato(struttura_corsa *database_reale,struttura_corsa *database_ordinato[1000],int dimensione) { int i; char partenza[MAX_STR],arrivo[MAX_STR]; printf("Database ordinato: \n"); for(i=0; i < dimensione;i++) { //basterebbe MAX_STR al posto di sizeof partenza in quanto 1 byte * MAX_STR = MAX_STR strftime(partenza,sizeof partenza,"%H:%M:%S",&database_ordinato[i]->ora_partenza); strftime(arrivo,sizeof partenza,"%H:%M:%S",&database_ordinato[i]->ora_arrivo); printf("%s %s %s %s %s %d/%d/%d\n",database_ordinato[i]->codice_tratta,database_ordinato[i]->partenza,database_ordinato[i]->destinazione,partenza,arrivo,database_ordinato[i]->data.tm_year +1900 , database_ordinato[i]->data.tm_mon + 1,database_ordinato[i]->data.tm_mday); } printf("Database reale: \n"); for(i=0; i < dimensione;i++) { //basterebbe MAX_STR al posto di sizeof partenza in quanto 1 byte * MAX_STR = MAX_STR strftime(partenza,sizeof partenza,"%H:%M:%S",&database_reale[i].ora_partenza); strftime(arrivo,sizeof partenza,"%H:%M:%S",&database_reale[i].ora_arrivo); printf("%s %s %s %s %s %d/%d/%d\n",database_reale[i].codice_tratta,database_reale[i].partenza,database_reale[i].destinazione,partenza,arrivo,database_reale[i].data.tm_year +1900 , database_reale[i].data.tm_mon + 1,database_reale[i].data.tm_mday); } } void toLowerStr(char *strToLower) { int i; for(i=0; i < strlen(strToLower); i++) { strToLower[i] = tolower(strToLower[i]); } } struttura_corsa *ottieni_informazioni(int *dimensione_max,char *nome_file) { int i; char data_formato_stringa[MAX_STR],orario_formato_stringa_partenza[MAX_STR],orario_formato_stringa_arrivo[MAX_STR]; struttura_corsa *database; FILE *fp; fp = fopen(nome_file,"r"); if(!fp) { return NULL; } fscanf(fp,"%d",dimensione_max); database = (struttura_corsa *)malloc(sizeof(struttura_corsa) * (*dimensione_max)); for(i=0; i < *dimensione_max; i++) { fscanf(fp,"%s %s %s %s %s %s %d",database[i].codice_tratta,database[i].partenza,database[i].destinazione,data_formato_stringa,orario_formato_stringa_partenza,orario_formato_stringa_arrivo,&database[i].ritardo); strptime(data_formato_stringa,"%Y/%m/%d",&database[i].data); strptime(orario_formato_stringa_partenza,"%H:%M:%S",&database[i].ora_partenza); strptime(orario_formato_stringa_arrivo,"%H:%M:%S",&database[i].ora_arrivo); //per evitare incongruenze nei confronti toLowerStr(database[i].partenza); toLowerStr(database[i].codice_tratta); toLowerStr(database[i].destinazione); } fclose(fp); return database; } void scambioValori(struttura_corsa *database[1000], int j) { struttura_corsa *tmp; tmp = database[j]; database[j] = database[j+1]; database[j+1] = tmp; } void copiaArray(struttura_corsa *database,struttura_corsa ***database_ordinato,int dimensione) { int i; (* database_ordinato) = (struttura_corsa **) malloc(sizeof (struttura_corsa *) * dimensione); for(i=0; i < dimensione; i++) { (*database_ordinato)[i] = database + i; } } void ordinamento_per_data(struttura_corsa *database,int dimensione_database) { int i,j,l=0, r = dimensione_database - 1; struttura_corsa **database_ordinato; //stesse dimensioni massime del vettore database copiaArray(database,&database_ordinato,dimensione_database); time_t data1 , data2,orario1,orario2; for(i=0; i < r; i++) { for(j=l; j < r - i; j++) { data1 = mktime(&database_ordinato[j]->data); data2 = mktime(&database_ordinato[j+1]->data); if(data1 > data2) { scambioValori(database_ordinato,j); }else if( data1 == data2) { orario1 = mktime(&database_ordinato[j]->ora_partenza); orario2 = mktime(&database_ordinato[j+1]->ora_partenza); if(orario1 > orario2) { scambioValori(database_ordinato,j); } } } } stampaRisultato(database,database_ordinato,dimensione_database); free(database_ordinato); } void ordinamento_per_codice_tratta(struttura_corsa *database,int dimensione_database) { int i, j ,l=0, r = dimensione_database - 1; struttura_corsa **database_ordinato; //stesse dimensioni massime del vettore database copiaArray(database,&database_ordinato,dimensione_database); for(i=0; i < r; i++) { for(j=l; j < r - i; j++) { if(strcmp(database_ordinato[j]->codice_tratta,database_ordinato[j+1]->codice_tratta) > 0) { scambioValori(database_ordinato,j); } } } stampaRisultato(database,database_ordinato,dimensione_database); free(database_ordinato); } void ordinamento_per_stazione_partenza(struttura_corsa *database, int dimensione_database,int stampa) { int i,j,l=0, r = dimensione_database - 1; struttura_corsa **database_ordinato; //stesse dimensioni massime del vettore database copiaArray(database,&database_ordinato,dimensione_database); for(i=0; i < r; i++) { for(j=l; j < r - i ; j++) { if(strcmp(database_ordinato[j]->partenza,database_ordinato[j+1]->partenza) > 0) { scambioValori(database_ordinato,j); } } } if(stampa) { stampaRisultato(database,database_ordinato,dimensione_database); } free(database_ordinato); } void ordinamento_per_stazione_arrivo(struttura_corsa *database, int dimensione_database) { int i,j,l=0, r = dimensione_database - 1; struttura_corsa **database_ordinato; copiaArray(database,&database_ordinato,dimensione_database); for(i=0; i < r; i++) { for(j=l; j < r - i + l; j++) { if(strcmp(database_ordinato[j]->destinazione,database_ordinato[j+1]->destinazione) > 0) { scambioValori(database_ordinato,j); } } } stampaRisultato(database,database_ordinato,dimensione_database); free(database_ordinato); } int handleMenu(struttura_corsa **database,int *dimensione_database,type_comando comando) { char partenza[MAX_STR],nome_file[100]; switch(comando) { case ordinamento_data: ordinamento_per_data(*database,*dimensione_database); break; case ordinamento_codice_tratta: ordinamento_per_codice_tratta(*database,*dimensione_database); break; case ordinamento_partenza: ordinamento_per_stazione_partenza(*database,*dimensione_database,1); break; case ordinamento_destinazione: ordinamento_per_stazione_arrivo(*database,*dimensione_database); break; case nuovo_file: scanf("%s",nome_file); free((*database)); (*database) = ottieni_informazioni(dimensione_database,nome_file); if(!(*database)) { printf("Errore,file non trovato"); return -1; } break; default: printf("Errore, comando inesistente"); return -1; } return 1; } //l'ordinamento è stata sviluppato con Bubble Sort int start() { struttura_corsa *database; int dimensione_database,result = 1; type_comando comando; database = ottieni_informazioni(&dimensione_database,"../s293438_1/Lab02/Es3/corse.txt"); if(!database) { printf("Errore"); return -1; } while(result == 1) { printf("Inserisci il comando,successivamente ( se necessario ) manda a capo e inserisci gli eventuali parametri richiesti\n"); printf("Menu:\n0 --> ordinamento del vettore per data, e a parità di date per ora \n1 --> ordinamento del vettore per codice di tratta \n2 --> ordinamento del vettore per stazione di partenza \n3 --> ordinamento del vettore per stazione di arrivo\n"); printf("4 --> inserisci nuovo file da cui leggere i dati\nScrivi: "); scanf("%d", &comando); result = handleMenu(&database, &dimensione_database, comando); } free(database); return 0; } int main() { start(); return 0; }
Editor is loading...