Подсчитать количество элементов массива - C (СИ)

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

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

Динамическая память. Одномерный массив. Массив заполняется произвольным количеством чисел. Как только с клавиатуры вводится любое отрицательное число, ввод завершается. Подсчитать количество элементов.

Решение задачи: «Подсчитать количество элементов массива»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
 
struct array;
typedef struct array array;
 
struct array {
    void  *data;  // данные
    size_t size;  // кол-во элементов
    size_t isize; // размер элемента
};
 
void* array_init(array*, size_t, size_t);
void* array_resize(array*, size_t);
void  array_destroy(array*);
 
int main(void) {
    array  a;     // динамический массив
    int   *ptr;   // указатель на данные в массиве
    int    var;   // переменная для ввода значения
    size_t count; // количество введенных элементов
 
    // создаем массив для 64х элементов типа int
    ptr = array_init(&a, 64, sizeof(int));
    if(NULL != ptr) { // если удалось создать
        count = 0;
        // вводим элементы, пока они есть на входе
        while(fscanf(stdin, "%d", &var) == 1) {
            if(var < 0) // условие окончания ввода
                break;
 
            if((count+1)>=a.size) { // массив заполнен
                // увеличиваем размер
                int * tmp = array_resize(&a, a.size + a.size);
                if(tmp) {
                    ptr = tmp;
                }
                else // увеличить не удалось
                    break;
            }
            ptr[count] = var; // запоминаем введеное значение
            ++count;
        }
        fprintf(stdout, "You enter %ud elements\n", count);
        array_destroy(&a); // удаляем массив
    }
    return EXIT_SUCCESS;
}
 
void* array_resize(array *self, size_t size) {
    void* ptr = NULL;
    if(self->size != size) {
        if(self->data) {
            ptr = realloc(self->data, size*self->isize);
            if(NULL == ptr)
                if(0 != size)
                    return NULL;
            self->data = ptr;
            self->size = size;
        }
        else {
            if(size) {
                ptr = calloc(size, self->isize);
                if(ptr) {
                    self->data = ptr;
                    self->size = size;
                }
            }
        }
    }
    return ptr;
}
void* array_init(array *self, size_t size, size_t isize) {
    self->data = calloc(size, isize);
    if(self->data) {
        self->size = size;
        self->isize = isize;
    }
    return self->data;
}
void array_destroy(array* self) {
    if(self->data) {
        free(self->data);
        self->data = NULL;
        self->size = 0;
        self->isize = 0;
    }
}

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

В данном коде реализована функция main, которая создаёт динамический массив типа array, заполняет его данными, полученными от пользователя, выводит количество введенных элементов, а затем освобождает память, выделенную под массив. Структура array содержит указатель data на данные в массиве, переменную size для хранения количества элементов и переменную isize для хранения размера одного элемента в массиве. Функция array_init выделяет память под массив заданного размера и возвращает указатель на первый элемент массива. Если выделение памяти не удалось, функция возвращает NULL. Функция array_resize изменяет размер массива, перераспределяя память под массив заданного размера. Если выделение памяти под новый массив не удалось, функция возвращает NULL. Функция array_destroy освобождает память, выделенную под массив. В функции main создается массив для 64 элементов типа int. Затем в цикле while пользователь вводит числа, пока не введет отрицательное число (что означает конец ввода). Если массив заполнен (т.е. количество введенных элементов равно размеру массива), то функция array_resize увеличивает размер массива на 64. Если выделение памяти под новый массив не удалось, то цикл прерывается. После ввода всех чисел выводится сообщение о количестве введенных элементов, а затем вызывается функция array_destroy, которая освобождает память, выделенную под массив.

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

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