fork download
  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <time.h>
  5. using namespace std;
  6.  
  7. #define STRING_SIZE 80
  8. #define arrsize(x) (sizeof(x)/sizeof((x)[0]))
  9.  
  10. //
  11. int find(int a, int *b, int size) {
  12. for (int i = size; i != -1; i--){
  13. if (a == b[i]) return i;
  14. }
  15. return -1; // not found
  16. }
  17.  
  18. //
  19. int randSet(int **set) {
  20. int size = (rand() % 10 + 1);
  21. *set = (int*) malloc(size*sizeof(int));
  22. for (int i = 0; i != size; i++){
  23. int num = rand() % 10 + 1;
  24. if (find(num, *set, i) != -1) {
  25. i--;
  26. continue;
  27. }
  28. (*set)[i] = num;
  29. }
  30. return size;
  31. }
  32.  
  33. //
  34. int copy(int *a, int sizea, int *b) {
  35. if (a == NULL || b == NULL) return -1;
  36. for (int i = 0; i != sizea; i++){
  37. b[i] = a[i];
  38. }
  39. return 0;
  40. }
  41.  
  42. //
  43. char* setToStr(int *b, int size) {
  44. if (b == NULL) return NULL;
  45. char *s = (char*) malloc(STRING_SIZE*sizeof(char)); // unsafe
  46. s[0] = '[';
  47. for (int i = 0; i != size; i++){
  48. if (i != 0){
  49. if (sprintf(s, "%s, %d", s, b[i]) <= 0) return NULL;
  50. continue;
  51. }
  52. if (sprintf(s, "%s%d", s, b[i]) <= 0) return NULL;
  53. }
  54. if (sprintf(s, "%s]", s) <= 0) return NULL;
  55. return s;
  56. }
  57.  
  58. //
  59. int intersect(int *a, int sizea, int *b, int sizeb, int **ret) {
  60. if (a == NULL || b == NULL) return -1;
  61. int* set = (int*) malloc(sizea*sizeof(int));
  62. int count = 0;
  63. for (int i = 0; i != sizea; i++){
  64. if (find(a[i], b, sizeb) >= 0){
  65. set[count] = a[i];
  66. count++;
  67. }
  68. }
  69. *ret = (int*) malloc(count*sizeof(int));
  70. if (copy(set, count, *ret)) return -1;
  71. delete(set);
  72. return count;
  73. }
  74. int unite(int *a, int sizea, int *b, int sizeb, int **ret) {
  75. if (a == NULL || b == NULL) return -1;
  76. int* set = (int*) malloc((sizea+sizeb)*sizeof(int));
  77. int count = sizea;
  78. for (int i = 0; i != sizea; i++) {
  79. set[i] = a[i];
  80. }
  81. for (int i = 0; i != sizeb; i++) {
  82. if (find(b[i], a, sizeb) < 0){
  83. set[count] = b[i];
  84. count++;
  85. }
  86. }
  87. *ret = (int*) malloc(count*sizeof(int));
  88. if (copy(set, count, *ret)) return -1;
  89. delete(set);
  90. return count;
  91. }
  92. int diference(int *a, int sizea, int *b, int sizeb, int **ret) {
  93. if (a == NULL || b == NULL) return -1;
  94. int* set = (int*) malloc(sizea*sizeof(int));
  95. int count = 0;
  96. for (int i = 0; i != sizea; i++) {
  97. if (find(a[i], b, sizeb) < 0){
  98. set[count] = a[i];
  99. count++;
  100. }
  101. }
  102. *ret = (int*) malloc(count*sizeof(int));
  103. if (copy(set, count, *ret)) return -1;
  104. delete(set);
  105. return count;
  106. }
  107. bool equal(int *a, int sizea, int *b, int sizeb) {
  108. if (a == NULL || b == NULL) return false;
  109. if (sizea != sizeb) return false;
  110. for (int i = 0; i != sizea; i++) {
  111. if (find(a[i], b, sizeb) < 0) return false;
  112. }
  113. for (int i = 0; i != sizeb; i++) {
  114. if (find(b[i], a, sizea) < 0) return false;
  115. }
  116. return true;
  117. }
  118.  
  119. int main() {
  120. // main init
  121. srand(time(NULL));
  122.  
  123. // sets
  124. int *setA, *setB, *setC;
  125. int sizeA = randSet(&setA);
  126. int sizeB = randSet(&setB);
  127. int sizeC = randSet(&setC);
  128.  
  129. printf("Множества:\nA = %s\nB = %s\nC = %s\n\n", setToStr(setA, sizeA), setToStr(setB, sizeB), setToStr(setC, sizeC));
  130.  
  131. int *setX, *setY, *setZ, *set1, *set2;
  132. int sizeX, sizeY, sizeZ, size1, size2;
  133.  
  134. sizeX = intersect(setB, sizeB, setC, sizeC, &setX);
  135. size1 = diference(setA, sizeA, setX, sizeX, &set1);
  136. printf("A\\(BnC) = %s\n", setToStr(set1, size1));
  137.  
  138. sizeX = diference(setA, sizeA, setB, sizeB, &setX);
  139. sizeY = diference(setA, sizeA, setC, sizeC, &setY);
  140. size2 = intersect(setX, sizeX, setY, sizeY, &set2);
  141. printf("(A\\B)n(A\\C) = %s\n", setToStr(set2, size2));
  142.  
  143. sizeX = unite(setX, sizeX, setY, sizeY, &setX);
  144. printf("A\\(BnC) = (A\\B)u(A\\C) %s\n", (equal(set1, size1, setX, sizeX) ? "истина" : "ложь"));
  145.  
  146. sizeX = unite(setB, sizeB, setC, sizeC, &setX);
  147. size1 = intersect(setA, sizeA, setX, sizeX, &set1);
  148. sizeX = intersect(setA, sizeA, setB, sizeB, &setX);
  149. sizeY = intersect(setA, sizeA, setC, sizeC, &setY);
  150. size2 = unite(setX, sizeX, setY, sizeY, &set2);
  151. printf("An(BuC) = (AnB)u(AnC) %s\n", (equal(set1, size1, set2, size2) ? "истина" : "ложь"));
  152.  
  153. return 0;
  154. }
Success #stdin #stdout 0s 4520KB
stdin
Standard input is empty
stdout
Множества:
A = [6, 8, 5, 10, 2]
B = [2, 10, 5, 1, 3, 7]
C = [6, 10, 5, 1]

A\(BnC) = [6, 8, 2]
(A\B)n(A\C) = [8]
A\(BnC) = (A\B)u(A\C) истина
An(BuC) = (AnB)u(AnC) истина