Advertisement
zoclhas

Sparse Matrix Menu Thingy

Jul 9th, 2025 (edited)
34
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.51 KB | Source Code | 0 0
  1. #include <stdio.h>
  2. // #include <stdlib.h> <- Enable if using formatted matrix output
  3.  
  4. #define MAX 20
  5.  
  6. void read(int sp[MAX][MAX]) {
  7.   int m, n, i = 0, j = 0, k = 1, val;
  8.   printf("Enter rows and cols [MAX %d for both]: [m n] ", MAX / 2);
  9.   scanf("%d %d", &m, &n);
  10.  
  11.   sp[0][0] = m;
  12.   sp[0][1] = n;
  13.  
  14.   for (; i < m; i++) {
  15.     for (j = 0; j < n; j++) {
  16.       printf("Enter value for [%d][%d]: ", i, j);
  17.       scanf("%d", &val);
  18.       if (val) {
  19.         sp[k][0] = i;
  20.         sp[k][1] = j;
  21.         sp[k++][2] = val;
  22.       }
  23.     }
  24.   }
  25.  
  26.   sp[0][2] = k - 1;
  27. }
  28.  
  29. // Prints out formatted matrix
  30. // void print_sp(int sp[MAX][MAX]) {
  31. //   int m = sp[0][0], n = sp[0][1], nz = sp[0][2], i = 0, j;
  32. //   int **mat = (int **)malloc(m * sizeof(int));
  33. //   for (; i < m; i++)
  34. //     mat[i] = (int *)malloc(n * sizeof(int));
  35. //   for (i = 0; i < m; i++) {
  36. //     for (j = 0; j < n; j++)
  37. //       mat[i][j] = 0;
  38. //   }
  39. //
  40. //   for (i = 1; i <= nz; i++) {
  41. //     mat[sp[i][0]][sp[i][1]] = sp[i][2];
  42. //   }
  43. //
  44. //   for (i = 0; i < m; i++) {
  45. //     for (j = 0; j < n; j++) {
  46. //       printf("%d\t", mat[i][j]);
  47. //     }
  48. //     printf("\n");
  49. //   }
  50. //
  51. //   free(mat);
  52. // }
  53.  
  54. void print_sp(int sp[MAX][MAX]) {
  55.   printf("Metadata: ");
  56.   for (int i = 0; i <= sp[0][2]; i++)
  57.     printf("(%d %d %d)\n", sp[i][0], sp[i][1], sp[i][2]);
  58.   printf("\n");
  59. }
  60.  
  61. void transpose(int sp[MAX][MAX], int res[MAX][MAX]) {
  62.   int m = sp[0][0], n = sp[0][1], nz = sp[0][2], i = 1;
  63.  
  64.   res[0][0] = n;
  65.   res[0][1] = m;
  66.   res[0][2] = nz;
  67.  
  68.   for (; i <= nz; i++) {
  69.     res[i][0] = sp[i][1];
  70.     res[i][1] = sp[i][0];
  71.     res[i][2] = sp[i][2];
  72.   }
  73. }
  74.  
  75. int add(int a[MAX][MAX], int b[MAX][MAX], int c[MAX][MAX]) {
  76.   int m1 = a[0][0], n1 = a[0][1], m2 = b[0][0], n2 = b[0][1], k1 = a[0][2],
  77.       k2 = b[0][2];
  78.   int i = 1, j = 1, k = 1, sum;
  79.  
  80.   if (m1 != m2 || n1 != n2)
  81.     return 1;
  82.  
  83.   c[0][0] = m1;
  84.   c[0][1] = n1;
  85.  
  86.   while (i <= k1 && j <= k2) {
  87.     if ((a[i][0] < b[j][0]) || (a[i][1] < b[j][1])) {
  88.       c[k][0] = a[i][0];
  89.       c[k][1] = a[i][1];
  90.       c[k++][2] = a[i++][2];
  91.     } else if ((a[i][0] > b[j][0]) || (a[i][1] > b[j][1])) {
  92.       c[k][0] = b[j][0];
  93.       c[k][1] = b[j][1];
  94.       c[k++][2] = b[j++][2];
  95.     } else {
  96.       sum = a[i][2] + b[j][2];
  97.       if (sum) {
  98.         c[k][0] = a[i][0];
  99.         c[k][1] = a[i][1];
  100.         c[k++][2] = sum;
  101.       }
  102.       i++;
  103.       j++;
  104.     }
  105.   }
  106.  
  107.   while (i <= k1) {
  108.     c[k][0] = a[i][0];
  109.     c[k][1] = a[i][1];
  110.     c[k++][2] = a[i++][2];
  111.   }
  112.  
  113.   while (j <= k2) {
  114.     c[k][0] = b[j][0];
  115.     c[k][1] = b[j][1];
  116.     c[k++][2] = b[j++][2];
  117.   }
  118.  
  119.   c[0][2] = k - 1;
  120.  
  121.   return 0;
  122. }
  123.  
  124. int main() {
  125.   int opt = 0;
  126.  
  127.   do {
  128.     printf("\nSelect an option:\n[1] Transpose Matrix\t[2] Add Matrices\n[0] "
  129.            "Exit\n");
  130.     printf("Enter: [0-2] ");
  131.     scanf("%d", &opt);
  132.  
  133.     if (opt > 2 || opt < 0) {
  134.       printf("Invalid option.\n");
  135.       continue;
  136.     } else if (opt == 0)
  137.       break;
  138.  
  139.     if (opt == 1) {
  140.       int sp[MAX][MAX], res[MAX][MAX];
  141.       read(sp);
  142.       printf("\nMatrix:\n");
  143.       print_sp(sp);
  144.  
  145.       transpose(sp, res);
  146.       printf("\nTransposed Matrix:\n");
  147.       print_sp(res);
  148.  
  149.       continue;
  150.     }
  151.  
  152.     int a[MAX][MAX], b[MAX][MAX], c[MAX][MAX];
  153.  
  154.     printf("\nMatrix A:\n");
  155.     read(a);
  156.     printf("\n");
  157.     print_sp(a);
  158.     printf("\nMatrix B:\n");
  159.     read(b);
  160.     printf("\n");
  161.     print_sp(b);
  162.  
  163.     add(a, b, c);
  164.     printf("\nMatrix A+B:\n");
  165.     print_sp(c);
  166.   } while (opt != 0);
  167.  
  168.   return 0;
  169. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement