Advertisement
Guest User

Untitled

a guest
May 5th, 2015
279
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 19.86 KB | None | 0 0
  1. //eliminare accenti
  2. //controllare indentazione
  3.  
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6.  
  7. double *inserisci_insieme(int *);
  8.  
  9. double **inserisci_operazione(double *,
  10.                               int,
  11.                               char *);
  12.  
  13. int **inserisci_relazione(double *,
  14.                           int);
  15.  
  16. int cerca_elemento(double,
  17.                    double *,
  18.                    int);
  19.                    
  20. int valuta_chiusura(double **,
  21.                     double *,
  22.                     int,
  23.                     char);
  24.                    
  25. int valuta_equivalenza(int **,
  26.                        int);
  27.                        
  28. int valuta_riflessiva(int **,
  29.                       int);
  30.                      
  31. int valuta_simmetrica(int **,
  32.                       int);
  33.                      
  34. int valuta_transitiva(int **,
  35.                       int);
  36.                    
  37. void valuta_congruenza(int **,
  38.                        double **,
  39.                        int,
  40.                        char);
  41.  
  42. int main(void)
  43. {
  44.     /*Variabili locali alla funzione main*/
  45.     double  *insieme,       /*Array che conterra' gli elementi dell'insieme*/
  46.             **operazione;   /*Array multi-dimensionale che servira' a definire
  47.                             l'operazione - contiene i risultati ottenuti
  48.                             applicando l'operazione ad ogni coppia ordinata
  49.                             dell'insieme - mantiene un'associazione con l'insieme
  50.                             tramite gli stessi indici*/
  51.            
  52.     int     cardinalita,    /*Cardinalita' dell'insieme, serve per definire il
  53.                             numero di elementi degli array*/
  54.             **relazione;    /*Array multi-dimensionale che servira' a definire
  55.                             la relazione - ogni elemento assume valore 1 se gli
  56.                             elementi associati sono in relazione, 0 altrimenti -
  57.                             mantiene un'associazione con l'insieme tramite gli
  58.                             stessi indici*/
  59.    
  60.     char    op,             /*Carattere che serve a memorizzare il simbolo
  61.                             associato all'operazione*/
  62.             non_letto;      /*Variabile di lavoro che serve a svuotare il
  63.                             buffer di lettura*/
  64.  
  65.     /* Inizio Progetto */
  66.     printf("\nProgetto di Programmazione Procedurale e Logica");
  67.     printf("di Gianluca Bonifazi - Matricola 261989 - 2014/2015\n");
  68.    
  69.     /* Funzione che acquisisce l'insieme */
  70.     insieme = inserisci_insieme(&cardinalita);
  71.  
  72.     /* Funzione che acquisisce l'operazione */
  73.     operazione = inserisci_operazione(insieme,
  74.                                       cardinalita,
  75.                                       &op);
  76.                          
  77.     /* Funzione che acquisisce la relazione */
  78.     relazione = inserisci_relazione(insieme,
  79.                                     cardinalita);  
  80.  
  81.     /*Valutazione di chiusura e congruenza*/
  82.     printf("\nValutazione in corso...\n");
  83.     if(valuta_chiusura(operazione, insieme, cardinalita, op))
  84.     {
  85.         if(valuta_equivalenza(relazione, cardinalita))
  86.             valuta_congruenza(relazione, operazione, cardinalita, op);
  87.     }
  88.     else
  89.     {
  90.         printf("\nATTENZIONE: la relazione inserita NON e' una congruenza");
  91.         printf(" rispetto all'operazione %c\n",
  92.                 op);
  93.     }
  94.  
  95.     /*Svuoto il buffer di lettura*/
  96.     do
  97.         non_letto = getchar();
  98.     while (non_letto != '\n');
  99.  
  100.     printf("\n\nEsecuzione terminata.\n Premere un tasto per uscire: ");
  101.     getchar();
  102.    
  103.     return (0);
  104. }
  105.  
  106.  
  107. /*La funzione prende in input una variabile passata per indirizzo all'interno
  108. della quale verra' memorizzato il valore della cardinalita' dell'insieme*/
  109. /*Restituisce un puntatore all'array che memorizza gli elementi dell'insieme*/
  110. double *inserisci_insieme(int *n)
  111. {
  112.     double  *a;                 /*Array che conterra' gli elementi dell'insieme*/
  113.    
  114.     int     i,                  /*Variabile di lavoro - cicli*/
  115.             esito_lettura,      /*Variabile di lavoro - validazione*/
  116.             insieme_corretto;   /*Variabile di lavoro - cicli e validazione*/
  117.    
  118.     char    carattere_non_letto; /*Variabile di lavoro - validazione*/
  119.    
  120.     do
  121.     {
  122.         /* Si chiede all'utente di definire la cardinalita' dell'insieme */
  123.         /* L'acquisizione del valore e' soggetta a validazione stretta */
  124.         do
  125.         {
  126.             printf("\nDigitare la cardinalità dell'insieme: ");
  127.             esito_lettura = scanf("%d",
  128.                                   n);
  129.                                  
  130.             if (esito_lettura != 1 || *n < 0)
  131.                 do
  132.                     carattere_non_letto = getchar();
  133.                 while (carattere_non_letto != '\n');
  134.         }
  135.         while (esito_lettura != 1 || *n < 0);
  136.        
  137.         /* Alloco dinamicamente un array della dimensione scelta */
  138.         a = (double *) calloc(*n,
  139.                               sizeof(double));
  140.        
  141.         /* Si chiede all'utente di digitare gli elementi dell'insieme */
  142.         /* L'acquisizione del valore e' soggetta a validazione stretta */
  143.  
  144.         printf("Inserisci i %d elementi separati da \"enter\":\n",
  145.                *n);
  146.            
  147.         /* Acquisizione degli elementi */
  148.         for(i = 0;
  149.             (i < *n);
  150.             i++)
  151.             do
  152.             {
  153.                 esito_lettura = scanf("%lf",
  154.                                       a + i);
  155.  
  156.                 if (esito_lettura != 1)
  157.                     do
  158.                         carattere_non_letto = getchar();
  159.                     while (carattere_non_letto != '\n');
  160.             }
  161.             while (esito_lettura != 1);  
  162.    
  163.         /* Stampo a video l'insieme che si è creato */
  164.         printf("L'insieme e' formato dai seguenti elementi: \n{ ");
  165.         for (i = 0;
  166.              i < *n;
  167.              i++)
  168.             printf("%.2f ",
  169.                    a[i]);
  170.         printf("}\n");
  171.        
  172.         /* Si chiede all'utente conferma dei valori digitati */
  173.         /* se corretto, si prosegue altrimenti la funzione cicla */
  174.         /* L'acquisizione di questo valore e' soggetta a validazione stretta */
  175.         do
  176.         {
  177.             printf("\nDigitare 1 se l'insieme e' corretto, 0 altrimenti: ");
  178.             esito_lettura = scanf("%d",
  179.                                   &insieme_corretto);
  180.                                  
  181.             if (esito_lettura != 1  
  182.                 || (insieme_corretto != 1 && insieme_corretto != 0))
  183.                 do
  184.                     carattere_non_letto = getchar();
  185.                 while (carattere_non_letto != '\n');
  186.         }
  187.         while (esito_lettura != 1
  188.                 || (insieme_corretto != 1 && insieme_corretto != 0));
  189.        
  190.         if(!insieme_corretto)
  191.             free(a);
  192.     }
  193.     while(!insieme_corretto);
  194.    
  195.     return(a);
  196. }
  197.  
  198.  
  199. /*La funzione prende in input l'array che contiene gli elementi dell'insieme,
  200. la cardinalita' dell'insieme e una variabile passata per indirizzo nella quale
  201. memorizzare il simbolo associato all'operazione da acquisire*/
  202. /*Restituisce un puntatore all'array multi-dimensionale che memorizza i risultati
  203. dell'operazione applicata ad ogni coppia ordinata dell'insieme*/
  204. double **inserisci_operazione(double *a,
  205.                               int n,
  206.                               char *op)
  207. {
  208.     int             esito_lettura,          /*Variabile di lavoro - validazione*/
  209.                     i,                      /*Variabile di lavoro - cicli*/
  210.                     j;                      /*Variabile di lavoro - cicli*/
  211.                    
  212.     double          **matrice;              /*Array multi-dimensionale che
  213.                                             servira' a definire l'operazione -
  214.                                             contiene i risultati ottenuti
  215.                                             applicando l'operazione ad ogni
  216.                                             coppia ordinata dell'insieme*/
  217.  
  218.     char            carattere_non_letto;    /*Variabile di lavoro - validazione*/
  219.    
  220.     /*Alloco una matrice di valori di dimensione n*n*/
  221.     matrice = (double **) calloc(n,
  222.                                  sizeof(double *));
  223.     for(i = 0;
  224.         (i < n);
  225.         i++)
  226.         matrice[i] = (double *) calloc(n,
  227.                                        sizeof(double));
  228.  
  229.     /*Acquisisco il simbolo con il quale l'utente vuole identificare
  230.     l'operazione - prima di acquisire il carattere svuoto il buffer*/
  231.     do    
  232.         scanf("%c",
  233.               &carattere_non_letto);
  234.     while(carattere_non_letto != '\n');
  235.  
  236.     /* Validazione stretta dell'acquisizione. Impongo che il simbolo
  237.     non sia un numero o un "a capo" */
  238.     do
  239.     {
  240.         printf("\nDefinisci il simbolo con cui identificare l'operazione");
  241.         printf(" binaria: ");
  242.  
  243.         scanf("%c",
  244.                 op);
  245.  
  246.         if (isdigit(*op) || *op == '\n')
  247.  
  248.             do
  249.                 carattere_non_letto = getchar();
  250.             while (carattere_non_letto != '\n');
  251.     }
  252.     while (isdigit(*op) || *op == '\n');
  253.  
  254.     /* Svuoto di nuovo il buffer in caso l'utente inserisce più di un simbolo
  255.     per l'operazione lasciando cosi solo il primo carattere */
  256.     do    
  257.         scanf("%c",
  258.               &carattere_non_letto);
  259.     while(carattere_non_letto != '\n');  
  260.  
  261.    
  262.     /*Definizione dell'operazione sugli elementi dell'insieme*/
  263.     printf("\nDigitare i risultati dell'operazione %c",
  264.             *op);
  265.     printf(" applicata ai seguenti operandi:");
  266.    
  267.     /*Richiedo all'utente il risultato dell'operazione binaria applicata ad ogni
  268.     coppia ordinata di operatori*/
  269.     for(i = 0;
  270.         (i < n);
  271.         i++)
  272.         for(j = 0;
  273.             (j < n);
  274.             j++)
  275.         {
  276.             printf("\n%.2f %c %.2f = ",
  277.                     a[i],
  278.                     *op,
  279.                     a[j]);
  280.                    
  281.             scanf("%lf",
  282.                     &matrice[i][j]);
  283.         }
  284.    
  285.     return(matrice);
  286. }
  287.  
  288.  
  289. /*La funzione prende in input l'array che contiene gli elementi dell'insieme,
  290. la cardinalita' dell'insieme*/
  291. /*Restituisce un puntatore all'array multi-dimensionale che memorizza un valore
  292. 0 o 1 tale da definire la relazione applicata ad ogni coppia ordinata
  293. dell'insieme*/
  294. int **inserisci_relazione(double *a,
  295.                           int n)
  296. {
  297.     int     **matrice,  /*Array multi-dimensionale che servira' a definire
  298.                         la relazione - ogni elemento assume valore 1 se gli
  299.                         elementi associati sono in relazione, 0 altrimenti -
  300.                         mantiene un'associazione con l'insieme tramite gli
  301.                         stessi indici*/
  302.    
  303.             i,          /*Variabile di lavoro - cicli*/
  304.             j,          /*Variabile di lavoro - cicli*/
  305.             num;        /*Variabile di lavoro - iterazioni*/
  306.    
  307.     double  elemento;   /*Variabile di lavoro - memorizza temporaneamente il
  308.                         valore per verificarne la presenza*/
  309.    
  310.     /*Alloco una matrice di dimensione n*n*/
  311.     matrice = (int **) calloc(n,
  312.                               sizeof(int *));
  313.    
  314.     for(i = 0;
  315.         (i < n);
  316.         i++)
  317.         matrice[i] = (int *) calloc(n,
  318.                                     sizeof(int));
  319.    
  320.     /*Definizione della relazione*/
  321.     printf("\nDefinire di seguito la relazione.\n");
  322.    
  323.     /*Per ogni elemento dell'insieme chiedo all'utente di specificare quali
  324.     elementi sono in relazione con esso*/
  325.     for(i = 0;
  326.         (i < n);
  327.         i++)
  328.     {
  329.         printf("Digitare il numero di elementi in relazione con %.2f: ",
  330.                 a[i]);
  331.        
  332.         scanf("%d",
  333.               &num);
  334.        
  335.         for(j = 0;
  336.             (j < num);
  337.             j++)
  338.         {
  339.             do
  340.             {
  341.                 printf("Digitare il %d° elemento t.c. %.2f R ",
  342.                         j + 1,
  343.                         a[i]);
  344.                 scanf("%lf",
  345.                       &elemento);
  346.                 /*Verifico che l'elemento digitato sia presente -
  347.                 se si' inserisco l'1 che definisce la relazione*/
  348.                 if(cerca_elemento(elemento, a, n) != -1)
  349.                     matrice[i][cerca_elemento(elemento, a, n)] = 1;
  350.                 else
  351.                     printf("\nERRORE: Elemento non presente nell'insieme.\n");
  352.             }
  353.             while(cerca_elemento(elemento, a, n) == -1);
  354.         }
  355.     }
  356.     return(matrice);
  357. }
  358.  
  359. /*Funzione che valuta se l'elemento "e" e' presente nell'insieme*/
  360. /*Prende in ingresso l'elemento, l'array che contiene gli elementi dell'insieme
  361. e la dimensione dell'array, restituisce l'indice dell'elemento all'interno di a
  362. se l'elemento e' presente, -1 altrimenti */
  363. int cerca_elemento(double e,
  364.                    double *a,
  365.                    int n)
  366. {
  367.     int i,              /*Varibile di lavoro - cicli*/
  368.         posizione;      /*Variabile di lavoro - assume l'indice
  369.                         dell'elemento all'interno di a se l'elemento e'
  370.                         presente, -1 altrimenti*/
  371.    
  372.     /*Scorro ogni elemento dell'array fino a trovare l'elemento cercato
  373.     o fino all'ultimo se non presente*/
  374.     /*Se l'elemento e' presente esco dal ciclo e restituisco la sua posizione*/
  375.     for(posizione = -1, i = 0;
  376.         ((i < n) && (posizione == -1));
  377.         i++)
  378.         if(a[i] == e)
  379.             posizione = i;
  380.    
  381.     return(posizione);
  382. }
  383.  
  384. /*Funzione che valuta se l'operazione e' chiusa rispetto all'insieme*/
  385. /*Prende in input la matrice che definisce l'operazione, l'array degli elementi
  386. e la dimensione dell'array, restituisce 1 se l'insieme e' chiuso rispetto
  387. all'operazione, 0 altrimenti*/
  388. int valuta_chiusura(double **matrice,
  389.                     double *a,
  390.                     int n,
  391.                     char op)
  392. {
  393.     int i,          /*Variabile di lavoro - input*/                  
  394.         j,          /*Variabile di lavoro - input*/
  395.         chiuso;     /*Variabile che segnala se l'insieme e' chiuso*/
  396.                                
  397.     /*Verifico se il risultato dell'operazione applicata ad ogni coppia ordinata
  398.     di elementi appartiene all'insieme
  399.     i.e. l'insieme e' chiuso rispetto all'operatore*/
  400.     for(chiuso = 1, i = 0;
  401.         ((i < n) && chiuso);
  402.         i++)
  403.         for(j = 0;
  404.             ((j < n) && chiuso);
  405.             j++)
  406.             if(cerca_elemento(matrice[i][j], a, n) == -1)
  407.                 chiuso = 0;
  408.            
  409.     /*Al termine del ciclo notifico all'utente se l'insieme e' chiuso*/
  410.     if(chiuso)
  411.         printf("\nATTENZIONE: L'insieme e' chiuso");
  412.     else
  413.         printf("\nATTENZIONE: L'insieme NON e' chiuso");
  414.     printf(" rispetto all'operazione %c \n",
  415.            op);
  416.          
  417.     return (chiuso);
  418. }
  419.  
  420. /*Funzione che valuta se la relazione binaria e' una relazione di equivalenza*/
  421. /*Prende in input la matrice che definisce la relazione e il numero di elementi,
  422. restituisce 1 se la relazione e' una relazione di equivalenza, 0 altrimenti*/
  423. int valuta_equivalenza(int **relazione,
  424.                        int n)
  425. {
  426.     int equivalenza = 0;    /*Variabile che segnala se la relazione
  427.                             e' una relazione di equivalenza*/
  428.    
  429.     /*La relazione e' una relazione di equivalenza se soddisfa le proprieta' di
  430.     riflessivita', simmetria e transitivita'*/
  431.     if(valuta_riflessiva(relazione, n)
  432.        && valuta_simmetrica(relazione, n)
  433.        && valuta_transitiva(relazione, n))
  434.         equivalenza = 1;
  435.    
  436.     if(!equivalenza)
  437.         printf("\nATTENZIONE: La relazione non e' una relazione d'equivalenza\n");
  438.    
  439.     return(equivalenza);            
  440. }
  441.  
  442. /*Funzione che valuta se la relazione soddisfa la proprieta' di rifflessivita'*/
  443. int valuta_riflessiva(int **relazione,
  444.                       int n)
  445. {
  446.     int i,          /*Variabile di lavoro - cicli*/
  447.         riflessiva; /*Variabile che segnala se la relazione
  448.                     soddisfa la riflessibilita'*/
  449.    
  450.     printf("\nProprieta' riflessiva...");
  451.     /*Riflessiva se: a R a, per ogni a*/
  452.     for(riflessiva = 1, i = 0;
  453.         ((i < n) && (riflessiva));
  454.         i++)
  455.         if(!relazione[i][i])
  456.             riflessiva = 0;
  457.    
  458.     if(riflessiva)
  459.         printf("OK\n");
  460.     else
  461.         printf("NO\n");
  462.     return(riflessiva);
  463. }
  464.  
  465. /*Funzione che valuta se la relazione soddisfa la proprieta' di simmetria*/
  466. int valuta_simmetrica(int **relazione,
  467.                       int n)
  468. {  
  469.     int i,          /*Variabile di lavoro - cicli*/
  470.         j,          /*Variabile di lavoro - cicli*/
  471.         simmetrica; /*Variabile che segnala se la relazione
  472.                     soddisfa la simmetria*/
  473.    
  474.     printf("\nProprieta' simmetrica...");
  475.     /*Simmetrica se: per ogni i j, i R j -> j R i*/
  476.     for(simmetrica = 1, i = 0;
  477.         ((i < n) && (simmetrica));
  478.         i++)
  479.         for(j = 0;
  480.             ((j < n) && (simmetrica));
  481.             j++)
  482.             if(relazione[i][j])
  483.                 if(!relazione[j][i])
  484.                     simmetrica = 0;
  485.    
  486.     if(simmetrica)
  487.         printf("OK\n");
  488.     else
  489.         printf("NO\n");
  490.    
  491.     return(simmetrica);
  492. }
  493.  
  494. /*Funzione che valuta se la relazione soddisfa la proprieta' di transitivita'*/
  495. int valuta_transitiva(int **relazione,
  496.                       int n)
  497. {
  498.     int i,          /*Variabile di lavoro - cicli*/
  499.         j,          /*Variabile di lavoro - cicli*/
  500.         k,          /*Variabile di lavoro - cicli*/
  501.         transitiva; /*Variabile che segnala se la relazione
  502.                     soddisfa la transitivita'*/
  503.    
  504.     printf("\nProprieta' transitiva...");
  505.     /*Scorro ogni coppia ordinata dell'insieme,
  506.     per ogni i,j t.c. i R j controllo che per ogni elemento "k" j R k -> i R k*/
  507.     for(transitiva = 1, i = 0;
  508.         ((i < n) && (transitiva));
  509.         i++)
  510.         for(j = 0;
  511.             ((j < n) && (transitiva));
  512.             j++)
  513.             if(relazione[i][j])
  514.                 for(k = 0;
  515.                     ((k < n) && (transitiva));
  516.                     k++)
  517.                     if(relazione[j][k])
  518.                         if(!relazione[i][k])
  519.                             transitiva = 0;
  520.    
  521.     if(transitiva)
  522.         printf("OK\n");
  523.     else
  524.         printf("NO\n");
  525.    
  526.     return(transitiva);
  527. }
  528.  
  529. /*Funzione che valuta se la relazione e' anche una congruenza
  530. rispetto all'operatore*/
  531. /*Prende in ingresso la matrice che definisce la relazione,
  532. la matrice che definisce l'operazione, e la loro dimensione.
  533. Restituisce 1 se la relazione e' una congruenza, 0 altrimenti*/
  534. void valuta_congruenza(int **relazione,
  535.                        double **operazione,
  536.                        int n,
  537.                        char op)
  538. {
  539.     int i,          /*Variabile di lavoro - cicli*/
  540.         j,          /*Variabile di lavoro - cicli*/
  541.         k,          /*Variabile di lavoro - cicli*/
  542.         congruenza; /*Variabile che segnala se la relazione
  543.                     e' una relazione di equivalenza*/
  544.    
  545.     /*Scorro ogni coppia ordinata dell'insieme,
  546.     per ogni i,j t.c. i R j (dove R e' gia' provata essere una relazione di
  547.     equivalenza) controllo che per ogni elemento "k" dell'insieme valga
  548.     ((i OP k) = (j OP k)) AND ((k OP i) = (k OP j))
  549.     (dove OP indica l'operazione binaria)*/
  550.     for(congruenza = 1, i = 0;
  551.         ((i < n) && congruenza);
  552.         i++)
  553.         for(j = 0;
  554.             ((j < n) && congruenza);
  555.             j++)
  556.             if(relazione[i][j] && (i != j))
  557.                 for(k = 0;
  558.                     ((k < n) && congruenza);
  559.                     k++)
  560.                     if((operazione[i][k] != operazione[j][k])
  561.                         || operazione[k][i] != operazione[k][j])
  562.                         congruenza = 0;
  563.     if(congruenza)
  564.         printf("\nATTENZIONE: la relazione inserita e' una congruenza");
  565.     else
  566.         printf("\nATTENZIONE: la relazione inserita NON e' una congruenza");
  567.         printf(" rispetto all'operazione %c\n",
  568.                 op);
  569. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement