Преобразовать одномерный массив, увеличив каждую его серию на 1 элемент - C (СИ)

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

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

Подскажите,пожалуйста, как написать эту программу. Дан целочисленный массив размера N. Назовем серией группу подряд идущих одинаковых элементов, а длиной серии-количество этих элементов(длина может=1). Преобразовать массив,увеличив каждую его серию на 1 элемент.

Решение задачи: «Преобразовать одномерный массив, увеличив каждую его серию на 1 элемент»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
void PrintArray(const int* const array, const int arrayLength)
{
  int i = 0;
  printf("-----  Array[length = %d]: -----\n", arrayLength);
  for(i = 0; i < arrayLength; i++)
  {
    printf("%d ", array[i]);
  }
  printf("%c", '\n');
}
 
void FillArray(int** const ptrToArray, const int maxLength)
{
  int i = 0;
  (*ptrToArray) = malloc(maxLength * sizeof(**ptrToArray));
  for(i = 0; i < maxLength; i++)
  {
    (*ptrToArray)[i] = rand() % 10;
  }
}
 
void ProcessArray(int** const ptrToArray, int* const ptrToArrayLength)
{
  int* tempArray = NULL;
  int i = 0;
  int j = 0;
  int oldLength = 0;
  int newLength = 0;
 
  oldLength = (*ptrToArrayLength);
  newLength = oldLength;
 
  /* counting sequences */
  for(i = 0; i < oldLength - 1; i++)
  {
    if ((*ptrToArray)[i] != (*ptrToArray)[i + 1])
    {
      newLength++;
    }
  }
  newLength++; /* last element will be duplicated either way */
 
  tempArray = malloc(newLength * sizeof(*tempArray));
 
  i = 0;
  j = 0;
  while (i < oldLength - 1)
  {
    tempArray[j] = (*ptrToArray)[i];
    if ((*ptrToArray)[i] != (*ptrToArray)[i + 1])
    {
      tempArray[j + 1] = tempArray[j];
      j = j + 2;
    }
    else
    {
      j++;
    }
    i++;
  }
  
  tempArray[newLength - 2] = (*ptrToArray)[oldLength - 1];
  tempArray[newLength - 1] = tempArray[newLength - 2];
 
  free(*ptrToArray);
  (*ptrToArray) = tempArray;
  (*ptrToArrayLength) = newLength;
}
 
void FreeArray(int** const ptrToArray)
{
  free(*ptrToArray);
  (*ptrToArray) = NULL;
}
 
int main(void)
{
  int* a = NULL;
  int N = 10;
 
  srand(time(NULL));
 
  FillArray(&a, N);
  PrintArray(a, N);
  ProcessArray(&a, &N);
  PrintArray(a, N);
  FreeArray(&a);
 
  return 0;
}

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

В этом коде выполняются следующие действия:

  1. Создаются функции для работы с массивом:
    • PrintArray - выводит элементы массива на экран;
    • FillArray - заполняет массив случайными числами;
    • ProcessArray - обрабатывает массив, объединяя его серии;
    • FreeArray - освобождает память, выделенную под массив.
  2. В функции main создается массив a длиной N = 10, заполняется случайными числами с помощью FillArray и выводится на экран с помощью PrintArray.
  3. Затем вызывается функция ProcessArray, которая обрабатывает массив, объединяя его серии. В результате обработки массив удлиняется на 1 элемент, и его последний элемент дублируется.
  4. После обработки массив выводится на экран с помощью PrintArray.
  5. Вызывается функция FreeArray, освобождающая память под массивом.
  6. Программа завершается возвратом 0 из функции main.

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


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

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

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