Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <string.h>
- #define MAXR 31
- #define LINE 300
- #define MAXN 1000
- typedef struct {
- int a;
- int m;
- int g;
- } data_t;
- typedef struct {
- int h;
- int m;
- int s;
- } ora_t;
- typedef struct {
- char codice_tratta[MAXR];
- char partenza[MAXR];
- char destinazione[MAXR];
- char data_stringa[MAXR];
- char ora_partenza[MAXR];
- char ora_arrivo[MAXR];
- int ritardo;
- data_t data;
- ora_t hpartenza, harrivo;
- } tabella;
- void leggitab(tabella *tab, int *dim);
- void opzioni(int *opz, tabella *tab, int *dim);
- void stampaLog(tabella **tab, int *dim);
- //FUNZIONI DI CONFRONTO TRA ITEMS.
- int ITEMlt(tabella *p, tabella *x, int caso);
- int confrontaorari (tabella *p, tabella *x);
- //FUNZIONE DI ORDINAMENTO.
- void insertionSort(tabella **p, int l, int r, int *opz);
- void ricerca(tabella **p, tabella *k, int *dim, int state);
- void ricercaLin(tabella **p, int l, int r, tabella k);
- void ricercaBin(tabella **p, int l, int r, tabella k);
- int main(int argc, const char * argv[]) {
- tabella tab[MAXN];
- int dim, opzione;
- leggitab(tab, &dim);
- opzioni(&opzione, tab, &dim);
- return 0;
- }
- void leggitab(tabella *tab, int *dim) {
- char sinput[LINE];
- FILE *fp;
- int i;
- fp = fopen("log.txt", "r");
- if (fp == NULL){
- printf("errore apertura file.\n");
- return;
- }
- fscanf(fp, "%d\n", dim);
- for (i = 0; i < *dim; i++) {
- fgets (sinput, LINE, fp);
- sscanf(sinput, "%s %s %s %s %s %s %d", tab[i].codice_tratta, tab[i].partenza, tab[i].destinazione, tab[i].data_stringa, tab[i].ora_partenza, tab[i].ora_arrivo, &tab[i].ritardo );
- sscanf (tab[i].data_stringa,"%d/%d/%d", &tab[i].data.a,&tab[i].data.m,&tab[i].data.g);
- sscanf (tab[i].ora_partenza,"%d:%d:%d", &tab[i].hpartenza.h,&tab[i].hpartenza.m,&tab[i].hpartenza.s);
- sscanf (tab[i].ora_arrivo,"%d:%d:%d", &tab[i].harrivo.h,&tab[i].harrivo.m,&tab[i].harrivo.s);
- }
- fclose(fp);
- return;
- }
- void stampaLog(tabella **tab, int *dim) {
- int i;
- printf("il log è:\n");
- for (i = 0; i < *dim; i++) {
- printf("%s %s %s %s %s %s %d\n", tab[i]->codice_tratta, tab[i]->partenza, tab[i]->destinazione, tab[i]->data_stringa, tab[i]->ora_partenza, tab[i]->ora_arrivo, tab[i]->ritardo);
- }
- return;
- }
- void opzioni(int *opz, tabella *tab, int *dim) {
- tabella *tab2[*dim];
- int status = 0, i;
- for(i = 0; i < *dim; i++) {
- tab2[i] = &tab[i];
- }
- //RENDERE LO SWITCH ITERATTIVO.
- while (1) {
- printf("schiaccia 1 per stampare il log\n");
- printf("schiaccia 2 per ordinare per data\n");
- printf("schiaccia 3 per ordinare per codice di tratta\n");
- printf("schiaccia 4 per ordinare per stazione di partenza\n");
- printf("schiaccia 5 per ordinare per stazione di arrivo\n");
- printf("schiaccia 6 per ricercare una stazione di partenza\n"); //dicotomica o lineare.
- scanf("%d", opz);
- switch (*opz) {
- case 1:
- stampaLog(tab2, dim);
- break;
- case 2:
- insertionSort(tab2, 0, *dim-1, opz);
- break;
- case 3:
- insertionSort(tab2, 0, *dim-1, opz);
- break;
- case 4:
- insertionSort(tab2, 0, *dim-1, opz);
- status = 1;
- break;
- case 5:
- insertionSort(tab2, 0, *dim-1, opz);
- break;
- case 6:
- ricerca(tab2, tab, dim, status);
- break;
- default:
- return;
- break;
- }
- }
- return;
- }
- void ricerca(tabella **p, tabella *k, int *dim, int state){
- int l = 0, r = *dim-1;
- tabella chiave;
- printf("inserisci la chiave:\n");
- scanf("%s", chiave.partenza);
- if (state == 0) //TABELLA NON ORDINATA.
- ricercaLin(p, l, r, chiave);
- else //STATE == 1 E QUINDI TABELLA ORDINATA.
- ricercaBin(p, l, r, chiave);
- return;
- }
- void ricercaLin(tabella **p, int l, int r, tabella k) {
- int i = l;
- int n = (int)strlen(k.partenza);
- while(i <= r ) {
- if (strncmp(k.partenza, p[i]->partenza, n) == 0)
- printf("%s %s %s %s %s %s %d\n", p[i]->codice_tratta, p[i]->partenza,p[i]->destinazione, p[i]->data_stringa, p[i]->ora_partenza, p[i]->ora_arrivo, p[i]->ritardo);
- else i++;
- }
- return;
- }
- void ricercaBin(tabella **p, int l, int r, tabella k) {
- int m = 0;
- int n = (int)strlen(k.partenza);
- while (l <= r) {
- m = (l+r)/2;
- if (strncmp(k.partenza, p[m]->partenza, n) == 0)
- printf("%s %s %s %s %s %s %d\n", p[m]->codice_tratta, p[m]->partenza,p[m]->destinazione, p[m]->data_stringa, p[m]->ora_partenza, p[m]->ora_arrivo, p[m]->ritardo);
- if(strncmp(p[m]->partenza, k.partenza, n) < 0)
- l = m+1;
- else
- r = m-1;
- }
- return;
- }
- int ITEMlt(tabella *p, tabella *x, int caso) {
- switch(caso) {
- case 2: //CASO DATA.
- return confrontaorari(p,x);
- break;
- case 3: //CASO CODICE DI TRATTA.
- return (strcmp(x->codice_tratta, p->codice_tratta));
- break;
- case 4: //CASO STAZIONE DI PARTENZA.
- return(strcmp(x->partenza, p->partenza));
- break;
- case 5: //CASO STAZIONE DI ARRIVO.
- return(strcmp(x->destinazione, p->destinazione));
- break;
- }
- return -1;
- }
- void insertionSort(tabella **p, int l, int r, int *opz) {
- int i, j = 0;
- tabella *x = NULL;
- for (i = l; i <= r; i++) {
- x = p[i];
- j = i-1;
- while(j >= l && ITEMlt(p[j], x, *opz) < 0) {
- p[j+1] = p[j]; //SCAMBIO GLI INDIRIZZI.
- j--;
- }
- p[j+1] = x;
- }
- return;
- }
- int confrontaorari (tabella *p, tabella *x) {
- if (x->data.a < p->data.a)
- return -1;
- else if (x->data.a == p->data.a) {
- if(x->data.m < p->data.m)
- return -1;
- else if(x->data.m == p->data.m) {
- if (x->data.g < p->data.g)
- return -1;
- else if (x->data.g == p->data.g) {
- if (x->hpartenza.h < p->hpartenza.h)
- return -1;
- else if (x->hpartenza.h == p->hpartenza.h) {
- if(x->hpartenza.m < p->hpartenza.m)
- return -1;
- else if (x->hpartenza.m == p->hpartenza.m){
- if(x->hpartenza.s < p->hpartenza.s)
- return -1;
- else if(x->hpartenza.s == p->hpartenza.s)
- return -1;
- }
- return 0;
- }
- return 0;
- }
- return 0;
- }
- return 0; //la data di x è maggiore della data di p.
- }
- return 0; //la data di x è maggiore della data di p.
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement