Сформировать один массив из элементов другого - C (СИ)

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

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

Из элементов массива А из n элементов, стоящих на нечетных местах и расположенных правее минимального элемента данной последовательности, сформировать новый массив C. Для формирования массива С напишите функцию с использованием указателей.

Решение задачи: «Сформировать один массив из элементов другого»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
 
int* min_a(const int* const arr, const size_t N)
{
  const int* minPtr = arr;
 
  size_t i = 0;
 
  while ((minPtr != NULL) && (i < N))
  {
    if (arr[i] < (*minPtr))
    {
      minPtr = &arr[i];
    }
 
    i++;
  }
 
  return (int*)minPtr;
}
 
size_t CalcSize(const int* const startPtr, const int* const endPtr)
{
  ptrdiff_t diff = endPtr - startPtr;
 
  size_t res = 0;
 
  if (diff > 0)
  {
    
    res = diff / 2;
 
    if (diff % 2 != 0)
    {
      res++;
    }
  }
 
  return res;
}
 
int* FormC(const int* const startPtr, const int* const endPtr, int align,
    size_t* const arrayLengthPtr)
{
  int* c = NULL;
 
  const int* iterator = NULL;
 
  size_t i = 0;
  size_t N = 0;
 
  if ((startPtr != NULL) && (startPtr != endPtr) && ((align != 1) ||
      (align != 0)))
  {
    N = CalcSize(startPtr, endPtr);
 
    if (N != 0)
    {
      c = malloc(N * sizeof(*c));
 
      if (c != NULL)
      {
        i = 0;
        iterator = startPtr + align + 1;
        while (iterator < endPtr + 1)
        {
          c[i] = *(iterator);
 
          iterator = iterator + 2;
          i++;
        }
        
        (*arrayLengthPtr) = N;
      }
    }
  }
 
  return c;
}
 
int* ConstructC(const int* const a, const size_t N,
    size_t* const resultLengthPtr)
{
  int* c = NULL;
  int* minPtr = NULL;
 
  int align = 0;
 
  if ((a != NULL) && (N != 0) && (resultLengthPtr != NULL))
  {
    minPtr = min_a(a, N);
 
    if ((minPtr - a) % 2 != 0)
    {
      align = 1;
    }
 
    c = FormC(minPtr, &a[N - 1], align, resultLengthPtr);
  }
 
  return c;
}
 
void PrintArray(const int* const array, const size_t N)
{
  size_t i = 0;
 
  if (array != NULL)
  {
    for(i = 0; i < N; i++)
    {
      printf("%d ", array[i]);
    }
    printf("\n");
  }
}
 
int main(void)
{
  int a[] = {1, 2, 3, 4, 0, 5, 6, 7, 8, 9, 10, 11, 12, 13};
 
  size_t lengthC = 0;
 
  int* c = ConstructC(a, sizeof(a) / sizeof(*a), &lengthC);
 
  if (c != NULL)
  {
    PrintArray(c, lengthC);
  }
 
  free(c);
 
  return 0;
}

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

В данном коде реализуется функция ConstructC, которая принимает на вход массив a, его размер N и указатель на переменную resultLengthPtr, в которую будет записан размер результирующего массива c. Сначала определяется указатель minPtr на минимальный элемент массива a с помощью функции min_a. Затем вычисляется смещение align, которое будет использоваться при формировании результирующего массива c. Если minPtr находится на нечетном индексе, то align устанавливается равным 1, иначе 0. Далее вызывается функция FormC, которая формирует результирующий массив c. Она принимает на вход указатель startPtr, который указывает на элемент массива a с минимальным значением, и указатель endPtr, который указывает на предпоследний элемент массива a. Функция возвращает размер результирующего массива c. Если вызов функции ConstructC успешен, то происходит печать результирующего массива c с помощью функции PrintArray. Затем результирующий массив освобождается с помощью функции free. В данном случае в качестве массива a используется массив a с десятью элементами. При вызове функции ConstructC формируется массив c размером 5 элементов, в котором дублируются минимальные значения из массива a. Затем этот массив печатается, после чего освобождается.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

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