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