hanreev

Matrix Calculator

Mar 30th, 2017
135
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.47 KB | None | 0 0
  1. /*
  2.  * Simple Matrix Calculator
  3.  * by: Rifai M. Hanif
  4.  */
  5.  
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8.  
  9. typedef enum {false, true} bool;
  10.  
  11. int** initMatrix(char* name, int rows, int cols, bool input) {
  12.     int** matrix;
  13.     char buffer[80];
  14.     matrix = (int**) malloc(rows * sizeof(int*));
  15.  
  16.     for (int i = 0; i < rows; i++) {
  17.         matrix[i] = (int*) malloc(cols * sizeof(int));
  18.  
  19.         if (input)
  20.         {
  21.             for (int j = 0; j < cols; j++)
  22.             {
  23.                 printf("%s(%d,%d): ", name, i+1, j+1);
  24.                 fgets(buffer, sizeof(buffer), stdin);
  25.                 sscanf(buffer, "%d", &matrix[i][j]);
  26.             }
  27.         }
  28.     }
  29.  
  30.     return matrix;
  31. }
  32.  
  33. void printMatrix(char* title, int** matrix, int rows, int cols)
  34. {
  35.     printf("\n%s(%dx%d)\n", title, rows, cols);
  36.     for (int i = 0; i < rows; i++)
  37.     {
  38.         for (int j = 0; j < cols; j++)
  39.         {
  40.             printf("%d\t", matrix[i][j]);
  41.         }
  42.         printf("\n");
  43.     }
  44. }
  45.  
  46. int** multiplyMatrix(int** m1, int r1, int c1, int** m2, int r2, int c2)
  47. {
  48.     if (c1 != r2)
  49.     {
  50.         printf("The number of columns in first matrix should be equal to the number of rows in the second.\n");
  51.         return false;
  52.     }
  53.  
  54.     int** matrix = initMatrix("M", r1, c2, false);
  55.  
  56.     for (int i = 0; i < r1; i++)
  57.     {
  58.         for (int j = 0; j < c2; j++)
  59.         {
  60.             matrix[i][j] = 0;
  61.             for (int k = 0; k < c1; k++)
  62.             {
  63.                 matrix[i][j] += m1[i][k] * m2[k][j];
  64.             }
  65.         }
  66.     }
  67.  
  68.     return matrix;
  69. }
  70.  
  71. int** addOrSubstractMatrix(int** m1, int r1, int c1, int** m2, int r2, int c2, char op)
  72. {
  73.     if (r1 != r2 || c1 != c2)
  74.     {
  75.         printf("Size not match.\n");
  76.         return false;
  77.     }
  78.  
  79.     if(op != '+' && op != '-')
  80.     {
  81.         printf("%c Invalid operation.\n", op);
  82.         return false;
  83.     }
  84.  
  85.     int** matrix = initMatrix("M", r1, c1, false);
  86.  
  87.     for (int i = 0; i < r1; i++)
  88.     {
  89.         for (int j = 0; j < c1; j++)
  90.         {
  91.             if (op == '+')
  92.                 matrix[i][j] = m1[i][j] + m2[i][j];
  93.             else
  94.                 matrix[i][j] = m1[i][j] - m2[i][j];
  95.         }
  96.     }
  97.  
  98.     return matrix;
  99. }
  100.  
  101. int** multiplyMatrixBy(int** m, int r, int c, int n)
  102. {
  103.     int** matrix = initMatrix("M", r, c, false);
  104.  
  105.     for (int i = 0; i < r; i++)
  106.     {
  107.         for (int j = 0; j < c; j++)
  108.         {
  109.             matrix[i][j] = m[i][j] * n;
  110.         }
  111.     }
  112.  
  113.     return matrix;
  114. }
  115.  
  116. int** powerMatrix(int** m, int r, int c, int n)
  117. {
  118.     if (r != c)
  119.     {
  120.         printf("The number of columns should be equal to the number of rows.\n");
  121.         return false;
  122.     }
  123.  
  124.     int** matrix = m;
  125.  
  126.     for (int i = 1; i < n; i++)
  127.     {
  128.         matrix = multiplyMatrix(matrix, r, c, m, r, c);
  129.     }
  130.  
  131.     return matrix;
  132. }
  133.  
  134. void clean()
  135. {
  136.     #if defined(WIN32) && !defined(UNIX)
  137.         system("cls");
  138.     #else
  139.         system("clear");
  140.     #endif
  141.  
  142.     printf("=================================================\n");
  143.     printf("*               MATRIX CALCULATOR               *\n");
  144.     printf("*              by: Rifa'i M. Hanif              *\n");
  145.     printf("=================================================\n\n");
  146. }
  147.  
  148. void pause()
  149. {
  150.     printf("\nPress enter to continue...");
  151.     getchar();
  152. }
  153.  
  154. int main()
  155. {
  156.     clean();
  157.  
  158.     int rA, rB, cA, cB, op, n;
  159.     char buffer[80];
  160.  
  161.     printf("Matrix A\n");
  162.     printf("========\n");
  163.     printf("Rows\t: ");
  164.     fgets(buffer, sizeof(buffer), stdin);
  165.     sscanf(buffer, "%d", &rA);
  166.     printf("Columns\t: ");
  167.     fgets(buffer, sizeof(buffer), stdin);
  168.     sscanf(buffer, "%d", &cA);
  169.     int** A = initMatrix("A", rA, cA, true);
  170.  
  171.     printf("\nMatrix B\n");
  172.     printf("Rows\t: ");
  173.     fgets(buffer, sizeof(buffer), stdin);
  174.     sscanf(buffer, "%d", &rB);
  175.     printf("Columns\t: ");
  176.     fgets(buffer, sizeof(buffer), stdin);
  177.     sscanf(buffer, "%d", &cB);
  178.     int** B = initMatrix("B", rB, cB, true);
  179.  
  180.     int** C = initMatrix("C", rA, cB, false);
  181.     int** D = initMatrix("D", rB, cA, false);
  182.     int** E = initMatrix("E", rA, cA, false);
  183.     int** F = initMatrix("E", rB, cB, false);
  184.  
  185.     while(true) {
  186.         clean();
  187.  
  188.         printMatrix("Matrix A", A, rA, cA);
  189.         printMatrix("Matrix B", B, rB, cB);
  190.  
  191.         printf("\n\nOptions:\n");
  192.         printf("========\n");
  193.         printf("1 - A*B\n");
  194.         printf("2 - B*A\n");
  195.         printf("3 - A+B\n");
  196.         printf("4 - A-B\n");
  197.         printf("5 - B-A\n");
  198.         printf("6 - Multiply A by n\n");
  199.         printf("7 - Multiply B by n\n");
  200.         printf("8 - Raise A to the power of n\n");
  201.         printf("9 - Raise B to the power of n\n");
  202.         printf("10 - Restart\n");
  203.         printf("11 - Exit\n\n");
  204.         printf("Your choice: ");
  205.         fgets(buffer, sizeof(buffer), stdin);
  206.         sscanf(buffer, "%d", &op);
  207.  
  208.         switch(op) {
  209.             case 1:
  210.                 C = multiplyMatrix(A, rA, cA, B, rB, cB);
  211.                 if (C)
  212.                     printMatrix("A*B", C, rA, cB);
  213.                 pause();
  214.                 break;
  215.             case 2:
  216.                 D = multiplyMatrix(B, rB, cB, A, rA, cA);
  217.                 if (D)
  218.                     printMatrix("B*A", D, rB, cA);
  219.                 pause();
  220.                 break;
  221.             case 3:
  222.                 E = addOrSubstractMatrix(A, rA, cA, B, rB, cB, '+');
  223.                 if (E)
  224.                     printMatrix("A+B", E, rA, cA);
  225.                 pause();
  226.                 break;
  227.             case 4:
  228.                 E = addOrSubstractMatrix(A, rA, cA, B, rB, cB, '-');
  229.                 if (E)
  230.                     printMatrix("A-B", E, rA, cA);
  231.                 pause();
  232.                 break;
  233.             case 5:
  234.                 E = addOrSubstractMatrix(B, rB, cB, A, rA, cA, '-');
  235.                 if (E)
  236.                     printMatrix("B-A", E, rA, cA);
  237.                 pause();
  238.                 break;
  239.             case 6:
  240.                 printf("n = ");
  241.                 fgets(buffer, sizeof(buffer), stdin);
  242.                 sscanf(buffer, "%d", &n);
  243.                 E = multiplyMatrixBy(A, rA, cA, n);
  244.                 if (E)
  245.                     printMatrix("nA", E, rA, cA);
  246.                 pause();
  247.                 break;
  248.             case 7:
  249.                 printf("n = ");
  250.                 fgets(buffer, sizeof(buffer), stdin);
  251.                 sscanf(buffer, "%d", &n);
  252.                 F = multiplyMatrixBy(B, rB, cB, n);
  253.                 if (F)
  254.                     printMatrix("nB", F, rB, cB);
  255.                 pause();
  256.                 break;
  257.             case 8:
  258.                 printf("n = ");
  259.                 fgets(buffer, sizeof(buffer), stdin);
  260.                 sscanf(buffer, "%d", &n);
  261.                 E = powerMatrix(A, rA, cA, n);
  262.                 if (E)
  263.                     printMatrix("A power n", E, rA, cA);
  264.                 pause();
  265.                 break;
  266.             case 9:
  267.                 printf("n = ");
  268.                 fgets(buffer, sizeof(buffer), stdin);
  269.                 sscanf(buffer, "%d", &n);
  270.                 F = powerMatrix(B, rB, cB, n);
  271.                 if (F)
  272.                     printMatrix("B power n", F, rB, cB);
  273.                 pause();
  274.                 break;
  275.             case 10:
  276.                 return main();
  277.                 break;
  278.             default:
  279.                 clean();
  280.                 printf("\nSee you next time...");
  281.                 exit(0);
  282.                 break;
  283.         }
  284.     }
  285.  
  286.     return 0;
  287. }
Advertisement
Add Comment
Please, Sign In to add comment