Сформировать третий массив на основе данных исходных массивов, который также упорядочен - C (СИ)
Формулировка задачи:
В общем, задание следующее:
1. Даны два целочисленных массива
2. Реализуйте алгоритмы сортировок данных массивов.
3. Сформировать третий массив на основе данных, который также упорядочен и представляет операцию с элементами исходных массивов:
• объединение (содержит числа, принадлежащие хотя бы одному из множеств);
• перечисление (числа, принадлежащие обоим множествам);
• разность (числа, принадлежащие первому множеству, но не второму);
• симметричную разность (объединение разностей множеств).
И то, что у меня получилось:
Никак не могу сделать две последние операции - простую и симметричную разность.
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
void BubbleSort (int* a, int n) // Определение функции сортировки пузырьком
{
int tmp, i, j;
for (i = 0; i < n - 1; i++)
for (j = 0; j < n - 1; j++)
if (a[j + 1] < a[j])
{
tmp = a[j +1];
a[j + 1] = a[j];
a[j] = tmp;
}
}
void PryamoyVibor (int* b, int n) // Определение функции сортировки прямым выбором
{
int i, j, k;
for (i = 0; i < n; i++)
{
k = i;
for (j = i + 1; j < n; j++)
if (b[j] < b[k]) k = j;
j = b[k];
b[k] =b[i];
b[i] = j;
}
}
int main ()
{
const int n = 20;
int a[n], b[n], c[40], d[40], i, j, k, q, w, r, count = 1;
clrscr();
printf (" Pervonachalniy massiv a[%d]: \n", n); // Ввод массива а рандомными числами от 0 до 700
for (i=0;i<n;i++)
{
a[i] = 0+rand()%700;
printf ("%d ", a[i]);
}
printf ("\n\n Pervonachalniy massiv b[%d]: \n", n); // Ввод массива b рандомными числами от 0 до 700
for (i=0;i<n;i++)
{
b[i] = 0+rand()%700;
printf ("%d ", b[i]);
}
BubbleSort (a, n); // Вызов функции сортировки пузырьком для массива а
printf ("\n\n Massiv a[%d], ostortirovanniy metodom puzirka: \n", n);
for (i = 0; i < n; i++)
printf ("%d ", a[i]);
PryamoyVibor (b, n); // Вызов функции сортировки прямым выбором для массива b
printf ("\n\n Massiv b[%d], ostsortirovanniy metodom pryamogo vibora: \n", n);
for (i = 0; i < n; i++)
printf ("%d ", b[i]);
for (i = 0, q = 0; i < n; i++) // Объединение массивов a и b в один массив c
c[q++] = a[i];
for (j = 0; j < n; j++)
c[q++] = b[j];
PryamoyVibor (c, q); // Вызов функции сортировки прямым выбором для нового массива c
int temp=c[0]; // Поиск одинаковых элементов в массиве c
for (i=1; i<q; i++)
{
if(c[i]!=temp)
{
for (j=i+1; j<q; j++)
if(c[i]==c[j])
c[j]=temp;
count++;
}
}
count=0;
for (i=1; i<q; i++) // Удаление одинаковых элементов в массиве c
if (c[i]!=c[0])
c[++count]=c[i];
printf("\n\n Objedinenie massivov a[%d] i b[%d] (%d elementov):\n", n, n, count + 1); // Вывод на экран массива c, содержащего объединение двух массивов
for (i=0; i<=count; i++)
printf("%d ", c[i]);
for (i = 0, w = 0; i < n; i++)
for (j = 0; j < n; j++)
if (a[i] == b[j])
d[w++] = a[i];
printf ("\n\n Peresechenie massivov a[%d] i b[%d] (%d element): \n", n, n, w); // Вывод на экран массива d, содержащего пересечение двух массивов
for (i = 0; i < w; i++)
printf ("%d ", d[i]);
getch();
return 0;
}Решение задачи: «Сформировать третий массив на основе данных исходных массивов, который также упорядочен»
textual
Листинг программы
count = 0;
temp = 0;
for(i=0; i<n;i++)
{
for(j=0;j<n;j++)
{
if(a[i]==b[j])
{
temp = 1; //если есть одинаковые числа в массивах
}
}
if(!temp) // если их нет, то отнести число к разности
{
c[count] = a[i];
count++;
}
temp = 0;
}
printf ("\n\n Raznoct' massivov a[%d] i b[%d] (%d element): \n", n, n, count);
for(i=0;i<count;i++)
printf("%d ",c[i]);
temp = 0;
// абсолютно также, только для второго массива, счетчик count со старым значением
for(i=0; i<n;i++)
{
for(j=0;j<n;j++)
{
if(b[i]==a[j])
{
temp = 1;
}
}
if(!temp)
{
c[count] = b[i];
count++;
}
temp = 0;
}
BubbleSort(c , count);
printf ("\n\n Cumutru4naya raznoct' massivov a[%d] i b[%d] (%d element): \n", n, n, count);
for(i=0;i<count;i++)
printf("%d ",c[i]);
Объяснение кода листинга программы
Выполняемый код:
- Инициализируются переменные:
count- счетчик количества уникальных чисел;temp- временная переменная.
- В цикле
forперебираются все элементы первого массиваa. - Внутри цикла
forперебираются все элементы второго массиваb. - Если текущие элементы
a[i]иb[j]равны, то значение переменнойtempизменяется на 1, что означает, что текущее число уже было учтено как уникальное. - Если после проверки всех элементов второго массива значение переменной
tempосталось равным 0, то текущее число из первого массива добавляется в конец результирующего массиваcи увеличивается значение счетчикаcount. - После завершения первой части кода выводится количество уникальных чисел в массивах
aиbи эти числа выводятся на экран. - Затем выполняется аналогичная первой часть кода, но уже для второго массива.
- После завершения второй части кода вызывается функция
BubbleSort, которая сортирует результирующий массивcпо возрастанию. - Выводится отсортированный массив
cна экран.