Advertisement
Guest User

Untitled

a guest
Jan 28th, 2020
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.43 KB | None | 0 0
  1. /*
  2. In: универсално множество
  3. I - функция, която по дадено под-множество и маска 1010101010...
  4. Out: (mask1 union (func(subset1) subtraction mask2))
  5.  
  6. */
  7.  
  8. #include <iostream>
  9. using namespace std;
  10.  
  11. // Structs
  12.  
  13. struct Set {
  14. char* set;
  15. int sz;
  16.  
  17. Set() : sz(0), set(NULL) {
  18. }
  19.  
  20. void clear() {
  21. delete[] set;
  22. char* set = NULL;
  23. sz = 0;
  24. }
  25. void print() {
  26. if(set == NULL || sz == 0) {
  27. cout << "ERROR";
  28. return;
  29. } else {
  30. cout << "Set: ";
  31. for(int i = 0; i < sz; i++) {
  32. cout << set[i];
  33. }
  34. cout << endl;
  35. }
  36. }
  37. };
  38.  
  39. struct Mask {
  40. bool* set;
  41. int sz;
  42. Mask() : sz(0), set(NULL){
  43.  
  44. }
  45. void clear() {
  46. delete[] set;
  47. bool* set = NULL;
  48. sz = 0;
  49. }
  50.  
  51. void print() {
  52. if(set == NULL || sz == 0) {
  53. cout << "ERROR";
  54. return;
  55. } else {
  56. cout << "Mask: ";
  57. for(int i = 0; i < sz; i++) {
  58. cout << set[i] << " ";
  59. }
  60. cout << endl;
  61. }
  62. }
  63.  
  64.  
  65. };
  66.  
  67.  
  68. // Interface functions
  69. bool isSet(Set& set);
  70. bool isSubSet(Set& uset, Set& subset);
  71.  
  72. void enterSet(Set& in_set);
  73. void enterMask(Mask& mask, Set& uset);
  74.  
  75. void createSet(Set& uset);
  76. void createMaskFromSubSet(Set& in_set, Set& in_subset, Mask& out_submask);
  77. void createFMask(Mask& mask);
  78.  
  79.  
  80. // The real MVPs
  81. void unionOfMasks(Mask& mask1, Mask& mask2, Mask& resmask);
  82. void sectionOfMasks(Mask& mask1, Mask& mask2, Mask& resmask);
  83.  
  84.  
  85. int main () {
  86.  
  87. Set uset, subset;
  88. Mask submask, mask1, mask2,
  89. fmask, rfmask, temp, result;
  90.  
  91. cout << "Universal set: ";
  92. enterSet(uset);
  93.  
  94. bool isSetOK = isSet(uset);
  95. cout << (isSetOK ? "SET" : "NOT SET") << endl;
  96.  
  97. if (!isSetOK) {
  98. createSet(uset);
  99. }
  100. uset.print();
  101.  
  102.  
  103. char yes_no;
  104.  
  105. do {
  106. mask1.clear();
  107. mask2.clear();
  108. subset.clear();
  109. temp.clear();
  110. result.clear();
  111.  
  112. cout << "Enter mask 1: ";
  113. enterMask(mask1, uset);
  114. // processMask(mask1, mask_sz1);
  115. cout << "Enter mask 2: ";
  116. enterMask(mask2, uset);
  117.  
  118. cout << "Enter sub-set: ";
  119. enterSet(subset);
  120. bool isSubSetOK = isSubSet(uset, subset);
  121. if(isSubSetOK) {
  122. createMaskFromSubSet(uset, subset, submask);
  123. }
  124.  
  125. fmask = mask1;
  126. createFMask(fmask);
  127. fmask.print();
  128.  
  129. // секция на м2 и с1
  130. sectionOfMasks(submask, mask2, temp);
  131. temp.print();
  132. result = temp;
  133. temp.clear();
  134.  
  135. // Маска на първата функция с маската на събсета
  136. unionOfMasks(fmask, result, temp);
  137. temp.print();
  138. result = temp;
  139. temp.clear();
  140.  
  141. result.print();
  142.  
  143. cout << "Do you want to continue again [y/n] ?";
  144. cin >> yes_no;
  145. } while (yes_no == 'y');
  146.  
  147.  
  148.  
  149. return 0;
  150. }
  151.  
  152.  
  153. bool isSet(Set& set) {
  154. if (set.set == NULL || set.sz <= 0) {
  155. return false;
  156. }
  157.  
  158. for (int i = 0; i < set.sz; i++) {
  159. for (int j = i+1; j < set.sz; j++) {
  160. if (set.set[i] == set.set[j]) {
  161. return false;
  162. }
  163. }
  164. }
  165.  
  166. return true;
  167. }
  168.  
  169.  
  170. void createSet(Set& uset) {
  171. if( uset.set == NULL || uset.sz <= 0) {
  172. //! Debug
  173. cout << "createSet() error, uset.set == null or uset.sz <= 0 \n";
  174. return;
  175. }
  176. int u = 0;
  177. int br = 0;
  178. for (int i = 0; i < uset.sz; i++) {
  179. br = 0;
  180. for (int j = i+1; j < uset.sz; j++) {
  181. if (uset.set[i] == uset.set[j]) {
  182. br++;
  183. }
  184. }
  185. if (br == 0) {
  186. u++;
  187. }
  188. }
  189.  
  190. char* u_arr = new char[u];
  191. int pos = 0;
  192.  
  193. for (int i = 0; i < uset.sz; i++) {
  194. br = 0;
  195. for (int j = 0; j < pos; j++) {
  196. if (uset.set[i] == u_arr[j]) {
  197. br++;
  198. break;
  199. }
  200. }
  201. if (br == 0) {
  202. u_arr[pos] = uset.set[i];
  203. pos++;
  204. }
  205. }
  206. delete[] uset.set;
  207. uset.set = u_arr;
  208. uset.sz = u;
  209.  
  210. }
  211.  
  212. void enterSet(Set& in_set) {
  213. cout << "Number of elements: ";
  214. cin >> in_set.sz;
  215.  
  216. in_set.set = new char[in_set.sz];
  217.  
  218. for (int i = 0; i < in_set.sz; i++) {
  219. cin >> in_set.set[i];
  220. }
  221. }
  222.  
  223. void enterMask(Mask& mask, Set& uset) {
  224. cout << "Number of elements: ";
  225. cin >> mask.sz;
  226.  
  227. mask.set = new bool[uset.sz];
  228. cout << "Enter 0 or 1 with spaces:" << endl;
  229. for (int i = 0; i < mask.sz; i++) {
  230. cin >> mask.set[i];
  231. }
  232. for (int i = mask.sz; i < uset.sz; i++) {
  233. mask.set[i] = 0;
  234. }
  235. mask.sz = uset.sz;
  236. }
  237.  
  238. bool isSubSet(Set& uset, Set& subset) {
  239. if(uset.set == NULL || uset.sz <= 0 ||
  240. subset.set == NULL || subset.sz <= 0 ) {
  241. return false;
  242. }
  243. int br = 0;
  244. for (int s = 0; s < subset.sz; s++) {
  245. br = 0;
  246. for (int u = 0; u < uset.sz; u++) {
  247. if (subset.set[s] == uset.set[u]) {
  248. br++;
  249. }
  250. }
  251. if (br == 0) {
  252. return false;
  253. }
  254. }
  255. return true;
  256. }
  257.  
  258. void createMaskFromSubSet(Set& in_set, Set& in_subset, Mask& out_submask) {
  259. if(in_set.set == NULL || in_set.sz <= 0) {
  260. return;
  261. }
  262. out_submask.sz = in_set.sz;
  263. out_submask.set = new bool[in_set.sz];
  264.  
  265. for (int u = 0; u < in_set.sz; u++) {
  266. out_submask.set[u] = false;
  267. for (int s = 0; s < in_set.sz; s++) {
  268. if (in_set.set[u] == in_subset.set[s]) {
  269. out_submask.set[u] = true;
  270. break;
  271. }
  272. }
  273. }
  274. }
  275.  
  276.  
  277. void unionOfMasks(Mask& mask1, Mask& mask2, Mask& resmask)
  278. {
  279. if(mask1.set == NULL || mask1.sz == 0) {cout << "Mask1 error in union"; return;}
  280. if(mask2.set == NULL || mask2.sz == 0) {cout << "Mask2 error in union"; return;}
  281. resmask = mask1;
  282. for(int i = 0; i < mask1.sz; i++) {
  283. cout << mask1.set[i] << " ";
  284. }
  285. cout << "+ ";
  286. for(int i = 0; i < mask1.sz; i++) {
  287. cout << mask2.set[i] << " ";
  288. }
  289. cout << "Union\t";
  290.  
  291. for(int i = 0; i < mask1.sz; i++) {
  292. resmask.set[i] = (mask1.set[i] || mask2.set[i]);
  293. }
  294. }
  295.  
  296. void sectionOfMasks(Mask& mask1, Mask& mask2, Mask& resmask)
  297. {
  298. if(mask1.set == NULL || mask1.sz == 0) {cout << "Mask1 error in section"; return;}
  299. if(mask2.set == NULL || mask2.sz == 0) {cout << "Mask2 error in section"; return;}
  300. resmask = mask1;
  301. for(int i = 0; i < mask1.sz; i++) {
  302. cout << mask1.set[i] << " ";
  303. }
  304. cout << "- ";
  305. for(int i = 0; i < mask1.sz; i++) {
  306. cout << mask2.set[i] << " ";
  307. }
  308. cout << "Section\t";
  309.  
  310. for(int i = 0; i < mask1.sz; i++) {
  311. resmask.set[i] = mask1.set[i] && mask2.set[i];
  312. }
  313. }
  314.  
  315. void createFMask(Mask& mask) {
  316. int uniq = 0;
  317. for(int i = 0; i < mask.sz; i++) {
  318. if(mask.set[i] == 0) {
  319. uniq++;
  320. if(uniq == 2) {
  321. uniq = 0;
  322. mask.set[i] = 1;
  323. }
  324. }
  325. cout << mask.set[i] << " ";
  326. }
  327.  
  328. //! Debug
  329. cout << endl;
  330. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement