Сформировать новый массив из элементов массивов P и Q, присутствующих в них обоих - C (СИ)

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

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

Даны два целочисленных массива: P(46) и Q(39). Сформировать новый массив из элементов массивов P и Q, присутствующих в них обоих, из исходных массивов эти элементы удалить. В новом массиве все значения должны быть уникальными. помогите написать прогу

Решение задачи: «Сформировать новый массив из элементов массивов P и Q, присутствующих в них обоих»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <time.h>
  5.  
  6. void RemoveValues(int* const arr, size_t* const arrLengthPtr, const int value)
  7. {
  8.   int canContinue = 0;
  9.  
  10.   size_t i = 0;
  11.  
  12.   i = 0;
  13.   while (i < ((*arrLengthPtr) - 1))
  14.   {
  15.     canContinue = 1;
  16.     while ((arr[i] == value) && canContinue)
  17.     {
  18.       if (i == ((*arrLengthPtr) - 1))
  19.       {
  20.         canContinue = 0;
  21.       }
  22.       else
  23.       {
  24.         memmove(&arr[i], &arr[i + 1], ((*arrLengthPtr) - i - 1) * sizeof(*arr));
  25.       }
  26.  
  27.       (*arrLengthPtr)--;
  28.     }
  29.     i++;
  30.   }
  31. }
  32.  
  33. int IsValuePresentInArray(const int* const arr, const size_t N, const int value)
  34. {
  35.   int isPresent = 0;
  36.  
  37.   const int* iterator = arr;
  38.  
  39.   while ((iterator < (arr + N)) && !isPresent)
  40.   {
  41.     if (*iterator == value)
  42.     {
  43.       isPresent = 1;
  44.     }
  45.     iterator++;
  46.   }
  47.  
  48.   return isPresent;
  49. }
  50.  
  51. int ConstructThird(int** const firstArrPtr, size_t* const firstArrLengthPtr,
  52.   int** const secondArrPtr, size_t* const secondArrLengthPtr,
  53.   int** const thirdArrPtr, size_t* const thirdArrLengthPtr)
  54. {
  55.   int errorCode = 0;
  56.   int value = 0;
  57.  
  58.   int* newArr = NULL;
  59.   int* temp = NULL;
  60.  
  61.   size_t N = 0;
  62.   size_t i = 0;
  63.  
  64.   do
  65.   {
  66.     newArr = malloc((*firstArrLengthPtr) * sizeof(*newArr));
  67.     if (newArr == NULL)
  68.     {
  69.       errorCode = 1;
  70.       break;
  71.     }
  72.  
  73.     memset(newArr, 0, (*firstArrLengthPtr) * sizeof(*newArr));
  74.  
  75.     while (i < (*firstArrLengthPtr))
  76.     {
  77.       value = (*firstArrPtr)[i];
  78.  
  79.       if (IsValuePresentInArray(*secondArrPtr, *secondArrLengthPtr, value))
  80.       {
  81.         newArr[N] = (*firstArrPtr)[i];
  82.         N++;
  83.  
  84.         RemoveValues(*firstArrPtr, firstArrLengthPtr, value);
  85.         RemoveValues(*secondArrPtr, secondArrLengthPtr, value);
  86.       }
  87.       i++;
  88.     }
  89.  
  90.     temp = realloc(*firstArrPtr, (*firstArrLengthPtr) * sizeof(*temp));
  91.     if (temp == NULL)
  92.     {
  93.       free(newArr);
  94.       errorCode = 1;
  95.       break;
  96.     }
  97.     else
  98.     {
  99.       (*firstArrPtr) = temp;
  100.     }
  101.  
  102.     temp = realloc(*secondArrPtr, (*secondArrLengthPtr) * sizeof(*temp));
  103.     if (temp == NULL)
  104.     {
  105.       free(newArr);
  106.       errorCode = 1;
  107.       break;
  108.     }
  109.     else
  110.     {
  111.       (*secondArrPtr) = temp;
  112.     }
  113.  
  114.     temp = realloc(newArr, N * sizeof(*temp));
  115.     if (temp == NULL)
  116.     {
  117.       free(newArr);
  118.       errorCode = 1;
  119.       break;
  120.     }
  121.     else
  122.     {
  123.       newArr = temp;
  124.     }
  125.  
  126.     (*thirdArrPtr) = newArr;
  127.     (*thirdArrLengthPtr) = N;
  128.   }
  129.   while (0);
  130.  
  131.   return errorCode;
  132. }
  133.  
  134. int CreateAndGenerateArray(int** const arrPtr, const size_t N)
  135. {
  136.   int* temp = NULL;
  137.  
  138.   size_t i = 0;
  139.  
  140.   temp = malloc(N * sizeof(*temp));
  141.   if (temp == NULL)
  142.   {
  143.     return 0;
  144.   }
  145.   else
  146.   {
  147.     for (i = 0; i < N; i++)
  148.     {
  149.       temp[i] = rand() % 10;
  150.     }
  151.  
  152.     (*arrPtr) = temp;
  153.   }
  154.  
  155.   return 1;
  156. }
  157.  
  158.  
  159. void PrintArray(const int* const arr, const size_t N)
  160. {
  161.   size_t i = 0;
  162.  
  163.   for (i = 0; i < N; i++)
  164.   {
  165.     if (i < N - 1)
  166.     {
  167.       printf("%d ", arr[i]);
  168.     }
  169.     else
  170.     {
  171.       printf("%d\n", arr[i]);
  172.     }
  173.   }
  174. }
  175.  
  176. int main(void)
  177. {
  178.   int* P = NULL;
  179.   int* Q = NULL;
  180.   int* Z = NULL;
  181.  
  182.   size_t lP = 8;
  183.   size_t lQ = 6;
  184.   size_t lZ = 0;
  185.  
  186.   srand(time(NULL));
  187.  
  188.   CreateAndGenerateArray(&P, lP);
  189.   CreateAndGenerateArray(&Q, lQ);
  190.  
  191.   printf("Before:\n");
  192.   printf("Array P:\n");
  193.   PrintArray(P, lP);
  194.  
  195.   printf("Array Q:\n");
  196.   PrintArray(Q, lQ);
  197.  
  198.   ConstructThird(&P, &lP, &Q, &lQ, &Z, &lZ);
  199.  
  200.   printf("After:\n");
  201.   printf("Array P:\n");
  202.   PrintArray(P, lP);
  203.  
  204.   printf("Array Q:\n");
  205.   PrintArray(Q, lQ);
  206.  
  207.   printf("Array Z:\n");
  208.   PrintArray(Z, lZ);
  209.  
  210.   return 0;
  211. }

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

  1. В данной программе реализуется алгоритм объединения двух массивов в один, при условии что значения из первого массива присутствуют во втором.
  2. Для решения задачи используется четыре функции:
    • RemoveValues - удаляет из массива все вхождения заданного значения.
    • IsValuePresentInArray - проверяет наличие значения в массиве.
    • ConstructThird - создает третий массив, объединяя значения из первых двух, которые присутствуют в обоих.
    • CreateAndGenerateArray - создает массив заданного размера и заполняет его случайными значениями.
  3. В функции ConstructThird используется вложенный цикл do-while, который гарантирует корректную обработку массивов любых размеров.
  4. Перед выходом из программы, все выделенные динамически массивы освобождаются с помощью функции free.

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


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

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

7   голосов , оценка 3.286 из 5

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

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

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