Advertisement
punidota

Untitled

Jun 27th, 2016
405
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 12.22 KB | None | 0 0
  1. #include <iostream>
  2. #include <conio.h>
  3. #include <assert.h>
  4.  
  5. using namespace std;
  6.  
  7.  
  8. struct element            
  9. {
  10.     int v;          
  11.     struct element * next;
  12. };
  13.  
  14.  
  15. class set
  16. {          
  17.     public:
  18.         set():power(0),rear(NULL){};
  19.         set(const set & s);
  20.         set(int p);
  21.         set(int * a, int sz);
  22.         ~set();
  23.         friend ostream & operator <<(ostream & out, const set & s);
  24.         set & operator --(); //prefix
  25.         set & operator --(int); //postfix
  26.         operator int() { return power; }
  27.         short operator == (const set & s) const;
  28.         set & operator = (const set & s);
  29.         friend set operator +(int el, const set & s);                            
  30.         set operator & (const set & s2)const;
  31.         set operator ^ (const set & s)const;
  32.        
  33.                                                                                    
  34.              
  35.     private:
  36.         int power;        
  37.         struct element * rear;
  38.         void push(int val);
  39.         struct element * contains(int v) const;
  40.         void delEl(struct element * p);
  41. };
  42.  
  43.  
  44. void set::push(int val)                                                        
  45. {
  46.     struct element * newEl = new element;
  47.     newEl->v = val;
  48.     power++;
  49.     if (rear)                       //если список не пустой
  50.     {
  51.         newEl->next = rear->next;
  52.         rear->next = newEl;
  53.         rear = newEl;            
  54.     }
  55.     else                            //если список пустой, закольцовываем его
  56.     {
  57.         newEl->next = newEl;
  58.         rear = newEl;
  59.     }
  60. }
  61.  
  62.  
  63. set set::operator ^(const set &s) const                                                                 //TEST
  64. {
  65.     if (power==0)           //если одно из множеств пустое, симм. разность будет равна другому мн-ву
  66.         return s;
  67.     if (s.power == 0)
  68.         return *this;
  69.     set newS;
  70.     if (*this == s)        //если множества равны, симм.разность равна пустому мн-ву.      
  71.         return newS;
  72.     newS = (*this);
  73.     newS = newS + (*this);
  74.     newS^=s;
  75.     return newS;
  76. }
  77.  
  78. set::set(int * a, int sz):power(0),rear(NULL)           //конструктор, изымающий множество из массива                    
  79. {
  80.     push(a[0]);
  81.     for (int i=1; i<sz; i++)
  82.     {
  83.         if (!contains(a[i]))
  84.             push(a[i]);
  85.     }  
  86. }
  87.  
  88. struct element * set::contains(int val) const //ищет элемент в множестве и возвращает указатель на него                            
  89. {
  90.     if (!rear)
  91.         return 0;
  92.     struct element * p = rear;
  93.     do
  94.     {
  95.         if (p->v == val)
  96.             return p;
  97.         p = p->next;
  98.     } while (p != rear);
  99.     return NULL;
  100. }
  101.  
  102. void set::delEl(struct element * p)
  103. {
  104.     power--;
  105.     delete p;
  106. }
  107.  
  108. set::set(const set & s):power(0),rear(NULL)     //копирующий конструктор
  109. {
  110.     if (s.rear)
  111.     {
  112.         struct element * p = s.rear->next;
  113.         do            
  114.         {                           //почленное копирование      
  115.             push(p->v);
  116.             p = p->next;
  117.         } while (p != s.rear->next);
  118.     }
  119. }
  120.  
  121. set::~set()
  122. {
  123.     if (power)                              //если содержит элементы, значит есть что удалять
  124.     {
  125.         struct element * p;
  126.         do                               //удаляем последовательно все элементы
  127.         {                                  
  128.             p = rear->next;
  129.             rear->next = p->next;
  130.             delEl(p);
  131.         } while (power);
  132.     }
  133. }
  134.  
  135. ostream & operator <<(ostream & out, const set & s)
  136. {
  137.     if (s.power == 0)           //пусто
  138.     {
  139.         out<<"Empty set"<<endl;
  140.         return out;
  141.     }
  142.     int i;                      //не пусто
  143.     struct element * p = s.rear->next;
  144.     out<<"power["<<s.power<<"]"<<endl;
  145.     do
  146.     {
  147.         out<<p->v<<"   ";          //последовательный вывод значений эл-в мн-ва через пробел
  148.         p = p->next;
  149.     } while (p != s.rear->next);
  150.     out<<endl;
  151.     return out;
  152. }
  153.  
  154.  
  155. set & set::operator --()                //удаление первого элемента
  156. {                    
  157.     struct element * p = rear->next;
  158.     rear->next = p->next;
  159.     delEl(p);
  160.     return (*this);
  161. }
  162.  
  163. set & set::operator --(int)             //удаление последнего элемента
  164. {
  165.     *this -= rear->v;
  166.     return (*this);
  167. }
  168.  
  169. short set::operator == (const set & s) const
  170. {
  171.     if (power != s.power)                   //если мощности множеств не равны, множества не равны
  172.         return 0;
  173.     if (power == 0)                         //два пустых множества равны
  174.         return 1;
  175.     struct element * p = s.rear;
  176.     do                                      //пробег по всем элементам одного множества              
  177.     {
  178.         if (!contains(p->v))                //если во втором множестве не содержится такого элемента,
  179.             return 0;                       //то множества не равны
  180.         p = p->next;
  181.     } while (p != s.rear);
  182.     return 1;                               //иначе - равны.
  183. }
  184.  
  185. set & set::operator = (const set & s)                       //присваивание
  186. {
  187.     if (s == *this)
  188.         return *this;
  189.     if (s.power == 0)
  190.     {
  191.         delete this;
  192.         power=0;
  193.         return *this;
  194.     }
  195.     int i = 0, min=(power<s.power?power:s.power);           //i - счетчик, max - минимальная мощность двух множеств.
  196.     struct element *p = (power?rear->next:NULL), *p2 = s.rear->next;                 //р2 - указатель на эл-т присваивоемого мн-ва, р  - указатель на элемент другого мн-ва.
  197.     for (i = 0; i < min; i++)      //копируем все, что влазит
  198.     {      
  199.         p->v = p2->v;
  200.         p = p->next;
  201.         p2 = p2->next;
  202.        
  203.     }
  204.     if (power < s.power)                    //если не влазит, добавляем
  205.     {
  206.         for (;i < s.power; i++)
  207.         {
  208.             push(p2->v);
  209.             p2 = p2->next;
  210.         }
  211.     }
  212.     else                                    //если остается лишнее место, удаляем
  213.     {
  214.         while (power != s.power)
  215.             (*this)--;
  216.     }
  217.     power=s.power;
  218.     return *this;
  219. }
  220.  
  221. set set::operator & (const set & s2)const               //пересечение множеств
  222. {
  223.    
  224.     if ((power == s2.power)&&(*this == s2))             //если множества равны, возращаем любое из них
  225.         return *this;
  226.     set spike; set spike2; set newS;
  227.     if ((power == 0) || (s2.power == 0))                //если одно из множеств пусто, возвращаем пустое множество
  228.         return newS;
  229.     struct element *p = rear->next;
  230.    
  231.     if (power <= s2.power)                     //небольшая оптимизация
  232.     {
  233.         do      
  234.         {
  235.             if (s2.contains(p->v))       //если элемент одного множества содержится в другом, добавляем его в результирующее мн-во
  236.                 newS.push(p->v);
  237.             p = p->next;
  238.         } while( p != rear->next);
  239.     }
  240.     else
  241.     {
  242.         newS = s2 & *this;
  243.     }
  244.     return newS;
  245. }
  246.  
  247. set & set::operator -=(const int el) //изъятие эл-та из мн-ва          
  248. {
  249.     struct element *p = contains(el);
  250.     if (p==NULL || power == 0)
  251.         return *this;         //из пустого множества не получится изъять. Так же не изъять то, чего нет.
  252.     if ((power == 1) & (p != NULL))        //если единственный элемент
  253.     {
  254.         delEl(rear);
  255.         rear = NULL;
  256.         return *this;
  257.     }
  258.     if (p == rear)                     //если конечный элемент
  259.     {
  260.         do
  261.         {
  262.             p = p->next;                //приходится заморачиваться с изменением указателя на хвост
  263.         } while (p->next != rear);
  264.         p->next = rear->next;
  265.         delEl(rear);
  266.         rear = p;
  267.     }
  268.     else
  269.     {
  270.         struct element *tmp = p->next;
  271.         p->v = p->next->v;
  272.         p->next = p->next->next;        //просто вынимаем элемент из списка
  273.         if (tmp == rear)
  274.             rear = p;
  275.         delEl(tmp);
  276.        
  277.     }
  278.     return *this;
  279. }
  280.  
  281. void doSomething()
  282. {
  283.     int ar[]={1,2,3,4},br[]={1,5,6,7,8,9},cr[]={1,4,9};
  284.         set a(ar,4);
  285.         set b(br,6);
  286.         set c(cr,3);
  287.     /*
  288.         cout<<"Enter 4 elements for set a"<<endl;
  289.         set a(4);
  290.         cout<<"Enter 6 elements for set b"<<endl;
  291.         set b(6);
  292.         cout<<"Enter 3 elements for set c"<<endl;
  293.         set c(3);
  294. */
  295.     cout<<"Set d will be empty"<<endl;
  296.     set d;
  297.     cout<<"Lets make new set j = a"<<endl;
  298.     set j;
  299.     j = a;
  300.    
  301.     cout<<"---------------------------------------------"<<endl;
  302.     cout<<"Set a:"<<a<<"Set b:"<<b<<"Set c:"<<c<<"Set d:"<<d<<"Set j:"<<j;    
  303.     cout<<"a+b=";
  304.     cout<<"="<<(a+b);
  305.     cout<<"a+a="<<(a+a);
  306.     cout<<"d+c="<<(d+c);
  307.    
  308.     cout<<"---------------------------------------------"<<endl;
  309.    
  310.  
  311.    
  312.     cout<<"Set a:"<<a<<"Set b:"<<b<<"Set c:"<<c<<"Set d:"<<d;
  313.    
  314.     cout<<"b-c="<<(b-c);
  315.     cout<<"d-a="<<(d-a);
  316.     cout<<"c-d="<<(c-d);
  317.    
  318.     cout<<"---------------------------------------------"<<endl;
  319.     cout<<"Set a:"<<a<<"Set b:"<<b<<"Set c:"<<c<<"Set d:"<<d;
  320.     cout<<"Enter x. Then we will do b-x, x+a and c+x"<<endl;
  321.     int x;
  322.     cin>>x;
  323.     cout<<"b-"<<x<<"="<<(b-x);
  324.     cout<<x<<"+a"<<"="<<(x+a);
  325.     cout<<"c+"<<x<<"="<<(c+x);
  326.    
  327.     if (b==b)
  328.         cout<<"b==b"<<endl;
  329.     else
  330.         cout<<"b!=b"<<endl;
  331.    
  332.     if (d==a)
  333.         cout<<"d==a"<<endl;
  334.     else
  335.         cout<<"d!=a"<<endl;
  336.    
  337.     cout<<"---------------------------------------------"<<endl;
  338.     cout<<"Set a:"<<a<<"Set b:"<<b<<"Set c:"<<c<<"Set d:"<<d;
  339.     cout<<"Now let's do c-- and --c"<<endl;
  340.     cout<<"c-- = "<<(c--);
  341.     cout<<"--c = "<<(--c);
  342.     if (b<x)
  343.         cout<<"b<x"<<endl;
  344.     else
  345.         cout<<"b!<x"<<endl;
  346.     if (c<x)
  347.         cout<<"c<x"<<endl;
  348.     else
  349.         cout<<"c!<x"<<endl;
  350.     if (d<a)
  351.         cout<<"d<a"<<endl;
  352.     else
  353.         cout<<"d!<a"<<endl;
  354.     if (b>c)
  355.         cout<<"b>c"<<endl;
  356.     else
  357.         cout<<"b!>c"<<endl;
  358.  
  359.     cout<<"---------------------------------------------"<<endl;
  360.     cout<<"Set a:"<<a<<"Set b:"<<b<<"Set c:"<<c<<"Set d:"<<d;
  361.     cout<<"Now lets make set e=a&b"<<endl;
  362.     set e = a&b;
  363.     cout<<"Set e:"<<e;
  364.     cout<<"e^a="<<(e^a);
  365.    
  366.     cout<<"---------------------------------------------"<<endl;
  367.     cout<<"Set a:"<<a<<"Set b:"<<b<<"Set c:"<<c<<"Set d:"<<d<<"Set e:"<<e;
  368.     cout<<"Enter new x. We will c+=x; b-=x."<<endl;
  369.     cin>>x;
  370.     cout<<"c+=x = "<<(c+=x);
  371.     cout<<"b-=x = "<<(b-=x);
  372.     cout<<"c+=a = "<<(c+=a);
  373.     cout<<"b-=e = "<<(b-=e);
  374.     cout<<"a^=b = "<<(a^=b);            
  375.     cout<<"c&=e = "<<(c&=e);
  376.     cout<<"b&=(a-9) = "<<(b&=(a-9));
  377.    
  378.     cout<<"---------------------------------------------"<<endl;
  379.     cout<<"Set a:"<<a<<"Set b:"<<b<<"Set c:"<<c<<"Set d:"<<d<<"Set e:"<<e;
  380.     cout<<"a^=a = "<<(a^=a);
  381.     cout<<"That's all."<<endl;  
  382.     getch();
  383. }
  384.  
  385. int main()
  386. {
  387.     //doSomething();
  388.      set a,b;
  389.     a+=1;
  390.     a+=2;
  391.     b+=3;
  392.     b+=2;
  393.  
  394.  
  395.    
  396.     cout<<"+"<< (a + b) <<endl;
  397.     //cout<<"+="<< (a+=b) <<endl;
  398.     cout<<"-"<< (a - b) <<endl;
  399.     cout<<"a:"<<a<<"b:"<<b;
  400.     cout<<"^"<< (a ^ b) <<endl;
  401.     cout<<"&"<< (a & b) <<endl;
  402.     cout<<"end.";
  403.     cout<<"^="<<(b^=a)<<endl;
  404.     getch();
  405. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement