Объединение двух множеств - C (СИ)

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

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

Помогите! Нужно сделать объединение двух множеств. Вот код, но я не пойму откуда ноль
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <locale.h>
  4. #define KU 11
  5. int search(int B[],int A)
  6. {
  7. int i;
  8. for(i=1;i<KU;i++)
  9. if (B[i]==A) return 1;
  10. return 0;
  11. }
  12. void vvod(int *KA, int A[KU])
  13. {
  14. int j;
  15. printf("Введите кол-во элементов множества: \n");
  16. scanf("%i",KA);
  17. printf("Введите элементы множества: \n");
  18. for (j=1;j<*KA;j++){
  19. scanf("%i",&A[j]);
  20. }
  21. }
  22. void obedenenie(int A[KU],int B[KU],int C[KU],int KA,int KB,int *p)
  23. {
  24. int j,i;
  25. *p=KB;
  26. for(i=1;i<*p;i++){
  27. C[i]=B[i];
  28. }
  29. for(j=1;j<KA;j++){
  30. if(search(C,A[j])==0)
  31. {
  32. (*p)++;
  33. C[*p]=A[j];
  34. }
  35. }
  36. }
  37. int main()
  38. {
  39. setlocale (LC_CTYPE,"");
  40. int A[KU],B[KU],i,j,KA,KB,p,C[KU],F;
  41. vvod(&KA,A);
  42. vvod(&KB,B);
  43. obedenenie(A,B,C,KA,KB,&p);
  44. for(i=1;i<=p;i++)
  45. printf("%i ",C[i]);
  46. return 0;
  47. }

Решение задачи: «Объединение двух множеств»

textual
Листинг программы
  1. #include <stdio.h>
  2. #define  KU 11
  3.  
  4. int* union_set(int* f1, int* l1, int* f2, int* l2, int* ds){
  5.     int* p = ds;
  6.     while((f1 != l1) && (f2 != l2)){
  7.         if(*f1 < *f2)
  8.             *p++ = *f1++;
  9.         else {
  10.             if(*f1 == *f2)
  11.                 ++f1;
  12.             *p++ = *f2++;
  13.         }
  14.     }
  15.  
  16.     while(f1 != l1)
  17.         *p++ = *f1++;
  18.     while(f2 != l2)
  19.         *p++ = *f2++;
  20.     return p;
  21. }
  22.  
  23. int main(void){
  24.     int* p, *e;
  25.     int  sc[KU * 2];
  26.     int  sa[] = { 1, 3, 4, 5, 8 };
  27.     int  sb[] = { 0, 1, 2, 5, 6, 7, 8, 9 };
  28.  
  29.     e = union_set(sa, sa + sizeof(sa)/sizeof(sa[0]),
  30.                   sb, sb + sizeof(sb)/sizeof(sb[0]), sc);
  31.     for(p = &sc[0]; p != e; ++p)
  32.         printf("%d ", *p);
  33.     return 0;
  34. }

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

  1. Включаем заголовочный файл для возможности работы с функциями ввода-вывода
  2. Определяем константу KU равную 11, которая будет использоваться в дальнейшем в коде
  3. Функция union_set принимает пять аргументов: указатели на первые и последние элементы двух множеств и указатель на первое пустое место в результирующем множестве
  4. В функции union_set происходит объединение двух множеств в третье. Результатом работы функции является указатель на первый элемент после объединенного множества
  5. В цикле while происходит сравнение и перемещение элементов из первого и второго множеств в третье до тех пор, пока не будут использованы все элементы одного из множеств
  6. Если текущие элементы первого и второго множеств равны, то они пропускаются и происходит переход к следующим элементам
  7. После завершения цикла while, в результирующее множество добавляются оставшиеся элементы из первого и второго множеств
  8. В функции main создается массив из KU * 2 элементов для хранения объединенного множества
  9. Задаются два множества: sa и sb. Множество sa содержит элементы { 1, 3, 4, 5, 8 }, а множество sb содержит элементы { 0, 1, 2, 5, 6, 7, 8, 9 }
  10. Вызывается функция union_set для объединения множеств sa и sb в результирующее множество sc
  11. Результат объединения выводится на экран с помощью цикла for и функции printf
  12. Возвращаемое значение функции main равно 0, что означает успешное выполнение программы

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


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

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

15   голосов , оценка 3.8 из 5

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

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

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