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

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

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

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

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

textual
Листинг программы
#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 вызываются все три функции для тестирования.

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


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

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

11   голосов , оценка 4 из 5
Похожие ответы