Discussion in 'C++' started by boat_58, Mar 27, 2011.

1. ### boat_58New Member

Joined:
Mar 27, 2011
Messages:
7
0
Trophy Points:
0
I am to create a program with a Class Set having the the following member functions:
• Set()
• void RemoveElement(int v)
• void Print()

then write the following friend functions of class Set:
• void Union(Set A, Set B), which calculates and prints the union of A and B
• void Intersect(Set A, Set B), which calculates and prints the intersection of A and B
• void Minus(Set A, Set B), which calculates and prints the minus of A and B

Write the following function to overload the following operations:
• = (Creates a new set from old set. For instance, A=B creates A from B)
• + (Creates union of two sets. For instance, C=A+B creates union of A and B into C)
• * (Creates intersection of two sets. For instance, C=A*B creates intersection of A and B into C)
• - (Creates minus of two sets. For instance, C=A-B creates minus of A and B into C)

Write a program which will take the elements of first set until user enters -1. Similarly, the program will take the elements of second set until user enters -1. Then show the following outputs in the console:
a. Elements of first set using Print() function of class
b. Elements of second set using Print() function of class
c. Union of the sets using friend function
e. Intersection of the sets using friend function
g. Minus of the sets using friend function

Sample input:
1 3 5 6 8 10 12 -1
2 4 5 6 7 11 13 -1

Sample output:
First set: 1 3 5 6 8 10 12
Second set: 2 4 5 6 7 11 13
Union (friend): 1 2 3 4 5 6 7 8 10 11 12 13
Union (operator overloading): 1 2 3 4 5 6 7 8 10 11 12 13
Intersection (friend): 5 6
Minus (friend): 1 3 8 10 12

I am trying to create the first friend function and i am stuck. I am a new to programming language and i need help. Any help that can be provided is greatly appreciated. This is what i have so far, its not much, but as i said, i am stuck.

PHP:
``` #include <iostream> using namespace std; int inputArraySetA[20]; int inputArraySetB[20]; //int inputArrayUnion[20]; int sizeSetA = 0; int sizeSetB = 0; //int sizeUnion = 0; int temp = 0; class Set {     protected:         int x;         int y;     public:         Set();         Set(int px,int py);         void AddElement(int v);         void RemoveElement(int v);         void Print();         friend void Union(int inputArraySetA[20], int inputArraySetB[20]);         friend void Intersect(int inputArraySetA[20], int inputArraySetB[20]);         friend void Minus(int inputArraySetA[20], int inputArraySetB[20]);                   }; //--------------------------------------------------------------------------------------------------------------------     void Union(int inputArraySetA[20], int inputArraySetB[20]) { } //-------------------------------------------------------------------------------------------------------------------- int main() {                             cout << "Enter First set of numbers, (-1) to quit: "<<endl; // Takes the input of the first set of numbers         for (int i = 0; i < 20; i++)          {             cin >> temp;             if (temp == -1)                  {                     break;                 }              else                  {                     inputArraySetA[i] = temp;                     sizeSetA++;                 }         }                       cout << "Enter Second set of numbers, (-1) to quit: "<<endl; // Takes the input of the second set of numbers         for (int i = 0; i < 20; i++)          {             cin >> temp;             if (temp == -1)                  {                     break;                 }              else                  {                     inputArraySetB[i] = temp;                     sizeSetB++;                 }         } //--------------------------------------------------------------------------------------------------------------------                cout << "Set A is ";         for (int i = 0; i < sizeSetA; i++)              {                 cout << inputArraySetA[i] << " ";             }         cout << "\nSet B is ";         for (int i = 0; i < sizeSetB; i++)              {                 cout << inputArraySetB[i] << " ";             }         return 0; } ```

2. ### xpi0t0sMentor

Joined:
Aug 6, 2004
Messages:
3,009
203
Trophy Points:
63
Occupation:
Senior Support Engineer
Location:
England
I'd have thought you want the Set members to be an array of some kind, e.g. int[20], rather than two distinct ints.
If using int[20] (as opposed to, say, vector) then you'll also need a variable indicating the current size. Or you could store the entered -1 to indicate the end of the data.
Code:
```class Set
{
private: // use this instead of protected, unless you know why you should be using protected
int array[20];
int size;

public:
Set() { size=0; }
void AddElement(int v) { array[size++]=v; } // TODO: add check for overflow
void RemoveElement(int v) {} // add this later
void Print() {} // add this later

//lets write these according to the spec given
friend void Union(Set A, Set B);
friend void Intersect(Set A, Set B);
friend void Minus(Set A, Set B);
};
```
In main, define Set setA, setB; then when inputting each set of numbers, after reading the number and checking for -1, just bung the number directly into setA or setB instead of into this inputArraySetA[20]; (which you weren't asked to do).

Your cout << "Set A is "; line should be followed by setA.Print(), not the code to print the array directly. But this does mean you can add the code for Print() easily now, as you've already written it.

To calculate the union, if we're assuming the data is inserted in ascending order that simplifies things. Create a pair if integers (p1 and p2) which will be used as indexes into setA.array and setB.array. Set them both to zero. In a loop, you'll need a three-way check:
if setA.array[p1]>setB.array[p2] OR p1==setA.size, display setB.array[p2] and increment p2
else if setA.array[p1]<setB.array[p2] OR p2==setB.size, display setA.array[p1] and increment p1
else (if neither of the above is true then the members must be equal)
display one or the other and increment BOTH p1 and p2, because we don't want to display duplicates.
Terminate the loop when p1==setA.size and p2==setB.size.

A similar approach should work for both Intersect and Minus, and then the operator overloaded versions are pretty much just a case of semantics.

3. ### boat_58New Member

Joined:
Mar 27, 2011
Messages:
7
0
Trophy Points:
0
thank you for your reply, i used protected because we had just begun talking about it and i was possibly thinking that using an inheritance would help make it easier.

the data is going to be random, it could be ascending or descending or just some random inputs, so will that still work? also, looking at the union explanation you gave me, checking to see which is bigger between setA and setB, am i to assume that p1 and p2 are going to contain all the numbers from each set? if s will it just check each number individually or all at once..

Thanks

Jeff

4. ### xpi0t0sMentor

Joined:
Aug 6, 2004
Messages:
3,009
203
Trophy Points:
63
Occupation:
Senior Support Engineer
Location:
England
Inheritance doesn't make anything easier. Use this only when you have to. It certainly isn't needed for this task and you shouldn't use it unless the teacher has said you should, for example if his next few exercises require inheritance.

The code I gave will only work if the sets are sorted in increasing value. If this isn't the case then one way to avoid checking each element against all elements in the other set is to define an array of flags where the size is equal to the maximum value in either set. Then loop through each set and set the corresponding flag to 1, and for the union just loop through the flags and display which ones are set.

So if set1 contains 3,5,7,9 and set2 contains 1,2,3,4,5, you need 9 flags (10 if you count from zero) and parsing set1 would set flags 3,5,7,9, and parsing set2 would set flags 1-5. This would result in flags 1,2,3,4,5,7,9 being set, which is the union.

To calculate the intersection, parse set1 as above, but when parsing set2, set the flag to 2 IF it's currently set to 1. (So the flags need to be counters really, not boolean.) The resulting flags would be 1=1, 2=1, 3=2, 4=1, 5=2, 6=0, 7=1, 8=0, 9=1 and the intersection is those flags with the value 2, i.e. 3,5.

The difference can then be done by parsing set1 as above (3,5,7,9=1), then when parsing set2 set the flag to zero if it's already a 1. (1,2,4 no change; 3,5=0). set1-set2 is then the flags that remain at 1, i.e. 7,9.

This will work if the sets don't contain duplicates. If they do then you'll need to think about the definitions of union, intersection and difference. For example: would the union of {1,2,3,3} and {3,3,4,5} be {1,2,3,4,5} or {1,2,3,3,4,5}?

shabbir likes this.
5. ### boat_58New Member

Joined:
Mar 27, 2011
Messages:
7
0
Trophy Points:
0
Hey,

as you see i used inputArraySetA[20] to take in my inputs, i tried using int a, but each time i used that i couldn't save a set of numbers in it only one number, is there a way in which i could just declare

int A
int B

and have A and B hold the set of numbers for A and B instead of the arrays?

6. ### xpi0t0sMentor

Joined:
Aug 6, 2004
Messages:
3,009
203
Trophy Points:
63
Occupation:
Senior Support Engineer
Location:
England
As I understand it the point of the exercise is that the Set class contains the sets of numbers. So yes of course you can have a separate array of ints if you want, but then you would have to copy all those numbers into the Set variable:

int num[20]
Set A
for ()
end loop

for ()
copy each number into A
end loop

and it seems to me it would just be a whole load easier to take the numbers directly into A:

Set A
for()
end loop.

No, you cannot store multiple integers into a single integer variable. To store multiple ints you need an array of ints. My point is that apart from Set you don't need to store multiple ints.

7. ### boat_58New Member

Joined:
Mar 27, 2011
Messages:
7
0
Trophy Points:
0
hey real quick, can you explain what you mean by this for me. I defined
Set A,B; // in main.

how do i bring the number directly into Set A, and Set B after defining it without having to store it in that array?

Thanks

Jeff

8. ### boat_58New Member

Joined:
Mar 27, 2011
Messages:
7
0
Trophy Points:
0
PHP:
``` int main(){            set A,B;        cout << "Enter First set of numbers, (-1) to quit: "<<endl; // Takes the input of the first set of numbers        for (int i = 0; i < 20; i++)         {            cin >> temp;            if (temp == -1)                 {                    break;                }             else                 {                    SetA[i] = temp;                    sizeSetA++;                }        }               cout << "Set A is ";setA.Print(); ```
I just changed the name of that array thinking that would do it but when the setA prints its empty so i did it wrong. how would i directly store it in setA

Joined:
Aug 6, 2004
Messages:
3,009