Advertisement
Guest User

Untitled

a guest
May 26th, 2019
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 12.07 KB | None | 0 0
  1.  
  2. /************************************************************************************************/
  3. /* programma che include una libreria creata da utente che gestisce due insiemi di numeri reali */
  4. /************************************************************************************************/
  5.  
  6. /*****************************/
  7. /* inclusione delle librerie */
  8. /*****************************/
  9.  
  10. #include <stdio.h>
  11. #include <stdlib.h>
  12. #include "lib_ins_reali.h"
  13.  
  14. /********************************/
  15. /* dichiarazione delle funzioni */
  16. /********************************/
  17.  
  18. elem_lista_t *crea_insieme(char);
  19. void ordinamento_per_selezione(elem_lista_t *);
  20. void elenco_funzioni();
  21. void stampa_insieme(elem_lista_t *);
  22.  
  23. /* definizione della funzione principale */
  24. int main(void)
  25. {
  26.     /*dichiarazioni delle variabili locali alla funzione*/
  27.     elem_lista_t         *insieme_A = NULL,     /*lavoro: puntatore all'elemento testa dell'insieme A*/
  28.                  *insieme_B = NULL,     /*lavoro: puntatore all'elemento testa dell'insieme B*/
  29.                  *insieme_C = NULL;     /*lavoro: puntatore all'elemento testa dell'insieme risultante*/
  30.     int           scelta,           /*input:  valore di tipo intero per definire la scelta dell'utente*/
  31.                   esito_uguaglianza,        /*output: valore che definisce l'uguaglianza tra insiemi*/
  32.                   esito_lettura;        /*output: valore che definisce la validazione degli input*/
  33.     char              id_insieme_A = 'a',       /*lavoro: identificazione dell'insieme A*/
  34.                   id_insieme_B = 'b',       /*lavoro: identificazione dell'insieme B*/
  35.                   rimozione_carattere;      /*lavoro: variabile di svuotamento buffer*/
  36.    
  37.     /*chiamata a funzione: stampa a video dell'elenco delle operazioni*/
  38.     do
  39.     {
  40.         do
  41.         {
  42.             /*chiamata a funzione: stampa menù*/
  43.             elenco_funzioni();
  44.             printf("\nScelta: ");
  45.             esito_lettura = scanf("%d",
  46.                           &scelta);
  47.                                  
  48.             /*validazione input: scelta menù*/
  49.             if (esito_lettura != 1)
  50.             {
  51.                 printf("\nInput non accettabile, prego reinserire!\n");
  52.                
  53.                 /*pulizia buffer*/
  54.                 while ((rimozione_carattere = getchar()) != '\n');
  55.             }
  56.         }
  57.         /*ripeti finché l'esito di scanf sia negativo*/
  58.         while (esito_lettura != 1);
  59.    
  60.         /*scelta delle funzioni da eseguire*/
  61.         switch (scelta)
  62.         {
  63.             case 1:
  64.                 /*chiamata a funzione: creazione dell'insieme A*/
  65.                 insieme_A = crea_insieme(id_insieme_A);
  66.  
  67.                 /*chiamata a funzione: creazione dell'insieme B*/
  68.                 insieme_B = crea_insieme(id_insieme_B);
  69.                 break;
  70.             case 2:
  71.                 /*chiamata a funzione: operazione di uguaglianza*/
  72.                 esito_uguaglianza = uguaglianza_insiemi(insieme_A,
  73.                                     insieme_B);
  74.                                                        
  75.                 /*stampa a video degli insiemi*/
  76.                 printf("\nINSIEMI:\n");
  77.                 printf("\nInsieme A = { ");
  78.                 stampa_insieme(insieme_A);
  79.                 printf("Insieme B = { ");
  80.                 stampa_insieme(insieme_B);
  81.                
  82.                 /*verifica di uguaglianza*/
  83.                 if (esito_uguaglianza == 1)
  84.                     printf("\nUGUAGLIANZA:\n\nInsieme A = Insieme B\n");
  85.                 else
  86.                     printf("\nUGUAGLIANZA:\n\nInsieme A != Insieme B\n");
  87.                 break;
  88.             case 3:
  89.                 /*stampa a video degli insiemi*/
  90.                 printf("\nINSIEMI:\n");
  91.                 printf("\nInsieme A = { ");
  92.                 stampa_insieme(insieme_A);
  93.                 printf("Insieme B = { ");
  94.                 stampa_insieme(insieme_B);
  95.                
  96.                 /*chiamata a funzione: operazione d'intersezione*/
  97.                 printf("\nINTERSEZIONE:\n\nInsieme C = { ");
  98.                 insieme_C = intersezione_insiemi(insieme_A,
  99.                                  insieme_B);
  100.                                                  
  101.                 /*stampa dell'insieme risultante*/
  102.                 stampa_insieme(insieme_C);
  103.                 break;
  104.             case 4:
  105.                 /*stampa a video degli insiemi*/
  106.                 printf("\nINSIEMI:\n");
  107.                 printf("\nInsieme A = { ");
  108.                 stampa_insieme(insieme_A);
  109.                 printf("Insieme B = { ");
  110.                 stampa_insieme(insieme_B);
  111.                
  112.                 /*chiamata a funzione: operazione di differenza A-B*/
  113.                 printf("\nDIFFERENZA (A-B):\n\nInsieme C = { ");
  114.                 insieme_C = differenza_insiemi(insieme_A,
  115.                                    insieme_B);
  116.                                                
  117.                 /*stampa a video dell'insieme risultante*/
  118.                 stampa_insieme(insieme_C);     
  119.            
  120.                 /*chiamata a funzione: operazione di differenza B-A*/
  121.                 printf("\nDIFFERENZA (B-A):\n\nInsieme C = { ");
  122.                 insieme_C = differenza_insiemi(insieme_B,
  123.                                    insieme_A);
  124.                                                
  125.                 /*stampa a video dell'insieme risultante*/
  126.                 stampa_insieme(insieme_C);         
  127.                 break;
  128.             case 5:
  129.                 /*stampa a video degli insiemi*/
  130.                 printf("\nINSIEMI:\n");
  131.                 printf("\nInsieme A = { ");
  132.                 stampa_insieme(insieme_A);
  133.                 printf("Insieme B = { ");
  134.                 stampa_insieme(insieme_B);
  135.                
  136.                 /*chiamata a funzione: operazione di differenza simmetrica*/
  137.                 printf("\nDIFFERENZA SIMMETRICA:\n\nInsieme C = { ");
  138.                 insieme_C = differenza_simmetrica_insiemi(insieme_A,
  139.                                       insieme_B);
  140.                                                          
  141.                 /*stampa a video dell'insieme risultante*/
  142.                 stampa_insieme(insieme_C);     
  143.                 break;
  144.             case 0:
  145.                 /*uscita dal programma*/
  146.                 break;
  147.             default:
  148.                 printf("\nInput non accettabile, prego reinserire!\n");
  149.                 break;
  150.         }
  151.     }
  152.    
  153.     /*ripeti finchè la scelta sia diversa da zero*/
  154.     while (scelta != 0);
  155.    
  156.     /*messa a capo della stringa: premere un tasto per continuare...*/
  157.     printf("\n");
  158.     return(0);
  159. }
  160.  
  161. /* definizione della funzione per la creazione dell'insieme */
  162. elem_lista_t *crea_insieme(char id_insieme)
  163. {
  164.     /*dichiarazione delle variabili locali alla funzione*/
  165.     elem_lista_t         *p,                /*lavoro: puntatore ausiliario che punterà alla testa dell'insieme */
  166.                  *corr_p,           /*lavoro: puntatore ausiliario che scorrerà l'insieme */
  167.                  *rip_p;            /*lavoro: puntatore ausiliario che controlla la ripetizione dei valori*/
  168.     int               card,             /*input:  variabile contenente la cardinalità dell'insieme */
  169.                   i,                /*lavoro: variabile contatore*/
  170.                   esito_lettura,        /*lavoro: variabile di controllo acquisizione tramite funzione scanf*/
  171.                   ripetuto = 0;         /*lavoro: variabile di controllo di ripetizione dei valori*/
  172.     char              rimozione_carattere;      /*lavoro: variabile di svuotamento buffer*/
  173.    
  174.     /*inserimento della cardinalità da tastiera*/
  175.     do
  176.     {
  177.         /*printf relativa all'insieme A*/
  178.         if (id_insieme == 'a')
  179.             printf("\nInserire la cardinalita' dell'insieme A\n");
  180.  
  181.        
  182.         /*printf relativa all'insieme B*/
  183.         else       
  184.             printf("\nInserire la cardinalita' dell'insieme B\n");
  185.  
  186.         printf("\nCardinalita': ");
  187.         esito_lettura = scanf("%d",
  188.                        &card);
  189.                          
  190.         /*validazione input: cardinalità insieme*/
  191.         if ((esito_lettura != 1 ||
  192.              card < 0))
  193.         {
  194.             printf("\nInput non accettabile!\n");
  195.                
  196.             /*pulizia buffer*/
  197.             while ((rimozione_carattere = getchar()) != '\n');
  198.         }
  199.     }
  200.    
  201.     /*ripeti finché l'esito di scanf sia negativo o minore di zero*/
  202.     while ((esito_lettura != 1 ||
  203.         card < 0));
  204.            
  205.     /*pulizia buffer*/
  206.     while ((rimozione_carattere = getchar()) != '\n');
  207.            
  208.     /*condizione in cui l'insieme sia vuoto*/
  209.     if (card == 0)
  210.     {
  211.         printf("\nInsieme vuoto!\n");
  212.         p = NULL;
  213.     }
  214.    
  215.     /*creazione dell'insieme non vuoto*/
  216.     else
  217.     {
  218.         /*allocazione dinamica del primo elemento dell'insieme */
  219.         p = (elem_lista_t *)malloc(sizeof(elem_lista_t));
  220.         printf("\nInserire i valori reali:\n\n");
  221.         do
  222.         {
  223.             printf("1' Valore: ");
  224.             esito_lettura = scanf("%lf",
  225.                            &p->valore);
  226.  
  227.             /*validazione input: inserimento valore*/
  228.             if (esito_lettura != 1)
  229.             {
  230.                 printf("\nInput non accettabile, prego reinserire!\n\n");
  231.                
  232.                 /*pulizia buffer*/
  233.                 while ((rimozione_carattere = getchar()) != '\n');
  234.             }
  235.         }
  236.        
  237.         /*ripeti finché l'esito di scanf sia negativo*/
  238.         while (esito_lettura != 1);
  239.        
  240.         /*pulizia buffer*/
  241.         while ((rimozione_carattere = getchar()) != '\n');
  242.        
  243.         /*inizializzazione del puntatore successivo a NULL*/
  244.         p->succ_p = NULL;
  245.        
  246.         /*assegnazione del puntatore ausiliario alla testa dell'insieme*/
  247.         corr_p = p;
  248.        
  249.         /*creazione degli elementi successivi dell'insieme*/
  250.         for (i = 2;
  251.             (i <= card);
  252.              i++)
  253.         {
  254.             /*allocazione dinamica degli elementi successivi dell'insieme*/
  255.             corr_p->succ_p = (elem_lista_t *)malloc(sizeof(elem_lista_t));
  256.            
  257.             /*scorrimento del puntatore ausiliario al valore successivo*/
  258.             corr_p = corr_p->succ_p;
  259.             corr_p->succ_p = NULL;
  260.             do
  261.             {
  262.                 /*assegnazione di rip_p alla testa dell'insieme*/
  263.                 rip_p = p;
  264.                
  265.                 /*printf condizionale in caso di ripetizione elemento*/
  266.                 if (ripetuto == 1)
  267.                     printf("\nValore gia' inserito, prego reinserire!\n");
  268.                    
  269.                 /*verifica di ripetizione elementi*/
  270.                 do
  271.                 {
  272.                     printf("%d' Valore: ", i);
  273.                     esito_lettura = scanf("%lf",
  274.                                    &corr_p->valore);
  275.                                      
  276.                     /*validazione input: inserimento valore*/
  277.                     if (esito_lettura != 1)
  278.                     {
  279.                         printf("\nInput non accettabile, prego reinserire!\n\n");
  280.            
  281.                         /*pulizia buffer*/
  282.                         while ((rimozione_carattere = getchar()) != '\n');
  283.                     }
  284.                 }
  285.                
  286.                 /*ripeti finché l'esito di scanf sia negativo*/
  287.                 while (esito_lettura != 1);
  288.                
  289.                 /*pulizia buffer*/
  290.                 while ((rimozione_carattere = getchar()) != '\n');
  291.                
  292.                 /*scansione insieme creato: controllo ripetizione valore*/
  293.                 ripetuto = 0;
  294.                 while (rip_p->succ_p != NULL)
  295.                 {
  296.                    
  297.                     /*se trovato: ripetizione input*/
  298.                     if (rip_p->valore == corr_p->valore)
  299.                         ripetuto = 1;
  300.                    
  301.                     /*scorrimento dei valori dell'insieme*/
  302.                     rip_p = rip_p->succ_p;
  303.                 }
  304.             }
  305.            
  306.             /*ripeti finché ripetuto sia uguale a uno*/
  307.             while (ripetuto == 1);
  308.         }
  309.        
  310.         /*chiamata a funzione: algoritmo di ordinamento per selezione*/
  311.         ordinamento_per_selezione(p);
  312.     }
  313.    
  314.     if (id_insieme == 'a')
  315.         printf("\nInsieme A generato!\n");
  316.  
  317.     if (id_insieme == 'b')
  318.         printf("\nInsieme B generato!\n");
  319.  
  320.     /*valore restituito alla funzione: primo elemento dell'insieme*/
  321.     return(p);
  322. }
  323.  
  324. /*definizione della funzione di ordinamento per selezione di un insieme*/
  325. void ordinamento_per_selezione(elem_lista_t *insieme)
  326. {
  327.     elem_lista_t         *inizio,   /*lavoro: variabile puntatore che punterà alla testa dell'insieme*/
  328.                  *tmp,      /*lavoro: variabile puntatore ausiliario per il confronto dei valori*/
  329.                  *min;      /*lavoro: variabile puntatore che punterà al valore minimo*/
  330.     double            max;      /*lavoro: variabile in cui verrà salvato il valore massimo*/    
  331.  
  332.     /*inizializzazione del primo valore*/
  333.     inizio = insieme;
  334.    
  335.     /*scansione dell'insieme*/
  336.     while (inizio->succ_p != NULL)
  337.     {
  338.         min = inizio;
  339.         tmp = inizio->succ_p;
  340.        
  341.         /*scambia finché tmp è diverso da NULL*/
  342.         while (tmp != NULL)
  343.         {
  344.             /*trova il valore minimo dell'insieme*/
  345.             if (min->valore > tmp->valore)
  346.                 min = tmp;
  347.            
  348.            
  349.             /*scorrimento al successivo valore*/
  350.             tmp = tmp->succ_p;
  351.         }
  352.        
  353.         /*operazione di scambio dei valori*/
  354.         max = inizio->valore;
  355.         inizio->valore = min->valore;
  356.         min->valore = max;
  357.        
  358.         /*impostazione del nuovo valore iniziale all'elemento successivo*/
  359.         inizio = inizio->succ_p;
  360.     }
  361.     return;
  362. }
  363.  
  364. /*definizione della funzione dell'elenco delle operazioni tra insiemi*/
  365. void elenco_funzioni()
  366. {
  367.     printf("\n* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *"); 
  368.     printf("\n* (Digitare: 1) Generazione insiemi A e B                           *");
  369.     printf("\n* (Digitare: 2) Stabilire se due insiemi sono uguali                *");
  370.     printf("\n* (Digitare: 3) Stabilire l'intersezione tra due insiemi            *");
  371.     printf("\n* (Digitare: 4) Stabilire la differenza tra due insiemi             *");
  372.     printf("\n* (Digitare: 5) Stabilire la differenza simmetrica tra due insiemi  *");
  373.     printf("\n* (Digitare: 0) Termina il programma                                *\n");
  374.     printf("*                                                                   *\n");
  375.     printf("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n"); 
  376.     return;
  377. }
  378.  
  379. /* definizione della funzione per la stampa a video di un insieme */
  380. void stampa_insieme(elem_lista_t *insieme)
  381. {
  382.     elem_lista_t *p;    /*lavoro: puntatore ausiliario che punterà alla testa dell'insieme*/
  383.    
  384.     /*scansione e stampa dei valori dell'insieme*/
  385.     p = insieme;
  386.     while (p != NULL)
  387.     {
  388.         if (p->succ_p != NULL)
  389.             printf("%3.3lf, ",
  390.                 p->valore);
  391.         else
  392.             printf("%3.3lf ",
  393.                 p->valore);
  394.         /*scorrimento al valore successivo*/
  395.         p = p->succ_p;
  396.     }
  397.     printf("}\n"); 
  398.     return;
  399. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement