Фрагмент для ознакомления
currentTimeMillis(); // Установка времени создания микробаdescendants = 1; // Изначально у микроба один потомокgenerations = 0; // Изначально у микроба нет поколений}// Метод для получения времени создания микробаpublic long getStartTime() {return startTime;}// Метод для получения количества потомков микробаpublic int getDescendants() {return descendants;}// Метод для получения количества поколений микробаpublic int getGenerations() {return generations;}// Метод для увеличения количества потомков и поколений микробаpublic void incrementDescendants() {descendants++; // Увеличение количества потомков на 1generations++; // Увеличение количества поколений на 1}}9.2.Класс Colonyimport java.util.Iterator;import java.util.LinkedList;import java.util.Timer;// Класс Colony представляет колонию микробовclass Colony {private LinkedList microbes; // Список микробов в колонииprivate final int maxGenerations; // Максимальное количество поколений для каждого микробаprivate Timer timer; // Таймер для управления временем // Метод для установки таймераpublic void setTimer(Timer timer) {this.timer = timer;}// Конструктор класса Colonypublic Colony(int maxGenerations, int initialCount) {this.microbes = new LinkedList<>();// Инициализация начального количества микробовfor (int i = 0; i < initialCount; i++) {this.microbes.add(new Microb());}this.maxGenerations = maxGenerations; // Установка максимального количества поколений}// Метод для получения общего числа микробов в колонииpublic int getMicrobeCount() {int count = 0;// Подсчет общего числа потомков всех микробов в колонииfor (Microb microb : microbes) { count += microb.getDescendants();}return count;}// Метод для получения времени, прошедшего с момента создания первого микробаpublic long getTime() {return System.currentTimeMillis() - microbes.getFirst().getStartTime();}// Метод для получения максимального количества поколенийpublic int getMaxGenerations(){return this.maxGenerations;}// Метод для симуляции роста микробовpublic void grow() { LinkedList newMicrobes = new LinkedList<>();Iterator iterator = microbes.iterator();// Итерация по текущим микробам в колонииwhile (iterator.hasNext()) { Microb microb = iterator.next();// Проверка возможности деления микробаif (microb.getGenerations() < maxGenerations) { microb.incrementDescendants(); // Увеличение числа потомков микроба // Каждый микроб делится на два новых микробаnewMicrobes.add(new Microb());newMicrobes.add(new Microb());// Удаление исходного микроба из колонии, так как он погибает после деленияiterator.remove();} }microbes.addAll(newMicrobes); // Добавление новых микробов после завершения деления}}9.3.Класс MicrobGrowthimport javax.swing.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.util.Timer;import java.util.TimerTask;// Класс MicrobGrowth отвечает за графический интерфейс и управление симуляцией роста микробовpublic class MicrobGrowth { JFrame frame; // Основное окно приложенияJTextField textField; // Текстовое поле для отображения количества микробовJButton startButton; // Кнопка для запуска симуляцииJButton stopButton; // Кнопка для остановки симуляцииprivate Colony colony; // Колония микробов, с которой работает симуляцияprivate Timer timer; // Таймер для управления частотой симуляцииprivate int divisions = 0; // Счетчик поколений // Конструктор класса MicrobGrowthpublic MicrobGrowth() {frame = new JFrame("Рост микробов"); // Создание нового окна с указанным заголовкомframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Установка операции закрытия окна по умолчаниюJPanel panel = new JPanel(); // Создание панели для размещения компонентов интерфейсаframe.add(panel); // Добавление панели на основное окноJLabel label = new JLabel("Начальное количество микробов:"); // Создание надписиpanel.add(label); // Добавление надписи на панельtextField = new JTextField(10); // Создание текстового поляpanel.add(textField); // Добавление текстового поля на панельstartButton = new JButton("Старт"); // Создание кнопки "Старт"panel.add(startButton); // Добавление кнопки "Старт" на панельstopButton = new JButton("Стоп"); // Создание кнопки "Стоп"panel.add(stopButton); // Добавление кнопки "Стоп" на панельJLabel maxGenLabel = new JLabel("Максимальное количество поколений:"); // Создание надписиpanel.add(maxGenLabel); // Добавление надписи на панельJTextField maxGenField = new JTextField(5); // Создание текстового поля для максимального количества поколенийpanel.add(maxGenField); // Добавление текстового поля на панель // Обработчик события для кнопки "Старт"startButton.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {int maxGenerations; int initialCount; try { maxGenerations = Integer.parseInt(maxGenField.getText()); // Получение значения максимального количества поколенийinitialCount = Integer.parseInt(textField.getText()); // Получение начального количества микробов} catch (NumberFormatException ex) { maxGenerations = 10; // Установка значения по умолчанию для максимального количества поколенийinitialCount = 1; // Установка значения по умолчанию для начального количества микробовJOptionPane.showMessageDialog(frame, "Неверный формат ввода. Установлены значения по умолчанию:\nМаксимальное количество поколений: 10\nНачальное количество микробов: 1"); // Вывод сообщения об ошибке}colony = new Colony(maxGenerations, initialCount); // Создание новой колонии микробовstartTimer(); // Запуск таймера} });// Обработчик события для кнопки "Стоп"stopButton.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) { stopTimer(); // Остановка таймера} });JMenuBar menuBar = new JMenuBar(); // Создание строки менюframe.setJMenuBar(menuBar); // Установка строки меню для основного окнаJMenu menu = new JMenu("О программе"); // Создание менюmenuBar.add(menu); // Добавление меню в строку менюJMenuItem helpMenuItem = new JMenuItem("Справка"); // Создание пункта меню "Справка"menu.add(helpMenuItem); // Добавление пункта меню в менюJMenuItem aboutMenuItem = new JMenuItem("О разработчике"); // Создание пункта меню "О разработчике"menu.add(aboutMenuItem); // Добавление пункта меню в меню // Обработчик события для пункта меню "Справка"helpMenuItem.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) { String helpMessage = "Справка по программе:\n\n" +"Эта программа моделирует рост микробов.\n" +"Вы можете задать начальное количество микробов и максимальное количество поколений.\n" +"После нажатия кнопки 'Старт' начнется симуляция роста микробов.\n" +"Кнопкой Стоп вы можете остановить симуляцию до достижения максимально заданного числа поколений.";JOptionPane.showMessageDialog(frame, helpMessage, "Справка", JOptionPane.INFORMATION_MESSAGE); // Вывод справки} });// Обработчик события для пункта меню "О разработчике"aboutMenuItem.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) { String aboutMessage = "Разработчик: ваше имя\n" +"Версия: 1.0\n" +"Дата: Апрель 2024\n" +"Email: ваш_email";JOptionPane.showMessageDialog(frame, aboutMessage, "О разработчике", JOptionPane.INFORMATION_MESSAGE); // Вывод информации о разработчике} });frame.pack(); // Упаковка компонентов окнаframe.setVisible(true); // Отображение окна на экране}// Метод для запуска таймераprivate void startTimer() {timer = new Timer(); // Создание нового объекта таймераtimer.scheduleAtFixedRate(new TimerTask() {@Overridepublic void run() {divisions++; // Увеличение счетчика поколенийif (divisions > colony.getMaxGenerations()){ // Проверка превышения введенного пользователем лимита числа поколенийstopTimer(); // Остановка таймераSwingUtilities.invokeLater(() -> { JOptionPane.showMessageDialog(null, "Симуляция завершена(достигнуто установленное число поколений)."); // Вывод сообщения об окончании симуляции}); return;}colony.grow(); // Вызов метода роста микробовSwingUtilities.invokeLater(() -> {int count = colony.getMicrobeCount(); // Получение текущего количества микробовtextField.setText(String.valueOf(count)); // Обновление текстового поля с количеством микробов});} }, 0, 1000); // Запуск таймера с интервалом 1 секундаcolony.setTimer(timer); // Установка ссылки на таймер в объекте колонии, если это необходимо для других целей}// Метод для остановки таймераprivate void stopTimer() {if (timer != null) {timer.cancel(); // Остановка таймера и отмена всех запланированных задачtimer.purge(); // Удаление всех отмененных задач из очереди таймераtimer = null; // Обнуление ссылки на таймер} }// Точка входа в программуpublic static void main(String[] args) {new MicrobGrowth(); // Создание объекта класса MicrobGrowth}}9.4.Класс MicrobGrowthTestimportstaticorg.junit.jupiter.api.Assertions.*;importorg.junit.jupiter.api.BeforeEach;importorg.junit.jupiter.api.Test;importjava.awt.*;classMicrobGrowthTest {privateMicrobGrowthmicrobGrowth;@BeforeEachvoidsetUp() {microbGrowth= newMicrobGrowth();}@TestvoidtestInitialInterface() {// Проверка инициализации основных компонентов интерфейсаassertNotNull(microbGrowth.frame);assertNotNull(microbGrowth.textField);assertNotNull(microbGrowth.startButton);assertNotNull(microbGrowth.stopButton);}@TestvoidtestTimerFunctionality() throwsInterruptedException {// Проверка корректности работы таймераmicrobGrowth.textField.setText("2");microbGrowth.startButton.doClick();Thread.sleep(5000); // Подождать 5 секунд для смены пяти поколенийmicrobGrowth.stopButton.doClick();assertEquals("64", microbGrowth.textField.getText());}@TestvoidtestColonyGrowth() throwsInterruptedException {// Проверка корректности работы с колонией микробовmicrobGrowth.textField.setText("2");microbGrowth.startButton.doClick();Thread.sleep(3000); // Подождать 3 секунды для смены трех поколенийmicrobGrowth.stopButton.doClick();assertEquals("16", microbGrowth.textField.getText());}}10.Приложение В Скриншоты интерфейсаРис.1 Основное окно программы
7. Список использованных источников
1) Слетков Д.В. Математическое моделирование роста колонии биологических объектов // Вестник российских университетов. Математика. - 2009.
2) Саруханян Самвел Каджикович, Масловская Анна Геннадьевна,
“ПРОСТЕЙШИЙ КЛЕТОЧНЫЙ АВТОМАТ ДЛЯ МОДЕЛИРОВАНИЯ ПОВЕРХНОСТНОГО РОСТА БАКТЕРИЙ” // Киберленинка URL: https://cyberleninka.ru/article/n/prosteyshiy-kletochnyy-avtomat-dlya-modelirovaniya-poverhnostnogo-rosta-bakteriy (дата обращения: 21.03.2024).