Объединение двух множеств - C (СИ)
Формулировка задачи:
Помогите! Нужно сделать объединение двух множеств. Вот код, но я не пойму откуда ноль
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#define KU 11
int search(int B[],int A)
{
int i;
for(i=1;i<KU;i++)
if (B[i]==A) return 1;
return 0;
}
void vvod(int *KA, int A[KU])
{
int j;
printf("Введите кол-во элементов множества: \n");
scanf("%i",KA);
printf("Введите элементы множества: \n");
for (j=1;j<*KA;j++){
scanf("%i",&A[j]);
}
}
void obedenenie(int A[KU],int B[KU],int C[KU],int KA,int KB,int *p)
{
int j,i;
*p=KB;
for(i=1;i<*p;i++){
C[i]=B[i];
}
for(j=1;j<KA;j++){
if(search(C,A[j])==0)
{
(*p)++;
C[*p]=A[j];
}
}
}
int main()
{
setlocale (LC_CTYPE,"");
int A[KU],B[KU],i,j,KA,KB,p,C[KU],F;
vvod(&KA,A);
vvod(&KB,B);
obedenenie(A,B,C,KA,KB,&p);
for(i=1;i<=p;i++)
printf("%i ",C[i]);
return 0;
}Решение задачи: «Объединение двух множеств»
textual
Листинг программы
#include <stdio.h>
#define KU 11
int* union_set(int* f1, int* l1, int* f2, int* l2, int* ds){
int* p = ds;
while((f1 != l1) && (f2 != l2)){
if(*f1 < *f2)
*p++ = *f1++;
else {
if(*f1 == *f2)
++f1;
*p++ = *f2++;
}
}
while(f1 != l1)
*p++ = *f1++;
while(f2 != l2)
*p++ = *f2++;
return p;
}
int main(void){
int* p, *e;
int sc[KU * 2];
int sa[] = { 1, 3, 4, 5, 8 };
int sb[] = { 0, 1, 2, 5, 6, 7, 8, 9 };
e = union_set(sa, sa + sizeof(sa)/sizeof(sa[0]),
sb, sb + sizeof(sb)/sizeof(sb[0]), sc);
for(p = &sc[0]; p != e; ++p)
printf("%d ", *p);
return 0;
}
Объяснение кода листинга программы
- Включаем заголовочный файл
для возможности работы с функциями ввода-вывода - Определяем константу KU равную 11, которая будет использоваться в дальнейшем в коде
- Функция union_set принимает пять аргументов: указатели на первые и последние элементы двух множеств и указатель на первое пустое место в результирующем множестве
- В функции union_set происходит объединение двух множеств в третье. Результатом работы функции является указатель на первый элемент после объединенного множества
- В цикле while происходит сравнение и перемещение элементов из первого и второго множеств в третье до тех пор, пока не будут использованы все элементы одного из множеств
- Если текущие элементы первого и второго множеств равны, то они пропускаются и происходит переход к следующим элементам
- После завершения цикла while, в результирующее множество добавляются оставшиеся элементы из первого и второго множеств
- В функции main создается массив из KU * 2 элементов для хранения объединенного множества
- Задаются два множества: sa и sb. Множество sa содержит элементы { 1, 3, 4, 5, 8 }, а множество sb содержит элементы { 0, 1, 2, 5, 6, 7, 8, 9 }
- Вызывается функция union_set для объединения множеств sa и sb в результирующее множество sc
- Результат объединения выводится на экран с помощью цикла for и функции printf
- Возвращаемое значение функции main равно 0, что означает успешное выполнение программы