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

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

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

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

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

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. struct array;
  5. typedef struct array array;
  6.  
  7. struct array {
  8.     void  *data;  // данные
  9.     size_t size;  // кол-во элементов
  10.     size_t isize; // размер элемента
  11. };
  12.  
  13. void* array_init(array*, size_t, size_t);
  14. void* array_resize(array*, size_t);
  15. void  array_destroy(array*);
  16.  
  17. int main(void) {
  18.     array  a;     // динамический массив
  19.     int   *ptr;   // указатель на данные в массиве
  20.     int    var;   // переменная для ввода значения
  21.     size_t count; // количество введенных элементов
  22.  
  23.     // создаем массив для 64х элементов типа int
  24.     ptr = array_init(&a, 64, sizeof(int));
  25.     if(NULL != ptr) { // если удалось создать
  26.         count = 0;
  27.         // вводим элементы, пока они есть на входе
  28.         while(fscanf(stdin, "%d", &var) == 1) {
  29.             if(var < 0) // условие окончания ввода
  30.                 break;
  31.  
  32.             if((count+1)>=a.size) { // массив заполнен
  33.                 // увеличиваем размер
  34.                 int * tmp = array_resize(&a, a.size + a.size);
  35.                 if(tmp) {
  36.                     ptr = tmp;
  37.                 }
  38.                 else // увеличить не удалось
  39.                     break;
  40.             }
  41.             ptr[count] = var; // запоминаем введеное значение
  42.             ++count;
  43.         }
  44.         fprintf(stdout, "You enter %ud elements\n", count);
  45.         array_destroy(&a); // удаляем массив
  46.     }
  47.     return EXIT_SUCCESS;
  48. }
  49.  
  50. void* array_resize(array *self, size_t size) {
  51.     void* ptr = NULL;
  52.     if(self->size != size) {
  53.         if(self->data) {
  54.             ptr = realloc(self->data, size*self->isize);
  55.             if(NULL == ptr)
  56.                 if(0 != size)
  57.                     return NULL;
  58.             self->data = ptr;
  59.             self->size = size;
  60.         }
  61.         else {
  62.             if(size) {
  63.                 ptr = calloc(size, self->isize);
  64.                 if(ptr) {
  65.                     self->data = ptr;
  66.                     self->size = size;
  67.                 }
  68.             }
  69.         }
  70.     }
  71.     return ptr;
  72. }
  73. void* array_init(array *self, size_t size, size_t isize) {
  74.     self->data = calloc(size, isize);
  75.     if(self->data) {
  76.         self->size = size;
  77.         self->isize = isize;
  78.     }
  79.     return self->data;
  80. }
  81. void array_destroy(array* self) {
  82.     if(self->data) {
  83.         free(self->data);
  84.         self->data = NULL;
  85.         self->size = 0;
  86.         self->isize = 0;
  87.     }
  88. }

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

В данном коде реализована функция 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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы