home *** CD-ROM | disk | FTP | other *** search
/ ftp.disi.unige.it / 2015-02-11.ftp.disi.unige.it.tar / ftp.disi.unige.it / pub / .person / CataniaB / teach-act / testi-esami / labo-7.00 / parte1-4.c < prev    next >
C/C++ Source or Header  |  2001-01-29  |  3KB  |  173 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define MAX 100
  4.  
  5. /* implementazione insiemi  ordinati,
  6.  * con array */
  7.  
  8.  
  9. /* tipi */
  10.  
  11. typedef unsigned char bool;
  12. typedef int elem;
  13. typedef struct tset {
  14.                         elem info[MAX];
  15.                         int lg;
  16.                     } set;
  17.  
  18. /* prototipi */
  19.  
  20. set empty();
  21. void insert(elem,set *);
  22. void print(set);
  23. void even_odd(set,set,set *,set *);
  24.  
  25. /* main*/
  26.  
  27. main()
  28. {
  29.     
  30.     set s1 = empty(), s2 =empty(),even,odd;
  31.     int m;
  32.     FILE *fp;
  33.     char nome_f[20];
  34.     
  35.     printf("\nInserire il nome del file ");
  36.     scanf("%s",nome_f);
  37.  
  38.     fp=fopen(nome_f,"r");
  39.  
  40.     while (fscanf(fp,"%d",&m) && (m!=-1))
  41.     {
  42.         insert(m,&s1);
  43.     }
  44.     while (fscanf(fp,"%d",&m) && (m!=-1))
  45.     {
  46.         insert(m,&s2);
  47.     }
  48.  
  49.     printf("\nIl primo insieme e': ");
  50.     print(s1);
  51.     printf("\nIl secondo insieme e': ");
  52.     print(s2);
  53.  
  54.     even_odd(s1,s2,&even,&odd);
  55.  
  56.     printf("\nL'insieme pari e': ");
  57.     print(even);
  58.     printf("\nL'insieme dispari e': ");
  59.     print(odd);
  60. }
  61.  
  62.  
  63. /* definizione funzioni */
  64.  
  65.  
  66.  
  67. set empty()
  68. {
  69.   set s;
  70.   s.lg = 0;
  71.   return s;
  72. }
  73.  
  74. void insert(elem el,set *s)
  75. {
  76.     int i,k;
  77.     if (s->lg == MAX)
  78.         {
  79.             printf("Errore: spazio insufficiente");
  80.             exit(EXIT_FAILURE);
  81.         }
  82.  
  83.     /* cerco la posizione (avanzo fino a trovare un elemento >= el o fine
  84.      * array)*/
  85.     
  86.     for (i=0;(i<s->lg) && (s->info[i] < el) ;i++);
  87.     
  88.     /* se sono arrivato in fondo o se
  89.      * l'elemento su cui ci siamo fermati e' > el, 
  90.      * l'elemento non e' presente e quindi lo posso aggiungere 
  91.      * (non vogliamo ripetizioni) e possiamo effettuare l'inserimento */
  92.     
  93.     if ((i == s->lg) || (s->info[i] != el))
  94.     {
  95.     
  96.         /* prima di  aggiungere l'elemento sposto in avanti tutti gli elementi successivi */
  97.         
  98.         for (k=s->lg-1;k>=i; k--)
  99.           s->info[k+1] = s->info[k];
  100.         
  101.         /* aggiungo l'elemento */        
  102.         
  103.         s->info[i] = el;
  104.         s->lg++;
  105.     }
  106.  
  107. }
  108.  
  109.  
  110.  
  111.  
  112. void print(set s)
  113. {
  114.   int i;
  115.   printf("{ ");
  116.   for (i=0;i< s.lg;i++)
  117.     { 
  118.         printf("%d ",s.info[i]);
  119.     }
  120.   printf("}\n");
  121. }
  122.  
  123.  
  124.  
  125. void even_odd(set s1, set s2, set *even, set *odd)
  126. {
  127.    int i,j,ii,jj;
  128.    *even=*odd =empty();
  129.    
  130.    /* scandisco in parallelo i due array e carico il minimo nell'insieme corrispondente */
  131.    
  132.    for (i=0,j=0;(i<s1.lg) && (j<s2.lg) ;)
  133.    {
  134.        if (s1.info[i] < s2.info[j])
  135.        {
  136.            if (!(s1.info[i]%2)) insert(s1.info[i],even);
  137.            else   insert(s1.info[i],odd);
  138.            i++; 
  139.        }    
  140.        else
  141.        {
  142.            if (!(s2.info[j]%2)) insert(s2.info[j],even);
  143.            else   insert(s2.info[j],odd);
  144.            j++;
  145.            if (s1.info[i] == s2.info[j]) i++;
  146.        }
  147.    }
  148.  
  149.    if (s1.lg > s2.lg)
  150.  
  151.     /* inserisco gli elementi mancanti del primo insieme */
  152.    
  153.       for (ii = i; ii < s1.lg;ii++)
  154.          {
  155.               if (!(s1.info[ii]%2)) insert(s1.info[ii],even);
  156.            else   insert(s1.info[ii],odd);
  157.           }
  158.            
  159.         else
  160.        
  161.        /* inserisco gli elementi mancanti del secondo insieme */
  162.   
  163.         for (jj = j; jj < s2.lg;jj++)
  164.           {
  165.               if (!(s2.info[jj]%2)) insert(s2.info[jj],even);
  166.           else   insert(s2.info[jj],odd);
  167.           }
  168.         
  169.  
  170.  } 
  171.  
  172.  
  173.