SHOW:
|
|
- or go back to the newest paste.
1 | /* | |
2 | - | gcc std=c11 -Wall -Werror -pedantic matrix.c -o matrix |
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 | int B[num_positive_below_main_diagonal]; | |
97 | memcpy(B, array, num_positive_below_main_diagonal * sizeof(B[0])); | |
98 | //printf("B:\n"); | |
99 | //array_print(num_positive_below_main_diagonal, B); | |
100 | matrix_zero_negative(N, A); | |
101 | //printf("A:\n"); | |
102 | matrix_print(N, A); | |
103 | return 0; | |
104 | } | |
105 |