Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- In: универсално множество
- I - функция, която по дадено под-множество и маска 1010101010...
- Out: (mask1 union (func(subset1) subtraction mask2))
- */
- #include <iostream>
- using namespace std;
- // Structs
- struct Set {
- char* set;
- int sz;
- Set() : sz(0), set(NULL) {
- }
- void clear() {
- delete[] set;
- char* set = NULL;
- sz = 0;
- }
- void print() {
- if(set == NULL || sz == 0) {
- cout << "ERROR";
- return;
- } else {
- cout << "Set: ";
- for(int i = 0; i < sz; i++) {
- cout << set[i];
- }
- cout << endl;
- }
- }
- };
- struct Mask {
- bool* set;
- int sz;
- Mask() : sz(0), set(NULL){
- }
- void clear() {
- delete[] set;
- bool* set = NULL;
- sz = 0;
- }
- void print() {
- if(set == NULL || sz == 0) {
- cout << "ERROR";
- return;
- } else {
- cout << "Mask: ";
- for(int i = 0; i < sz; i++) {
- cout << set[i] << " ";
- }
- cout << endl;
- }
- }
- };
- // Interface functions
- bool isSet(Set& set);
- bool isSubSet(Set& uset, Set& subset);
- void enterSet(Set& in_set);
- void enterMask(Mask& mask, Set& uset);
- void createSet(Set& uset);
- void createMaskFromSubSet(Set& in_set, Set& in_subset, Mask& out_submask);
- void createFMask(Mask& mask);
- // The real MVPs
- void unionOfMasks(Mask& mask1, Mask& mask2, Mask& resmask);
- void sectionOfMasks(Mask& mask1, Mask& mask2, Mask& resmask);
- int main () {
- Set uset, subset;
- Mask submask, mask1, mask2,
- fmask, rfmask, temp, result;
- cout << "Universal set: ";
- enterSet(uset);
- bool isSetOK = isSet(uset);
- cout << (isSetOK ? "SET" : "NOT SET") << endl;
- if (!isSetOK) {
- createSet(uset);
- }
- uset.print();
- char yes_no;
- do {
- mask1.clear();
- mask2.clear();
- subset.clear();
- temp.clear();
- result.clear();
- cout << "Enter mask 1: ";
- enterMask(mask1, uset);
- // processMask(mask1, mask_sz1);
- cout << "Enter mask 2: ";
- enterMask(mask2, uset);
- cout << "Enter sub-set: ";
- enterSet(subset);
- bool isSubSetOK = isSubSet(uset, subset);
- if(isSubSetOK) {
- createMaskFromSubSet(uset, subset, submask);
- }
- fmask = mask1;
- createFMask(fmask);
- fmask.print();
- // секция на м2 и с1
- sectionOfMasks(submask, mask2, temp);
- temp.print();
- result = temp;
- temp.clear();
- // Маска на първата функция с маската на събсета
- unionOfMasks(fmask, result, temp);
- temp.print();
- result = temp;
- temp.clear();
- result.print();
- cout << "Do you want to continue again [y/n] ?";
- cin >> yes_no;
- } while (yes_no == 'y');
- return 0;
- }
- bool isSet(Set& set) {
- if (set.set == NULL || set.sz <= 0) {
- return false;
- }
- for (int i = 0; i < set.sz; i++) {
- for (int j = i+1; j < set.sz; j++) {
- if (set.set[i] == set.set[j]) {
- return false;
- }
- }
- }
- return true;
- }
- void createSet(Set& uset) {
- if( uset.set == NULL || uset.sz <= 0) {
- //! Debug
- cout << "createSet() error, uset.set == null or uset.sz <= 0 \n";
- return;
- }
- int u = 0;
- int br = 0;
- for (int i = 0; i < uset.sz; i++) {
- br = 0;
- for (int j = i+1; j < uset.sz; j++) {
- if (uset.set[i] == uset.set[j]) {
- br++;
- }
- }
- if (br == 0) {
- u++;
- }
- }
- char* u_arr = new char[u];
- int pos = 0;
- for (int i = 0; i < uset.sz; i++) {
- br = 0;
- for (int j = 0; j < pos; j++) {
- if (uset.set[i] == u_arr[j]) {
- br++;
- break;
- }
- }
- if (br == 0) {
- u_arr[pos] = uset.set[i];
- pos++;
- }
- }
- delete[] uset.set;
- uset.set = u_arr;
- uset.sz = u;
- }
- void enterSet(Set& in_set) {
- cout << "Number of elements: ";
- cin >> in_set.sz;
- in_set.set = new char[in_set.sz];
- for (int i = 0; i < in_set.sz; i++) {
- cin >> in_set.set[i];
- }
- }
- void enterMask(Mask& mask, Set& uset) {
- cout << "Number of elements: ";
- cin >> mask.sz;
- mask.set = new bool[uset.sz];
- cout << "Enter 0 or 1 with spaces:" << endl;
- for (int i = 0; i < mask.sz; i++) {
- cin >> mask.set[i];
- }
- for (int i = mask.sz; i < uset.sz; i++) {
- mask.set[i] = 0;
- }
- mask.sz = uset.sz;
- }
- bool isSubSet(Set& uset, Set& subset) {
- if(uset.set == NULL || uset.sz <= 0 ||
- subset.set == NULL || subset.sz <= 0 ) {
- return false;
- }
- int br = 0;
- for (int s = 0; s < subset.sz; s++) {
- br = 0;
- for (int u = 0; u < uset.sz; u++) {
- if (subset.set[s] == uset.set[u]) {
- br++;
- }
- }
- if (br == 0) {
- return false;
- }
- }
- return true;
- }
- void createMaskFromSubSet(Set& in_set, Set& in_subset, Mask& out_submask) {
- if(in_set.set == NULL || in_set.sz <= 0) {
- return;
- }
- out_submask.sz = in_set.sz;
- out_submask.set = new bool[in_set.sz];
- for (int u = 0; u < in_set.sz; u++) {
- out_submask.set[u] = false;
- for (int s = 0; s < in_set.sz; s++) {
- if (in_set.set[u] == in_subset.set[s]) {
- out_submask.set[u] = true;
- break;
- }
- }
- }
- }
- void unionOfMasks(Mask& mask1, Mask& mask2, Mask& resmask)
- {
- if(mask1.set == NULL || mask1.sz == 0) {cout << "Mask1 error in union"; return;}
- if(mask2.set == NULL || mask2.sz == 0) {cout << "Mask2 error in union"; return;}
- resmask = mask1;
- for(int i = 0; i < mask1.sz; i++) {
- cout << mask1.set[i] << " ";
- }
- cout << "+ ";
- for(int i = 0; i < mask1.sz; i++) {
- cout << mask2.set[i] << " ";
- }
- cout << "Union\t";
- for(int i = 0; i < mask1.sz; i++) {
- resmask.set[i] = (mask1.set[i] || mask2.set[i]);
- }
- }
- void sectionOfMasks(Mask& mask1, Mask& mask2, Mask& resmask)
- {
- if(mask1.set == NULL || mask1.sz == 0) {cout << "Mask1 error in section"; return;}
- if(mask2.set == NULL || mask2.sz == 0) {cout << "Mask2 error in section"; return;}
- resmask = mask1;
- for(int i = 0; i < mask1.sz; i++) {
- cout << mask1.set[i] << " ";
- }
- cout << "- ";
- for(int i = 0; i < mask1.sz; i++) {
- cout << mask2.set[i] << " ";
- }
- cout << "Section\t";
- for(int i = 0; i < mask1.sz; i++) {
- resmask.set[i] = mask1.set[i] && mask2.set[i];
- }
- }
- void createFMask(Mask& mask) {
- int uniq = 0;
- for(int i = 0; i < mask.sz; i++) {
- if(mask.set[i] == 0) {
- uniq++;
- if(uniq == 2) {
- uniq = 0;
- mask.set[i] = 1;
- }
- }
- cout << mask.set[i] << " ";
- }
- //! Debug
- cout << endl;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement