Преобразовать одномерный массив, увеличив каждую его серию на 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; }
Объяснение кода листинга программы
В этом коде выполняются следующие действия:
- Создаются функции для работы с массивом:
PrintArray
- выводит элементы массива на экран;FillArray
- заполняет массив случайными числами;ProcessArray
- обрабатывает массив, объединяя его серии;FreeArray
- освобождает память, выделенную под массив.
- В функции
main
создается массивa
длинойN = 10
, заполняется случайными числами с помощьюFillArray
и выводится на экран с помощьюPrintArray
. - Затем вызывается функция
ProcessArray
, которая обрабатывает массив, объединяя его серии. В результате обработки массив удлиняется на 1 элемент, и его последний элемент дублируется. - После обработки массив выводится на экран с помощью
PrintArray
. - Вызывается функция
FreeArray
, освобождающая память под массивом. - Программа завершается возвратом 0 из функции
main
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д