Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <FL/Fl.H> // Подключаем основной заголовочный файл FLTK
- #include <FL/Fl_Window.H> // Для работы с окнами
- #include <FL/Fl_Button.H> // Для кнопок (может понадобиться позже)
- #include <FL/Fl_Input.H> // Для полей ввода
- #include <FL/fl_draw.H> // Для рисования на окне
- #include <vector> // Для работы с контейнерами
- #include <string> // Для работы со строками
- #include <map> // Для хранения данных ключ-значение
- // Определяем базовый класс логического элемента (ворота)
- class LogicGate {
- public:
- int x, y; // Координаты расположения элемента на экране
- std::string type; // Тип элемента (AND, OR, NOT)
- bool value; // Выходное значение логического элемента
- // Конструктор класса, инициализирует координаты и тип элемента
- LogicGate(int x_, int y_, std::string type_) : x(x_), y(y_), type(type_), value(false) {}
- // Виртуальные методы, которые будут реализованы в производных классах
- virtual void draw() = 0; // Отрисовка элемента (чистая виртуальная функция)
- virtual bool compute(bool a, bool b = false) = 0; // Логическая операция, принимает 1 или 2 аргумента
- };
- // Логический элемент AND
- class AndGate : public LogicGate {
- public:
- AndGate(int x, int y) : LogicGate(x, y, "AND") {} // Конструктор
- void draw() override {
- fl_color(FL_BLACK); // Устанавливаем черный цвет
- fl_rectf(x, y, 40, 40); // Рисуем прямоугольник
- fl_color(FL_WHITE); // Меняем цвет на белый
- fl_draw("AND", x + 10, y + 25); // Отображаем текст
- }
- bool compute(bool a, bool b) override { return value = a && b; } // Вычисляем логическое И
- };
- // Логический элемент OR
- class OrGate : public LogicGate {
- public:
- OrGate(int x, int y) : LogicGate(x, y, "OR") {}
- void draw() override {
- fl_color(FL_BLACK);
- fl_rectf(x, y, 40, 40);
- fl_color(FL_WHITE);
- fl_draw("OR", x + 10, y + 25);
- }
- bool compute(bool a, bool b) override { return value = a || b; } // Вычисляем логическое ИЛИ
- };
- // Логический элемент NOT
- class NotGate : public LogicGate {
- public:
- NotGate(int x, int y) : LogicGate(x, y, "NOT") {}
- void draw() override {
- fl_color(FL_BLACK);
- fl_rectf(x, y, 40, 40);
- fl_color(FL_WHITE);
- fl_draw("NOT", x + 5, y + 25);
- }
- bool compute(bool a, bool) override { return value = !a; } // Вычисляем логическое НЕ
- };
- // Основной класс окна, в котором будет отображаться схема
- class LogicCircuitWindow : public Fl_Window {
- private:
- std::vector<LogicGate*> gates; // Вектор для хранения логических элементов
- public:
- LogicCircuitWindow(int w, int h, const char* title) : Fl_Window(w, h, title) {
- // Создаем логические элементы для выражения ((NOT x1) AND x2) OR x3
- LogicGate* notGate = new NotGate(50, 50); // NOT x1
- LogicGate* andGate = new AndGate(150, 50); // (NOT x1) AND x2
- LogicGate* orGate = new OrGate(250, 50); // ((NOT x1) AND x2) OR x3
- // Добавляем элементы в список
- gates.push_back(notGate);
- gates.push_back(andGate);
- gates.push_back(orGate);
- }
- void draw() override {
- Fl_Window::draw(); // Вызываем стандартную функцию рисования окна
- for (auto gate : gates) {
- gate->draw(); // Рисуем каждый логический элемент
- }
- // Рисуем соединительные линии между элементами
- fl_color(FL_BLACK);
- fl_line(90, 70, 140, 70); // Линия от NOT к AND
- fl_line(200, 70, 240, 70); // Линия от AND к OR
- }
- };
- int main() {
- LogicCircuitWindow win(400, 300, "Логическая схема"); // Создаем окно 400x300 пикселей
- win.show(); // Отображаем окно
- return Fl::run(); // Запускаем главный цикл программы
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement