Hi,
Could someone please let me know how to terminating char pointer array properly?
The menu 0 can successfully generate a set with no garbage value
But other function for ex: Union , Equality
Got a weird character at the back of the array.
ex = S = { A , C, D , H ,L , @}
(Will only find it if we generate a few times)
But i really curious is there any way to not let this happen?
Thank you
SOrry for the bad English
Appreciate your help much!
#include <iostream>
#include <ctime>
#include <cstdlib>
#include <iomanip>
using namespace std;
const int MAX = 10;
typedef char* ptr;
void constructSet (ptr,int);
void printSet (ptr,ptr);
bool checkSet (char ,ptr ,ptr);
void displaySet (ptr,int);
void addInElement (ptr ,ptr&);
void checkElement (ptr , ptr);
int checkCardinality (ptr , ptr);
void Union (ptr first , ptr last);
void Intersection (ptr first,ptr last);
void complement (ptr first,ptr last);
void complementA (ptr,ptr,ptr,ptr,ptr,ptr);
void complementB (ptr,ptr,ptr,ptr,ptr,ptr);
void subset (ptr first,ptr last);
void equality (ptr,ptr);
int checkEqualityS1 (ptr ,ptr ,ptr ,ptr );
int checkEqualityS2 (ptr ,ptr ,ptr ,ptr );
int generateSize ();
int main ()
{
char a[MAX];
srand( (unsigned int) time(NULL));
int option;
int size;
do
{
cout << "Here are some of the set operations" << endl
<< endl;
cout << "0 . An example of set" << endl;
cout << "1 . Union " << endl;
cout << "2 . Intersection " << endl;
cout << "3 . Complement " << endl;
cout << "4 . Subset of " << endl;
cout << "5 . Equality " << endl;
cout << "9 . Quit " << endl
<< endl;
cout << "Your choice: ";
cin >> option;
cout << endl;
size = generateSize();
ptr first = &a[0];
ptr last = &a[size-1];
switch (option)
{
case 0 : displaySet (a ,size);
cout << setw(80) << setfill ('-') << " "<<endl;
break;
case 1 : Union (first,last);
cout << setw(80) << setfill ('-') << " "<<endl;
break;
case 2 : Intersection (first,last);
cout << setw(80) << setfill ('-') << " "<<endl;
break;
case 3 : complement (first,last);
cout << setw(80) << setfill ('-') << " "<<endl;
break;
case 4 : subset (first,last);
cout << setw(80) << setfill ('-') << " "<<endl;
break;
case 5 : equality (first,last);
cout << setw(80) << setfill ('-') << " "<<endl;
break;
}
}while (option!=9);
return 0;
}
int generateSize ()
{
int size;
size = rand()%MAX+0;
return size;
}
void displaySet (ptr s,int size)
{
int option;
ptr first = &s[0];
ptr last = &s[size-1];
cout << setw(80) << setfill ('-') << " "<<endl;
cout << "Here is an example on set of uppercase letters" << endl << endl;
constructSet (s,size);
cout << " Set S = " ;
printSet (first,last);
cout << "Note that elements in S are distinct and are not in order " << endl << endl;
int cardinal;
do
{
cout << "Wish to try the following operations?" << endl;
cout << " 1. Add an element to the set " << endl;
cout << " 2. Check an element in set " << endl;
cout << " 3. Check the cardinality" << endl;
cout << " 9. Quit" << endl
<< endl;
cout << "Your choice : ";
cin >> option;
cout << endl;
switch (option)
{
case 1 : addInElement (first,last);
cout << setw(80) << setfill ('-') << " "<<endl;
break;
case 2 : checkElement (first,last);
cout << setw(80) << setfill ('-') << " "<<endl;
break;
case 3 :cardinal = checkCardinality (first,last);
cout << "S has " << cardinal << " elements " << endl;
cout << setw(80) << setfill ('-') << " "<<endl;
break;
}
}while (option!=9);
}
void constructSet (ptr s,int size)
{
ptr ch;
ptr first = s;
int i;
for (i = 0;i<=size;i++)
{
ch = new char;
*ch =static_cast <char> ((rand()%26) + 65);
if (checkSet (*ch , first , s)== false)
{
*s = *ch;
++s;
}
}
*s='\0';
}
void printSet (ptr first,ptr last)
{
cout << "{" ;
while (first<last)
{
cout << *first << " , " ;
++first;
}
cout << *last<< " } ";
cout << endl;
}
bool checkSet (char character ,ptr first ,ptr last)
{
while (first<=last)
{
if (character == *first)
return true;
else
first++;
}
return false;
}
void addInElement (ptr first,ptr& last)
{
char newElement;
cout << "Current ";
printSet (first,last);
cout << "Enter an element : " ;
cin >> newElement;
if (checkSet (newElement ,first,last)==false)
{
last++;
*last = newElement;
}
cout << " Set S = " ;
printSet (first,last);
}
void checkElement (ptr first,ptr last)
{
char character;
printSet (first, last);
cout <<"Which element?: ";
cin >> character;
cout << endl;
if (checkSet ( character, first , last)==false)
{
cout << character << " not in" << " S " << endl;
}
else
cout << character << " is in" << " S " << endl;
}
int checkCardinality (ptr first, ptr last)
{
printSet (first,last);
int sum = 0;
while (first <=last)
{
first++;
sum++;
}
return sum;
}
//GARBAGE VALUE WHEN IT SUPPOSE TO BE EMPTY SET
void Union (ptr first,ptr last)
{
ptr first2;
ptr last2;
int size1 = generateSize();
int size2 = generateSize();
char a1 [MAX];
char a2 [MAX];
cout << "Given the following two sets " << endl;
cout << "Set S1 = ";
constructSet (a1 , size1);
first = &a1 [0];
last = &a1 [size1 - 1];
printSet (first,last);
cout << "Set S2 = ";
constructSet (a2 , size2);
first2 = &a2 [0];
last2 = &a2 [size2 - 1];
printSet (first2,last2);
while (first <= last)
{
if (checkSet (*first , first2 , last2)==false)
{
last2++;
*last2 = *first;
first++;
}
else
first++;
}
first++;
cout << " The union is : " ;
printSet (first2,last2);
}
void Intersection (ptr first,ptr last)
{
ptr first2;
ptr last2;
ptr first3;
ptr last3;
int size1 = generateSize();
int size2 = generateSize();
char a1 [MAX];
char a2 [MAX];
char b [MAX] = { };
cout << "Given the following two sets " << endl;
cout << "Set S1 = ";
constructSet (a1 , size1);
first = &a1 [0];
last = &a1 [size1 - 1];
printSet (first,last);
cout << "Set S2 = ";
constructSet (a2 , size2);
first2 = &a2 [0];
last2 = &a2 [size2 - 1];
printSet (first2,last2);
first3 = &b[0];
last3 = &b[0];
while (first <= last)
{
if (checkSet (*first , first2 , last2)==true)
{
*last3 = *first;
last3++;
first++;
}
else
{
first++;
}
}
last3--;
cout << " The intersection is : " ;
printSet (first3,last3);
}
void complement (ptr first,ptr last)
{
ptr first2;
ptr last2;
ptr first3;
ptr last3;
ptr first4;
ptr last4;
int size1 = generateSize();
int size2 = generateSize();
char a1 [MAX];
char a2 [MAX];
char b [MAX] = { };
char c [MAX] = { };
cout << "Given the following two sets " << endl;
cout << "Set A = ";
constructSet (a1 , size1);
first = &a1 [0];
last = &a1 [size1 - 1];
printSet (first,last);
cout << "Set B = ";
constructSet (a2 , size2);
first2 = &a2 [0];
last2 = &a2 [size2 - 1];
printSet (first2,last2);
first3 = &b[0];
last3 =first3;
first4 = &c[0];
last4 = first4;
complementA (first,last,first2,last2,first3,last3);
complementB (first,last,first2,last2,first4,last4);
}
void complementA (ptr first,ptr last,ptr first2,ptr last2,ptr first3,ptr last3)
{
// Complements A-B
while (first <= last)
{
if (checkSet (*first , first2 , last2)==true)
{
first++;
}
else
{
*last3 = *first;
last3++;
first++;
}
}
last3--;
cout << endl;
cout << "Complements A-B : " ;
printSet (first3,last3);
}
void complementB (ptr first,ptr last,ptr first2,ptr last2,ptr first4,ptr last4)
{
//Complements B-A
while (first2 <= last2)
{
if (checkSet (*first2 , first , last)==true)
{
first2++;
}
else
{
*last4 = *first2;
last4++;
first2++;
}
}
last4--;
cout << endl;
cout << "Complements B-A : " ;
printSet (first4,last4);
}
void subset (ptr first,ptr last)
{
ptr first2;
ptr last2;
int size1 = generateSize();
int size2 = generateSize();
char a1 [MAX];
char a2 [MAX];
char b [MAX] = { };
cout << "Given the following two sets " << endl;
cout << "Set A = ";
constructSet (a1 , size1);
first = &a1 [0];
last = &a1 [size1-1];
printSet (first,last);
cout << "Set B = ";
constructSet (a2 , size2);
first2 = &a2 [0];
last2 = &a2 [size2-1];
printSet (first2,last2);
int sum = 0;
while (first <= last)
{
if (checkSet (*first , first2 , last2)==true)
{
sum++;
first++;
}
else
first++;
}
if (sum == size1)
cout << " A is subset of B" << endl;
else
cout << "A is not subset of B" << endl;
}
void equality (ptr first,ptr last)
{
ptr first2;
ptr last2;
int size1 = generateSize();
int size2 = generateSize();
char a1 [MAX] ;
char a2 [MAX] ;
char b [MAX] = { };
cout << "Given the following two sets " << endl;
cout << "Set A = ";
constructSet (a1 , size1);
first = &a1 [0];
last = &a1 [size1 - 1];
printSet (first,last);
cout << "Set B = ";
constructSet (a2 , size2);
first2 = &a2 [0];
last2 = &a2 [size2 - 1];
printSet (first2,last2);
int sizeS1;
int sizeS2;
if (size1 != size2)
cout << "It is NOT EQUAL" << endl;
else
{
sizeS1 = checkEqualityS1 (first,last,first2,last2);
sizeS2 = checkEqualityS2 (first,last,first2,last2);
if ( (sizeS1 && sizeS2) == true)
cout << "It is EQUAL" << endl;
else
cout << "It is NOT EQUAL" << endl;
}
}
int checkEqualityS1 (ptr first,ptr last,ptr first2,ptr last2)
{
int sum = 0;
while (first <= last)
{
if (checkSet (*first , first2 , last2)==true)
{
sum++;
first++;
}
else
return false;
}
return sum;
}
int checkEqualityS2 (ptr first,ptr last,ptr first2,ptr last2)
{
int sum = 0;
while (first2 <= last2)
{
if (checkSet (*first2 , first , last)==true)
{
sum++;
first2++;
}
else
return false;
}
return sum;
}