Advertisement
Guest User

matriciraresvasiliu

a guest
Jan 17th, 2020
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 9.55 KB | None | 0 0
  1. /*
  2.  * Somma e moltiplica due matrici di numeri reali,
  3.  * acquisite tramite tastiera e stampate poi a video.
  4.  */
  5.  
  6. #include <stdio.h>
  7. #include <stdlib.h> /* fornisce il sottoprogramma calloc */
  8.  
  9. /* Tipo di dato per gestire le matrici */
  10. typedef struct
  11. {
  12.     double **matrice; /* matrice           */
  13.     int    n_righe,   /* numero di righe   */
  14.            n_colonne; /* numero di colonne */
  15. } matrice_t;
  16.  
  17. /* Prototipi dei sottoprogrammi */
  18.  
  19. void scarta_caratteri_in_eccesso();
  20.  
  21. void acquisisci_dimensione_matrice(int *dimensione, char messaggio[]);
  22.  
  23. void alloca_matrice(matrice_t *matrice);
  24.  
  25. void inizializza_matrice(matrice_t *matrice);
  26.  
  27. matrice_t somma_due_matrici(matrice_t matrice_A, matrice_t matrice_B);
  28.                        
  29. matrice_t moltiplica_due_matrici(matrice_t matrice_A, matrice_t matrice_B);
  30.                            
  31. void visualizza_matrice(matrice_t matrice, char messaggio[]);
  32.  
  33. int
  34. main(void)
  35. {
  36.     matrice_t matrice_A, matrice_B; /* matrici da acquisire da tastiera                    */
  37.     matrice_t somma_matrici,        /* matrice che conterra' la somma delle due matrici    */
  38.               prodotto_matrici;     /* matrice che conterra' il prodotto delle due matrici */
  39.    
  40.     printf("+-- Calcolo della somma e del prodotto tra due matrici --+\n\n");
  41.    
  42.     /* CONFIGURAZIONE DELLE MATRICI */
  43.    
  44.     /* acquisizione della dimensione delle matrici */
  45.     acquisisci_dimensione_matrice(&matrice_A.n_righe,
  46.                                   "Inserisci la dimensione della matrice A:\n  numero di righe   = ");
  47.     acquisisci_dimensione_matrice(&matrice_A.n_colonne,
  48.                                   "  numero di colonne = ");
  49.    
  50.     acquisisci_dimensione_matrice(&matrice_B.n_righe,
  51.                                   "\nInserisci la dimensione della matrice B:\n  numero di righe   = ");
  52.     acquisisci_dimensione_matrice(&matrice_B.n_colonne,
  53.                                   "  numero di colonne = ");
  54.    
  55.     /* allocamento dinamico delle matrici */
  56.     alloca_matrice(&matrice_A);
  57.     alloca_matrice(&matrice_B);
  58.    
  59.     printf("\n=========================\n");
  60.    
  61.     /* acquisizione da tastiera delle matrici */
  62.     printf("\nMatrice A numero di righe: %d; numero di colonne: %d\n", matrice_A.n_righe, matrice_A.n_colonne);
  63.     inizializza_matrice(&matrice_A);
  64.    
  65.     printf("\nMatrice B numero di righe: %d; numero di colonne: %d\n", matrice_B.n_righe, matrice_B.n_colonne);
  66.     inizializza_matrice(&matrice_B);
  67.    
  68.     printf("\n=========================\n");
  69.    
  70.     /* OPERAZIONI TRA MATRICI */
  71.    
  72.     /* Somma */
  73.     /* se le due matrici non hanno la stessa dimensione la somma non si puo' fare */
  74.     if(matrice_A.n_righe == matrice_B.n_righe && matrice_A.n_colonne == matrice_B.n_colonne)
  75.     {
  76.    
  77.         /* viene eseguita la somma tra la matrice A e la matrice B */
  78.         somma_matrici = somma_due_matrici(matrice_A, matrice_B);
  79.        
  80.         /* viene visualizzato il risultato tramite una
  81.            stampa a video della matrice somma       */
  82.         visualizza_matrice(somma_matrici,
  83.                            "Risultato somma tra la matrice A e la matrice B:");
  84.     }
  85.     /* se la somma non si puo' fare viene stampato un messaggio di errore */
  86.     else
  87.     {
  88.         printf("\nImpossibile sommare le due matrici.\n");
  89.         printf("  Le matrici devono avere le dimensioni uguali.\n");
  90.     }
  91.    
  92.     /* Prodotto */
  93.     /* se il numero di colonne della prima matrice non รจ uguale al numero
  94.        di righe della seconda matrice il prodotto non si puo' fare     */
  95.     if(matrice_A.n_colonne == matrice_B.n_righe)
  96.     {
  97.         /* viene eseguito il prodotto tra la matrice A e la matrice B */
  98.         prodotto_matrici = moltiplica_due_matrici(matrice_A, matrice_B);
  99.        
  100.         /* viene visualizzato il risultato tramite una
  101.            stampa a video della matrice prodotto    */
  102.         visualizza_matrice(prodotto_matrici,
  103.                            "Risultato prodotto tra la matrice A e la matrice B:");
  104.     }
  105.     /* se il prodotto non si puo' fare viene stampato un messaggio di errore */
  106.     else
  107.     {
  108.         printf("\nImpossibile moltiplicare le due matrici.\n");
  109.         printf("  Il numero di colonne della prima matrice deve corrispondere");
  110.         printf(" al numero di righe della seconda matrice.\n");
  111.     }
  112.  
  113.     return(0);
  114. }
  115.  
  116. /*
  117.  *  Scarta i caratteri inseriti in eccesso.
  118.  */
  119. void
  120. scarta_caratteri_in_eccesso(void)
  121. {
  122.     char scarto; /* carattere da non processare */
  123.    
  124.     do
  125.     {
  126.         scanf("%c", &scarto);
  127.     }while(scarto != '\n');
  128. }
  129.  
  130. /*
  131.  * Stampa un messaggio che informa quale dato inserire.
  132.  * Acquisisce la quantita' di righe o colonne della matrice.
  133.  */
  134. void
  135. acquisisci_dimensione_matrice(int *dimensione,  /* output - dimensione della matrice  */
  136.                               char messaggio[]) /* input  - testo da stampare a video */
  137. {
  138.     int stato = 0; /* esito dell'acquisizione scanf
  139.                       0 - dato non valido
  140.                       1 - dato valido            */
  141.    
  142.     do
  143.     {
  144.         /* Acquisisci il dato */
  145.         printf("%s", messaggio);
  146.         stato = scanf("%d", dimensione);
  147.        
  148.         /* se il dato non e' un numero stampa un messaggio di errore */
  149.         if(stato == 0)
  150.         {
  151.             printf("  Errore! Input non valido\n\n");
  152.            
  153.             scarta_caratteri_in_eccesso();
  154.         }
  155.         /* nella matrici ci deve essere almeno una riga/colonna */
  156.         else if(*dimensione < 1)
  157.         {
  158.             printf("  Errore! Il valore deve essere maggiore o uguale a 1.\n\n");
  159.            
  160.             stato = 0; /* il dato acquisito non e' valido */
  161.            
  162.             scarta_caratteri_in_eccesso();
  163.         }
  164.     }while(stato == 0); /* esegui il ciclo finche' il dato acquisito non e' valido */
  165.    
  166.     scarta_caratteri_in_eccesso();
  167. }
  168.  
  169. /*
  170.  * Alloca dinamicamente la matrice in ingresso.
  171.  */
  172. void
  173. alloca_matrice(matrice_t *matrice) /* output - matrice allocata dinamicamente */
  174. {
  175.     int i; /* indice riga */
  176.    
  177.     /* alloca dinamicamente tutte le righe della matrice */
  178.     (*matrice).matrice = (double **)calloc((*matrice).n_colonne, sizeof(double));
  179.    
  180.     /* alloca dinamicamente tutte le colonne della matrice */
  181.     for(i = 0; i < (*matrice).n_colonne; i++)
  182.     {
  183.         ((*matrice).matrice)[i] = (double *)calloc((*matrice).n_colonne, sizeof(double));
  184.     }
  185. }
  186.  
  187. /*
  188.  * Acquisisce il valore di ogni elemento della matrice.
  189.  */
  190. void
  191. inizializza_matrice(matrice_t *matrice) /* output - matrice inizializzata */
  192. {
  193.     int i, /* indice riga                    */
  194.         j, /* indice colonna                 */
  195.         stato; /* esito dell'acquisizione scanf
  196.                   0 - dato non valido
  197.                   1 - dato valido            */
  198.    
  199.     for(i = 0; i < (*matrice).n_righe; i++)
  200.     {
  201.         printf("  Inserisci valori riga %d\n", (i+1));
  202.         printf("  Inserisci valore elemento 1: ");
  203.        
  204.         for(j = 0; j < (*matrice).n_colonne; j++)
  205.         {
  206.             stato = scanf("%lf", &((*matrice).matrice)[i][j]);
  207.            
  208.             /* se il dato non e' un numero stampa un messaggio di errore */
  209.             if(stato == 0)
  210.             {
  211.                 j = (*matrice).n_colonne; /* terminiamo il ciclo                         */
  212.                 i--;                      /* rieseguiamo l'acquisizione di tutta la riga */
  213.                
  214.                 printf("  Errore! Input non valido\n\n");      
  215.             }
  216.         }
  217.        
  218.         scarta_caratteri_in_eccesso();
  219.     }
  220. }
  221.  
  222. /*
  223.  * Somma due matrici.
  224.  * Pre: le due matrici hanno la stessa dimensione.
  225.  * Post: la somma tra le due matrici viene salvata nella matrice in ingresso.
  226.  */
  227. matrice_t
  228. somma_due_matrici(matrice_t matrice_A, matrice_t matrice_B) /* input - matrici da sommare */
  229. {
  230.     int i, /* indice riga    */
  231.         j; /* indice colonna */
  232.    
  233.     matrice_t somma_matrici;
  234.    
  235.     /* configurazione della matrice che conterra' la somma */
  236.     somma_matrici.n_righe = matrice_A.n_righe;
  237.     somma_matrici.n_colonne = matrice_A.n_colonne;
  238.        
  239.     alloca_matrice(&somma_matrici);
  240.    
  241.     for(i = 0; i < matrice_A.n_righe; i++)
  242.     {      
  243.         for(j = 0; j < matrice_A.n_colonne; j++)
  244.         {
  245.             somma_matrici.matrice[i][j] = matrice_A.matrice[i][j] +
  246.                                   matrice_B.matrice[i][j];
  247.         }
  248.     }
  249.    
  250.     return somma_matrici;
  251. }
  252.  
  253. /*
  254.  * Moltiplica due matrici.
  255.  * Pre: il numero di colonne della prima matrice e' uguale al numero di righe della seconda.
  256.  * Post: il prodotto tra le due matrici viene salvato nella matrice in ingresso.
  257.  */
  258. matrice_t
  259. moltiplica_due_matrici(matrice_t matrice_A, matrice_t matrice_B) /* input - matrici da moltiplicare */
  260. {
  261.     int i, /* indice riga                    */
  262.         j, /* indice colonna della matrice B */
  263.         k; /* indice colonna della matrice A */
  264.    
  265.     double prodotto_scalare; /* prodotto scalare della i-esima riga di A
  266.                                 e della j-esima colonna di B          */
  267.                                
  268.     matrice_t prodotto_matrici;
  269.    
  270.     /* configurazione della matrice che conterra' il prodotto */
  271.     prodotto_matrici.n_righe = matrice_A.n_righe;
  272.     prodotto_matrici.n_colonne = matrice_B.n_colonne;
  273.        
  274.     alloca_matrice(&prodotto_matrici);
  275.    
  276.     for(i = 0; i < matrice_A.n_righe; i++)
  277.     {      
  278.         for(j = 0; j < matrice_B.n_colonne; j++)
  279.         {
  280.             prodotto_scalare = 0;
  281.            
  282.             /* calcolo del prodotto scalare della i-esima riga di A e
  283.                della j-esima colonna di B                          */
  284.             for(k = 0; k < matrice_A.n_colonne; k++)
  285.             {
  286.                  prodotto_scalare += matrice_A.matrice[i][k] * matrice_B.matrice[k][j];
  287.             }
  288.            
  289.             prodotto_matrici.matrice[i][j] = prodotto_scalare;
  290.         }
  291.     }
  292.    
  293.     return prodotto_matrici;
  294. }
  295.  
  296. /*
  297.  * Stampa a video il messaggio e la matrice in ingresso.
  298.  */
  299. void
  300. visualizza_matrice(matrice_t matrice, /* input - matrice da stampare a video   */
  301.                    char messaggio[])  /* input - messaggio da stampare a video */
  302. {
  303.     int i, /* indice riga    */
  304.         j; /* indice colonna */
  305.    
  306.     printf("\n%s\n", messaggio);
  307.    
  308.     for(i = 0; i < matrice.n_righe; i++)
  309.     {      
  310.         for(j = 0; j < matrice.n_colonne; j++)
  311.         {
  312.             printf("  %11.4f ", matrice.matrice[i][j]);
  313.         }
  314.         printf("\n");
  315.     }
  316. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement