Определить количество положительных элементов в тех строках, которые содержат хотя бы один нулевой элемент - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Дан массив (nxn).Определить количество положительных элементов в тех строках, которые содержат хотя бы один нулевой элемент. язык си

Решение задачи: «Определить количество положительных элементов в тех строках, которые содержат хотя бы один нулевой элемент»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <math.h>
  3.  
  4. #define EPSILON_DOUBLE  0.000000001
  5. #define EPSILON_FLOAT   0.00001f
  6.  
  7. #define M 3
  8. #define N 4
  9.  
  10. int PositiveIntPredicate(const void* n)
  11. {
  12.   return (*(int*)n > 0);
  13. }
  14.  
  15. int PositiveDoublePredicate(const void* d)
  16. {
  17.   return (*(double*)d > EPSILON_DOUBLE);
  18. }
  19.  
  20. int PositiveFloatPredicate(const void* f)
  21. {
  22.   return (*(float*)f > EPSILON_FLOAT);
  23. }
  24.  
  25. int IsZeroInt(const void* n)
  26. {
  27.   return (*(int*)n == 0);
  28. }
  29.  
  30. int IsZeroDouble(const void* d)
  31. {
  32.   return (fabs(*(double*)d) <= EPSILON_DOUBLE);
  33. }
  34.  
  35. int IsZeroFloat(const void* f)
  36. {
  37.   double temp = *(float*)f * 1.0;
  38.   return IsZeroDouble(&temp);
  39. }
  40.  
  41. /*
  42.   Returns the number of elements in the range [first,last) for which predicate is true.
  43. */
  44. size_t count_if(const void* first, const void* last, const size_t elementSize,
  45.     int (*predicate)(const void* elem))
  46. {
  47.   size_t count = 0;
  48.  
  49.   while (first != last)
  50.   {
  51.     if (predicate(first)) count++;
  52.  
  53.     first = (char*)first + elementSize;
  54.   }
  55.  
  56.   return count;
  57. }
  58.  
  59. /*
  60.   Returns true if pred returns true for any of the elements in the range [first,last), and false otherwise.
  61. */
  62. int any_of(const void* first, const void* last, const size_t elementSize,
  63.     int (*predicate)(const void* elem))
  64. {
  65.   while (first != last)
  66.   {
  67.     if (predicate(first)) return 1;
  68.  
  69.     first = (char*)first + elementSize;
  70.   }
  71.  
  72.   return 0;
  73. }
  74.  
  75. void TestInts(void)
  76. {
  77.   int a[M][N] = {
  78.     {1, 2, 3, 4},
  79.     {1, 0, 2, 3},
  80.     {0, 0, 1, 2}
  81.   };
  82.  
  83.   size_t i, j;
  84.   size_t positiveCount = 0;
  85.  
  86.   printf("=== INTEGER TEST ===\n");
  87.  
  88.   for (i = 0; i < M; i++)
  89.   {
  90.     for (j = 0; j < N; j++)
  91.     {
  92.       if (j == N - 1) printf("%3d\n", a[i][j]);
  93.       else printf("%3d ", a[i][j]);
  94.     }
  95.   }
  96.  
  97.   for (i = 0; i < M; i++)
  98.   {
  99.     if (any_of(&a[i], &a[i] + 1, sizeof(int), IsZeroInt))
  100.     {
  101.       positiveCount = count_if(&a[i], &a[i] + 1, sizeof(int), PositiveIntPredicate);
  102.  
  103.       printf("At line %lu: count = %lu\n", i, positiveCount);
  104.     }
  105.   }
  106.   printf("===   END TEST   ===\n\n");
  107. }
  108.  
  109. void TestDoubles(void)
  110. {
  111.   double a[M][N] = {
  112.     {-1.0, 0.0, 0.0, 1.0},
  113.     {2.99, 0.0, 0.0, 3.0},
  114.     {1.0, 2.0, 3.0, 4.0}
  115.   };
  116.  
  117.   size_t i, j;
  118.   size_t positiveCount = 0;
  119.  
  120.   printf("=== DOUBLES TEST ===\n");
  121.  
  122.   for (i = 0; i < M; i++)
  123.   {
  124.     for (j = 0; j < N; j++)
  125.     {
  126.       if (j == N - 1) printf("%+.4f\n", a[i][j]);
  127.       else printf("%+.4f ", a[i][j]);
  128.     }
  129.   }
  130.  
  131.   for (i = 0; i < M; i++)
  132.   {
  133.     if (any_of(&a[i], &a[i] + 1, sizeof(double), IsZeroDouble))
  134.     {
  135.       positiveCount = count_if(&a[i], &a[i] + 1, sizeof(double), PositiveDoublePredicate);
  136.  
  137.       printf("At line %lu: count = %lu\n", i, positiveCount);
  138.     }
  139.   }
  140.   printf("===   END TEST   ===\n\n");
  141. }
  142.  
  143. void TestFloats(void)
  144. {
  145.   float a[M][N] = {
  146.     {0.0f, 0.0f, 0.0f, 0.0f},
  147.     {-1.0f, 0.0f, 0.0f, -3.0f},
  148.     {1.0f, 2.0f, 3.0f, 0.0f}
  149.   };
  150.  
  151.   size_t i, j;
  152.   size_t positiveCount = 0;
  153.  
  154.   printf("=== FLOATS  TEST ===\n");
  155.  
  156.   for (i = 0; i < M; i++)
  157.   {
  158.     for (j = 0; j < N; j++)
  159.     {
  160.       if (j == N - 1) printf("%+.4f\n", a[i][j]);
  161.       else printf("%+.4f ", a[i][j]);
  162.     }
  163.   }
  164.  
  165.   for (i = 0; i < M; i++)
  166.   {
  167.     if (any_of(&a[i], &a[i] + 1, sizeof(float), IsZeroDouble))
  168.     {
  169.       positiveCount = count_if(&a[i], &a[i] + 1, sizeof(float), PositiveFloatPredicate);
  170.  
  171.       printf("At line %lu: count = %lu\n", i, positiveCount);
  172.     }
  173.   }
  174.   printf("===   END TEST   ===\n\n");
  175. }
  176.  
  177. int main(void)
  178. {
  179.   TestInts();
  180.   TestDoubles();
  181.   TestFloats();
  182.  
  183.   return 0;
  184. }

Объяснение кода листинга программы

В данном коде определены функции-предикаты для проверки нулевых значений и положительных чисел для типов данных int, double и float. Также определены функции count_if и any_of для подсчета числа элементов, удовлетворяющих условию, и проверки наличия такого элемента в диапазоне. В функции TestInts массив a[M][N] содержит значения {1, 2, 3, 4}, {1, 0, 2, 3}, {0, 0, 1, 2}. При итерации по этому массиву выводится каждое значение. Затем проверяется наличие нулевого значения в каждой строке. Если такое значение найдено, то подсчитывается количество положительных значений в этой строке и выводится на экран. Аналогично работает функция TestDoubles, но с массивом double и немного другими значениями. Функция TestFloats работает также, но использует функцию IsZeroDouble для проверки нулевых значений в float. В функции main вызываются все три функции для тестирования.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы