// ННГУ, ВМК, Курс "Методы программирования-2", С++, ООП // // set.cpp - Copyright (c) Гергель В.П. 04.10.2001 // // Множество - реализация через битовые поля #include "set.h" TSet :: TSet(int mp) : MaxPower(mp), BitField(mp) {} TSet :: TSet(const TSet &s) : // конструктор копирования MaxPower(s.MaxPower), BitField(s.BitField) { } TSet :: TSet(const TBitField &bf) : // конструктор преобразования типа MaxPower(bf.GetLength()), BitField(bf){ } TSet :: operator TBitField() { // преобразование типа к TBitField TBitField temp(this->BitField); return temp; } // максимальная мощность и проверка принадлежности элементов int TSet :: GetMaxPower ( void ) const { // получить макс. к-во эл-тов return MaxPower; } /*---------------------------------------------*/ int TSet :: IsMember(const int Elem ) const { // элемент мн-ва ? return BitField.GetBit(Elem); } /*---------------------------------------------*/ // включение/исключение элемента множества void TSet :: InsElem (const int Elem ) { // включение элемента множества BitField.SetBit(Elem); } /*---------------------------------------------*/ void TSet :: DelElem ( const int Elem ) { // исключение элемента множества BitField.ClrBit(Elem); } /*---------------------------------------------*/ // теоретико-множественные операции TSet & TSet :: operator=(const TSet &s) { // присваивание BitField = s.BitField; MaxPower = s.GetMaxPower(); return *this; } /*---------------------------------------------*/ int TSet :: operator==(const TSet &s) { // сравнение return BitField == s.BitField; } /*---------------------------------------------*/ TSet TSet :: operator+ (const TSet &s) { // объединение TSet temp(BitField | s.BitField); return temp; } /*---------------------------------------------*/ TSet TSet :: operator* (const TSet &s) { // пересечение TSet temp(BitField & s.BitField); return temp; } /*---------------------------------------------*/ TSet TSet :: operator~ ( void ) { // дополнение TSet temp(~BitField); return temp; } /*---------------------------------------------*/ // перегрузка ввода/вывода istream &operator>>(istream &istr, TSet &s) { // ввод // формат данных - { i1, i2,.., in } int temp; char ch; // поиск { do { istr >> ch; } while (ch != '{'); // ввод элементов и включение в множество do { istr >> temp; s.InsElem(temp); do { istr >> ch; } while ( ( ch != ',' ) && ( ch != '}' ) ); } while (ch != '}'); return istr; } /*---------------------------------------------*/ ostream &operator<<(ostream &ostr, const TSet &s) { // вывод // формат данных - { i1, i2,.., in } int i, n; char ch = ' '; ostr << "{"; // вывод элементов n = s.GetMaxPower(); for ( i=0; i < n; i++ ) { if ( s.IsMember(i) ) { ostr << ch << ' ' << i; ch = ','; } } ostr << " }"; return ostr; } /*---------------------------------------------*/