Сформировать новый массив из элементов массивов P и Q, присутствующих в них обоих - C (СИ)
Формулировка задачи:
Даны два целочисленных массива: P(46) и Q(39). Сформировать новый массив из элементов массивов P и Q, присутствующих в них обоих, из исходных массивов эти элементы удалить. В новом массиве все значения должны быть уникальными.
помогите написать прогу
Решение задачи: «Сформировать новый массив из элементов массивов P и Q, присутствующих в них обоих»
textual
Листинг программы
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> void RemoveValues(int* const arr, size_t* const arrLengthPtr, const int value) { int canContinue = 0; size_t i = 0; i = 0; while (i < ((*arrLengthPtr) - 1)) { canContinue = 1; while ((arr[i] == value) && canContinue) { if (i == ((*arrLengthPtr) - 1)) { canContinue = 0; } else { memmove(&arr[i], &arr[i + 1], ((*arrLengthPtr) - i - 1) * sizeof(*arr)); } (*arrLengthPtr)--; } i++; } } int IsValuePresentInArray(const int* const arr, const size_t N, const int value) { int isPresent = 0; const int* iterator = arr; while ((iterator < (arr + N)) && !isPresent) { if (*iterator == value) { isPresent = 1; } iterator++; } return isPresent; } int ConstructThird(int** const firstArrPtr, size_t* const firstArrLengthPtr, int** const secondArrPtr, size_t* const secondArrLengthPtr, int** const thirdArrPtr, size_t* const thirdArrLengthPtr) { int errorCode = 0; int value = 0; int* newArr = NULL; int* temp = NULL; size_t N = 0; size_t i = 0; do { newArr = malloc((*firstArrLengthPtr) * sizeof(*newArr)); if (newArr == NULL) { errorCode = 1; break; } memset(newArr, 0, (*firstArrLengthPtr) * sizeof(*newArr)); while (i < (*firstArrLengthPtr)) { value = (*firstArrPtr)[i]; if (IsValuePresentInArray(*secondArrPtr, *secondArrLengthPtr, value)) { newArr[N] = (*firstArrPtr)[i]; N++; RemoveValues(*firstArrPtr, firstArrLengthPtr, value); RemoveValues(*secondArrPtr, secondArrLengthPtr, value); } i++; } temp = realloc(*firstArrPtr, (*firstArrLengthPtr) * sizeof(*temp)); if (temp == NULL) { free(newArr); errorCode = 1; break; } else { (*firstArrPtr) = temp; } temp = realloc(*secondArrPtr, (*secondArrLengthPtr) * sizeof(*temp)); if (temp == NULL) { free(newArr); errorCode = 1; break; } else { (*secondArrPtr) = temp; } temp = realloc(newArr, N * sizeof(*temp)); if (temp == NULL) { free(newArr); errorCode = 1; break; } else { newArr = temp; } (*thirdArrPtr) = newArr; (*thirdArrLengthPtr) = N; } while (0); return errorCode; } int CreateAndGenerateArray(int** const arrPtr, const size_t N) { int* temp = NULL; size_t i = 0; temp = malloc(N * sizeof(*temp)); if (temp == NULL) { return 0; } else { for (i = 0; i < N; i++) { temp[i] = rand() % 10; } (*arrPtr) = temp; } return 1; } void PrintArray(const int* const arr, const size_t N) { size_t i = 0; for (i = 0; i < N; i++) { if (i < N - 1) { printf("%d ", arr[i]); } else { printf("%d\n", arr[i]); } } } int main(void) { int* P = NULL; int* Q = NULL; int* Z = NULL; size_t lP = 8; size_t lQ = 6; size_t lZ = 0; srand(time(NULL)); CreateAndGenerateArray(&P, lP); CreateAndGenerateArray(&Q, lQ); printf("Before:\n"); printf("Array P:\n"); PrintArray(P, lP); printf("Array Q:\n"); PrintArray(Q, lQ); ConstructThird(&P, &lP, &Q, &lQ, &Z, &lZ); printf("After:\n"); printf("Array P:\n"); PrintArray(P, lP); printf("Array Q:\n"); PrintArray(Q, lQ); printf("Array Z:\n"); PrintArray(Z, lZ); return 0; }
Объяснение кода листинга программы
- В данной программе реализуется алгоритм объединения двух массивов в один, при условии что значения из первого массива присутствуют во втором.
- Для решения задачи используется четыре функции:
RemoveValues
- удаляет из массива все вхождения заданного значения.IsValuePresentInArray
- проверяет наличие значения в массиве.ConstructThird
- создает третий массив, объединяя значения из первых двух, которые присутствуют в обоих.CreateAndGenerateArray
- создает массив заданного размера и заполняет его случайными значениями.
- В функции
ConstructThird
используется вложенный циклdo-while
, который гарантирует корректную обработку массивов любых размеров. - Перед выходом из программы, все выделенные динамически массивы освобождаются с помощью функции
free
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д