Advertisement
Guest User

esame.c con commenti

a guest
Jan 17th, 2018
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.82 KB | None | 0 0
  1. //operazioni tra matrici
  2.  
  3. #include<stdio.h>
  4. #include<stdlib.h> // libreria per uscita di errore exit() ed altre belle cose
  5. #include<ctype.h> // libreria per funzione toupper() che converte a maiuscole ed altre belle cose
  6. #define DIM 100 // definisce DIM come "100" in modo che tu scrivi DIM invece di scrivere 100 ogni volta
  7. #define DB "esame.dat" // definisce DB come "esame.dat" in modo che basta scrivere DB invece di "esame.dat"
  8.  
  9. void leggimatrice(int n, int m, double a[][DIM], FILE *fp);
  10. void somma_matrici( int n, int m, int n1, int m1, double a[][DIM], double b[][DIM], FILE *fp);
  11. void prodotto_matrici(int n, int m, int n1, int m1, double a[][DIM], double b[][DIM], FILE *fp);
  12. void differenza_matrici(int n, int m, int n1, int m1, double a[][DIM], double b[][DIM], FILE *fp);
  13. void funzione(int n, int m, int n1, int m1, double a[][DIM], double b[][DIM], FILE *fp);
  14.  
  15.  
  16.  
  17. int main (void) {
  18.  
  19.     int scelta, nrighe1, ncolonne1, nrighe2, ncolonne2;
  20.     double a[DIM][DIM]={0}, b[DIM][DIM]={0}, c[DIM][DIM]={0};
  21.     char lettera, lettera2;
  22.     FILE *fp;
  23.  
  24.     fp = fopen(DB, "a"); // Apre il file "esame.dat" (scrivere DB o "esame.dat" è uguale, vedi riga 7)
  25.     // con l'attributo "a", ovvero modalità "APPEND", che scrive "in coda", alla fine del file.
  26.  
  27.  
  28.     for(;;) // for vuoto senza condizione di uscita perchè quest'ultima sta già in TUTTI i vari casi
  29.     // per un ciclo di questo tipo meglio scrivere while(1) invece di for(;;)
  30.     {
  31.         printf("Inserisci le dimensioni della prima matrice(mxn): ");
  32.         scanf("%dx%d", &nrighe1, &ncolonne1);
  33.  
  34.         printf("Inserisci le dimensioni della seconda matrice(mxn): ");
  35.         scanf("%dx%d", &nrighe2, &ncolonne2);
  36.  
  37.         printf("Inserisci gli elementi della prima matrice:\n");
  38.         leggimatrice(nrighe1, ncolonne1, a, fp); // richiama la funzione che legge la matrice
  39.  
  40.         printf("Inserisci gli elementi della seconda matrice:\n");
  41.         leggimatrice(nrighe2, ncolonne2, b, fp); // la stessa funzione che legge la matrice ma con parametri diversi
  42.  
  43.         for(;;) // leggi riga 28 per for(;;)
  44.          {
  45.             // lista delle funzioni del programma
  46.             printf("Quale operazione vuoi svolgere? Inserisci 1 per la somma di matrici, 2 per il prodotto, 3 per la differenza, 4 per la matrice f(A,B): ");
  47.             scanf("%d", &scelta); //in base al numero inserito esegue un operazione del programma.
  48.  
  49.             switch (scelta) {
  50.                 // inserendo un numero della lista sceglie l'operazione
  51.                 // richiama la relativa funzione passando i valori delle matrici inserite prima
  52.                 // il 'break' alla fine serve per uscire dal ciclo infinito 'for(;;)', altrimenti senza il programma non termina MAI.
  53.                 case 1: somma_matrici(nrighe1, ncolonne1, nrighe2, ncolonne2, a, b, fp); break;
  54.                 case 2: prodotto_matrici(nrighe1, ncolonne1, nrighe2, ncolonne2, a, b, fp); break;
  55.                 case 3: differenza_matrici(nrighe1, ncolonne1, nrighe2, ncolonne2, a, b, fp); break;
  56.                 case 4: funzione(nrighe1, ncolonne1, nrighe2, ncolonne2, a, b, fp); break;
  57.                 default: printf("Scelta sbagliata!\n"); break;
  58.             }
  59.  
  60.             printf("Vuoi svolgere altre operazioni sulle matrici?(S/N): ");
  61.             scanf("%s", &lettera); // legge la scelta dell utente, se S o N
  62.  
  63.             if(toupper(lettera) == 'N') // se metti N
  64.  
  65.             // la funzione 'toupper' della libreria 'ctype.h' rende tutto maiuscolo
  66.             // perchè l'if verifica la S e N --SOLO-- se sono maiuscole, quindi con 'toupper'
  67.             // ci assicuriamo che tutto funzioni anche se l'utente mette s e n minuscole
  68.  
  69.             {
  70.                 fprintf(fp, "Sessione di lavoro terminata!\n"); // scrive nel file di log
  71.                 printf("\nArrivederci!\n"); // saluta l'utente, buona educazione..
  72.                 fclose(fp); // chiude il file di log
  73.                 exit(EXIT_SUCCESS); // esce con successo
  74.  
  75.             } else if(toupper(lettera) == 'S') // invece se metti S {
  76.                 fprintf(fp, "L'utente ha scelto di eseguire altre operazioni!\n"); // scrive nel file di log
  77.                 printf("Vuoi cambiare matrici?(S/N): ");
  78.                 scanf("%s", &lettera2); // legge la scelta dell utente, se S o N
  79.  
  80.                 //per info toupper leggi riga 60
  81.  
  82.                 if(toupper(lettera2) == 'S') { // se metti S
  83.                     fprintf(fp, "L'utente ha scelto di cambiare matrici\n"); // scrive nel file di log
  84.                     break; // esce dal ciclo
  85.                 } else if(toupper(lettera2) == 'N') { // se metti N
  86.                     fprintf(fp, "L'utente ha scelto di non cambiare matrici!\n"); // scrive nel file di log
  87.                 } else {
  88.                     fprintf(fp, "Sessione di lavoro terminata!\n"); // scrive nel file di log
  89.                     printf("\nScelta sbagliata!\n");
  90.                     fclose(fp); // chiude il file di log
  91.                     exit(EXIT_SUCCESS); // esce con successo
  92.                 }
  93.             } else { // se non metti ne S ne N ti avvisa che hai sbagliato!
  94.                 fprintf(fp, "Sessione di lavoro terminata!\n"); // scrive nel file di log
  95.                 printf("\nScelta sbagliata!\n");
  96.                 fclose(fp); // chiude il file di log
  97.                 exit(1); // esce con codice errore
  98.             }
  99.         }
  100.     }
  101. }
  102.  
  103.  
  104. // QUA INIZIANO LE FUNZIONI USATE DAL PROGRAMMA, COPIARE COME STANNO!
  105.  
  106. void leggimatrice(int n, int m, double a[][DIM], FILE *fp) {
  107.  
  108.     int i, j;
  109.  
  110.     fprintf(fp, "La matrice è:\n");
  111.  
  112.     for(i=0; i<n; i++) {
  113.         for(j=0; j<m; j++) {
  114.             printf("Inserisci l'entrata di posto [%d;%d]: ", i+1, j+1);
  115.             scanf("%lf", &a[i][j]);
  116.             fprintf(fp, "%8.2f", a[i][j]);
  117.         }
  118.         fprintf(fp, "\n");
  119.     }
  120. }
  121.  
  122. void somma_matrici( int n, int m, int n1, int m1, double a[][DIM], double b[][DIM], FILE *fp) {
  123.  
  124.     int i, j;
  125.  
  126.     fprintf(fp, "L'utente ha scelto l'operazione somma matrici\n");
  127.  
  128.     if(n==n1 && m==m1) {
  129.         printf("La matrice somma è:\n");
  130.         fprintf(fp, "La matrice somma è:\n");
  131.         for(i=0; i<n; i++) {
  132.             for(j=0; j<m; j++) {
  133.                 printf("%8.2f", a[i][j] + b[i][j]);
  134.                 fprintf(fp, "%8.2f", a[i][j] +b[i][j]);
  135.             }
  136.             printf("\n");
  137.             fprintf(fp, "\n");
  138.         }
  139.     } else {
  140.         printf("Impossibile calcolare la matrice somma!\n");
  141.         fprintf(fp, "Scelta sbagliata!\n");
  142.     }
  143. }
  144.  
  145. void prodotto_matrici(int n, int m, int n1, int m1, double a[][DIM], double b[][DIM], FILE *fp) {
  146.  
  147.     int i, j, k;
  148.     double c[DIM][DIM]={0}, sum=0;
  149.  
  150.     fprintf(fp, "L'utente ha scelto l'operazione prodotto \n");
  151.  
  152.     if(m==n1) {
  153.         fprintf(fp, "La matrice prodotto è:\n");
  154.         printf("La matrice prodotto è: \n");
  155.         for(i=0; i<n; i++) {
  156.             for(j=0; j<m; j++) {
  157.                 for(k=0; k<m; k++) {
  158.                     sum += a[i][k] * b[k][j];
  159.                 }
  160.                 c[i][j] = sum;
  161.                 sum=0;
  162.             }
  163.         }
  164.  
  165.         for(i=0;i<n;i++) {
  166.             for(j=0; j<m1; j++){
  167.                 printf("%8.2f", c[i][j]);
  168.                 fprintf(fp, "%8.2f", c[i][j]);
  169.             }
  170.             printf("\n");
  171.             fprintf(fp, "\n");
  172.         }
  173.     } else {
  174.         printf("Impossibile calcolare la matrice prodotto!\n");
  175.         fprintf(fp, "Scelta sbagliata\n");
  176.     }
  177. }
  178.  
  179. void differenza_matrici(int n, int m, int n1, int m1, double a[][DIM], double b[][DIM], FILE *fp) {
  180.  
  181.     int i, j;
  182.  
  183.     fprintf(fp, "L'utente ha scelto l'operazione differenza\n");
  184.  
  185.     if(n==n1 && m==m1) {
  186.         fprintf(fp, "La matrice differenza è:\n");
  187.         printf("la matrice differenza è:\n");
  188.         for(i=0; i<n; i++) {
  189.             for(j=0; j<m; j++) {
  190.                 printf("%8.2f", a[i][j] - b[i][j]);
  191.                 fprintf(fp, "%8.2f", a[i][j] - b[i][j]);
  192.             }
  193.             printf("\n");
  194.             fprintf(fp, "\n");
  195.         }
  196.     } else {
  197.         printf("Impossibile calcolare la matrice differenza!\n");
  198.         fprintf(fp, "Scelta sbagliata\n");
  199.     }
  200. }
  201.  
  202. void funzione(int n, int m, int n1, int m1, double a[][DIM], double b[][DIM], FILE *fp) {
  203.  
  204.     int i, j, somma=0;
  205.     double c[DIM][DIM]={0};
  206.  
  207.     fprintf(fp, "L'utente ha scelto di effettuare la funzione\n");
  208.  
  209.     if(n==n1 && m==m1) {
  210.         for(i=0; i<n; i++) {
  211.             for(j=0; j<m; j++) {
  212.                 somma += (a[i][j] + b[i][j]);
  213.             }
  214.         }
  215.  
  216.         for(i=0; i<n; i++) {
  217.             for(j=0; j<m; j++) {
  218.                 c[i][j]= (a[i][j] + b[i][j])/somma;
  219.             }
  220.         }
  221.  
  222.         fprintf(fp, "La matrice della funzione è:\n");
  223.         printf("La matrice risultante è:\n");
  224.         for(i=0; i<n; i++) {
  225.             for(j=0; j<m; j++) {
  226.                 printf("%8.2f", c[i][j]);
  227.                 fprintf(fp, "%8.2f", c[i][j]);
  228.             }
  229.             printf("\n");
  230.             fprintf(fp, "\n");
  231.         }
  232.     } else {
  233.         printf("Impossibile calcolare la matrice risultante!\n");
  234.         fprintf(fp, "Scelta sbagliata!\n");
  235.     }
  236.  
  237. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement