Semper_Idem

C Matrix

Jan 8th, 2021 (edited)
920
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /*
  2. cc std=c11 -Wall -Werror -pedantic matrix.c -o matrix
  3. */
  4.  
  5.  
  6. #include <stdio.h>
  7. #include <string.h>
  8. #include <inttypes.h>
  9.  
  10. const int minN = 2;
  11. const int maxN = 25;
  12.  
  13. #define FORMAT_PRId32FIXED "%-11"PRId32
  14.  
  15. int matrix_read(int n, int32_t matrix[n][n]) {
  16.     for (int row = 0; row < n; ++row) {
  17.         for (int col = 0; col < n; ++col) {
  18.             int32_t val = 0;
  19.             int ret = scanf("%"SCNd32, &val);
  20.             if (ret != 1) {
  21.                 return -1;
  22.             } else {
  23.                 matrix[row][col] = val;
  24.             }
  25.         }
  26.     }
  27.     return 0;
  28. }
  29.  
  30. void matrix_print(int n, int32_t matrix[n][n]) {
  31.     for (int row = 0; row < n; ++row) {
  32.         for (int col = 0; col < n-1; ++col) {
  33.             printf(FORMAT_PRId32FIXED" ", matrix[row][col]);
  34.         }
  35.         printf(FORMAT_PRId32FIXED, matrix[row][n-1]);
  36.         printf("\n");
  37.     }
  38. }
  39.  
  40.  
  41. int matrix_positive_below_main_diagonal(int n, int32_t matrix[n][n], int32_t array[(n*(n-1))/2]) {
  42.     int num_elems = 0;
  43.     for (int row = 1; row < n; ++row) {
  44.         for (int col = 0; col < row; ++col) {
  45.             int32_t val = matrix[row][col];
  46.             if (val > 0) {
  47.                 array[num_elems] = val;
  48.                 ++num_elems;
  49.             }
  50.         }
  51.     }
  52.     return num_elems;
  53. }
  54.  
  55. void matrix_zero_negative(int n, int32_t matrix[n][n]) {
  56.     for (int row = 0; row < n; ++row) {
  57.         for (int col = 0; col < n; ++col) {
  58.             int32_t *val = &matrix[row][col];
  59.             if (*val < 0) {
  60.                 *val = 0;
  61.             }
  62.         }
  63.     }
  64. }
  65.  
  66. void array_print(int n, int32_t array[n]) {
  67.     if (n <= 0) {
  68.         return;
  69.     }
  70.     for (int i = 0; i < n - 1; ++i) {
  71.         printf("%"PRId32", ", array[i]);
  72.     }
  73.     printf("%"PRId32, array[n-1]);
  74.     printf("\n");
  75. }
  76.  
  77. int main(int argc, char *argv[]) {
  78.     (void)(argc);
  79.     (void)(argv);
  80.     int N = 0;
  81.     int ret;
  82.     ret = scanf("%d", &N);
  83.     if (ret != 1 || (minN > N || N > maxN)) {
  84.         return -1;
  85.     }
  86.     int32_t A[N][N];
  87.     ret = matrix_read(N, A);
  88.     if (ret != 0) {
  89.         return -1;
  90.     }
  91.  
  92.     int32_t array[(N*(N-1))/2];
  93.     int num_positive_below_main_diagonal =
  94.             matrix_positive_below_main_diagonal(N, A, array);
  95.    
  96.     if (num_positive_below_main_diagonal > 0 ) {
  97.         int32_t B[num_positive_below_main_diagonal];
  98.         memcpy(B, array, num_positive_below_main_diagonal * sizeof(B[0]));
  99.         //printf("B:\n");
  100.         //array_print(num_positive_below_main_diagonal, B);
  101.     }
  102.     matrix_zero_negative(N, A);
  103.     //printf("A:\n");  
  104.     matrix_print(N, A);
  105.     return 0;
  106. }
  107.  
RAW Paste Data