Подсчитать количество элементов массива - C (СИ)
Формулировка задачи:
Решение задачи: «Подсчитать количество элементов массива»
#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
, которая освобождает память, выделенную под массив.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д