From 4530946cd319d95f0ef2d2e538064910c98452a2 Mon Sep 17 00:00:00 2001 From: Maria02179 <73477221+Maria02179@users.noreply.github.com> Date: Mon, 4 Oct 2021 16:14:30 +0300 Subject: [PATCH 1/7] Add files via upload --- tbitfield.cpp | 100 +++++++++++++++++++++++++++++++++++++++++++++++++ tset.cpp | 101 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 201 insertions(+) create mode 100644 tbitfield.cpp create mode 100644 tset.cpp diff --git a/tbitfield.cpp b/tbitfield.cpp new file mode 100644 index 000000000..b7247f8b0 --- /dev/null +++ b/tbitfield.cpp @@ -0,0 +1,100 @@ +// ННГУ, ВМК, Курс "Методы программирования-2", С++, ООП +// +// tbitfield.cpp - Copyright (c) Гергель В.П. 07.05.2001 +// Переработано для Microsoft Visual Studio 2008 Сысоевым А.В. (19.04.2015) +// +// Битовое поле + +#include "tbitfield.h" + +#define BITS_IN_ONE_MEM (sizeof(TELEM) * 8) + +TBitField::TBitField(int len) +{ + +} + +TBitField::TBitField(const TBitField& bf) // конструктор копирования +{ +} + +TBitField::~TBitField() +{ +} + +int TBitField::GetMemIndex(const int n) const // индекс Мем для бита n +{ + return 0; +} + +TELEM TBitField::GetMemMask(const int n) const // битовая маска для бита n +{ + + return 0; +} + +// доступ к битам битового поля + +int TBitField::GetLength(void) const // получить длину (к-во битов) +{ + return 0; +} + +void TBitField::SetBit(const int n) // установить бит +{ + if ((n < 0) || (n > BitLen)) + throw 2; +} + +void TBitField::ClrBit(const int n) // очистить бит +{ +} + +int TBitField::GetBit(const int n) const // получить значение бита +{ + return 0; +} + +// битовые операции + +TBitField& TBitField::operator=(const TBitField & bf) // присваивание +{ + return *this; +} + +int TBitField::operator==(const TBitField & bf) const // сравнение +{ + return 0; +} + +int TBitField::operator!=(const TBitField & bf) const // сравнение +{ + return 0; +} + +TBitField TBitField::operator|(const TBitField & bf) // операция "или" +{ + return TBitField(0); +} + +TBitField TBitField::operator&(const TBitField & bf) // операция "и" +{ + return TBitField(0); +} + +TBitField TBitField::operator~(void) // отрицание +{ + return TBitField(0); +} + +// ввод/вывод + +istream& operator>>(istream & istr, TBitField & bf) // ввод +{ + return istr; +} + +ostream& operator<<(ostream & ostr, const TBitField & bf) // вывод +{ + return ostr; +} diff --git a/tset.cpp b/tset.cpp new file mode 100644 index 000000000..38c6473d7 --- /dev/null +++ b/tset.cpp @@ -0,0 +1,101 @@ +// ННГУ, ВМК, Курс "Методы программирования-2", С++, ООП +// +// tset.cpp - Copyright (c) Гергель В.П. 04.10.2001 +// Переработано для Microsoft Visual Studio 2008 Сысоевым А.В. (19.04.2015) +// +// Множество - реализация через битовые поля + +#include "tset.h" + +TSet::TSet(int mp) : BitField(mp) +{ + +} + +// конструктор копирования +TSet::TSet(const TSet& s) : BitField(0) +{ +} + +// конструктор преобразования типа +TSet::TSet(const TBitField& bf) : BitField(0) +{ +} + +TSet::operator TBitField() +{ + return BitField; +} + +int TSet::GetMaxPower(void) const // получить макс. к-во эл-тов +{ + return MaxPower; +} + +int TSet::IsMember(const int Elem) const // элемент множества? +{ + return 0; +} + +void TSet::InsElem(const int Elem) // включение элемента множества +{ +} + +void TSet::DelElem(const int Elem) // исключение элемента множества +{ +} + +// теоретико-множественные операции + +TSet& TSet::operator=(const TSet& s) // присваивание +{ + return *this; +} + +int TSet::operator==(const TSet& s) const // сравнение +{ + return 0; +} + +int TSet::operator!=(const TSet& s) const // сравнение +{ + return 0; +} + +TSet TSet::operator+(const TSet& s) // объединение +{ + return TSet(0); +} + +TSet TSet::operator+(const int Elem) // объединение с элементом +{ + + return TSet(0); +} + +TSet TSet::operator-(const int Elem) // разность с элементом +{ + return TSet(0); +} + +TSet TSet::operator*(const TSet& s) // пересечение +{ + return TSet(0); +} + +TSet TSet::operator~(void) // дополнение +{ + return TSet(0); +} + +// перегрузка ввода/вывода + +istream& operator>>(istream& istr, TSet& s) // ввод +{ + return istr; +} + +ostream& operator<<(ostream& ostr, const TSet& s) // вывод +{ + return ostr; +} From a1a409c950eb82d37be44d82fae08311dd975734 Mon Sep 17 00:00:00 2001 From: Maria02179 <73477221+Maria02179@users.noreply.github.com> Date: Mon, 11 Oct 2021 11:34:50 +0300 Subject: [PATCH 2/7] Add files via upload From cd297a56940ac2c2527904113ae2efcf08f44520 Mon Sep 17 00:00:00 2001 From: Maria02179 <73477221+Maria02179@users.noreply.github.com> Date: Mon, 25 Oct 2021 18:33:41 +0300 Subject: [PATCH 3/7] Delete tbitfield.cpp --- tbitfield.cpp | 100 -------------------------------------------------- 1 file changed, 100 deletions(-) delete mode 100644 tbitfield.cpp diff --git a/tbitfield.cpp b/tbitfield.cpp deleted file mode 100644 index b7247f8b0..000000000 --- a/tbitfield.cpp +++ /dev/null @@ -1,100 +0,0 @@ -// ННГУ, ВМК, Курс "Методы программирования-2", С++, ООП -// -// tbitfield.cpp - Copyright (c) Гергель В.П. 07.05.2001 -// Переработано для Microsoft Visual Studio 2008 Сысоевым А.В. (19.04.2015) -// -// Битовое поле - -#include "tbitfield.h" - -#define BITS_IN_ONE_MEM (sizeof(TELEM) * 8) - -TBitField::TBitField(int len) -{ - -} - -TBitField::TBitField(const TBitField& bf) // конструктор копирования -{ -} - -TBitField::~TBitField() -{ -} - -int TBitField::GetMemIndex(const int n) const // индекс Мем для бита n -{ - return 0; -} - -TELEM TBitField::GetMemMask(const int n) const // битовая маска для бита n -{ - - return 0; -} - -// доступ к битам битового поля - -int TBitField::GetLength(void) const // получить длину (к-во битов) -{ - return 0; -} - -void TBitField::SetBit(const int n) // установить бит -{ - if ((n < 0) || (n > BitLen)) - throw 2; -} - -void TBitField::ClrBit(const int n) // очистить бит -{ -} - -int TBitField::GetBit(const int n) const // получить значение бита -{ - return 0; -} - -// битовые операции - -TBitField& TBitField::operator=(const TBitField & bf) // присваивание -{ - return *this; -} - -int TBitField::operator==(const TBitField & bf) const // сравнение -{ - return 0; -} - -int TBitField::operator!=(const TBitField & bf) const // сравнение -{ - return 0; -} - -TBitField TBitField::operator|(const TBitField & bf) // операция "или" -{ - return TBitField(0); -} - -TBitField TBitField::operator&(const TBitField & bf) // операция "и" -{ - return TBitField(0); -} - -TBitField TBitField::operator~(void) // отрицание -{ - return TBitField(0); -} - -// ввод/вывод - -istream& operator>>(istream & istr, TBitField & bf) // ввод -{ - return istr; -} - -ostream& operator<<(ostream & ostr, const TBitField & bf) // вывод -{ - return ostr; -} From deeaf587cdbcd30025ee91c976ea17c1c911debc Mon Sep 17 00:00:00 2001 From: Maria02179 <73477221+Maria02179@users.noreply.github.com> Date: Mon, 25 Oct 2021 18:33:57 +0300 Subject: [PATCH 4/7] Delete tset.cpp --- tset.cpp | 101 ------------------------------------------------------- 1 file changed, 101 deletions(-) delete mode 100644 tset.cpp diff --git a/tset.cpp b/tset.cpp deleted file mode 100644 index 38c6473d7..000000000 --- a/tset.cpp +++ /dev/null @@ -1,101 +0,0 @@ -// ННГУ, ВМК, Курс "Методы программирования-2", С++, ООП -// -// tset.cpp - Copyright (c) Гергель В.П. 04.10.2001 -// Переработано для Microsoft Visual Studio 2008 Сысоевым А.В. (19.04.2015) -// -// Множество - реализация через битовые поля - -#include "tset.h" - -TSet::TSet(int mp) : BitField(mp) -{ - -} - -// конструктор копирования -TSet::TSet(const TSet& s) : BitField(0) -{ -} - -// конструктор преобразования типа -TSet::TSet(const TBitField& bf) : BitField(0) -{ -} - -TSet::operator TBitField() -{ - return BitField; -} - -int TSet::GetMaxPower(void) const // получить макс. к-во эл-тов -{ - return MaxPower; -} - -int TSet::IsMember(const int Elem) const // элемент множества? -{ - return 0; -} - -void TSet::InsElem(const int Elem) // включение элемента множества -{ -} - -void TSet::DelElem(const int Elem) // исключение элемента множества -{ -} - -// теоретико-множественные операции - -TSet& TSet::operator=(const TSet& s) // присваивание -{ - return *this; -} - -int TSet::operator==(const TSet& s) const // сравнение -{ - return 0; -} - -int TSet::operator!=(const TSet& s) const // сравнение -{ - return 0; -} - -TSet TSet::operator+(const TSet& s) // объединение -{ - return TSet(0); -} - -TSet TSet::operator+(const int Elem) // объединение с элементом -{ - - return TSet(0); -} - -TSet TSet::operator-(const int Elem) // разность с элементом -{ - return TSet(0); -} - -TSet TSet::operator*(const TSet& s) // пересечение -{ - return TSet(0); -} - -TSet TSet::operator~(void) // дополнение -{ - return TSet(0); -} - -// перегрузка ввода/вывода - -istream& operator>>(istream& istr, TSet& s) // ввод -{ - return istr; -} - -ostream& operator<<(ostream& ostr, const TSet& s) // вывод -{ - return ostr; -} From 27dd05bc5474d2337b4199b2572c7169c1c2fbc4 Mon Sep 17 00:00:00 2001 From: Maria02179 <73477221+Maria02179@users.noreply.github.com> Date: Mon, 25 Oct 2021 18:36:48 +0300 Subject: [PATCH 5/7] Update tbitfield.cpp --- src/tbitfield.cpp | 143 ++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 125 insertions(+), 18 deletions(-) diff --git a/src/tbitfield.cpp b/src/tbitfield.cpp index f84822e87..f2a88b3db 100644 --- a/src/tbitfield.cpp +++ b/src/tbitfield.cpp @@ -9,92 +9,199 @@ #define BITS_IN_ONE_MEM (sizeof(TELEM) * 8) -TBitField::TBitField(int len) +TBitField::TBitField(int len) : BitLen(len) { - + if (len < 0) + throw len; + else + { + MemLen = (len + 15) >> 4; // в эл-те pМем 16 бит (TELEM==int) + pMem = new TELEM[MemLen]; + if (pMem != NULL) + for (int i = 0; i < MemLen; i++) pMem[i] = 0; + } } 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() { + delete[]pMem; } int TBitField::GetMemIndex(const int n) const // индекс Мем для бита n -{ - return 0; +{// преобразовать к int и разделить на 16 + if ((n < 0) || (n > BitLen)) + throw n; + else + return n >> 4; // в эл-те pМем 16 бит + } TELEM TBitField::GetMemMask(const int n) const // битовая маска для бита n { - - return 0; + if ((n < 0) || (n > BitLen)) + throw n; + else + { + return 1 << (n & 15); + } } // доступ к битам битового поля int TBitField::GetLength(void) const // получить длину (к-во битов) { - return 0; + return BitLen; } void TBitField::SetBit(const int n) // установить бит { if ((n < 0) || (n > BitLen)) - throw 2; + throw n; + else + pMem[GetMemIndex(n)] |= GetMemMask(n); } - void TBitField::ClrBit(const int n) // очистить бит { + + if ((n < 0) || (n > BitLen)) + throw n; + else + pMem[GetMemIndex(n)] &= ~GetMemMask(n); } int TBitField::GetBit(const int n) const // получить значение бита { - return 0; + if ((n < 0) || (n > BitLen)) + throw n; + else + { + int result = (GetMemMask(n) & pMem[GetMemIndex(n)]); + if (result == 0) + return(0); + else + return(1); + } } // битовые операции TBitField& TBitField::operator=(const TBitField & bf) // присваивание { + if (this != &bf) + { + delete []pMem; + BitLen = bf.BitLen; + MemLen = bf.MemLen; + pMem = new TELEM[MemLen]; + for (int i = 0; i < MemLen; i++) + pMem[i] = bf.pMem[i]; + } return *this; + } int TBitField::operator==(const TBitField & bf) const // сравнение { - return 0; + if (BitLen != bf.BitLen) + return 0; + else + { + for (int i = 0; i < BitLen; i++) + if (GetBit(i) != bf.GetBit(i)) + return 0; + return 1; + } } int TBitField::operator!=(const TBitField & bf) const // сравнение { - return 0; + if (BitLen != bf.BitLen) + return 1; + else + { + for (int i = 0; i < BitLen; i++) + if (GetBit(i) != bf.GetBit(i)) + return 1; + return 0; + } } TBitField TBitField::operator|(const TBitField & bf) // операция "или" { - return TBitField(0); + int i; + if (bf.BitLen > BitLen) BitLen = bf.BitLen; + TBitField tmp(BitLen); + for (i = 0; i < MemLen; i++) tmp.pMem[i] = pMem[i]; + for (i = 0; i < bf.MemLen; i++) tmp.pMem[i] |= bf.pMem[i]; + return tmp; } -TBitField TBitField::operator&(const TBitField & bf) // операция "и" +TBitField TBitField::operator&(const TBitField& bf) // операция "и" { - return TBitField(0); + if (BitLen == bf.BitLen) + { + int i; + + TBitField tmp(BitLen); + + for (i = 0; i < MemLen; i++) tmp.pMem[i] = pMem[i]; + + for (i = 0; i < bf.MemLen; i++) tmp.pMem[i] &= bf.pMem[i]; + + return tmp; + } + else + { + if (BitLen < bf.BitLen) BitLen = bf.BitLen; + TBitField tmp(BitLen); + for (int i = 0; i < bf.BitLen; i++) + { + int tmpval = (GetBit(i) && bf.GetBit(i)); + if (tmpval == 0) + tmp.ClrBit(i); + else + tmp.SetBit(i); + } + for (int i = bf.BitLen; i < BitLen; i++) + tmp.ClrBit(i); + return tmp; + } + } -TBitField TBitField::operator~(void) // отрицание +TBitField TBitField::operator~(void) // отрицание??? { - return TBitField(0); + TBitField tmp(BitLen); + for (int i = 0; i < MemLen; i++) //маску сделать + tmp.pMem[i] = ~pMem[i]; + return tmp; } // ввод/вывод istream& operator>>(istream & istr, TBitField & bf) // ввод { - return istr; + int i = 0; + while ((i >= 0) && (i < bf.BitLen)) + { + bf.SetBit(i); + istr >> i; + } + return istr; } ostream& operator<<(ostream & ostr, const TBitField & bf) // вывод { + for (int i = 0; i < bf.BitLen; i++) + ostr << bf.GetBit(i); return ostr; } From 457ec35a5faaeb6367e4ca2b5eef036c9a2ed83e Mon Sep 17 00:00:00 2001 From: Maria02179 <73477221+Maria02179@users.noreply.github.com> Date: Mon, 25 Oct 2021 18:37:38 +0300 Subject: [PATCH 6/7] Update tset.cpp --- src/tset.cpp | 46 ++++++++++++++++++++++++++++++++++------------ 1 file changed, 34 insertions(+), 12 deletions(-) diff --git a/src/tset.cpp b/src/tset.cpp index 97f74d7e9..6e41dd338 100644 --- a/src/tset.cpp +++ b/src/tset.cpp @@ -7,19 +7,22 @@ #include "tset.h" -TSet::TSet(int mp) : BitField(mp) +TSet::TSet(int mp = 100) : BitField(mp), MaxPower(mp) { - } // конструктор копирования TSet::TSet(const TSet& s) : BitField(0) { + MaxPower = s.MaxPower; + BitField = s.BitField; } // конструктор преобразования типа -TSet::TSet(const TBitField& bf) : BitField(0) +TSet::TSet(const TBitField& bf) : BitField(bf.GetLength()) { + BitField = bf; + MaxPower = bf.GetLength(); } TSet::operator TBitField() @@ -34,68 +37,87 @@ int TSet::GetMaxPower(void) const // получить макс. к-во эл-т int TSet::IsMember(const int Elem) const // элемент множества? { - return 0; + 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.MaxPower; return *this; } int TSet::operator==(const TSet& s) const // сравнение { - return 0; + return (MaxPower == s.MaxPower) && (BitField == s.BitField); } int TSet::operator!=(const TSet& s) const // сравнение { - return 0; + return ((MaxPower != s.MaxPower) || (BitField != s.BitField)); } TSet TSet::operator+(const TSet& s) // объединение { - return TSet(0); + TSet tmp(BitField | s.BitField); + return tmp; } TSet TSet::operator+(const int Elem) // объединение с элементом { - - return TSet(0); + TSet tmp(BitField); + tmp.InsElem(Elem); + return tmp; } TSet TSet::operator-(const int Elem) // разность с элементом { - return TSet(0); + TSet tmp(*this); + tmp.BitField.ClrBit(Elem); + return tmp; } TSet TSet::operator*(const TSet& s) // пересечение { - return TSet(0); + TSet tmp(BitField & s.BitField); + return tmp; } TSet TSet::operator~(void) // дополнение { - return TSet(0); + TSet tmp(~BitField); + return tmp; } // перегрузка ввода/вывода istream& operator>>(istream& istr, TSet& s) // ввод { + int i = 0; + while ((i >= 0) && (i < s.MaxPower)) + { + s.InsElem(i); + istr >> i; + } return istr; } ostream& operator<<(ostream& ostr, const TSet& s) // вывод { + for (int i = 0; i < s.MaxPower; i++) + if (s.BitField.GetBit(i)) + ostr << i; return ostr; } From 2374476bba505f80b7eb73944b223cd34a07f0f3 Mon Sep 17 00:00:00 2001 From: Maria02179 <73477221+Maria02179@users.noreply.github.com> Date: Mon, 27 Dec 2021 23:11:53 +0300 Subject: [PATCH 7/7] Update tbitfield.cpp --- src/tbitfield.cpp | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/tbitfield.cpp b/src/tbitfield.cpp index f2a88b3db..c3b04585b 100644 --- a/src/tbitfield.cpp +++ b/src/tbitfield.cpp @@ -15,7 +15,7 @@ TBitField::TBitField(int len) : BitLen(len) throw len; else { - MemLen = (len + 15) >> 4; // в эл-те pМем 16 бит (TELEM==int) + MemLen = (len + 15) >> 4; pMem = new TELEM[MemLen]; if (pMem != NULL) for (int i = 0; i < MemLen; i++) pMem[i] = 0; @@ -41,7 +41,7 @@ int TBitField::GetMemIndex(const int n) const // индекс Мем для би if ((n < 0) || (n > BitLen)) throw n; else - return n >> 4; // в эл-те pМем 16 бит + return n >> 4; } @@ -178,11 +178,14 @@ TBitField TBitField::operator&(const TBitField& bf) // операция "и" } -TBitField TBitField::operator~(void) // отрицание??? -{ - TBitField tmp(BitLen); - for (int i = 0; i < MemLen; i++) //маску сделать - tmp.pMem[i] = ~pMem[i]; +TBitField TBitField::operator~(void) { // отрицание + TBitField tmp = (*this); + for (size_t i = 0; i < BitLen; i++) { + if (tmp.GetBit(i)) + tmp.ClrBit(i); + else + tmp.SetBit(i); + } return tmp; }