Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * Simple Matrix Calculator
- * by: Rifai M. Hanif
- */
- #include <stdio.h>
- #include <stdlib.h>
- typedef enum {false, true} bool;
- int** initMatrix(char* name, int rows, int cols, bool input) {
- int** matrix;
- char buffer[80];
- matrix = (int**) malloc(rows * sizeof(int*));
- for (int i = 0; i < rows; i++) {
- matrix[i] = (int*) malloc(cols * sizeof(int));
- if (input)
- {
- for (int j = 0; j < cols; j++)
- {
- printf("%s(%d,%d): ", name, i+1, j+1);
- fgets(buffer, sizeof(buffer), stdin);
- sscanf(buffer, "%d", &matrix[i][j]);
- }
- }
- }
- return matrix;
- }
- void printMatrix(char* title, int** matrix, int rows, int cols)
- {
- printf("\n%s(%dx%d)\n", title, rows, cols);
- for (int i = 0; i < rows; i++)
- {
- for (int j = 0; j < cols; j++)
- {
- printf("%d\t", matrix[i][j]);
- }
- printf("\n");
- }
- }
- int** multiplyMatrix(int** m1, int r1, int c1, int** m2, int r2, int c2)
- {
- if (c1 != r2)
- {
- printf("The number of columns in first matrix should be equal to the number of rows in the second.\n");
- return false;
- }
- int** matrix = initMatrix("M", r1, c2, false);
- for (int i = 0; i < r1; i++)
- {
- for (int j = 0; j < c2; j++)
- {
- matrix[i][j] = 0;
- for (int k = 0; k < c1; k++)
- {
- matrix[i][j] += m1[i][k] * m2[k][j];
- }
- }
- }
- return matrix;
- }
- int** addOrSubstractMatrix(int** m1, int r1, int c1, int** m2, int r2, int c2, char op)
- {
- if (r1 != r2 || c1 != c2)
- {
- printf("Size not match.\n");
- return false;
- }
- if(op != '+' && op != '-')
- {
- printf("%c Invalid operation.\n", op);
- return false;
- }
- int** matrix = initMatrix("M", r1, c1, false);
- for (int i = 0; i < r1; i++)
- {
- for (int j = 0; j < c1; j++)
- {
- if (op == '+')
- matrix[i][j] = m1[i][j] + m2[i][j];
- else
- matrix[i][j] = m1[i][j] - m2[i][j];
- }
- }
- return matrix;
- }
- int** multiplyMatrixBy(int** m, int r, int c, int n)
- {
- int** matrix = initMatrix("M", r, c, false);
- for (int i = 0; i < r; i++)
- {
- for (int j = 0; j < c; j++)
- {
- matrix[i][j] = m[i][j] * n;
- }
- }
- return matrix;
- }
- int** powerMatrix(int** m, int r, int c, int n)
- {
- if (r != c)
- {
- printf("The number of columns should be equal to the number of rows.\n");
- return false;
- }
- int** matrix = m;
- for (int i = 1; i < n; i++)
- {
- matrix = multiplyMatrix(matrix, r, c, m, r, c);
- }
- return matrix;
- }
- void clean()
- {
- #if defined(WIN32) && !defined(UNIX)
- system("cls");
- #else
- system("clear");
- #endif
- printf("=================================================\n");
- printf("* MATRIX CALCULATOR *\n");
- printf("* by: Rifa'i M. Hanif *\n");
- printf("=================================================\n\n");
- }
- void pause()
- {
- printf("\nPress enter to continue...");
- getchar();
- }
- int main()
- {
- clean();
- int rA, rB, cA, cB, op, n;
- char buffer[80];
- printf("Matrix A\n");
- printf("========\n");
- printf("Rows\t: ");
- fgets(buffer, sizeof(buffer), stdin);
- sscanf(buffer, "%d", &rA);
- printf("Columns\t: ");
- fgets(buffer, sizeof(buffer), stdin);
- sscanf(buffer, "%d", &cA);
- int** A = initMatrix("A", rA, cA, true);
- printf("\nMatrix B\n");
- printf("Rows\t: ");
- fgets(buffer, sizeof(buffer), stdin);
- sscanf(buffer, "%d", &rB);
- printf("Columns\t: ");
- fgets(buffer, sizeof(buffer), stdin);
- sscanf(buffer, "%d", &cB);
- int** B = initMatrix("B", rB, cB, true);
- int** C = initMatrix("C", rA, cB, false);
- int** D = initMatrix("D", rB, cA, false);
- int** E = initMatrix("E", rA, cA, false);
- int** F = initMatrix("E", rB, cB, false);
- while(true) {
- clean();
- printMatrix("Matrix A", A, rA, cA);
- printMatrix("Matrix B", B, rB, cB);
- printf("\n\nOptions:\n");
- printf("========\n");
- printf("1 - A*B\n");
- printf("2 - B*A\n");
- printf("3 - A+B\n");
- printf("4 - A-B\n");
- printf("5 - B-A\n");
- printf("6 - Multiply A by n\n");
- printf("7 - Multiply B by n\n");
- printf("8 - Raise A to the power of n\n");
- printf("9 - Raise B to the power of n\n");
- printf("10 - Restart\n");
- printf("11 - Exit\n\n");
- printf("Your choice: ");
- fgets(buffer, sizeof(buffer), stdin);
- sscanf(buffer, "%d", &op);
- switch(op) {
- case 1:
- C = multiplyMatrix(A, rA, cA, B, rB, cB);
- if (C)
- printMatrix("A*B", C, rA, cB);
- pause();
- break;
- case 2:
- D = multiplyMatrix(B, rB, cB, A, rA, cA);
- if (D)
- printMatrix("B*A", D, rB, cA);
- pause();
- break;
- case 3:
- E = addOrSubstractMatrix(A, rA, cA, B, rB, cB, '+');
- if (E)
- printMatrix("A+B", E, rA, cA);
- pause();
- break;
- case 4:
- E = addOrSubstractMatrix(A, rA, cA, B, rB, cB, '-');
- if (E)
- printMatrix("A-B", E, rA, cA);
- pause();
- break;
- case 5:
- E = addOrSubstractMatrix(B, rB, cB, A, rA, cA, '-');
- if (E)
- printMatrix("B-A", E, rA, cA);
- pause();
- break;
- case 6:
- printf("n = ");
- fgets(buffer, sizeof(buffer), stdin);
- sscanf(buffer, "%d", &n);
- E = multiplyMatrixBy(A, rA, cA, n);
- if (E)
- printMatrix("nA", E, rA, cA);
- pause();
- break;
- case 7:
- printf("n = ");
- fgets(buffer, sizeof(buffer), stdin);
- sscanf(buffer, "%d", &n);
- F = multiplyMatrixBy(B, rB, cB, n);
- if (F)
- printMatrix("nB", F, rB, cB);
- pause();
- break;
- case 8:
- printf("n = ");
- fgets(buffer, sizeof(buffer), stdin);
- sscanf(buffer, "%d", &n);
- E = powerMatrix(A, rA, cA, n);
- if (E)
- printMatrix("A power n", E, rA, cA);
- pause();
- break;
- case 9:
- printf("n = ");
- fgets(buffer, sizeof(buffer), stdin);
- sscanf(buffer, "%d", &n);
- F = powerMatrix(B, rB, cB, n);
- if (F)
- printMatrix("B power n", F, rB, cB);
- pause();
- break;
- case 10:
- return main();
- break;
- default:
- clean();
- printf("\nSee you next time...");
- exit(0);
- break;
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment