Advertisement
Guest User

Untitled

a guest
Feb 19th, 2020
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.02 KB | None | 0 0
  1. #include<malloc.h>
  2. #include <math.h>
  3. #include<stdio.h>
  4. #include <stdlib.h>
  5. #include <time.h>
  6. #include "hdr.h"
  7.  
  8. int main()
  9. {
  10.     Set *a, *b, *c;
  11.     OverlapFlags of;
  12.  
  13.     srand(time(0));
  14.     a = set(52);
  15.     print(a);
  16.  
  17.     b = set(19);
  18.     print(b);
  19.  
  20.     findOverlap(a, b, &of);
  21.  
  22.     printf("\n\nSECHENIE:");
  23.     c = Intersection(a, b, &of);
  24.     print(c);
  25.     freeSet(c);
  26.  
  27.     printf("\n\nRAZLIKA:");
  28.     c = Difference(a, b, &of);
  29.     print(c);
  30.     freeSet(c);
  31.  
  32.     printf("\n\nOBEDINENIE:");
  33.     c = Union(a, b, &of);
  34.     print(c);
  35.     freeSet(c);
  36.  
  37.     printf("\n\nSIMETRICHNA RAZLIKA:");
  38.     c = SymmetricDifference(a, b, &of);
  39.     print(c);
  40.  
  41.     freeOverlap(&of);
  42.  
  43.     freeSet(a);
  44.     freeSet(b);
  45.     freeSet(c);
  46.     getchar();
  47.     getchar();
  48.     return 0;
  49. }
  50.  
  51. Set* set(int elcount)
  52. {
  53.     int i, a;
  54.     Set* s;
  55.  
  56.     s = (Set*)malloc(sizeof(Set));
  57.     s->arr = (int*)malloc(elcount * sizeof(int));
  58.  
  59.     s->len = elcount;
  60.     random_generator(s);
  61.  
  62.     return s;
  63. }
  64.  
  65. void print(Set *s)
  66. {
  67.     int i;
  68.     printf("\nMoshtnost: %d\n", s->len);
  69.     for (i = 0; i < s->len; i++)
  70.     {
  71.         printf("%d, ", s->arr[i], i);
  72.     }
  73. }
  74.  
  75. int findElement(Set *s, int element)
  76. {
  77.     int i;
  78.  
  79.     for (i = 0; i < s->len; i++)
  80.     {
  81.         if (element == s->arr[i])
  82.             return i;
  83.     }
  84.  
  85.     return -1;
  86. }
  87.  
  88. void findOverlap(Set *A, Set *B, OverlapFlags *result)
  89. {
  90.     int i, findElementIndex;
  91.  
  92.     result->ofCount = 0;
  93.     result->ofArr = (unsigned int*)calloc((unsigned int)ceilf(2 * (A->len + B->len) / (sizeof(int)*8.0f)), sizeof(int));
  94.  
  95.     for (i = 0; i < B->len; i++)
  96.     {
  97.         findElementIndex = findElement(A, B->arr[i]);
  98.         if (findElementIndex != -1)
  99.         {
  100.             result->ofArr[(2 * findElementIndex) / (sizeof(int) * 8)] |= (1 << (2 * findElementIndex) % (sizeof(int) * 8));
  101.             result->ofArr[(2 * i + 1) / (sizeof(int) * 8)] |= (1 << (2 * i + 1) % (sizeof(int) * 8));
  102.             result->ofCount += 1;
  103.             findElementIndex = -1;
  104.         }
  105.     }
  106.  
  107. }
  108.  
  109. void freeOverlap(OverlapFlags* of)
  110. {
  111.     free(of->ofArr);
  112. }
  113.  
  114. void freeSet(Set* s)
  115. {
  116.     free(s->arr);
  117.     free(s);
  118. }
  119.  
  120. Set* Intersection(Set *A, Set *B, OverlapFlags *of)
  121. {
  122.     int i;
  123.     Set *C;
  124.  
  125.     C = (Set*)malloc(sizeof(Set));
  126.     C->len = 1;
  127.     C->arr = (Set*)malloc(sizeof(int));
  128.  
  129.     for (i = 0; i < A->len; i++)
  130.     {
  131.         if (of->ofArr[(2 * i) / (sizeof(int) * 8)] & (1 << (2 * i) % (sizeof(int) * 8)))
  132.         {
  133.             C->arr[C->len - 1] = A->arr[i];
  134.             C->len++;
  135.             C->arr = realloc(C->arr, C->len * sizeof(int));
  136.         }
  137.     }
  138.  
  139.     C->len--;
  140.     C->arr = realloc(C->arr, C->len * sizeof(int));
  141.  
  142.     return C;
  143. }
  144.  
  145. Set* Difference(Set *A, Set *B, OverlapFlags *of)
  146. {
  147.     Set *D;
  148.     int i, k;
  149.  
  150.     D = (Set*)malloc(sizeof(Set));
  151.     D->len = A->len - of->ofCount;
  152.     D->arr = (int*)malloc(D->len * sizeof(int));
  153.  
  154.     for (i = k = 0; i < A->len; i++)
  155.     {
  156.         if ((of->ofArr[(2 * i) / (sizeof(int) * 8)] & (1 << (2 * i) % (sizeof(int) * 8))) == 0)
  157.         {
  158.             D->arr[k] = A->arr[i];
  159.             k++;
  160.         }
  161.     }
  162.  
  163.  
  164.     return D;
  165. }
  166.  
  167. Set* Union(Set *A, Set *B, OverlapFlags *of)
  168. {
  169.     Set *C;
  170.     int i, k;
  171.  
  172.     C = (Set*)malloc(sizeof(Set));
  173.     C->len = A->len + B->len - of->ofCount;
  174.     C->arr = (int*)malloc(C->len * sizeof(int));
  175.  
  176.     for (i = 0; i < A->len; i++)
  177.     {
  178.         C->arr[i] = A->arr[i];
  179.     }
  180.  
  181.     k = i;
  182.     for (i = 0; i < B->len; i++)
  183.     {
  184.         if ((of->ofArr[(2 * i + 1) / (sizeof(int) * 8)] & (1 << (2 * i + 1) % (sizeof(int) * 8))) == 0)
  185.         {
  186.             C->arr[k] = B->arr[i];
  187.             k++;
  188.         }
  189.     }
  190.  
  191.     return C;
  192. }
  193.  
  194. Set* SymmetricDifference(Set *A, Set *B, OverlapFlags *of)
  195. {
  196.     Set *D;
  197.     int i, k;
  198.  
  199.     D = (Set*)malloc(sizeof(Set));
  200.     D->len = A->len + B->len - of->ofCount * 2;
  201.     D->arr = (int*)malloc(D->len * sizeof(int));
  202.  
  203.     for (i = k = 0; i < A->len; i++)
  204.     {
  205.         if ((of->ofArr[(2 * i) / (sizeof(int) * 8)] & (1 << (2 * i) % (sizeof(int) * 8))) == 0)
  206.         {
  207.             D->arr[k] = A->arr[i];
  208.             k++;
  209.         }
  210.     }
  211.  
  212.     for (i = 0; i < B->len; i++)
  213.     {
  214.         if ((of->ofArr[(2 * i + 1) / (sizeof(int) * 8)] & (1 << (2 * i + 1) % (sizeof(int) * 8))) == 0)
  215.         {
  216.             D->arr[k] = B->arr[i];
  217.             k++;
  218.         }
  219.     }
  220.  
  221.  
  222.     return D;
  223. }
  224.  
  225. void random_generator(Set *s)
  226. {
  227.     int i, a;
  228.  
  229.     a = 1;
  230.     s->arr[0] = 1 + rand() % 6;
  231.     for (i = 1; i < s->len; i++)
  232.     {
  233.         s->arr[i] = (s->arr[i - 1] + 1 + rand() % 25);
  234.         a += 10;
  235.     }
  236. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement