Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #define MAXS 30 /*lunghezza max delle stringhe*/
- typedef struct corse_tot
- {
- char cod_tratta[MAXS];
- char partenza[MAXS];
- char arrivo[MAXS];
- char data[MAXS]; /*formato MM/GG*/
- char ora_partenza[MAXS];
- char ora_arrivo[MAXS];
- int ritardo;
- } corse;
- int ContaDati(char *nomf);
- void LeggiDati(char *nomf, corse *c, int num);
- void StampaVideo(corse *c, int num);
- void StampaFile(corse *c, int num);
- void OrdPerData(corse **c, int num);
- void OrdPerCod(corse **c, int num);
- void OrdPerPart(corse **c, int num);
- void OrdPerArr(corse **c, int num);
- int ConfrontaOre(corse *c1, corse *c2);
- void StampaVideo2(corse **c, int num);
- void RicercaBin(corse **c, int l, int r, char* str);
- void RicercaLin(corse *c, int l, int r, char* str);
- int main()
- {
- corse *cor, **ord1, **ord2, **ord3, **ord4;
- int scelta, i, fine=0, n=0, num;
- char part[MAXS];
- char nomefile[MAXS];
- printf("Scrivere il nome del file da cui prendere i dati: ");
- scanf("%s", nomefile);
- n = ContaDati(nomefile);
- num = n+1;
- cor = (corse*)malloc(num*sizeof(corse));
- ord1 = (corse**)malloc(num*sizeof(corse*));
- ord2 = (corse**)malloc(num*sizeof(corse*));
- ord3 = (corse**)malloc(num*sizeof(corse*));
- ord4 = (corse**)malloc(num*sizeof(corse*));
- LeggiDati(nomefile, cor, num);
- for(i=0; i<n; i++)
- ord1[i] = ord2[i] = ord3[i] = ord4[i] = &cor[i];
- printf("Digitare il numero corrispondente all'operazione: \n");
- printf("(1) - Stampa a video;\n(2) - Stampa su file;\n(3) - Ordinamento per data;\n(4) - Ordinamento per codice tratta;\n");
- printf("(5) - Ordinamento per staz di partenza;\n(6) - Ordinamento per staz. d'arrivo;\n");
- printf("(7) - Ricerca di una tratta per stazione di partenza(Binaria);\n(8) - Ricerca di una tratta per stazione di ");
- printf("partenza.(Lineare);\n(9) - Prendi i dati da un altro file;\n(0) - Termina programma.\n");
- scanf("%d", &scelta);
- if (scelta == 0)
- fine = 1;
- while (fine != 1)
- {
- switch(scelta)
- {
- case 1:
- StampaVideo(cor, n);
- break;
- case 2:
- StampaFile(cor, n);
- break;
- case 3:
- OrdPerData(ord1, n);
- StampaVideo2(ord1, n);
- break;
- case 4:
- OrdPerCod(ord2, n);
- StampaVideo2(ord2, n);
- break;
- case 5:
- OrdPerPart(ord3, n);
- StampaVideo2(ord3, n);
- break;
- case 6:
- OrdPerArr(ord4, n);
- StampaVideo2(ord4, n);
- break;
- case 7:
- printf("Digitare la stazione di partenza: ");
- scanf("%s", part);
- RicercaBin(ord3, 0, n, part);
- break;
- case 8:
- printf("Digitare la stazione di partenza: ");
- scanf("%s", part);
- RicercaLin(cor, 0, n, part);
- break;
- case 9:
- free(cor);
- for(i=0; i<n; i++)
- {
- free(ord1[i]);
- free(ord2[i]);
- free(ord3[i]);
- free(ord4[i]);
- }
- free(ord1);
- free(ord2);
- free(ord3);
- free(ord4);
- printf("Scrivere il nome del file da cui prendere i dati: ");
- scanf("%s", nomefile);
- n = ContaDati(nomefile);
- num = n+1;
- cor = (corse*)malloc(num*sizeof(corse));
- ord1 = (corse**)malloc(num*sizeof(corse*));
- ord2 = (corse**)malloc(num*sizeof(corse*));
- ord3 = (corse**)malloc(num*sizeof(corse*));
- ord4 = (corse**)malloc(num*sizeof(corse*));
- LeggiDati(nomefile, cor, num);
- for(i=0; i<n; i++)
- ord1[i] = ord2[i] = ord3[i] = ord4[i] = &cor[i];
- break;
- case 0:
- fine = 1;
- break;
- default:
- printf("Opzione non presente nel programma.\n");
- break;
- }
- printf("Esegui una nuova operazione:\n");
- scanf("%d", &scelta);
- }
- return 0;
- }
- int ContaDati(char* nomf)
- {
- FILE *fp;
- int num;
- fp = fopen(nomf, "r");
- fscanf(fp, "%d", &num);
- fclose(fp);
- return num;
- }
- void LeggiDati(char* nomf, corse *c, int num)
- {
- FILE *fp;
- int i;
- fp = fopen(nomf, "r");
- fscanf(fp, "%d", &num);
- for(i=1; i<=num; i++)
- fscanf(fp, "%s %s %s %s %s %s %d", c[i].cod_tratta, c[i].partenza, c[i].arrivo, c[i].data,
- c[i].ora_partenza, c[i].ora_arrivo, &c[i].ritardo);
- for(i=0; i<=num; i++)
- {
- strcpy(c[i].cod_tratta, c[i+1].cod_tratta);
- strcpy(c[i].partenza, c[i+1].partenza);
- strcpy(c[i].arrivo, c[i+1].arrivo);
- strcpy(c[i].data, c[i+1].data);
- strcpy(c[i].ora_partenza, c[i+1].ora_partenza);
- strcpy(c[i].ora_arrivo, c[i+1].ora_arrivo);
- c[i].ritardo = c[i+1].ritardo;
- }
- fclose(fp);
- return;
- }
- void StampaVideo(corse *c, int num)
- {
- int i;
- for(i=0; i<num; i++)
- printf("%s %s %s %s %s %s %d\n", c[i].cod_tratta, c[i].partenza, c[i].arrivo, c[i].data,
- c[i].ora_partenza, c[i].ora_arrivo, c[i].ritardo);
- return;
- }
- void StampaFile(corse *c, int num)
- {
- FILE *fp;
- int i;
- fp = fopen("stampacorse.txt", "w");
- for(i=0; i<num; i++)
- fprintf(fp, "%s %s %s %s %s %s %d\n", c[i].cod_tratta, c[i].partenza, c[i].arrivo, c[i].data,
- c[i].ora_partenza, c[i].ora_arrivo, c[i].ritardo);
- fclose(fp);
- return;
- }
- void OrdPerData(corse **c, int num)
- {
- corse *temp;
- int i, j, imin, confr;
- for(i=0; i<num-1; i++)
- {
- imin = i;
- for(j=i+1; j<num; j++)
- if(strcmp(c[j]->data, c[imin]->data)<0)
- imin = j;
- else
- {
- if(strcmp(c[j]->data, c[imin]->data)==0)
- {
- confr = ConfrontaOre(c[j], c[imin]);
- if(confr<0)
- imin = j;
- }
- }
- temp = c[i];
- c[i] = c[imin];
- c[imin] = temp;
- }
- return;
- }
- void OrdPerCod(corse **c, int num)
- {
- corse *temp;
- int i, j, imin;
- for(i=0; i<num-1; i++)
- {
- imin = i;
- for(j=i+1; j<num; j++)
- if(strcmp(c[j]->cod_tratta,c[imin]->cod_tratta)<0)
- imin = j;
- temp = c[i];
- c[i] = c[imin];
- c[imin] = temp;
- }
- return;
- }
- void OrdPerPart(corse **c, int num)
- {
- corse *temp;
- int i, j, imin;
- for(i=0; i<num-1; i++)
- {
- imin = i;
- for(j=i+1; j<num; j++)
- if(strcmp(c[j]->partenza,c[imin]->partenza)<0)
- imin = j;
- temp = c[i];
- c[i] = c[imin];
- c[imin] = temp;
- }
- return;
- }
- void OrdPerArr(corse **c, int num)
- {
- corse *temp;
- int i, j, imin;
- for(i=0; i<num-1; i++)
- {
- imin = i;
- for(j=i+1; j<num; j++)
- if(strcmp(c[j]->arrivo,c[imin]->arrivo)<0)
- imin = j;
- temp = c[i];
- c[i] = c[imin];
- c[imin] = temp;
- }
- return;
- }
- void RicercaBin(corse **c, int l, int r, char* str)
- {
- int n, m = 0;
- n = strlen(str);
- while(l <= r)
- {
- m = (l+r)/2;
- if(strncmp(str, c[m]->partenza,n) == 0)
- printf("%s %s %s %s %s %s %d\n", c[m]->cod_tratta, c[m]->partenza, c[m]->arrivo, c[m]->data,
- c[m]->ora_partenza, c[m]->ora_arrivo, c[m]->ritardo);
- if(strncmp(str, c[m]->partenza, n) < 0)
- l = m+1;
- else
- r = m-1;
- }
- }
- void RicercaLin(corse *c, int l, int r, char* str)
- {
- int i = l, n;
- int found = 0;
- n = strlen(str);
- while(i <= r && found == 0)
- if(strncmp(str, c[i].partenza,n) == 0)
- {
- printf("%s %s %s %s %s %s %d\n", c[i].cod_tratta, c[i].partenza, c[i].arrivo, c[i].data,
- c[i].ora_partenza, c[i].ora_arrivo, c[i].ritardo);
- found = 1;
- }
- else
- i++;
- if(found == 0)
- printf("Non e' stata trovata nessuna tratta\n");
- }
- int ConfrontaOre(corse *c1, corse *c2)
- {
- int confr;
- confr = strcmp(c1->ora_partenza, c2->ora_partenza);
- if(confr == 0)
- confr = strcmp(c1->ora_arrivo, c2->ora_arrivo);
- return confr;
- }
- void StampaVideo2(corse **c, int num)
- {
- int i;
- for(i=0; i<num; i++)
- printf("%s %s %s %s %s %s %d\n", c[i]->cod_tratta, c[i]->partenza, c[i]->arrivo, c[i]->data,
- c[i]->ora_partenza, c[i]->ora_arrivo, c[i]->ritardo);
- return;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement