Последовательность Коллатца представляет собой интересную математическую задачу, которая привлекает внимание многих исследователей. Основной смысл задачи заключается в следующем: для любого натурального числа n выполните следующие действия, пока n не станет равным 1:
- Если n чётное, разделите его на 2.
- Если n нечётное, умножьте его на 3 и добавьте 1.
Эта задача, несмотря на свою простоту, не имеет доказанного решения о том, что любое начальное число всегда приводит к единице. В этой статье мы создадим графическое приложение на языке D с использованием библиотеки QtE5 для визуализации последовательности Коллатца. Это приложение позволит вводить начальное число и отображать график последовательности.
Описание функциональности
Наше приложение будет состоять из основного окна с полем ввода для начального числа и кнопки для запуска вычислений. После нажатия кнопки, на графике будет отображаться последовательность Коллатца для введённого числа.
Структура проекта
- Основное окно приложения
- Поле ввода и кнопка
- Обработчик события кнопки
- Отрисовка графика
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 является отличным примером использования мощных инструментов для визуализации математических последовательностей. Такое приложение может быть полезным как для учебных целей, так и для более глубокого исследования свойств последовательности Коллатца.
Автор статьи:
Обновлено:
Добавить комментарий