Es3 Lab02

 avatar
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...