Указатели в функции с одномерным массивом - 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; }
Объяснение кода листинга программы
- Включаются необходимые заголовочные файлы: stdio.h и stdbool.h
- Определяется тип указателя на функцию с одним аргументом и возвращаемым булевым значением
- Определяются функции-предикаты для проверки значений на положительность, отрицательность и нулевое значение для int и float типов данных
- Определяется функция CountIf, которая принимает абстрактный массив, размер элемента и количество элементов в массиве, а также предикат для проверки. Функция осуществляет перебор элементов массива с помощью цикла while и проверяет каждый элемент с помощью предиката. Если элемент удовлетворяет условию, увеличивается счетчик.
- В функции main создаются массивы a и b типа int и float соответственно.
- Создаются переменные positive, negative и zeroes для подсчета количества элементов, удовлетворяющих условиям.
- Вызывается функция CountIf для массива a с предикатами IsPositiveInt, IsNegativeInt и IsZeroInt соответственно. Результат подсчета выводится на экран.
- Вызывается функция CountIf для массива b с предикатами IsPositiveFloat, IsNegativeFloat и IsZeroFloat соответственно. Результат подсчета выводится на экран.
- Функция main возвращает 0, завершая работу программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д