본문 바로가기
programming/C

[C언어] 두 배열의 합집합, 교집합, 차집합 구하는 함수

by 몽구스_ 2019. 10. 18.
728x90
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
#include <stdio.h>
#include <stdlib.h>
#define MAX_SET_SIZE 10
#define HAVE_ELEMENT 1
#define DO_NOT_HAVE_ELEMENT 0
int hasElement(int set[], int sizeint element);
int setUnion(int set1[], int size1, int set2[], int size2, int setResult[]);
int setIntersecton(int set1[], int size1, int set2[], int size2, int setResult[]);
int setComplements(int set1[], int size1, int set2[], int size2, int setResult[]);
void printSet(int set[], int size);
int addOneElement(int set[], int sizeint element);
int main(int argc, char *argv[])
{
     int i;
     int setA[MAX_SET_SIZE];
     int setB[MAX_SET_SIZE];
     int setC[MAX_SET_SIZE*2];
     int sizeA;
     int sizeB;
     int sizeC;
 
     printf("Enter the size of Set A:");
     scanf("%d",&sizeA);
 
     i = 0;
     while( i < sizeA )
     {
         printf("Enter the number for Set A (%d/%d):", i+1,sizeA );
         scanf"%d"&setA[i] );
         i = addOneElement(setA, i, setA[i]);
     }
 
     printf("Enter the size of Set B:");
     scanf("%d",&sizeB);
 
     i=0;
     while( i < sizeB )
     {
         printf("Enter the number for Set B (%d/%d):", i+1, sizeB );
         scanf"%d"&setB[i] );
         i = addOneElement(setB, i, setB[i]);
     }
 
     printf("Set A: ");
     printSet( setA, sizeA );
     printf("Set B: ");
     printSet( setB, sizeB );
     sizeC = setUnion( setA, sizeA, setB, sizeB, setC ); // Union, setC is the result set
     printf("Union of setA and setB: ");
     printSet( setC, sizeC );
     sizeC = setIntersecton( setA, sizeA, setB, sizeB, setC ); //Intersection, setC is the result set
     printf("Intersection of setA and setB: ");
     printSet( setC, sizeC );
     sizeC = setComplements( setA, sizeA, setB, sizeB, setC ); //Complements, setC is the result set
     printf("Set-theoretic difference of setA and setB (setA - setB): ");
     printSet( setC, sizeC );
 
     return 0;
}
 
int hasElement(int set[], int sizeint element) //같은 원소가 존재하는지 확인
{
     int i = 0;
     for( i = 0; i < size; i++ )
     {
        if( set[i] == element )
            return HAVE_ELEMENT;
     }
     return DO_NOT_HAVE_ELEMENT;
}
// 원소를 집합에 추가. 이미 존재하면 추가하지 않고 redundant라고 출력한다. 현재의 집합 크기를 반환한다.
int addOneElement(int set[], int sizeint element)
{
    if (hasElement(set, size, element) == HAVE_ELEMENT)
        printf("It is redundant. Please retry.\n");
    else
    {
        set[size= element;
        size++;
    }
    return size;
        
}
void printSet(int set[], int size)
{
    int i;
    for( i = 0; i < size; i++ )
    {
        if (size == 1)
            printf("{ %d }\n", set[i]);
        else if (i == 0)
            printf("{ %d, ", set[i]);
        else if (i == size - 1)
            printf("%d }\n ", set[i]);
        else
            printf("%d, ", set[i]);
    }
}
int setUnion(int set1[], int size1, int set2[], int size2, int setResult[])//합
{
    int i, size3 = size1;
    for( i = 0; i < size1; i++ )
        setResult[i] = set1[i];
    for( i = 0; i < size2; i++ )
    {
        if (hasElement(setResult, size3, set2[i]) == DO_NOT_HAVE_ELEMENT)
        {
            setResult[size3] = set2[i];
            size3++;
        }
    }
    return size3;
}
int setIntersecton(int set1[], int size1, int set2[], int size2, int setResult[])//교
{
    int i, size3 = 0;
    if (size1 > size2)
    {
        for( i = 0; i < size2; i++ )
        {
            if(hasElement(set1, size1, set2[i]))
            {
                size3++;
                setResult[size3 - 1= set2[i];
            }
        }
    }
    else
    {
        for( i = 0; i < size1; i++ )
        {
            if(hasElement(set2, size2, set1[i]))
            {
                size3++;
                setResult[size3 - 1= set1[i];
            }
        }
    }
    return size3;
}
int setComplements(int set1[], int size1, int set2[], int size2, int setResult[])//차
{
    int i, size3 = 0;
    for( i = 0; i < size1; i++ )
    {
        if(hasElement(set2, size2, set1[i]) == DO_NOT_HAVE_ELEMENT)
        {
            size3++;
            setResult[size3 - 1= set1[i];
        }
    }
 
    return size3;
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none;color:white">cs

모든 함수는 새로운 배열 setResult의 size를 리턴한다.

 

처음엔 자꾸 쓰레기 숫자가 떠서 좀 짜증났는데 무튼 겨우 풀었다.

 

합,교,차 중 하나라도 할 수 있다면 나머지는 쉬울 것이다.

댓글