Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

First Upload #10

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
88 changes: 75 additions & 13 deletions src/tbitfield.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,80 +7,142 @@

#include "tbitfield.h"

TBitField::TBitField(int len)
TBitField::TBitField(int len) : BitLen(len)
{
if (len < 0) throw std::invalid_argument("error");
MemLen = BitLen / (8 * sizeof(TELEM)) + 1;
pMem = new TELEM[MemLen];
for (int i = 0; i < MemLen; i++) { pMem[i] = 0; }
}

TBitField::TBitField(const TBitField &bf) // конструктор копирования
TBitField::TBitField(const TBitField& bf) // конструктор копирования
{
BitLen = bf.BitLen;
MemLen = bf.MemLen;
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
{
if ((n < 0) | (n > BitLen)) throw invalid_argument("error");
return n / (sizeof(TELEM) * 8);
}

TELEM TBitField::GetMemMask(const int n) const // битовая маска для бита n
{
if ((n < 0) | (n > BitLen)) throw invalid_argument("error");
TELEM result = (1 << (n % (sizeof(TELEM) * 8)));
return result;
}

// доступ к битам битового поля

int TBitField::GetLength(void) const // получить длину (к-во битов)
{
return 0;
return BitLen;
}

void TBitField::SetBit(const int n) // установить бит
{
if ((n < 0) | (n > BitLen)) throw invalid_argument("error");
pMem[GetMemIndex(n)] |= GetMemMask(n);
}

void TBitField::ClrBit(const int n) // очистить бит
{
if ((n < 0) | (n > BitLen)) throw invalid_argument("error");
pMem[GetMemIndex(n)] &= ~GetMemMask(n);
}

int TBitField::GetBit(const int n) const // получить значение бита
{
return 0;
if ((n < 0) | (n > BitLen)) throw invalid_argument("error");
return ((pMem[GetMemIndex(n)] & GetMemMask(n)) > 0) ? 1 : 0;
}

// битовые операции

TBitField& TBitField::operator=(const TBitField &bf) // присваивание
TBitField& TBitField::operator=(const TBitField& bf) // присваивание
{
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 // сравнение
int TBitField::operator==(const TBitField& bf) const // сравнение
{
return 0;
if (BitLen != bf.BitLen) return 0;
for (int i = 0; i < BitLen;i++) {
if (GetBit(i) != bf.GetBit(i)) return 0;
}
return 1;
}

int TBitField::operator!=(const TBitField &bf) const // сравнение
int TBitField::operator!=(const TBitField& bf) const // сравнение
{
return 0;
if (BitLen != bf.BitLen) return 1;
for (int i = 0; i < BitLen;i++) {
if (GetBit(i) != bf.GetBit(i)) return 1;
}
return 0;
}

TBitField TBitField::operator|(const TBitField &bf) // операция "или"
TBitField TBitField::operator|(const TBitField& bf) // операция "или"
{
TBitField result(GetLength() >= bf.GetLength() ? *this : bf);
for (int i = 0; i < (BitLen < bf.BitLen ? BitLen : bf.BitLen); i++)
if ((GetBit(i) | bf.GetBit(i)) > 0) result.SetBit(i);
return result;
}

TBitField TBitField::operator&(const TBitField &bf) // операция "и"
TBitField TBitField::operator&(const TBitField& bf) // операция "и"
{
int max_len = BitLen > bf.BitLen ? BitLen : bf.BitLen;
int min_len = BitLen + bf.BitLen - max_len;
TBitField result(max_len);
for (int i = 0; i < min_len; i++)
if (GetBit(i) & bf.GetBit(i)) result.SetBit(i);
else result.ClrBit(i);
for (int i = min_len; i < max_len; i++) result.ClrBit(i);
return result;
}

TBitField TBitField::operator~(void) // отрицание
{
TBitField result(BitLen);
for (int i = 0; i < BitLen; i++)
if (GetBit(i)) result.ClrBit(i);
else result.SetBit(i);
return result;
}

// ввод/вывод

istream &operator>>(istream &istr, TBitField &bf) // ввод
istream& operator>>(istream& istr, TBitField& bf) // ввод
{
int sign;
for (int i = 0; i < bf.BitLen; i++) {
istr >> sign;
if (sign == 1) bf.SetBit(bf.BitLen - i - 1);
else if (sign == 0) bf.ClrBit(bf.BitLen - i - 1);
else i--;
}
return istr;
}

ostream &operator<<(ostream &ostr, const TBitField &bf) // вывод
ostream& operator<<(ostream& ostr, const TBitField& bf) // вывод
{
ostr << "{ ";
for (int i = bf.BitLen - 1; i >= 0; i--)
ostr << bf.GetBit(i) << " ";
ostr << "}";
return ostr;
}
65 changes: 44 additions & 21 deletions src/tset.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,85 +4,108 @@
// Переработано для Microsoft Visual Studio 2008 Сысоевым А.В. (19.04.2015)
//
// Множество - реализация через битовые поля
// ННГУ, ВМК, Курс "Методы программирования-2", С++, ООП
//
// tset.cpp - Copyright (c) Гергель В.П. 04.10.2001
// Переработано для Microsoft Visual Studio 2008 Сысоевым А.В. (19.04.2015)
//
// Множество - реализация через битовые поля

#include "tset.h"

TSet::TSet(int mp) : BitField(-1)
{
}
// Fake variables used as placeholders in tests
static const int FAKE_INT = -1;
static TBitField FAKE_BITFIELD(1);
static TSet FAKE_SET(1);

TSet::TSet(int mp) : MaxPower(mp), BitField(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()
{
}
TSet::operator TBitField() { return BitField; }

int TSet::GetMaxPower(void) const // получить макс. к-во эл-тов
{
return MaxPower;
}

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) // присваивание
TSet& TSet::operator=(const TSet& s) // присваивание
{
MaxPower = s.MaxPower;
BitField = TBitField(s.BitField);
return *this;
}

int TSet::operator==(const TSet &s) const // сравнение
int TSet::operator==(const TSet& s) const // сравнение
{
return 0;
return BitField == s.BitField;
}

int TSet::operator!=(const TSet &s) const // сравнение
int TSet::operator!=(const TSet& s) const // сравнение
{
return BitField != s.BitField;
}

TSet TSet::operator+(const TSet &s) // объединение
TSet TSet::operator+(const TSet& s) // объединение
{
return TSet(BitField | (s.BitField));
}

TSet TSet::operator+(const int Elem) // объединение с элементом
{
TSet tmp(*this);
tmp.InsElem(Elem);
return tmp;
}

TSet TSet::operator-(const int Elem) // разность с элементом
{
TSet tmp(*this);
tmp.DelElem(Elem);
return tmp;
}

TSet TSet::operator*(const TSet &s) // пересечение
TSet TSet::operator*(const TSet& s) // пересечение
{
return TSet(BitField & (s.BitField));
}

TSet TSet::operator~(void) // дополнение
{
return TSet(~BitField);
}

// перегрузка ввода/вывода

istream &operator>>(istream &istr, TSet &s) // ввод
istream& operator>>(istream& istr, TSet& s) // ввод
{
istr >> s.BitField;
return istr;
}

ostream& operator<<(ostream &ostr, const TSet &s) // вывод
ostream& operator<<(ostream& ostr, const TSet& s)
{
ostr << s.BitField;
return ostr;
}