From cd1fc498adc62d01dc652120c08f203c27c82c0d Mon Sep 17 00:00:00 2001 From: soldsven Date: Sat, 11 Jun 2022 14:03:08 +0300 Subject: [PATCH 1/7] Animals Vectors --- animals/animal.cpp | 201 ++++++++++++++++++++++++++++++++++++++++++++- vectors/vector.cpp | 95 ++++++++++++++++----- 2 files changed, 274 insertions(+), 22 deletions(-) diff --git a/animals/animal.cpp b/animals/animal.cpp index 6745215e..4a12fb4c 100644 --- a/animals/animal.cpp +++ b/animals/animal.cpp @@ -1,7 +1,204 @@ -#include "animal.h" +#include +#include +#include using namespace std; -int main() { +class Animal +{ +private: + int Age; //возраст в годах + float Weight; //вес в кг + +public: + + int getAge() const { return Age; } + void setAge(int ValueAge) { Age = ValueAge; } + + float getWeight() const { return Weight; } + void setWeight(float ValueWeight) { Weight = ValueWeight; } + + virtual string about() const { return (stringstream() << "Age = "<< Age <<", "<<"Weight = "< -#include "vector.h" +#include +#include using namespace std; -ostream& operator <<(ostream& os, const vector3d& v) { - return os << "{ " << v[0] << ", " << v[1] << ", " << v[2] << " }"; -} +class Vector3d { +public: + + float data[3]; + + Vector3d() { data[2] = data[1] = data[0] = 0; } + Vector3d(float value) { data[2] = data[1] = data[0] = value; } + Vector3d(float b1, float b2, float b3) { data[0] = b1; data[1] = b2; data[2] = b3; } + + float operator[](int idx) const { return data[idx]; } + float& operator[](int idx) { return data[idx]; } -int main(int argc, char** argv) { - vector3d v1, v2(12), v3(1, 3, 8); - v1[2] = 54; - //vector3d v4 = v1 + v2, v5 = v1 - v2, v6 = v1 * 0.5f; - //cout << "v4: " << v4 << endl << "v5: " << v5 << endl << "v6: " << v6 << endl; - - printf("address of v1: 0x%p, size: %zu bytes\n", &v1, sizeof(v1)); - printf("address of v1.data: 0x%p, size: %zu bytes\n", &v1.data, sizeof(v1.data)); - printf("address of v1.data[-1]: 0x%p, size: %zu bytes\n", &v1.data[-1], sizeof(v1.data[-1])); - printf("address of v1.data[0]: 0x%p, size: %zu bytes\n", &v1.data[0], sizeof(v1.data[0])); - printf("address of v1.data[1]: 0x%p, size: %zu bytes\n", &v1.data[1], sizeof(v1.data[1])); - printf("address of v1.data[2]: 0x%p, size: %zu bytes\n", &v1.data[2], sizeof(v1.data[2])); - printf("address of v1.data[2000]: 0x%p, size: %zu bytes\n", &v1.data[2000], sizeof(v1.data[2000])); - - return 0; + Vector3d operator +(const Vector3d& v2) const { + return Vector3d(data[0] + v2[0], data[1] + v2[1], data[2] + v2[2]); + }; + Vector3d operator -(const Vector3d& v2) { + return Vector3d(data[0] - v2[0], data[1] - v2[1], data[2] - v2[2]); + }; + Vector3d operator *(const float k) { + return Vector3d(data[0] * k, data[1] * k, data[2] * k); + }; + Vector3d operator /(const float k) { + return Vector3d(data[0] / k, data[1] / k, data[2] / k); + }; + Vector3d operator-() { + return Vector3d(-data[0], -data[1], -data[2]); + }; + Vector3d operator !() { + if ((data[0] == 0) && (data[1] == 0) && (data[2] == 0)) + return Vector3d(0); + else + return Vector3d(1); + }; +}; + +ostream& operator <<(ostream& os, const Vector3d& v) { + return os << "{" << v[0] << "," << v[1] << "," << v[2] << "}"; +}; + +bool test_Vector3d() { + Vector3d v1; + Vector3d v2(2, 4, 6); + Vector3d v3(8, 5, 11); + Vector3d v4 = v2 + v3, v5 = v3 - v2, v6 = v2 * 3, v7 = v2 / 2, v8 = -v3, v9 = !v1, v10 = !v2; + if (v4.data[0] != v2.data[0]+ v3.data[0] || v4.data[1] != v2.data[1] + v3.data[1] || v4.data[2] != v2.data[2] + v3.data[2]) { + cerr << "Сложение векторов выполнено неверно" << endl; + return 1; + } + if (v5.data[0] != v3.data[0] - v2.data[0] || v5.data[1] != v3.data[1] - v2.data[1] || v5.data[2] != v3.data[2] - v2.data[2]) { + cerr << "Вычитание векторов выполнено неверно" << endl; + return 1; + } + if (v6.data[0] != v2.data[0]*3 || v6.data[1] != v2.data[1] * 3 || v6.data[2] != v2.data[2] * 3) { + cerr << "Умножение на скаляр выполнено неверно" << endl; + return 1; + } + if (v7.data[0] != v2.data[0] /2 || v7.data[1] != v2.data[1] / 2 || v7.data[2] != v2.data[2] / 2) { + cerr << "Деление на скаляр выполнено неверно" << endl; + return 1; + } + if (v8.data[0] != -v3.data[0] || v8.data[1] != -v3.data[1] || v8.data[2] != -v3.data[2]) { + cerr << "Инвертирование знака выполнено неверно" << endl; + return 1; + } + if (v9.data[0] != 1 || v9.data[1] != 1 || v9.data[2] != 1) { + cerr << "Логическое отрицание выполнено неаверно" << endl; + return 1; + } + if (v10.data[0] != 0 || v10.data[1] != 0 || v10.data[2] != 0) { + cerr << "Логическое отрицание выполнено неаверно" << endl; + return 1; + } + return 0; } + From 97f794bb1476ae067057814dca08fe867d568f28 Mon Sep 17 00:00:00 2001 From: Stepan Khorin <90862586+soldsven@users.noreply.github.com> Date: Wed, 15 Jun 2022 15:34:43 +0300 Subject: [PATCH 2/7] Add files via upload --- memhacks/memhacks.cpp | 129 +++++++++++++++++++++++------------------- memhacks/memhacks.h | 79 ++++++++++++++++---------- memhacks/newhacks.cpp | 0 memhacks/newhacks.h | 34 +++++++++++ 4 files changed, 155 insertions(+), 87 deletions(-) create mode 100644 memhacks/newhacks.cpp create mode 100644 memhacks/newhacks.h diff --git a/memhacks/memhacks.cpp b/memhacks/memhacks.cpp index 514c8689..17688459 100644 --- a/memhacks/memhacks.cpp +++ b/memhacks/memhacks.cpp @@ -1,57 +1,72 @@ -#include -#include "memhacks.h" - -using namespace std; - -B::B() : b_s("It's b!") { - for (auto i = 0; i < sizeof(data) / sizeof(data[0]); i++) - data[i] = i * 2; -} - -/// -/// Выводит на экран адреса и размеры объекта типа и его содержимого. -/// Можно модифицировать для собственных отладочных целей. -/// -/// Изучаемый объект -void printInternals(const B& b) { - const A* a = &b, * a2 = a + 1; - cout << "Address of b is 0x" << &b << ", address of b.a_s is 0x" << &b.a_s << ", address of b.b_s is 0x" << &b.b_s << endl; - cout << "Size of A is " << sizeof(A) << ", size of B is " << sizeof(B) << endl; - cout << "B string is '" << b.getBString() << "'" << endl; - //cout << "B data: "; b.printData(cout); cout << endl; -} - -/// -/// Извлекает значение из текущего объекта. -/// Подразумевается, что текущий объект на самом деле представлено классом . -/// -/// Значение B::b_s -std::string A::getBString() const { - // TODO -} - -/// -/// Извлекает значения , и -/// из текущего объекта и выводит их в текстовом виде в указанный выходной поток -/// с помощью адресной арифметики. -/// Подразумевается, что текущий объект на самом деле представлено классом . -/// -void A::printData(std::ostream& os) { - // TODO -} - -/// -/// Извлекает значения , и -/// из текущего объекта и выводит их в текстовом виде в указанный выходной поток -/// с помощью виртуальных функций, предусмотренных в классе . -/// -void A::printData2(std::ostream& os) { - // TODO -} - -int main() -{ - B b; - printInternals(b); - return 0; -} +#include +#include "memhacks.h" +#include +using namespace std; +A::A() : a_s("It's a!") { } + +B::B() : b_s("It's b!") { + for (int i = 0; i < sizeof(data) / sizeof(data[0]); i++) + data[i] = i * 2; +} + + +/// +/// Выводит на экран адреса и размеры объекта типа и его содержимого. +/// Можно модифицировать для собственных отладочных целей. +/// +/// Изучаемый объект +void printInternals(const B& b) { + const A* a = &b, * a2 = a + 1; + cout << "Address of b is 0x" << &b << ", address of b.a_s is 0x" << &b.a_s << ", address of b.b_s is 0x" << &b.b_s << endl; + cout << "Size of A is " << sizeof(A) << ", size of B is " << sizeof(B) << endl; + cout << "B string is '" << b.getBString() << "'" << endl; +} +/// +/// Извлекает значение из текущего объекта. +/// Подразумевается, что текущий объект на самом деле представлено классом . +/// +/// Значение B::b_s +std::string A::getBString() const {return *(( const string *)(this+1)); } + +std::string A::getAString() const { return *(( const string *)(this+1)-3); } + +float A::getdataFloat(int i) const { return *(( const float *)(this+2)-4+i); } + +// +2=4 +4=0 + +/// +/// Извлекает значения , и +/// из текущего объекта и выводит их в текстовом виде в указанный выходной поток +/// с помощью адресной арифметики. +/// Подразумевается, что текущий объект на самом деле представлено классом . +/// +void printData(std::ostream& os, const A& a, const B& b) { + os << "A string is '" << b.getAString() << "'" << endl; + os << "B string is '" << b.getBString() << "'" << endl; + os << "Data: "; + for (int i=0;i<7;i++){ + os << b.getdataFloat(i) << "; "; + } +} + +/// +/// Извлекает значения , и +/// из текущего объекта и выводит их в текстовом виде в указанный выходной поток +/// с помощью виртуальных функций, предусмотренных в классе . +/// +void B::printData2(std::ostream& os) { + os << aboutA(); + os << aboutB(); +} +using namespace std; +int main() +{ + B b; + A a; + printInternals(b); + cout << "MEMHACKS:" << endl; + printData(cout,a,b); + cout << endl << "STANDART:" << endl; + b.printData2(cout); + return 0; +} diff --git a/memhacks/memhacks.h b/memhacks/memhacks.h index 51076b55..bbb29d3a 100644 --- a/memhacks/memhacks.h +++ b/memhacks/memhacks.h @@ -1,30 +1,49 @@ -#pragma once - -#include -#include - -class B; // чтобы можно было объявить printInternals() как friend в классе A - -class A { - std::string a_s; - int foo; - - friend void printInternals(const B&); - -public: - std::string getBString() const; - void printData(std::ostream& os); - void printData2(std::ostream& os); -}; - -class B : public A { - std::string b_s; - float data[7]; - - friend void printInternals(const B&); - -public: - B(); -}; - -void printInternals(const B& b); +#pragma once + +#include +#include +#include +using namespace std; +class B; // чтобы можно было объявить printInternals() как friend в классе A + +class A { + std::string a_s; + int foo; + friend void printInternals(const B&); + +public: + A(); + std::string getAString() const; + std::string getBString() const; + float getdataFloat(int i) const; + virtual string aboutA() const { + stringstream ss; + ss << "String A: " << a_s; + return ss.str(); + } + void printData(std::ostream& os, const A& a, const B& b); +}; + +class B : public A { + std::string b_s; + friend void printInternals(const B&); + float data[7]; + +public: + B(); + string get_b_s(){return b_s;} + float get_data(int i){return data[i];} + virtual string aboutB() { + stringstream ss; + ss << "String B: " << get_b_s() << endl; + ss << "Data : "; + for (int i=0;i<7;i++){ + ss << get_data(i) << "; "; + } + cout << endl; + return ss.str(); + } + void printData2(std::ostream& os); +}; + +void printInternals(const B& b); diff --git a/memhacks/newhacks.cpp b/memhacks/newhacks.cpp new file mode 100644 index 00000000..e69de29b diff --git a/memhacks/newhacks.h b/memhacks/newhacks.h new file mode 100644 index 00000000..a53a2326 --- /dev/null +++ b/memhacks/newhacks.h @@ -0,0 +1,34 @@ +#pragma once + +#include +#include +#include +#include + + +class foo +{ + int x; + std:: string str="Hello world"; +public: + static void* operator new (size_t size); + static void operator delete (void *p); +}; + +class Bar : foo +{ + char data[20]; + bool t; +public: + static void* operator new (size_t size); + static void operator delete (void *p); +}; +class Buz : foo +{ + double y; + float b; +public: + static void operator delete (void *p); +private: + static void* operator new (size_t size); +}; \ No newline at end of file From 5f8f8c4be78410d59ad27d0447cbd87c16c2d6cc Mon Sep 17 00:00:00 2001 From: Stepan Khorin <90862586+soldsven@users.noreply.github.com> Date: Wed, 15 Jun 2022 15:39:24 +0300 Subject: [PATCH 3/7] Add files via upload --- memhacks/newhacks.cpp | 77 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) diff --git a/memhacks/newhacks.cpp b/memhacks/newhacks.cpp index e69de29b..7f2e46d7 100644 --- a/memhacks/newhacks.cpp +++ b/memhacks/newhacks.cpp @@ -0,0 +1,77 @@ +#include +#include +#include "newhacks.h" + +using namespace std; +void printInfofoo(foo a) +{ + cerr << "foo: Creat object in stack in adress:" << &a << endl; +} +void printInfoBar(Bar a) +{ + cerr << "Bar: Creat object in stack in adress:" << &a << endl; +} +void printInfoBuz(Buz a) +{ + cerr << "Buz: Creat object in stack in adress:" << &a << endl; +} +void* foo::operator new(size_t size) +{ + typeof(malloc(size)) p = malloc(size); + cerr << "foo: operator new(" << size << ") adress: " << p << endl; + return p; +} +void foo::operator delete(void* p) +{ + free(p); + cerr << "foo: operator delete(" << p << ")" << endl; +} + +void* Bar::operator new(size_t size) +{ + typeof(malloc(size)) p = malloc(size); + cerr << "Bar: operator new(" << size << ") adress: " << p << endl; + return p; +} +void Bar::operator delete(void* p) +{ + free(p); + cerr << "Bar: operator delete(" << p << ")" << endl; +} +void* Buz::operator new(size_t size) +{ + typeof(malloc(size)) p = malloc(size); + cerr << "Buz: operator new(" << size << ") adress: " << p << endl; + return p; +} +void Buz::operator delete(void* p) +{ + free(p); + cerr << "Buz: operator delete(" << p << ")" << endl; +} +int main(){ + foo *obj1 = new foo; + delete obj1; + obj1 =new foo; + delete obj1; + Bar *obj2 = new Bar; + delete obj2; + obj2 = new Bar; + delete obj2; + /* Нельзя создавать объект типа Buz в динамической памяти, добавили его в private: + Buz *obj3 = new Buz; + delete obj3; + obj3 = new Buz; + delete obj3; + */ + foo obj12,obj13; + printInfofoo(obj12); + printInfofoo(obj13); + Bar obj22,obj23; + printInfoBar(obj22); + printInfoBar(obj23); + Buz obj32,obj33; + printInfoBuz(obj32); + printInfoBuz(obj33); + return 0; +} \ No newline at end of file From ca819c5bcdeb23fa7fd2a09c246d3c6fa377d8d8 Mon Sep 17 00:00:00 2001 From: Stepan Khorin <90862586+soldsven@users.noreply.github.com> Date: Wed, 15 Jun 2022 15:41:45 +0300 Subject: [PATCH 4/7] Add files via upload --- memhacks/electricity.cpp | 115 ++++++++++++++++++++++++++++++ memhacks/electricity.h | 148 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 263 insertions(+) create mode 100644 memhacks/electricity.cpp create mode 100644 memhacks/electricity.h diff --git a/memhacks/electricity.cpp b/memhacks/electricity.cpp new file mode 100644 index 00000000..de5ef7af --- /dev/null +++ b/memhacks/electricity.cpp @@ -0,0 +1,115 @@ +#include +#include "electricity.h" + +using namespace std; + +bool Object::isConnectedTo(const Object& other) const +{ + for (int i=1;i<=getPoleCount();i++){ + for (int j=1;j<=other.getPoleCount();j++){ + if (getPole(i)->connectedObjectPole==other.getPole(j)->name && getPole(i)->name!=other.getPole(j)->name) + return true; + } + } + return false; +} + +bool Object::connect(const std::string& poleName, const Object& other, const std::string& otherPoleName) +{ + if (poleName!=otherPoleName){ + getPole(poleName)->connectedObject=const_cast(&other); + getPole(poleName)->connectedObjectPole=otherPoleName; + getPole(otherPoleName)->connectedObjectPole=poleName; + getPole(otherPoleName)->connectedObject=const_cast(this); + return true; + } + return false; +} + +Switch::Switch(const std::string& name) + : Object(name) + , a1("A1") + , a2("A2") +{} +Light::Light(const std::string & name) + : Object(name) + , a1("A1") + , a2("A2") +{} +Generator::Generator(const std::string & name) + : Object(name) + , a1("A1") //Faza ~ фаза + , a2("A2") //Neytral ~ нейтраль + , a3("A3") //Zemly ~ земля +{} + +const Pole* Switch::getPole(const string& name) const +{ + if (name == a1.name) + return &a1; + if (name == a2.name) + return &a2; + return nullptr; +} + +const Pole* Switch::getPole(size_t idx) const +{ + if (idx==1) + return &a1; + if (idx==2) + return &a2; + return nullptr; +} +const Pole* Light::getPole(const string& name) const +{ + if (name == a1.name) + return &a1; + if (name == a2.name) + return &a2; + return nullptr; +} + +const Pole* Light::getPole(size_t idx) const +{ + if (idx==1) + return &a1; + if (idx==2) + return &a2; + return nullptr; +} +const Pole* Generator::getPole(const string& name) const +{ + if (name == a1.name) + return &a1; + if (name == a2.name) + return &a2; + if (name == a3.name) + return &a3; + return nullptr; +} + +const Pole* Generator::getPole(size_t idx) const +{ + if (idx==1) + return &a1; + if (idx==2) + return &a2; + if (idx==3) + return &a3; + return nullptr; +} +int main() +{ + Switch sw, sw2; + sw.connect("A2", sw2, "A1"); + cout << "is " << (sw.isConnectedTo(sw2) ? "" : "not ") << "connected" << endl; + //создать цепь из генератора, выключателя и светильника + Switch sw1; + Light lamp; + Generator gen; + gen.connect("A2",lamp,"A1"); // Нейтраль с 1ым полюсом лампы + gen.connect("A1",lamp,"A2"); // Фаза со 2ым полюсаом лампы + gen.connect("A2",sw1,"A1"); // Нейтраль с 1ым полюсом переключателя + gen.connect("A3",sw1,"A2"); //Земля со 2ым полюсом переключателя + return 0; +} \ No newline at end of file diff --git a/memhacks/electricity.h b/memhacks/electricity.h new file mode 100644 index 00000000..5c7c6e6e --- /dev/null +++ b/memhacks/electricity.h @@ -0,0 +1,148 @@ +#pragma once +#include + +class Object; + +/// +/// Полюс устройства. +/// К одному полюсу может быть подключен один любой другой полюс этого же +/// устройства, или же любой полюс любого другого устройства. +/// +/// У каждого полюса есть своё название, которое получает значение по умолчанию +/// при создании устройства, но может быть изменено позднее. +/// +struct Pole { + /// + /// Название полюса. + /// Должно быть уникальным в пределах устройства. + /// + std::string name; + + /// + /// Устройство, подключенное к данному полюсу. + /// Может совпадать с устройством, содержащим данный полюс, при условии, что соединяются + /// два разных полюса. + /// Значение nullptr означает, что к данному полюсу ничего не подключено. + /// + Object* connectedObject; + + /// + /// Полюс устройства, к которому подключен данный полюс. + /// + std::string connectedObjectPole; + + Pole(const std::string& name_) : name(name_), connectedObject(nullptr) {} +}; + +/// +/// Электротехническое устройство. +/// Имеет произвольное неотрицательное количество полюсов (), +/// через которые может соединяться с другими устройствами. +/// +class Object { + std::string name; + +protected: + Object(const std::string& name_) : name(name_) {} + + /// + /// Возвращает полюс по внутреннему индексу устройства. + /// + /// Индекс полюса, от 0 до значения, возвращаемого . + /// Полюс с указанным индексом, или nullptr, если такой полюс не существует. + Pole* getPole(size_t idx); + + /// + /// Возвращает полюс по внутреннему индексу устройства. + /// + /// Индекс полюса, от 0 до значения, возвращаемого . + /// Полюс с указанным индексом, или nullptr, если такой полюс не существует. + virtual const Pole* getPole(size_t idx) const = 0; + +public: + virtual ~Object() {} + + const std::string& getName() const { return name; } + void getName(const std::string &newName) { name = newName; } + /// + /// Возвращает полюс по имени. + /// + /// Имя полюса. + /// Полюс с указанным именем, или nullptr, если такой полюс не существует. + Pole* getPole(const std::string& name) { return const_cast(const_cast(this)->getPole(name)); } + + /// + /// Возвращает полюс по имени. + /// + /// Имя полюса. + /// Полюс с указанным именем, или nullptr, если такой полюс не существует. + virtual const Pole* getPole(const std::string& name) const = 0; + + /// Количество полюсов в текущем устройстве. + virtual size_t getPoleCount() const = 0; + + /// + /// Проверяет, связаны ли два указанных устройства напрямую через какую-либо пару их полюсов. + /// + /// Устройство, наличие прямой связи с которым проверяется. + /// true если устройства связаны напрямую, false в противном случае. + bool isConnectedTo(const Object& other) const; + + /// + /// Соединяет указанные полюса текущего и указанного устройства. + /// Если к этим полюсам было что-то подключено, то такая связь разрушается. + /// + /// Название подключаемого полюса текущего устройства + /// Устройство, которое связывается с текущим. + /// Название подключаемого полюса другого устройства + /// + /// Может использоваться для связи устройства с самим собой. + /// В этом случае в качестве следует передать то же устройство, + /// для которого вызывается этот метод. + /// + bool connect(const std::string& poleName, const Object& other, const std::string& otherPoleName); +}; + +/// +/// Простой выключатель с двумя полюсами. +/// +class Switch : public Object { +public: + Pole a1, a2; + + Switch(const std::string& name = ""); + + virtual size_t getPoleCount() const { return 2; } + + virtual const Pole* getPole(const std::string& name) const; + +protected: + virtual const Pole* getPole(size_t idx) const; +}; + +class Light : public Object { +public: + Pole a1, a2; + + Light(const std::string& name = ""); + + virtual size_t getPoleCount() const { return 2; } + + virtual const Pole* getPole(const std::string& name) const; + +protected: + virtual const Pole* getPole(size_t idx) const; +}; +class Generator : public Object { +public: + Pole a1,a2,a3; + + Generator(const std::string& name = ""); + + virtual size_t getPoleCount() const { return 3; } + + virtual const Pole* getPole(const std::string& name) const; + +protected: + virtual const Pole* getPole(size_t idx) const; +}; From fc8e62b1a9a2deb807be2ed6745dbf8e777640dd Mon Sep 17 00:00:00 2001 From: Stepan Khorin <90862586+soldsven@users.noreply.github.com> Date: Wed, 15 Jun 2022 15:45:07 +0300 Subject: [PATCH 5/7] Delete electricity.cpp --- memhacks/electricity.cpp | 115 --------------------------------------- 1 file changed, 115 deletions(-) delete mode 100644 memhacks/electricity.cpp diff --git a/memhacks/electricity.cpp b/memhacks/electricity.cpp deleted file mode 100644 index de5ef7af..00000000 --- a/memhacks/electricity.cpp +++ /dev/null @@ -1,115 +0,0 @@ -#include -#include "electricity.h" - -using namespace std; - -bool Object::isConnectedTo(const Object& other) const -{ - for (int i=1;i<=getPoleCount();i++){ - for (int j=1;j<=other.getPoleCount();j++){ - if (getPole(i)->connectedObjectPole==other.getPole(j)->name && getPole(i)->name!=other.getPole(j)->name) - return true; - } - } - return false; -} - -bool Object::connect(const std::string& poleName, const Object& other, const std::string& otherPoleName) -{ - if (poleName!=otherPoleName){ - getPole(poleName)->connectedObject=const_cast(&other); - getPole(poleName)->connectedObjectPole=otherPoleName; - getPole(otherPoleName)->connectedObjectPole=poleName; - getPole(otherPoleName)->connectedObject=const_cast(this); - return true; - } - return false; -} - -Switch::Switch(const std::string& name) - : Object(name) - , a1("A1") - , a2("A2") -{} -Light::Light(const std::string & name) - : Object(name) - , a1("A1") - , a2("A2") -{} -Generator::Generator(const std::string & name) - : Object(name) - , a1("A1") //Faza ~ фаза - , a2("A2") //Neytral ~ нейтраль - , a3("A3") //Zemly ~ земля -{} - -const Pole* Switch::getPole(const string& name) const -{ - if (name == a1.name) - return &a1; - if (name == a2.name) - return &a2; - return nullptr; -} - -const Pole* Switch::getPole(size_t idx) const -{ - if (idx==1) - return &a1; - if (idx==2) - return &a2; - return nullptr; -} -const Pole* Light::getPole(const string& name) const -{ - if (name == a1.name) - return &a1; - if (name == a2.name) - return &a2; - return nullptr; -} - -const Pole* Light::getPole(size_t idx) const -{ - if (idx==1) - return &a1; - if (idx==2) - return &a2; - return nullptr; -} -const Pole* Generator::getPole(const string& name) const -{ - if (name == a1.name) - return &a1; - if (name == a2.name) - return &a2; - if (name == a3.name) - return &a3; - return nullptr; -} - -const Pole* Generator::getPole(size_t idx) const -{ - if (idx==1) - return &a1; - if (idx==2) - return &a2; - if (idx==3) - return &a3; - return nullptr; -} -int main() -{ - Switch sw, sw2; - sw.connect("A2", sw2, "A1"); - cout << "is " << (sw.isConnectedTo(sw2) ? "" : "not ") << "connected" << endl; - //создать цепь из генератора, выключателя и светильника - Switch sw1; - Light lamp; - Generator gen; - gen.connect("A2",lamp,"A1"); // Нейтраль с 1ым полюсом лампы - gen.connect("A1",lamp,"A2"); // Фаза со 2ым полюсаом лампы - gen.connect("A2",sw1,"A1"); // Нейтраль с 1ым полюсом переключателя - gen.connect("A3",sw1,"A2"); //Земля со 2ым полюсом переключателя - return 0; -} \ No newline at end of file From 51750b3865010d04c8d2ee66eb1099cc86089855 Mon Sep 17 00:00:00 2001 From: Stepan Khorin <90862586+soldsven@users.noreply.github.com> Date: Wed, 15 Jun 2022 15:45:35 +0300 Subject: [PATCH 6/7] Delete electricity.h --- memhacks/electricity.h | 148 ----------------------------------------- 1 file changed, 148 deletions(-) delete mode 100644 memhacks/electricity.h diff --git a/memhacks/electricity.h b/memhacks/electricity.h deleted file mode 100644 index 5c7c6e6e..00000000 --- a/memhacks/electricity.h +++ /dev/null @@ -1,148 +0,0 @@ -#pragma once -#include - -class Object; - -/// -/// Полюс устройства. -/// К одному полюсу может быть подключен один любой другой полюс этого же -/// устройства, или же любой полюс любого другого устройства. -/// -/// У каждого полюса есть своё название, которое получает значение по умолчанию -/// при создании устройства, но может быть изменено позднее. -/// -struct Pole { - /// - /// Название полюса. - /// Должно быть уникальным в пределах устройства. - /// - std::string name; - - /// - /// Устройство, подключенное к данному полюсу. - /// Может совпадать с устройством, содержащим данный полюс, при условии, что соединяются - /// два разных полюса. - /// Значение nullptr означает, что к данному полюсу ничего не подключено. - /// - Object* connectedObject; - - /// - /// Полюс устройства, к которому подключен данный полюс. - /// - std::string connectedObjectPole; - - Pole(const std::string& name_) : name(name_), connectedObject(nullptr) {} -}; - -/// -/// Электротехническое устройство. -/// Имеет произвольное неотрицательное количество полюсов (), -/// через которые может соединяться с другими устройствами. -/// -class Object { - std::string name; - -protected: - Object(const std::string& name_) : name(name_) {} - - /// - /// Возвращает полюс по внутреннему индексу устройства. - /// - /// Индекс полюса, от 0 до значения, возвращаемого . - /// Полюс с указанным индексом, или nullptr, если такой полюс не существует. - Pole* getPole(size_t idx); - - /// - /// Возвращает полюс по внутреннему индексу устройства. - /// - /// Индекс полюса, от 0 до значения, возвращаемого . - /// Полюс с указанным индексом, или nullptr, если такой полюс не существует. - virtual const Pole* getPole(size_t idx) const = 0; - -public: - virtual ~Object() {} - - const std::string& getName() const { return name; } - void getName(const std::string &newName) { name = newName; } - /// - /// Возвращает полюс по имени. - /// - /// Имя полюса. - /// Полюс с указанным именем, или nullptr, если такой полюс не существует. - Pole* getPole(const std::string& name) { return const_cast(const_cast(this)->getPole(name)); } - - /// - /// Возвращает полюс по имени. - /// - /// Имя полюса. - /// Полюс с указанным именем, или nullptr, если такой полюс не существует. - virtual const Pole* getPole(const std::string& name) const = 0; - - /// Количество полюсов в текущем устройстве. - virtual size_t getPoleCount() const = 0; - - /// - /// Проверяет, связаны ли два указанных устройства напрямую через какую-либо пару их полюсов. - /// - /// Устройство, наличие прямой связи с которым проверяется. - /// true если устройства связаны напрямую, false в противном случае. - bool isConnectedTo(const Object& other) const; - - /// - /// Соединяет указанные полюса текущего и указанного устройства. - /// Если к этим полюсам было что-то подключено, то такая связь разрушается. - /// - /// Название подключаемого полюса текущего устройства - /// Устройство, которое связывается с текущим. - /// Название подключаемого полюса другого устройства - /// - /// Может использоваться для связи устройства с самим собой. - /// В этом случае в качестве следует передать то же устройство, - /// для которого вызывается этот метод. - /// - bool connect(const std::string& poleName, const Object& other, const std::string& otherPoleName); -}; - -/// -/// Простой выключатель с двумя полюсами. -/// -class Switch : public Object { -public: - Pole a1, a2; - - Switch(const std::string& name = ""); - - virtual size_t getPoleCount() const { return 2; } - - virtual const Pole* getPole(const std::string& name) const; - -protected: - virtual const Pole* getPole(size_t idx) const; -}; - -class Light : public Object { -public: - Pole a1, a2; - - Light(const std::string& name = ""); - - virtual size_t getPoleCount() const { return 2; } - - virtual const Pole* getPole(const std::string& name) const; - -protected: - virtual const Pole* getPole(size_t idx) const; -}; -class Generator : public Object { -public: - Pole a1,a2,a3; - - Generator(const std::string& name = ""); - - virtual size_t getPoleCount() const { return 3; } - - virtual const Pole* getPole(const std::string& name) const; - -protected: - virtual const Pole* getPole(size_t idx) const; -}; From 2ba3697d6f355e54b33c2533a08323764a58d591 Mon Sep 17 00:00:00 2001 From: Stepan Khorin <90862586+soldsven@users.noreply.github.com> Date: Wed, 15 Jun 2022 15:46:43 +0300 Subject: [PATCH 7/7] Add files via upload --- electricity/electricity.cpp | 164 ++++++++++++++------- electricity/electricity.h | 274 +++++++++++++++++++----------------- 2 files changed, 263 insertions(+), 175 deletions(-) diff --git a/electricity/electricity.cpp b/electricity/electricity.cpp index 9f1c0170..de5ef7af 100644 --- a/electricity/electricity.cpp +++ b/electricity/electricity.cpp @@ -1,49 +1,115 @@ -#include -#include "electricity.h" - -using namespace std; - -bool Object::isConnectedTo(const Object& other) const -{ - // TODO - return false; -} - -bool Object::connect(const std::string& poleName, const Object& other, const std::string& otherPoleName) -{ - // TODO - return false; -} - -Switch::Switch(const std::string& name) - : Object(name) - , a1("A1") - , a2("A2") -{ -} - -const Pole* Switch::getPole(const string& name) const -{ - if (name == a1.name) - return &a1; - if (name == a2.name) - return &a2; - return nullptr; -} - -const Pole* Switch::getPole(size_t idx) const -{ - // TODO - return nullptr; -} - -int main() -{ - Switch sw, sw2; - sw.connect("A2", sw2, "A1"); - cout << "is " << (sw.isConnectedTo(sw2) ? "" : "not ") << "connected" << endl; - - // TODO: создать цепь из генератора, выключателя и светильника - - return 0; -} +#include +#include "electricity.h" + +using namespace std; + +bool Object::isConnectedTo(const Object& other) const +{ + for (int i=1;i<=getPoleCount();i++){ + for (int j=1;j<=other.getPoleCount();j++){ + if (getPole(i)->connectedObjectPole==other.getPole(j)->name && getPole(i)->name!=other.getPole(j)->name) + return true; + } + } + return false; +} + +bool Object::connect(const std::string& poleName, const Object& other, const std::string& otherPoleName) +{ + if (poleName!=otherPoleName){ + getPole(poleName)->connectedObject=const_cast(&other); + getPole(poleName)->connectedObjectPole=otherPoleName; + getPole(otherPoleName)->connectedObjectPole=poleName; + getPole(otherPoleName)->connectedObject=const_cast(this); + return true; + } + return false; +} + +Switch::Switch(const std::string& name) + : Object(name) + , a1("A1") + , a2("A2") +{} +Light::Light(const std::string & name) + : Object(name) + , a1("A1") + , a2("A2") +{} +Generator::Generator(const std::string & name) + : Object(name) + , a1("A1") //Faza ~ фаза + , a2("A2") //Neytral ~ нейтраль + , a3("A3") //Zemly ~ земля +{} + +const Pole* Switch::getPole(const string& name) const +{ + if (name == a1.name) + return &a1; + if (name == a2.name) + return &a2; + return nullptr; +} + +const Pole* Switch::getPole(size_t idx) const +{ + if (idx==1) + return &a1; + if (idx==2) + return &a2; + return nullptr; +} +const Pole* Light::getPole(const string& name) const +{ + if (name == a1.name) + return &a1; + if (name == a2.name) + return &a2; + return nullptr; +} + +const Pole* Light::getPole(size_t idx) const +{ + if (idx==1) + return &a1; + if (idx==2) + return &a2; + return nullptr; +} +const Pole* Generator::getPole(const string& name) const +{ + if (name == a1.name) + return &a1; + if (name == a2.name) + return &a2; + if (name == a3.name) + return &a3; + return nullptr; +} + +const Pole* Generator::getPole(size_t idx) const +{ + if (idx==1) + return &a1; + if (idx==2) + return &a2; + if (idx==3) + return &a3; + return nullptr; +} +int main() +{ + Switch sw, sw2; + sw.connect("A2", sw2, "A1"); + cout << "is " << (sw.isConnectedTo(sw2) ? "" : "not ") << "connected" << endl; + //создать цепь из генератора, выключателя и светильника + Switch sw1; + Light lamp; + Generator gen; + gen.connect("A2",lamp,"A1"); // Нейтраль с 1ым полюсом лампы + gen.connect("A1",lamp,"A2"); // Фаза со 2ым полюсаом лампы + gen.connect("A2",sw1,"A1"); // Нейтраль с 1ым полюсом переключателя + gen.connect("A3",sw1,"A2"); //Земля со 2ым полюсом переключателя + return 0; +} \ No newline at end of file diff --git a/electricity/electricity.h b/electricity/electricity.h index f7df29ca..5c7c6e6e 100644 --- a/electricity/electricity.h +++ b/electricity/electricity.h @@ -1,126 +1,148 @@ -#pragma once -#include - -class Object; - -/// -/// Полюс устройства. -/// К одному полюсу может быть подключен один любой другой полюс этого же -/// устройства, или же любой полюс любого другого устройства. -/// -/// У каждого полюса есть своё название, которое получает значение по умолчанию -/// при создании устройства, но может быть изменено позднее. -/// -struct Pole { - /// - /// Название полюса. - /// Должно быть уникальным в пределах устройства. - /// - std::string name; - - /// - /// Устройство, подключенное к данному полюсу. - /// Может совпадать с устройством, содержащим данный полюс, при условии, что соединяются - /// два разных полюса. - /// Значение nullptr означает, что к данному полюсу ничего не подключено. - /// - Object* connectedObject; - - /// - /// Полюс устройства, к которому подключен данный полюс. - /// - std::string connectedObjectPole; - - Pole(const std::string& name_) : name(name_), connectedObject(nullptr) {} -}; - -/// -/// Электротехническое устройство. -/// Имеет произвольное неотрицательное количество полюсов (), -/// через которые может соединяться с другими устройствами. -/// -class Object { - std::string name; - -protected: - Object(const std::string& name_) : name(name_) {} - - /// - /// Возвращает полюс по внутреннему индексу устройства. - /// - /// Индекс полюса, от 0 до значения, возвращаемого . - /// Полюс с указанным индексом, или nullptr, если такой полюс не существует. - Pole* getPole(size_t idx) { /* TODO */ return nullptr; } - - /// - /// Возвращает полюс по внутреннему индексу устройства. - /// - /// Индекс полюса, от 0 до значения, возвращаемого . - /// Полюс с указанным индексом, или nullptr, если такой полюс не существует. - virtual const Pole* getPole(size_t idx) const = 0; - -public: - virtual ~Object() {} - - const std::string& getName() const { return name; } - void getName(const std::string &newName) { name = newName; } - - /// - /// Возвращает полюс по имени. - /// - /// Имя полюса. - /// Полюс с указанным именем, или nullptr, если такой полюс не существует. - Pole* getPole(const std::string& name) { return const_cast(const_cast(this)->getPole(name)); } - - /// - /// Возвращает полюс по имени. - /// - /// Имя полюса. - /// Полюс с указанным именем, или nullptr, если такой полюс не существует. - virtual const Pole* getPole(const std::string& name) const = 0; - - /// Количество полюсов в текущем устройстве. - virtual size_t getPoleCount() const = 0; - - /// - /// Проверяет, связаны ли два указанных устройства напрямую через какую-либо пару их полюсов. - /// - /// Устройство, наличие прямой связи с которым проверяется. - /// true если устройства связаны напрямую, false в противном случае. - bool isConnectedTo(const Object& other) const; - - /// - /// Соединяет указанные полюса текущего и указанного устройства. - /// Если к этим полюсам было что-то подключено, то такая связь разрушается. - /// - /// Название подключаемого полюса текущего устройства - /// Устройство, которое связывается с текущим. - /// Название подключаемого полюса другого устройства - /// - /// Может использоваться для связи устройства с самим собой. - /// В этом случае в качестве следует передать то же устройство, - /// для которого вызывается этот метод. - /// - bool connect(const std::string& poleName, const Object& other, const std::string& otherPoleName); -}; - -/// -/// Простой выключатель с двумя полюсами. -/// -class Switch : public Object { -public: - Pole a1, a2; - - Switch(const std::string& name = ""); - - virtual size_t getPoleCount() const { return 2; } - - virtual const Pole* getPole(const std::string& name) const; - -protected: - virtual const Pole* getPole(size_t idx) const; -}; - -// TODO: класс светильника с двумя полюсами - -// TODO: класс генератора с тремя полюсами (фаза, нейтраль, земпя). +#pragma once +#include + +class Object; + +/// +/// Полюс устройства. +/// К одному полюсу может быть подключен один любой другой полюс этого же +/// устройства, или же любой полюс любого другого устройства. +/// +/// У каждого полюса есть своё название, которое получает значение по умолчанию +/// при создании устройства, но может быть изменено позднее. +/// +struct Pole { + /// + /// Название полюса. + /// Должно быть уникальным в пределах устройства. + /// + std::string name; + + /// + /// Устройство, подключенное к данному полюсу. + /// Может совпадать с устройством, содержащим данный полюс, при условии, что соединяются + /// два разных полюса. + /// Значение nullptr означает, что к данному полюсу ничего не подключено. + /// + Object* connectedObject; + + /// + /// Полюс устройства, к которому подключен данный полюс. + /// + std::string connectedObjectPole; + + Pole(const std::string& name_) : name(name_), connectedObject(nullptr) {} +}; + +/// +/// Электротехническое устройство. +/// Имеет произвольное неотрицательное количество полюсов (), +/// через которые может соединяться с другими устройствами. +/// +class Object { + std::string name; + +protected: + Object(const std::string& name_) : name(name_) {} + + /// + /// Возвращает полюс по внутреннему индексу устройства. + /// + /// Индекс полюса, от 0 до значения, возвращаемого . + /// Полюс с указанным индексом, или nullptr, если такой полюс не существует. + Pole* getPole(size_t idx); + + /// + /// Возвращает полюс по внутреннему индексу устройства. + /// + /// Индекс полюса, от 0 до значения, возвращаемого . + /// Полюс с указанным индексом, или nullptr, если такой полюс не существует. + virtual const Pole* getPole(size_t idx) const = 0; + +public: + virtual ~Object() {} + + const std::string& getName() const { return name; } + void getName(const std::string &newName) { name = newName; } + /// + /// Возвращает полюс по имени. + /// + /// Имя полюса. + /// Полюс с указанным именем, или nullptr, если такой полюс не существует. + Pole* getPole(const std::string& name) { return const_cast(const_cast(this)->getPole(name)); } + + /// + /// Возвращает полюс по имени. + /// + /// Имя полюса. + /// Полюс с указанным именем, или nullptr, если такой полюс не существует. + virtual const Pole* getPole(const std::string& name) const = 0; + + /// Количество полюсов в текущем устройстве. + virtual size_t getPoleCount() const = 0; + + /// + /// Проверяет, связаны ли два указанных устройства напрямую через какую-либо пару их полюсов. + /// + /// Устройство, наличие прямой связи с которым проверяется. + /// true если устройства связаны напрямую, false в противном случае. + bool isConnectedTo(const Object& other) const; + + /// + /// Соединяет указанные полюса текущего и указанного устройства. + /// Если к этим полюсам было что-то подключено, то такая связь разрушается. + /// + /// Название подключаемого полюса текущего устройства + /// Устройство, которое связывается с текущим. + /// Название подключаемого полюса другого устройства + /// + /// Может использоваться для связи устройства с самим собой. + /// В этом случае в качестве следует передать то же устройство, + /// для которого вызывается этот метод. + /// + bool connect(const std::string& poleName, const Object& other, const std::string& otherPoleName); +}; + +/// +/// Простой выключатель с двумя полюсами. +/// +class Switch : public Object { +public: + Pole a1, a2; + + Switch(const std::string& name = ""); + + virtual size_t getPoleCount() const { return 2; } + + virtual const Pole* getPole(const std::string& name) const; + +protected: + virtual const Pole* getPole(size_t idx) const; +}; + +class Light : public Object { +public: + Pole a1, a2; + + Light(const std::string& name = ""); + + virtual size_t getPoleCount() const { return 2; } + + virtual const Pole* getPole(const std::string& name) const; + +protected: + virtual const Pole* getPole(size_t idx) const; +}; +class Generator : public Object { +public: + Pole a1,a2,a3; + + Generator(const std::string& name = ""); + + virtual size_t getPoleCount() const { return 3; } + + virtual const Pole* getPole(const std::string& name) const; + +protected: + virtual const Pole* getPole(size_t idx) const; +};