diff --git a/sln/vc10/bitfield/bitfield.vcxproj b/sln/vc10/bitfield/bitfield.vcxproj index f4b10eb18..c0a3e148c 100644 --- a/sln/vc10/bitfield/bitfield.vcxproj +++ b/sln/vc10/bitfield/bitfield.vcxproj @@ -1,5 +1,5 @@  - + Debug @@ -14,16 +14,19 @@ {A76282B3-4276-4945-9AF2-3AC68111A828} bitfield Win32Proj + 10.0.16299.0 StaticLibrary Unicode true + v141 StaticLibrary Unicode + v141 diff --git a/sln/vc10/gtest/gtest.vcxproj b/sln/vc10/gtest/gtest.vcxproj index 518510409..9a4ba0b32 100644 --- a/sln/vc10/gtest/gtest.vcxproj +++ b/sln/vc10/gtest/gtest.vcxproj @@ -1,5 +1,5 @@  - + Debug @@ -14,16 +14,19 @@ {60932AFC-7808-48B7-B3BF-F2BC151C0065} gtest Win32Proj + 10.0.16299.0 StaticLibrary Unicode true + v141 StaticLibrary Unicode + v141 diff --git a/sln/vc10/sample_prime_numbers/sample_prime_numbers.vcxproj b/sln/vc10/sample_prime_numbers/sample_prime_numbers.vcxproj index 981eb64a1..0acdc102f 100644 --- a/sln/vc10/sample_prime_numbers/sample_prime_numbers.vcxproj +++ b/sln/vc10/sample_prime_numbers/sample_prime_numbers.vcxproj @@ -1,5 +1,5 @@  - + Debug @@ -14,16 +14,19 @@ {5D0218F2-E502-414F-BA66-9E76B2785178} sample_prime_numbers Win32Proj + 10.0.16299.0 Application Unicode true + v141 Application Unicode + v141 diff --git a/sln/vc10/test_bitfield/test_bitfield.vcxproj b/sln/vc10/test_bitfield/test_bitfield.vcxproj index 5b72614b8..03c2eb5d9 100644 --- a/sln/vc10/test_bitfield/test_bitfield.vcxproj +++ b/sln/vc10/test_bitfield/test_bitfield.vcxproj @@ -1,5 +1,5 @@  - + Debug @@ -14,16 +14,19 @@ {C650C93E-F0A7-4235-9F5F-0DCE78609BFB} test_bitfield Win32Proj + 10.0.16299.0 Application Unicode true + v141 Application Unicode + v141 diff --git a/src/tbitfield.cpp b/src/tbitfield.cpp index 3bfa48182..d8dad4303 100644 --- a/src/tbitfield.cpp +++ b/src/tbitfield.cpp @@ -13,86 +13,250 @@ static TBitField FAKE_BITFIELD(1); TBitField::TBitField(int len) { + if (len >= 0) + { + BitLen = len; + MemLen = len * sizeof(TELEM) * 8; + pMem = new TELEM[MemLen]; + for (int i = 0; i < MemLen; i++) + { + pMem[i] = 0; + } + } + else + throw "Error"; } TBitField::TBitField(const TBitField &bf) // конструктор копирования { + MemLen = bf.MemLen; + BitLen = bf.BitLen; + pMem = new TELEM[MemLen]; + for (int i = 0; i < MemLen; i++) + { + pMem[i] = bf.pMem[i]; + } } TBitField::~TBitField() { + if (pMem != 0) + { + delete[] pMem; + } + pMem = 0; + MemLen = 0; + BitLen = 0; } int TBitField::GetMemIndex(const int n) const // индекс Мем для бита n { - return FAKE_INT; + if ((n < 0) || (n > BitLen)) + { + throw "Error"; + } + else + return n >> 5; } TELEM TBitField::GetMemMask(const int n) const // битовая маска для бита n { - return FAKE_INT; + if ((n < 0) && (n < BitLen)) + { + throw "Error"; + } + return 1 << (n & 31); } // доступ к битам битового поля int TBitField::GetLength(void) const // получить длину (к-во битов) { - return FAKE_INT; + return BitLen; } void TBitField::SetBit(const int n) // установить бит { + if ((n >= 0) && (n < BitLen)) + { + int i = GetMemIndex(n); + int m = GetMemMask(n); + pMem[i] = pMem[i] | m; + } + else + { + throw "Error"; + } } void TBitField::ClrBit(const int n) // очистить бит { + if ((n >= 0) && (n < BitLen)) + { + int i = GetMemIndex(n); + int m = GetMemMask(n); + pMem[i] = pMem[i] & ~m; + } + else + { + throw "error"; + } } int TBitField::GetBit(const int n) const // получить значение бита { - return FAKE_INT; + if ((n >= 0) && (n < BitLen)) + { + int i = GetMemIndex(n); + int m = GetMemMask(n); + return (pMem[i] & m); + } + else + { + throw "Error"; + } } // битовые операции TBitField& TBitField::operator=(const TBitField &bf) // присваивание { - return FAKE_BITFIELD; + if (this == &bf) + return *this; + else + { + delete[] pMem; + MemLen = bf.MemLen; + pMem = new TELEM[MemLen]; + BitLen = bf.BitLen; + for (int i = 0; i < MemLen; i++) + { + pMem[i] = bf.pMem[i]; + } + return *this; + } } int TBitField::operator==(const TBitField &bf) const // сравнение { - return FAKE_INT; + if ((MemLen == bf.MemLen) && (BitLen == bf.BitLen)) + { + for (int i = 0; i < MemLen; i++) + { + if (pMem[i] != bf.pMem[i]) + return 0; + } + return 1; + } + return 0; } int TBitField::operator!=(const TBitField &bf) const // сравнение { - return FAKE_INT; + if ((MemLen == bf.MemLen) && (BitLen == bf.BitLen)) + { + for (int i = 0; i < MemLen; i++) + { + if (pMem[i] == bf.pMem[i]) + return 1; + } + return 0; + } + return 1; } TBitField TBitField::operator|(const TBitField &bf) // операция "или" { - return FAKE_BITFIELD; + if (BitLen >= bf.BitLen) + { + TBitField res = TBitField(BitLen); + for (int i = 0; i < MemLen; i++) + { + res.pMem[i] = pMem[i] | bf.pMem[i]; + } + return res; + } + else + { + TBitField res = TBitField(bf.BitLen); + for (int i = 0; i < MemLen; i++) + { + res.pMem[i] = pMem[i] | bf.pMem[i]; + } + return res; + } } TBitField TBitField::operator&(const TBitField &bf) // операция "и" { - return FAKE_BITFIELD; + if (BitLen >= bf.BitLen) + { + TBitField res = TBitField(BitLen); + for (int i = 0; i < MemLen; i++) + { + res.pMem[i] = pMem[i] & bf.pMem[i]; + } + return res; + } + else + { + TBitField res = TBitField(bf.BitLen); + for (int i = 0; i < MemLen; i++) + { + res.pMem[i] = pMem[i] & bf.pMem[i]; + } + return res; + } } TBitField TBitField::operator~(void) // отрицание { - return FAKE_BITFIELD; + TBitField res(*this); + for (int i = 0; i < BitLen; i++) + { + if (GetBit(i)) + { + res.ClrBit(i); + } + else + res.SetBit(i); + } + return res; } // ввод/вывод istream &operator>>(istream &istr, TBitField &bf) // ввод { - return istr; + int l; + istr >> l; + TBitField res(l); + + char* m = new char[l]; + istr >> m; + for (int i = 0; i < bf.BitLen; i++) + { + if (m[i] == 0) + { + bf.ClrBit(i); + } + else + { + if (m[i] == 1) + { + bf.SetBit(i); + } + else + throw "Error"; + } + } + return istr; } ostream &operator<<(ostream &ostr, const TBitField &bf) // вывод { - return ostr; + for (int i = 0; i < bf.BitLen; i++) + ostr << bf.GetBit(i); + + return ostr; } diff --git a/src/tset.cpp b/src/tset.cpp index e70a76e58..78f036a32 100644 --- a/src/tset.cpp +++ b/src/tset.cpp @@ -12,93 +12,128 @@ static const int FAKE_INT = -1; static TBitField FAKE_BITFIELD(1); static TSet FAKE_SET(1); -TSet::TSet(int mp) : BitField(-1) +TSet::TSet(int mp) : BitField(mp) { + MaxPower = mp; } // конструктор копирования -TSet::TSet(const TSet &s) : BitField(-1) +TSet::TSet(const TSet &s) : BitField(s.BitField) { + MaxPower = s.MaxPower; } // конструктор преобразования типа -TSet::TSet(const TBitField &bf) : BitField(-1) +TSet::TSet(const TBitField &bf) : BitField(bf) { + MaxPower = bf.GetLength(); } TSet::operator TBitField() { - return FAKE_BITFIELD; + TBitField res(this->BitField); + return res; } int TSet::GetMaxPower(void) const // получить макс. к-во эл-тов { - return FAKE_INT; + return MaxPower; } int TSet::IsMember(const int Elem) const // элемент множества? { - return FAKE_INT; + 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) // присваивание { - return FAKE_SET; + MaxPower = s.MaxPower; + BitField = s.BitField; + return *this; } int TSet::operator==(const TSet &s) const // сравнение { - return FAKE_INT; + return BitField == s.BitField; } int TSet::operator!=(const TSet &s) const // сравнение { - return FAKE_INT; + return BitField != s.BitField; } TSet TSet::operator+(const TSet &s) // объединение { - return FAKE_SET; + TSet res(BitField | s.BitField); + return res; } TSet TSet::operator+(const int Elem) // объединение с элементом { - return FAKE_SET; + BitField.SetBit(Elem); + return *this; } TSet TSet::operator-(const int Elem) // разность с элементом { - return FAKE_SET; + TSet res(BitField & Elem); + return res; } TSet TSet::operator*(const TSet &s) // пересечение { - return FAKE_SET; + TSet res(BitField & s.BitField); + return res; } TSet TSet::operator~(void) // дополнение { - return FAKE_SET; + TSet res(~BitField); + return res; } // перегрузка ввода/вывода istream &operator>>(istream &istr, TSet &s) // ввод { - return istr; + int l; + istr >> l; + TSet res(l); + int k = 0; + for (int i = 0; i < l; i++) + { + istr >> k; + if (k == 0) + res.DelElem(i); + else + res.InsElem(i); + } + s = res; + + return istr; } ostream& operator<<(ostream &ostr, const TSet &s) // вывод { - return ostr; + int k = s.GetMaxPower(); + ostr << "{"; + for (int i = 0; i < k; i++) + { + if (s.IsMember(i)) + ostr << i << ";"; + } + ostr << "}"; + return ostr; }