Приложение на D с QtE5 для последовательности Коллатца

Приложение на D с QtE5 для последовательности Коллатца

Последовательность Коллатца представляет собой интересную математическую задачу, которая привлекает внимание многих исследователей. Основной смысл задачи заключается в следующем: для любого натурального числа n выполните следующие действия, пока n не станет равным 1:

  • Если n чётное, разделите его на 2.
  • Если n нечётное, умножьте его на 3 и добавьте 1.

Эта задача, несмотря на свою простоту, не имеет доказанного решения о том, что любое начальное число всегда приводит к единице. В этой статье мы создадим графическое приложение на языке D с использованием библиотеки QtE5 для визуализации последовательности Коллатца. Это приложение позволит вводить начальное число и отображать график последовательности.

Описание функциональности

Наше приложение будет состоять из основного окна с полем ввода для начального числа и кнопки для запуска вычислений. После нажатия кнопки, на графике будет отображаться последовательность Коллатца для введённого числа.

Структура проекта

  1. Основное окно приложения
  2. Поле ввода и кнопка
  3. Обработчик события кнопки
  4. Отрисовка графика

1. Основное окно приложения

Начнем с создания основного окна приложения. В языке D для создания графических интерфейсов можно использовать библиотеку QtE5, которая предоставляет мощные возможности для создания оконных приложений.

import qte5;

class MainWindow : QMainWindow {
    QLineEdit input;
    QPushButton button;
    QWidget centralWidget;
    QVBoxLayout layout;

    this() {
        super();
        setWindowTitle("Последовательность Коллатца");

        input = new QLineEdit();
        button = new QPushButton("Построить график");
        centralWidget = new QWidget(this);
        layout = new QVBoxLayout(centralWidget);

        layout.addWidget(input);
        layout.addWidget(button);
        setCentralWidget(centralWidget);

        button.clicked.connect(&onButtonClicked);
    }

    void onButtonClicked() {
        // Здесь будет обработчик нажатия кнопки
    }
}

mixin APP_MAIN;

int main(string[] args) {
    QApplication app = new QApplication(args);
    MainWindow window = new MainWindow();
    window.show();
    return app.exec();
}

2. Поле ввода и кнопка

Мы добавили поле ввода (QLineEdit) и кнопку (QPushButton). Поле ввода позволит пользователю вводить начальное число, а кнопка запускает процесс вычисления и отображения графика.

3. Обработчик события кнопки

Теперь добавим обработчик события нажатия кнопки, который будет считывать введённое значение, вычислять последовательность Коллатца и отображать её на графике.

void onButtonClicked() {
    string text = input.text();
    int startValue;
    try {
        startValue = to!int(text);
    } catch (ConvException) {
        QMessageBox.critical(this, "Ошибка", "Введите корректное число.");
        return;
    }

    // Вычисляем последовательность Коллатца
    auto sequence = collatzSequence(startValue);

    // Отображаем график (метод будет описан далее)
    displayGraph(sequence);
}

4. Вычисление последовательности Коллатца

Добавим функцию для вычисления последовательности Коллатца:

int[] collatzSequence(int start) {
    int[] sequence;
    int n = start;

    while (n != 1) {
        sequence ~= n;
        if (n % 2 == 0) {
            n /= 2;
        } else {
            n = 3 * n + 1;
        }
    }

    sequence ~= 1; // Добавляем последнее число в последовательности
    return sequence;
}

5. Отрисовка графика

Для отображения графика будем использовать библиотеку qcustomplot, которая поддерживается QtE5.

import qcustomplot;

void displayGraph(int[] sequence) {
    QCustomPlot plot = new QCustomPlot();
    QCPGraph graph = plot.addGraph();

    QVector<double> x(sequence.length);
    QVector<double> y(sequence.length);

    for (int i = 0; i < sequence.length; ++i) {
        x[i] = i;
        y[i] = sequence[i];
    }

    graph.setData(x, y);
    plot.rescaleAxes();
    plot.replot();

    QWidget graphWidget = new QWidget();
    QVBoxLayout layout = new QVBoxLayout(graphWidget);
    layout.addWidget(&plot);

    QMainWindow graphWindow = new QMainWindow();
    graphWindow.setCentralWidget(graphWidget);
    graphWindow.resize(800, 600);
    graphWindow.show();
}

Завершение

Теперь, собрав все части вместе, мы получаем полноценное приложение для отображения последовательности Коллатца. Вот итоговый код:

import qte5;
import qcustomplot;

class MainWindow : QMainWindow {
    QLineEdit input;
    QPushButton button;
    QWidget centralWidget;
    QVBoxLayout layout;

    this() {
        super();
        setWindowTitle("Последовательность Коллатца");

        input = new QLineEdit();
        button = new QPushButton("Построить график");
        centralWidget = new QWidget(this);
        layout = new QVBoxLayout(centralWidget);

        layout.addWidget(input);
        layout.addWidget(button);
        setCentralWidget(centralWidget);

        button.clicked.connect(&onButtonClicked);
    }

    void onButtonClicked() {
        string text = input.text();
        int startValue;
        try {
            startValue = to!int(text);
        } catch (ConvException) {
            QMessageBox.critical(this, "Ошибка", "Введите корректное число.");
            return;
        }

        // Вычисляем последовательность Коллатца
        auto sequence = collatzSequence(startValue);

        // Отображаем график
        displayGraph(sequence);
    }

    int[] collatzSequence(int start) {
        int[] sequence;
        int n = start;

        while (n != 1) {
            sequence ~= n;
            if (n % 2 == 0) {
                n /= 2;
            } else {
                n = 3 * n + 1;
            }
        }

        sequence ~= 1; // Добавляем последнее число в последовательности
        return sequence;
    }

    void displayGraph(int[] sequence) {
        QCustomPlot plot = new QCustomPlot();
        QCPGraph graph = plot.addGraph();

        QVector<double> x(sequence.length);
        QVector<double> y(sequence.length);

        for (int i = 0; i < sequence.length; ++i) {
            x[i] = i;
            y[i] = sequence[i];
        }

        graph.setData(x, y);
        plot.rescaleAxes();
        plot.replot();

        QWidget graphWidget = new QWidget();
        QVBoxLayout layout = new QVBoxLayout(graphWidget);
        layout.addWidget(&plot);

        QMainWindow graphWindow = new QMainWindow();
        graphWindow.setCentralWidget(graphWidget);
        graphWindow.resize(800, 600);
        graphWindow.show();
    }
}

mixin APP_MAIN;

int main(string[] args) {
    QApplication app = new QApplication(args);
    MainWindow window = new MainWindow();
    window.show();
    return app.exec();
}

Создание графического приложения для отображения последовательности Коллатца на языке D с использованием библиотеки QtE5 является отличным примером использования мощных инструментов для визуализации математических последовательностей. Такое приложение может быть полезным как для учебных целей, так и для более глубокого исследования свойств последовательности Коллатца.


Карпов Ярослав

Автор статьи:

Обновлено:

23.05.2024


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *