Определить количество положительных элементов в тех строках, которые содержат хотя бы один нулевой элемент - C (СИ)
Формулировка задачи:
Решение задачи: «Определить количество положительных элементов в тех строках, которые содержат хотя бы один нулевой элемент»
- #include <stdio.h>
- #include <math.h>
- #define EPSILON_DOUBLE 0.000000001
- #define EPSILON_FLOAT 0.00001f
- #define M 3
- #define N 4
- int PositiveIntPredicate(const void* n)
- {
- return (*(int*)n > 0);
- }
- int PositiveDoublePredicate(const void* d)
- {
- return (*(double*)d > EPSILON_DOUBLE);
- }
- int PositiveFloatPredicate(const void* f)
- {
- return (*(float*)f > EPSILON_FLOAT);
- }
- int IsZeroInt(const void* n)
- {
- return (*(int*)n == 0);
- }
- int IsZeroDouble(const void* d)
- {
- return (fabs(*(double*)d) <= EPSILON_DOUBLE);
- }
- int IsZeroFloat(const void* f)
- {
- double temp = *(float*)f * 1.0;
- return IsZeroDouble(&temp);
- }
- /*
- Returns the number of elements in the range [first,last) for which predicate is true.
- */
- size_t count_if(const void* first, const void* last, const size_t elementSize,
- int (*predicate)(const void* elem))
- {
- size_t count = 0;
- while (first != last)
- {
- if (predicate(first)) count++;
- first = (char*)first + elementSize;
- }
- return count;
- }
- /*
- Returns true if pred returns true for any of the elements in the range [first,last), and false otherwise.
- */
- int any_of(const void* first, const void* last, const size_t elementSize,
- int (*predicate)(const void* elem))
- {
- while (first != last)
- {
- if (predicate(first)) return 1;
- first = (char*)first + elementSize;
- }
- return 0;
- }
- void TestInts(void)
- {
- int a[M][N] = {
- {1, 2, 3, 4},
- {1, 0, 2, 3},
- {0, 0, 1, 2}
- };
- size_t i, j;
- size_t positiveCount = 0;
- printf("=== INTEGER TEST ===\n");
- for (i = 0; i < M; i++)
- {
- for (j = 0; j < N; j++)
- {
- if (j == N - 1) printf("%3d\n", a[i][j]);
- else printf("%3d ", a[i][j]);
- }
- }
- for (i = 0; i < M; i++)
- {
- if (any_of(&a[i], &a[i] + 1, sizeof(int), IsZeroInt))
- {
- positiveCount = count_if(&a[i], &a[i] + 1, sizeof(int), PositiveIntPredicate);
- printf("At line %lu: count = %lu\n", i, positiveCount);
- }
- }
- printf("=== END TEST ===\n\n");
- }
- void TestDoubles(void)
- {
- double a[M][N] = {
- {-1.0, 0.0, 0.0, 1.0},
- {2.99, 0.0, 0.0, 3.0},
- {1.0, 2.0, 3.0, 4.0}
- };
- size_t i, j;
- size_t positiveCount = 0;
- printf("=== DOUBLES TEST ===\n");
- for (i = 0; i < M; i++)
- {
- for (j = 0; j < N; j++)
- {
- if (j == N - 1) printf("%+.4f\n", a[i][j]);
- else printf("%+.4f ", a[i][j]);
- }
- }
- for (i = 0; i < M; i++)
- {
- if (any_of(&a[i], &a[i] + 1, sizeof(double), IsZeroDouble))
- {
- positiveCount = count_if(&a[i], &a[i] + 1, sizeof(double), PositiveDoublePredicate);
- printf("At line %lu: count = %lu\n", i, positiveCount);
- }
- }
- printf("=== END TEST ===\n\n");
- }
- void TestFloats(void)
- {
- float a[M][N] = {
- {0.0f, 0.0f, 0.0f, 0.0f},
- {-1.0f, 0.0f, 0.0f, -3.0f},
- {1.0f, 2.0f, 3.0f, 0.0f}
- };
- size_t i, j;
- size_t positiveCount = 0;
- printf("=== FLOATS TEST ===\n");
- for (i = 0; i < M; i++)
- {
- for (j = 0; j < N; j++)
- {
- if (j == N - 1) printf("%+.4f\n", a[i][j]);
- else printf("%+.4f ", a[i][j]);
- }
- }
- for (i = 0; i < M; i++)
- {
- if (any_of(&a[i], &a[i] + 1, sizeof(float), IsZeroDouble))
- {
- positiveCount = count_if(&a[i], &a[i] + 1, sizeof(float), PositiveFloatPredicate);
- printf("At line %lu: count = %lu\n", i, positiveCount);
- }
- }
- printf("=== END TEST ===\n\n");
- }
- int main(void)
- {
- TestInts();
- TestDoubles();
- TestFloats();
- return 0;
- }
Объяснение кода листинга программы
В данном коде определены функции-предикаты для проверки нулевых значений и положительных чисел для типов данных 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 вызываются все три функции для тестирования.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д