Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- // #include <stdlib.h> <- Enable if using formatted matrix output
- #define MAX 20
- void read(int sp[MAX][MAX]) {
- int m, n, i = 0, j = 0, k = 1, val;
- printf("Enter rows and cols [MAX %d for both]: [m n] ", MAX / 2);
- scanf("%d %d", &m, &n);
- sp[0][0] = m;
- sp[0][1] = n;
- for (; i < m; i++) {
- for (j = 0; j < n; j++) {
- printf("Enter value for [%d][%d]: ", i, j);
- scanf("%d", &val);
- if (val) {
- sp[k][0] = i;
- sp[k][1] = j;
- sp[k++][2] = val;
- }
- }
- }
- sp[0][2] = k - 1;
- }
- // Prints out formatted matrix
- // void print_sp(int sp[MAX][MAX]) {
- // int m = sp[0][0], n = sp[0][1], nz = sp[0][2], i = 0, j;
- // int **mat = (int **)malloc(m * sizeof(int));
- // for (; i < m; i++)
- // mat[i] = (int *)malloc(n * sizeof(int));
- // for (i = 0; i < m; i++) {
- // for (j = 0; j < n; j++)
- // mat[i][j] = 0;
- // }
- //
- // for (i = 1; i <= nz; i++) {
- // mat[sp[i][0]][sp[i][1]] = sp[i][2];
- // }
- //
- // for (i = 0; i < m; i++) {
- // for (j = 0; j < n; j++) {
- // printf("%d\t", mat[i][j]);
- // }
- // printf("\n");
- // }
- //
- // free(mat);
- // }
- void print_sp(int sp[MAX][MAX]) {
- printf("Metadata: ");
- for (int i = 0; i <= sp[0][2]; i++)
- printf("(%d %d %d)\n", sp[i][0], sp[i][1], sp[i][2]);
- printf("\n");
- }
- void transpose(int sp[MAX][MAX], int res[MAX][MAX]) {
- int m = sp[0][0], n = sp[0][1], nz = sp[0][2], i = 1;
- res[0][0] = n;
- res[0][1] = m;
- res[0][2] = nz;
- for (; i <= nz; i++) {
- res[i][0] = sp[i][1];
- res[i][1] = sp[i][0];
- res[i][2] = sp[i][2];
- }
- }
- int add(int a[MAX][MAX], int b[MAX][MAX], int c[MAX][MAX]) {
- int m1 = a[0][0], n1 = a[0][1], m2 = b[0][0], n2 = b[0][1], k1 = a[0][2],
- k2 = b[0][2];
- int i = 1, j = 1, k = 1, sum;
- if (m1 != m2 || n1 != n2)
- return 1;
- c[0][0] = m1;
- c[0][1] = n1;
- while (i <= k1 && j <= k2) {
- if ((a[i][0] < b[j][0]) || (a[i][1] < b[j][1])) {
- c[k][0] = a[i][0];
- c[k][1] = a[i][1];
- c[k++][2] = a[i++][2];
- } else if ((a[i][0] > b[j][0]) || (a[i][1] > b[j][1])) {
- c[k][0] = b[j][0];
- c[k][1] = b[j][1];
- c[k++][2] = b[j++][2];
- } else {
- sum = a[i][2] + b[j][2];
- if (sum) {
- c[k][0] = a[i][0];
- c[k][1] = a[i][1];
- c[k++][2] = sum;
- }
- i++;
- j++;
- }
- }
- while (i <= k1) {
- c[k][0] = a[i][0];
- c[k][1] = a[i][1];
- c[k++][2] = a[i++][2];
- }
- while (j <= k2) {
- c[k][0] = b[j][0];
- c[k][1] = b[j][1];
- c[k++][2] = b[j++][2];
- }
- c[0][2] = k - 1;
- return 0;
- }
- int main() {
- int opt = 0;
- do {
- printf("\nSelect an option:\n[1] Transpose Matrix\t[2] Add Matrices\n[0] "
- "Exit\n");
- printf("Enter: [0-2] ");
- scanf("%d", &opt);
- if (opt > 2 || opt < 0) {
- printf("Invalid option.\n");
- continue;
- } else if (opt == 0)
- break;
- if (opt == 1) {
- int sp[MAX][MAX], res[MAX][MAX];
- read(sp);
- printf("\nMatrix:\n");
- print_sp(sp);
- transpose(sp, res);
- printf("\nTransposed Matrix:\n");
- print_sp(res);
- continue;
- }
- int a[MAX][MAX], b[MAX][MAX], c[MAX][MAX];
- printf("\nMatrix A:\n");
- read(a);
- printf("\n");
- print_sp(a);
- printf("\nMatrix B:\n");
- read(b);
- printf("\n");
- print_sp(b);
- add(a, b, c);
- printf("\nMatrix A+B:\n");
- print_sp(c);
- } while (opt != 0);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement