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 / laboratorio / lab-26-4-99 / subset.c < prev   
C/C++ Source or Header  |  1999-05-25  |  2KB  |  55 lines

  1. /*  Programma per generare tutti i sottinsiemi di {1,..,n} 
  2.  *  In questa versione si usano array a dimensione fissa MAX +1
  3.  *  Provare a modificarlo per ottenere i sottoinsiemi di {a,...,n}, dove
  4.  *  1 <= a <=n 
  5.  */
  6.  
  7. #include <stdio.h>
  8. /* #include <stdlib.h> */
  9.  
  10. #define MAX 10 
  11.  
  12. main()
  13.  
  14. {
  15.     int n, k;
  16.     int subset [MAX];  
  17.       /* subset ha 11 elementi (poiche` si parte da 0)
  18.        * l'elemento di posto 0 serve "per controllo"
  19.        *  quindi  il valore massimo per n e` 10  !! 
  20.        *   
  21.        * i valori nell'array saranno solo 0 e 1
  22.        * 
  23.        * tutto funziona anche usando   char   al posto di int
  24.        * e senza cambiare niente altro 
  25.        * (si continua a leggere e scrivere in formato intero !!)
  26.        */ 
  27.     
  28.     scanf("%d", &n);    /* legge il valore per n; notare che bisogna usare
  29.                          * l'indirizzo di n :  &n
  30.                          */
  31.     
  32.     if ( (n > MAX) || (n < 1)) printf("input errato");
  33.     else  {
  34.        
  35.       for(k=0; k <= n ; k++) subset[k] = 0;
  36.     
  37.       while (subset[0] == 0) {
  38.     
  39.           /* stampa il sottinsieme corrente */
  40.           printf("{ ");
  41.           for(k=1; k <= n ; k++) if (subset[k]) printf("%d ", k);
  42.           printf(" } \n");     /*  si usa \n  per andare a capo nell'output */
  43.           
  44.           /* somma  1 al numero contenuto nell'array, con aritmetica binaria */
  45.           k = n;
  46.           while (subset[k]) {  subset[k]= 0; k-- ;};
  47.           subset[k] = 1;
  48.           
  49.         } /* chiude il while (subset[0] == 0)  */
  50.         
  51.      }  /* chiude l'else */
  52.        
  53. } /* chiude il main */
  54.            
  55.