Advertisement
Guest User

nonèpossibile

a guest
Nov 22nd, 2019
178
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 8.84 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #define MAXS 30         /*lunghezza max delle stringhe*/
  5.  
  6. typedef struct corse_tot
  7. {
  8.     char cod_tratta[MAXS];
  9.     char partenza[MAXS];
  10.     char arrivo[MAXS];
  11.     char data[MAXS];                /*formato MM/GG*/
  12.     char ora_partenza[MAXS];
  13.     char ora_arrivo[MAXS];
  14.     int ritardo;
  15. } corse;
  16.  
  17. int ContaDati(char *nomf);
  18. void LeggiDati(char *nomf, corse *c, int num);
  19. void StampaVideo(corse *c, int num);
  20. void StampaFile(corse *c, int num);
  21. void OrdPerData(corse **c, int num);
  22. void OrdPerCod(corse **c, int num);
  23. void OrdPerPart(corse **c, int num);
  24. void OrdPerArr(corse **c, int num);
  25. int ConfrontaOre(corse *c1, corse *c2);
  26. void StampaVideo2(corse **c, int num);
  27. void RicercaBin(corse **c, int l, int r, char* str);
  28. void RicercaLin(corse *c, int l, int r, char* str);
  29.  
  30. int main()
  31. {
  32.     corse *cor, **ord1, **ord2, **ord3, **ord4;
  33.     int scelta, i, fine=0, n=0, num;
  34.     char part[MAXS];
  35.     char nomefile[MAXS];
  36.  
  37.     printf("Scrivere il nome del file da cui prendere i dati: ");
  38.     scanf("%s", nomefile);
  39.  
  40.     n = ContaDati(nomefile);
  41.     num = n+1;
  42.     cor = (corse*)malloc(num*sizeof(corse));
  43.     ord1 = (corse**)malloc(num*sizeof(corse*));
  44.     ord2 = (corse**)malloc(num*sizeof(corse*));
  45.     ord3 = (corse**)malloc(num*sizeof(corse*));
  46.     ord4 = (corse**)malloc(num*sizeof(corse*));
  47.     LeggiDati(nomefile, cor, num);
  48.  
  49.     for(i=0; i<n; i++)
  50.         ord1[i] = ord2[i] = ord3[i] = ord4[i] = &cor[i];
  51.  
  52.     printf("Digitare il numero corrispondente all'operazione: \n");
  53.     printf("(1) - Stampa a video;\n(2) - Stampa su file;\n(3) - Ordinamento per data;\n(4) - Ordinamento per codice tratta;\n");
  54.     printf("(5) - Ordinamento per staz di partenza;\n(6) - Ordinamento per staz. d'arrivo;\n");
  55.     printf("(7) - Ricerca di una tratta per stazione di partenza(Binaria);\n(8) - Ricerca di una tratta per stazione di ");
  56.     printf("partenza.(Lineare);\n(9) - Prendi i dati da un altro file;\n(0) - Termina programma.\n");
  57.  
  58.     scanf("%d", &scelta);
  59.     if (scelta == 0)
  60.         fine = 1;
  61.  
  62.     while (fine != 1)
  63.     {
  64.         switch(scelta)
  65.         {
  66.         case 1:
  67.             StampaVideo(cor, n);
  68.             break;
  69.         case 2:
  70.             StampaFile(cor, n);
  71.             break;
  72.         case 3:
  73.             OrdPerData(ord1, n);
  74.             StampaVideo2(ord1, n);
  75.             break;
  76.         case 4:
  77.             OrdPerCod(ord2, n);
  78.             StampaVideo2(ord2, n);
  79.             break;
  80.         case 5:
  81.             OrdPerPart(ord3, n);
  82.             StampaVideo2(ord3, n);
  83.             break;
  84.         case 6:
  85.             OrdPerArr(ord4, n);
  86.             StampaVideo2(ord4, n);
  87.             break;
  88.         case 7:
  89.             printf("Digitare la stazione di partenza: ");
  90.             scanf("%s", part);
  91.             RicercaBin(ord3, 0, n, part);
  92.             break;
  93.         case 8:
  94.             printf("Digitare la stazione di partenza: ");
  95.             scanf("%s", part);
  96.             RicercaLin(cor, 0, n, part);
  97.             break;
  98.         case 9:
  99.             free(cor);
  100.             for(i=0; i<n; i++)
  101.             {
  102.                 free(ord1[i]);
  103.                 free(ord2[i]);
  104.                 free(ord3[i]);
  105.                 free(ord4[i]);
  106.             }
  107.             free(ord1);
  108.             free(ord2);
  109.             free(ord3);
  110.             free(ord4);
  111.  
  112.             printf("Scrivere il nome del file da cui prendere i dati: ");
  113.             scanf("%s", nomefile);
  114.             n = ContaDati(nomefile);
  115.             num = n+1;
  116.             cor = (corse*)malloc(num*sizeof(corse));
  117.             ord1 = (corse**)malloc(num*sizeof(corse*));
  118.             ord2 = (corse**)malloc(num*sizeof(corse*));
  119.             ord3 = (corse**)malloc(num*sizeof(corse*));
  120.             ord4 = (corse**)malloc(num*sizeof(corse*));
  121.             LeggiDati(nomefile, cor, num);
  122.             for(i=0; i<n; i++)
  123.                 ord1[i] = ord2[i] = ord3[i] = ord4[i] = &cor[i];
  124.             break;
  125.         case 0:
  126.             fine = 1;
  127.             break;
  128.         default:
  129.             printf("Opzione non presente nel programma.\n");
  130.             break;
  131.         }
  132.         printf("Esegui una nuova operazione:\n");
  133.         scanf("%d", &scelta);
  134.     }
  135.  
  136.     return 0;
  137. }
  138.  
  139. int ContaDati(char* nomf)
  140. {
  141.     FILE *fp;
  142.     int num;
  143.  
  144.     fp = fopen(nomf, "r");
  145.  
  146.     fscanf(fp, "%d", &num);
  147.  
  148.     fclose(fp);
  149.  
  150.     return num;
  151. }
  152.  
  153. void LeggiDati(char* nomf, corse *c, int num)
  154. {
  155.     FILE *fp;
  156.     int i;
  157.  
  158.     fp = fopen(nomf, "r");
  159.  
  160.     fscanf(fp, "%d", &num);
  161.     for(i=1; i<=num; i++)
  162.         fscanf(fp, "%s %s %s %s %s %s %d", c[i].cod_tratta, c[i].partenza, c[i].arrivo, c[i].data,
  163.                c[i].ora_partenza, c[i].ora_arrivo, &c[i].ritardo);
  164.  
  165.     for(i=0; i<=num; i++)
  166.     {
  167.         strcpy(c[i].cod_tratta, c[i+1].cod_tratta);
  168.         strcpy(c[i].partenza, c[i+1].partenza);
  169.         strcpy(c[i].arrivo, c[i+1].arrivo);
  170.         strcpy(c[i].data, c[i+1].data);
  171.         strcpy(c[i].ora_partenza, c[i+1].ora_partenza);
  172.         strcpy(c[i].ora_arrivo, c[i+1].ora_arrivo);
  173.         c[i].ritardo = c[i+1].ritardo;
  174.     }
  175.  
  176.     fclose(fp);
  177.     return;
  178. }
  179.  
  180. void StampaVideo(corse *c, int num)
  181. {
  182.     int i;
  183.  
  184.     for(i=0; i<num; i++)
  185.         printf("%s %s %s %s %s %s %d\n", c[i].cod_tratta, c[i].partenza, c[i].arrivo, c[i].data,
  186.                c[i].ora_partenza, c[i].ora_arrivo, c[i].ritardo);
  187.  
  188.     return;
  189. }
  190.  
  191. void StampaFile(corse *c, int num)
  192. {
  193.     FILE *fp;
  194.     int i;
  195.  
  196.     fp = fopen("stampacorse.txt", "w");
  197.  
  198.     for(i=0; i<num; i++)
  199.         fprintf(fp, "%s %s %s %s %s %s %d\n", c[i].cod_tratta, c[i].partenza, c[i].arrivo, c[i].data,
  200.                 c[i].ora_partenza, c[i].ora_arrivo, c[i].ritardo);
  201.  
  202.     fclose(fp);
  203.  
  204.     return;
  205. }
  206.  
  207. void OrdPerData(corse **c, int num)
  208. {
  209.     corse *temp;
  210.     int i, j, imin, confr;
  211.  
  212.     for(i=0; i<num-1; i++)
  213.     {
  214.         imin = i;
  215.         for(j=i+1; j<num; j++)
  216.  
  217.             if(strcmp(c[j]->data, c[imin]->data)<0)
  218.                 imin = j;
  219.             else
  220.             {
  221.                 if(strcmp(c[j]->data, c[imin]->data)==0)
  222.                 {
  223.                     confr = ConfrontaOre(c[j], c[imin]);
  224.                     if(confr<0)
  225.                         imin = j;
  226.                 }
  227.             }
  228.         temp = c[i];
  229.         c[i] = c[imin];
  230.         c[imin] = temp;
  231.     }
  232.     return;
  233. }
  234.  
  235. void OrdPerCod(corse **c, int num)
  236. {
  237.     corse *temp;
  238.     int i, j, imin;
  239.  
  240.     for(i=0; i<num-1; i++)
  241.     {
  242.         imin = i;
  243.         for(j=i+1; j<num; j++)
  244.             if(strcmp(c[j]->cod_tratta,c[imin]->cod_tratta)<0)
  245.                 imin = j;
  246.         temp = c[i];
  247.         c[i] = c[imin];
  248.         c[imin] = temp;
  249.     }
  250.  
  251.     return;
  252. }
  253.  
  254. void OrdPerPart(corse **c, int num)
  255. {
  256.     corse *temp;
  257.     int i, j, imin;
  258.  
  259.     for(i=0; i<num-1; i++)
  260.     {
  261.         imin = i;
  262.         for(j=i+1; j<num; j++)
  263.             if(strcmp(c[j]->partenza,c[imin]->partenza)<0)
  264.                 imin = j;
  265.         temp = c[i];
  266.         c[i] = c[imin];
  267.         c[imin] = temp;
  268.     }
  269.     return;
  270. }
  271.  
  272. void OrdPerArr(corse **c, int num)
  273. {
  274.     corse *temp;
  275.     int i, j, imin;
  276.  
  277.     for(i=0; i<num-1; i++)
  278.     {
  279.         imin = i;
  280.         for(j=i+1; j<num; j++)
  281.             if(strcmp(c[j]->arrivo,c[imin]->arrivo)<0)
  282.                 imin = j;
  283.         temp = c[i];
  284.         c[i] = c[imin];
  285.         c[imin] = temp;
  286.     }
  287.     return;
  288. }
  289.  
  290. void RicercaBin(corse **c, int l, int r, char* str)
  291. {
  292.     int n, m = 0;
  293.  
  294.     n = strlen(str);
  295.  
  296.     while(l <= r)
  297.     {
  298.         m = (l+r)/2;
  299.         if(strncmp(str, c[m]->partenza,n) == 0)
  300.             printf("%s %s %s %s %s %s %d\n", c[m]->cod_tratta, c[m]->partenza, c[m]->arrivo, c[m]->data,
  301.                    c[m]->ora_partenza, c[m]->ora_arrivo, c[m]->ritardo);
  302.         if(strncmp(str, c[m]->partenza, n) < 0)
  303.             l = m+1;
  304.         else
  305.             r = m-1;
  306.     }
  307. }
  308.  
  309. void RicercaLin(corse *c, int l, int r, char* str)
  310. {
  311.     int i = l, n;
  312.     int found = 0;
  313.  
  314.     n = strlen(str);
  315.  
  316.     while(i <= r && found == 0)
  317.         if(strncmp(str, c[i].partenza,n) == 0)
  318.         {
  319.             printf("%s %s %s %s %s %s %d\n", c[i].cod_tratta, c[i].partenza, c[i].arrivo, c[i].data,
  320.                    c[i].ora_partenza, c[i].ora_arrivo, c[i].ritardo);
  321.             found = 1;
  322.         }
  323.         else
  324.             i++;
  325.  
  326.     if(found == 0)
  327.         printf("Non e' stata trovata nessuna tratta\n");
  328.  
  329. }
  330.  
  331. int ConfrontaOre(corse *c1, corse *c2)
  332. {
  333.     int confr;
  334.  
  335.     confr = strcmp(c1->ora_partenza, c2->ora_partenza);
  336.     if(confr == 0)
  337.         confr = strcmp(c1->ora_arrivo, c2->ora_arrivo);
  338.  
  339.     return confr;
  340. }
  341.  
  342. void StampaVideo2(corse **c, int num)
  343. {
  344.     int i;
  345.  
  346.     for(i=0; i<num; i++)
  347.         printf("%s %s %s %s %s %s %d\n", c[i]->cod_tratta, c[i]->partenza, c[i]->arrivo, c[i]->data,
  348.                c[i]->ora_partenza, c[i]->ora_arrivo, c[i]->ritardo);
  349.  
  350.     return;
  351. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement