Указатели в функции с одномерным массивом - C (СИ)

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

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

Разработать функцию, которая находит количество положительных, отрицательных и равных нулю элементов массива. Обработку массива необходимо реализовать с помощью указателей, без использования индексации. Как написать без функции я знаю но вот как через функцию и еще с указателем не знаю

Решение задачи: «Указатели в функции с одномерным массивом»

textual
Листинг программы
#include <stdio.h>
#include <stdbool.h>
 
typedef bool (* Predicate)(const void* const);
 
static bool IsNegativeInt(const void* const a)
{
    return (*(int*)a < 0);
}
 
static bool IsPositiveInt(const void* const a)
{
    return (*(int*)a > 0);
}
 
static bool IsZeroInt(const void* const a)
{
    return (*(int*)a == 0);
}
 
static bool IsNegativeFloat(const void* const a)
{
    return (*(float*)a < 0.0f);
}
 
static bool IsPositiveFloat(const void* const a)
{
    return (*(float*)a > 0.0f);
}
 
static bool IsZeroFloat(const void* const a)
{
    return (*(float*)a == 0.0f);
}
 
size_t CountIf(const void* const abstractArray, const size_t elementSize, const size_t elementsCount,
               Predicate predicate)
{
    const unsigned char* start = abstractArray;
    const unsigned char* const end = start + elementsCount * elementSize;
 
    size_t count = 0;
 
    while (start < end)
    {
        if (predicate(start))
        {
            count++;
        }
 
        start = start + elementSize;
    }
 
    return count;
}
 
int main(void)
{
    int a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
 
    float b[4] = {0.0f, 1.2f, -45.5f, 4.3f};
 
    size_t positive, negative, zeroes;
 
    positive = CountIf(a, sizeof(int), 10, IsPositiveInt);
    negative = CountIf(a, sizeof(int), 10, IsNegativeInt);
    zeroes = CountIf(a, sizeof(int), 10, IsZeroInt);
 
    printf("For array a: p = %zu, n = %zu, 0 = %zu\n", positive, negative, zeroes);
 
    positive = CountIf(b, sizeof(float), 4, IsPositiveFloat);
    negative = CountIf(b, sizeof(float), 4, IsNegativeFloat);
    zeroes = CountIf(b, sizeof(float), 4, IsZeroFloat);
 
    printf("For array b: p = %zu, n = %zu, 0 = %zu\n", positive, negative, zeroes);
 
    return 0;
}

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

  1. Включаются необходимые заголовочные файлы: stdio.h и stdbool.h
  2. Определяется тип указателя на функцию с одним аргументом и возвращаемым булевым значением
  3. Определяются функции-предикаты для проверки значений на положительность, отрицательность и нулевое значение для int и float типов данных
  4. Определяется функция CountIf, которая принимает абстрактный массив, размер элемента и количество элементов в массиве, а также предикат для проверки. Функция осуществляет перебор элементов массива с помощью цикла while и проверяет каждый элемент с помощью предиката. Если элемент удовлетворяет условию, увеличивается счетчик.
  5. В функции main создаются массивы a и b типа int и float соответственно.
  6. Создаются переменные positive, negative и zeroes для подсчета количества элементов, удовлетворяющих условиям.
  7. Вызывается функция CountIf для массива a с предикатами IsPositiveInt, IsNegativeInt и IsZeroInt соответственно. Результат подсчета выводится на экран.
  8. Вызывается функция CountIf для массива b с предикатами IsPositiveFloat, IsNegativeFloat и IsZeroFloat соответственно. Результат подсчета выводится на экран.
  9. Функция main возвращает 0, завершая работу программы.

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


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

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

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