fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <assert.h>
  4. #include <time.h>
  5.  
  6. int **Make2DArray(size_t m, size_t n)
  7. {
  8. int **arr = malloc(sizeof(int *) * m);
  9. assert(arr);
  10. for (size_t i = 0; i < m; i++)
  11. {
  12. arr[i] = malloc(sizeof(int) * n);
  13. assert(arr[i]);
  14. }
  15. return arr;
  16. }
  17.  
  18. void Init2DArray(int **arr, size_t m, size_t n)
  19. {
  20. if (arr == NULL)
  21. return;
  22.  
  23. for (size_t i = 0; i < m; i++)
  24. for (size_t j = 0; j < n; j++)
  25. arr[i][j] = rand() % 201 - 100;
  26. }
  27.  
  28. void Print2DArray(int **arr, size_t m, size_t n)
  29. {
  30. for (size_t i = 0; i < m; i++, putchar('\n'))
  31. for (size_t j = 0; j < n; j++)
  32. printf("%6d", arr[i][j]);
  33. putchar('\n');
  34. }
  35.  
  36. void PrintArray(int *arr, size_t size)
  37. {
  38. for (size_t i = 0; i < size; i++)
  39. {
  40. printf("%6d", arr[i]);
  41. if (!((i + 1) % 10))
  42. putchar('\n');
  43. }
  44. putchar('\n');
  45. }
  46.  
  47. void Free2DArray(int **arr, size_t m)
  48. {
  49. for (size_t i = 0; i < m; i++)
  50. free(arr[i]);
  51. free(arr);
  52. }
  53.  
  54. int *GetPosIn2DArray(int **arr, size_t m, size_t n, int (*cond)(int), size_t *res_size)
  55. {
  56. int *res = NULL;
  57. size_t size = 0;
  58.  
  59. for (size_t i = 0; i < m; i++)
  60. for (size_t j = 0; j < n; j++)
  61. if (cond(arr[i][j]))
  62. {
  63. size++;
  64. int *tmp = realloc(res, sizeof(int) * size);
  65. assert(tmp);
  66. res = tmp;
  67. res[size - 1] = arr[i][j];
  68. }
  69. *res_size = size;
  70. return res;
  71. }
  72.  
  73. int cond_pos(int a)
  74. {
  75. return a > 0;
  76. }
  77.  
  78. int cond_neg(int a)
  79. {
  80. return a < 0;
  81. }
  82.  
  83. int main(void)
  84. {
  85. const size_t m = 10;
  86. const size_t n = 10;
  87.  
  88. srand(time(NULL));
  89.  
  90. puts("Array:");
  91. int **array = Make2DArray(m, n);
  92. Init2DArray (array, m, n);
  93. Print2DArray(array, m, n);
  94.  
  95. puts("pos vec:");
  96. size_t vec1_size;
  97. int *vec1 = GetPosIn2DArray(array, m, n, cond_pos, &vec1_size);
  98. PrintArray(vec1, vec1_size);
  99. free(vec1);
  100.  
  101. puts("neg vec:");
  102. size_t vec2_size;
  103. int *vec2 = GetPosIn2DArray(array, m, n, cond_neg, &vec2_size);
  104. PrintArray(vec2, vec2_size);
  105. free(vec2);
  106.  
  107. Free2DArray (array, m);
  108. return 0;
  109. }
  110.  
Success #stdin #stdout 0s 4288KB
stdin
Standard input is empty
stdout
Array:
   -18    67    48    15    56    28    95    54    54    63
    90   -58   -22   -31   -48    61   -95   -86    -1   -68
   -36     6   -20   -82     1   -86    80   -30    42    88
    34    75    54   -68   -11   -41    60   -17   -88    14
    97   -99     6   -76   -80     8    85   -75    22   -16
   -93    36    90   -63    54   -60   -48    34    10    94
   -29    94    68    76   -75   -93   -66    36   -60    98
   -51    87    49     5   -89    70   -88    96    45   -15
   -21     3   -80   -82    40    75   -42    92   -42    18
    36   -21    12   -47   -46    37   -40   -61   -28     1

pos vec:
    67    48    15    56    28    95    54    54    63    90
    61     6     1    80    42    88    34    75    54    60
    14    97     6     8    85    22    36    90    54    34
    10    94    94    68    76    36    98    87    49     5
    70    96    45     3    40    75    92    18    36    12
    37     1
neg vec:
   -18   -58   -22   -31   -48   -95   -86    -1   -68   -36
   -20   -82   -86   -30   -68   -11   -41   -17   -88   -99
   -76   -80   -75   -16   -93   -63   -60   -48   -29   -75
   -93   -66   -60   -51   -89   -88   -15   -21   -80   -82
   -42   -42   -21   -47   -46   -40   -61   -28