Задача об инфекции стригущего лишая (Ван Тассел Д. Стиль, разработка, эффективность, отладка и испытание программ. М.: Мир, 1981)
Промоделируйте процесс распространения инфекции стригущего лишая по участку кожи размером n ? n (n — нечетное) клеток.
Предполагается, что исходной зараженной клеткой кожи является центральная.
В каждый интервал времени пораженная инфекцией клетка может с вероятностью 0,5 заразить любую из соседних здоровых клеток.
По прошествии шести единиц времени зараженная клетка становится невосприимчивой к инфекции, возникший иммунитет действует в течение последующих четырех единиц времени, а затем клетка оказывается здоровой.
В ходе моделирования описанного процесса выдавать текущее состояние моделируемого участка кожи в каждом интервале времени, отмечая зараженные, невосприимчивые к инфекции и здоровые клетки.
Для работы была установлена свежая программа с официального сайта visualstudio.microsoft.com которая работает бесплатно на 30 дней. Что бы продолжить работу с программой пришлось регистрироваться и тогда дается лицензионная версия. Обязательно на компьютере, должен установлен пакет NETFramework,Version=v4.6.1
Рекомендации при запуске компилирования кода про лишай. При слабом компьютере не рекомендуется вставлять большие числа, лучше не больше ста, так как визуал студио может зависнуть при обработке. Используйте целые числа. Отрицательные и так не введутся. При запуске компилятора идет расчет зараженной клетки и здоровой, данные выводятся в таблицу справа. Продолжительность включённой программы не должен быть большим, так как может зависнуть на слабом компьютере. Блог учеба
Порядок запуска
1. При загрузке кода нажмите кнопку пуск. Введите значения от 1. Рис 1.
1. Что бы остановить компилятор нажми конпку стоп. Что бы сделать новую сетку нажми кнопку новая. Смотри рисунок 2.
Описание интерфейса программы, назначение основных элементов формы.
Метод initializecomponent, который инициализирует все компоненты, расположенные на форме: поля, кнопки, меню, переключатели и загружает откомпилированную страницу компонента.
Метод dataGridView dataGridView - это отображение строк и столбцов данных в сетке, позволяет автоматизировать вывод информации, позволяет вывести таблицу с данными.
Создаем таблицу и конвертируем в 32 от -1 до i++
for (int i = 0; i <= Convert.ToInt32(textBox2.Text) - 1; i++)
{
dataGridView1.Columns.Add(Convert.ToString(i + 1), Convert.ToString(i + 1));
dataGridView1.Columns[i].Width = 25;
}
for (int i = 0; i <= Convert.ToInt32(textBox1.Text) - 1; i++)
{
dataGridView1.Rows.Add();
заполняем таблицу
for (int i = 0; i <= Convert.ToInt32(textBox2.Text) - 1; i++)
{
for (int u = 0; u <= Convert.ToInt32(textBox1.Text) - 1; u++)
{
dataGridView1.Rows[i].Cells[u].Value = "1";
заполняем зараженную клетку
dataGridView1.Rows[horizontal].Cells[vertically].Value = 10;
запускаем таймер
timer1.Enabled = true
Метод MessageBox.Show вводим данные. Сколько клеток будет в сетке.
extchanged - событие для динамического создания текстового поля
При генерации события KeyPress обработчик получает экземпляр класса KeyEventArgs, свойство Key EventArgs. Key Code которого содержит ASCII-символ клавиши, нажатие которой спровоцировало это событие.
Основные команды:
создаем рандомное число - Random rnd = new Random
делаем ход
for (int i = 0; i <= Convert.ToInt32(textBox2.Text) - 1; i++)
{
for (int j = 0; j <= Convert.ToInt32(textBox1.Text) - 1; j++)
{
if (dataGridView1.Rows[i].Cells[j].Value.ToString() != "0")
{
dataGridView1.Rows[i].Cells[j].Value = Convert.ToInt32(dataGridView1.Rows[i].Cells[j].Value.ToString()) - 1;
}
находим зараженные клетки
for (int i = 0; i <= Convert.ToInt32(textBox2.Text) - 1; i++)
{
for (int j = 0; j <= Convert.ToInt32(textBox1.Text) - 1; j++)
{
заражаем соседние клетки кроме крайних
if (i != 0 & j != 0)
выводим результат
int Immunity = 0; //переменная для клеток с иммунитетом
int Patient = 0; //переменная для зараженных клеток
если зараженных клеток нет, то останавливаем таймер
if (Patient == 0 & Immunity == 0)
запускаем таймер
timer1.Enabled = true
Останавливаем таймер
timer1.Enabled = false;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
//переменная для хода
int Course = 0;
private void dataGridView2_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
// dataGridView позволяет автоматизировать вывод информации. позволяет вывести таблицу с данными в Вашей программе
}
private void button1_Click(object sender, EventArgs e)
{
if (textBox1.Text != "" & textBox2.Text != "")
{
//Удаление ненужных элементов
label1.Visible = false;
label2.Visible = false;
textBox1.Visible = false;
textBox2.Visible = false;
button1.Visible = false;
dataGridView1.Visible = true;
dataGridView2.Visible = true;
button2.Visible = true;
//вычисляем центр
int horizontal = Convert.ToInt32(textBox2.Text) / 2;
int vertically = Convert.ToInt32(textBox1.Text) / 2;
//Создаем таблицу
for (int i = 0; i <= Convert.ToInt32(textBox2.Text) - 1; i++)
{
dataGridView1.Columns.Add(Convert.ToString(i + 1), Convert.ToString(i + 1));
dataGridView1.Columns[i].Width = 25;
}
for (int i = 0; i <= Convert.ToInt32(textBox1.Text) - 1; i++)
{
dataGridView1.Rows.Add();
}
//заполняем таблицу
for (int i = 0; i <= Convert.ToInt32(textBox2.Text) - 1; i++)
{
for (int u = 0; u <= Convert.ToInt32(textBox1.Text) - 1; u++)
{
dataGridView1.Rows[i].Cells[u].Value = "1";
}
}
//заполняем зараженную клетку
dataGridView1.Rows[horizontal].Cells[vertically].Value = 10;
//запускаем таймер
timer1.Enabled = true;
}
else
{
MessageBox.Show("Введите данные");
}
}
private void новаяToolStripMenuItem_Click(object sender, EventArgs e)
{
Application.Restart();
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
textBox2.Text = textBox1.Text;
}
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
if (!Char.IsDigit(e.KeyChar))
{
e.Handled = !System.Text.RegularExpressions.Regex.IsMatch(e.KeyChar.ToString(), @"[0,1,2,3,4,5,6,7,8,9,\b]");
}
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void textBox2_KeyPress(object sender, KeyPressEventArgs e)
{
if (!Char.IsDigit(e.KeyChar))
{
e.Handled = !System.Text.RegularExpressions.Regex.IsMatch(e.KeyChar.ToString(), @"[0,1,2,3,4,5,6,7,8,9,\b]");
}
}
private void timer1_Tick(object sender, EventArgs e)
{
//создаем рамдомное число
Random rnd = new Random();
//делаем ход
for (int i = 0; i <= Convert.ToInt32(textBox2.Text) - 1; i++)
{
for (int j = 0; j <= Convert.ToInt32(textBox1.Text) - 1; j++)
{
if (dataGridView1.Rows[i].Cells[j].Value.ToString() != "0")
{
dataGridView1.Rows[i].Cells[j].Value = Convert.ToInt32(dataGridView1.Rows[i].Cells[j].Value.ToString()) - 1;
}
}
}
//находим зараженные клетки
for (int i = 0; i <= Convert.ToInt32(textBox2.Text) - 1; i++)
{
for (int j = 0; j <= Convert.ToInt32(textBox1.Text) - 1; j++)
{
//заражаем соседние клетки кроме крайних
if (i != 0 & j != 0)
{
if (i != Convert.ToInt32(textBox2.Text) - 1 & j != Convert.ToInt32(textBox1.Text) - 1)
{
int value = rnd.Next(0, 16);
if (value == 1 | value == 32)
{
if (Convert.ToInt32(dataGridView1.Rows[i - 1].Cells[j - 1].Value.ToString()) == 0)
dataGridView1.Rows[i - 1].Cells[j - 1].Value = 10;
}
if (value == 2 | value == 10)
{
if (Convert.ToInt32(dataGridView1.Rows[i - 1].Cells[j].Value.ToString()) == 0)
dataGridView1.Rows[i - 1].Cells[j].Value = 10;
}
if (value == 3 | value == 11)
{
if (Convert.ToInt32(dataGridView1.Rows[i - 1].Cells[j + 1].Value.ToString()) == 0)
dataGridView1.Rows[i - 1].Cells[j + 1].Value = 10;
}
if (value == 4 | value == 12)
{
if (Convert.ToInt32(dataGridView1.Rows[i].Cells[j - 1].Value.ToString()) == 0)
dataGridView1.Rows[i].Cells[j - 1].Value = 10;
}
if (value == 5 | value == 13)
{
if (Convert.ToInt32(dataGridView1.Rows[i].Cells[j + 1].Value.ToString()) == 0)
dataGridView1.Rows[i].Cells[j + 1].Value = 10;
}
if (value == 6 | value == 14)
{
if (Convert.ToInt32(dataGridView1.Rows[i + 1].Cells[j - 1].Value.ToString()) == 0)
dataGridView1.Rows[i + 1].Cells[j - 1].Value = 10;
}
if (value == 7 | value == 15)
{
if (Convert.ToInt32(dataGridView1.Rows[i + 1].Cells[j].Value.ToString()) == 0)
dataGridView1.Rows[i + 1].Cells[j].Value = 10;
}
if (value ==8 | value == 16)
{
if (Convert.ToInt32(dataGridView1.Rows[i + 1].Cells[j + 1].Value.ToString()) == 0)
dataGridView1.Rows[i + 1].Cells[j + 1].Value = 10;
}
}
}
}
}
//выводим результат
int Immunity = 0; //переменная для клеток с иммунитетом
int Patient = 0; //переменная для зараженных клеток
for (int i = 0; i <= Convert.ToInt32(textBox2.Text) - 1; i++)
{
for (int j = 0; j <= Convert.ToInt32(textBox1.Text) - 1; j++)
{
if (Convert.ToInt32(dataGridView1.Rows[i].Cells[j].Value.ToString()) >= 4)
{
Patient++;
dataGridView1.Rows[i].Cells[j].Style.BackColor = System.Drawing.Color.Red;
}
if (Convert.ToInt32(dataGridView1.Rows[i].Cells[j].Value.ToString()) >= 1 & Convert.ToInt32(dataGridView1.Rows[i].Cells[j].Value.ToString()) <= 3)
{
Immunity++;
dataGridView1.Rows[i].Cells[j].Style.BackColor = System.Drawing.Color.Green;
}
if (Convert.ToInt32(dataGridView1.Rows[i].Cells[j].Value.ToString()) == 0)
{
dataGridView1.Rows[i].Cells[j].Style.BackColor = System.Drawing.Color.White;
}
}
}
Course++;
dataGridView2.Rows.Add(Course, Patient, Immunity, (((Convert.ToInt32(textBox1.Text) * Convert.ToInt32(textBox2.Text)) - Patient) - Immunity));
//если зараженных клеток нет, то останавливаем таймер
if (Patient == 0 & Immunity == 0)
{
timer1.Enabled = false;
}
}
private void button2_Click(object sender, EventArgs e)
{
timer1.Enabled = false;
}
}
}
Промоделируйте процесс распространения инфекции стригущего лишая по участку кожи размером n ? n (n — нечетное) клеток.
Предполагается, что исходной зараженной клеткой кожи является центральная.
В каждый интервал времени пораженная инфекцией клетка может с вероятностью 0,5 заразить любую из соседних здоровых клеток.
По прошествии шести единиц времени зараженная клетка становится невосприимчивой к инфекции, возникший иммунитет действует в течение последующих четырех единиц времени, а затем клетка оказывается здоровой.
В ходе моделирования описанного процесса выдавать текущее состояние моделируемого участка кожи в каждом интервале времени, отмечая зараженные, невосприимчивые к инфекции и здоровые клетки.
Для работы была установлена свежая программа с официального сайта visualstudio.microsoft.com которая работает бесплатно на 30 дней. Что бы продолжить работу с программой пришлось регистрироваться и тогда дается лицензионная версия. Обязательно на компьютере, должен установлен пакет NETFramework,Version=v4.6.1
Рекомендации при запуске компилирования кода про лишай. При слабом компьютере не рекомендуется вставлять большие числа, лучше не больше ста, так как визуал студио может зависнуть при обработке. Используйте целые числа. Отрицательные и так не введутся. При запуске компилятора идет расчет зараженной клетки и здоровой, данные выводятся в таблицу справа. Продолжительность включённой программы не должен быть большим, так как может зависнуть на слабом компьютере. Блог учеба
Порядок запуска
1. При загрузке кода нажмите кнопку пуск. Введите значения от 1. Рис 1.
![]() |
рисунок 1 |
1. Что бы остановить компилятор нажми конпку стоп. Что бы сделать новую сетку нажми кнопку новая. Смотри рисунок 2.
![]() |
Рисунок 2 |
Описание интерфейса программы, назначение основных элементов формы.
Метод initializecomponent, который инициализирует все компоненты, расположенные на форме: поля, кнопки, меню, переключатели и загружает откомпилированную страницу компонента.
Метод dataGridView dataGridView - это отображение строк и столбцов данных в сетке, позволяет автоматизировать вывод информации, позволяет вывести таблицу с данными.
Создаем таблицу и конвертируем в 32 от -1 до i++
for (int i = 0; i <= Convert.ToInt32(textBox2.Text) - 1; i++)
{
dataGridView1.Columns.Add(Convert.ToString(i + 1), Convert.ToString(i + 1));
dataGridView1.Columns[i].Width = 25;
}
for (int i = 0; i <= Convert.ToInt32(textBox1.Text) - 1; i++)
{
dataGridView1.Rows.Add();
заполняем таблицу
for (int i = 0; i <= Convert.ToInt32(textBox2.Text) - 1; i++)
{
for (int u = 0; u <= Convert.ToInt32(textBox1.Text) - 1; u++)
{
dataGridView1.Rows[i].Cells[u].Value = "1";
заполняем зараженную клетку
dataGridView1.Rows[horizontal].Cells[vertically].Value = 10;
запускаем таймер
timer1.Enabled = true
Метод MessageBox.Show вводим данные. Сколько клеток будет в сетке.
extchanged - событие для динамического создания текстового поля
При генерации события KeyPress обработчик получает экземпляр класса KeyEventArgs, свойство Key EventArgs. Key Code которого содержит ASCII-символ клавиши, нажатие которой спровоцировало это событие.
Основные команды:
создаем рандомное число - Random rnd = new Random
делаем ход
for (int i = 0; i <= Convert.ToInt32(textBox2.Text) - 1; i++)
{
for (int j = 0; j <= Convert.ToInt32(textBox1.Text) - 1; j++)
{
if (dataGridView1.Rows[i].Cells[j].Value.ToString() != "0")
{
dataGridView1.Rows[i].Cells[j].Value = Convert.ToInt32(dataGridView1.Rows[i].Cells[j].Value.ToString()) - 1;
}
находим зараженные клетки
for (int i = 0; i <= Convert.ToInt32(textBox2.Text) - 1; i++)
{
for (int j = 0; j <= Convert.ToInt32(textBox1.Text) - 1; j++)
{
заражаем соседние клетки кроме крайних
if (i != 0 & j != 0)
выводим результат
int Immunity = 0; //переменная для клеток с иммунитетом
int Patient = 0; //переменная для зараженных клеток
если зараженных клеток нет, то останавливаем таймер
if (Patient == 0 & Immunity == 0)
запускаем таймер
timer1.Enabled = true
Останавливаем таймер
timer1.Enabled = false;
ПРИЛОЖЕНИЕ 1 ТЕКСТ ПРОГРАММЫ
using System;using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
//переменная для хода
int Course = 0;
private void dataGridView2_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
// dataGridView позволяет автоматизировать вывод информации. позволяет вывести таблицу с данными в Вашей программе
}
private void button1_Click(object sender, EventArgs e)
{
if (textBox1.Text != "" & textBox2.Text != "")
{
//Удаление ненужных элементов
label1.Visible = false;
label2.Visible = false;
textBox1.Visible = false;
textBox2.Visible = false;
button1.Visible = false;
dataGridView1.Visible = true;
dataGridView2.Visible = true;
button2.Visible = true;
//вычисляем центр
int horizontal = Convert.ToInt32(textBox2.Text) / 2;
int vertically = Convert.ToInt32(textBox1.Text) / 2;
//Создаем таблицу
for (int i = 0; i <= Convert.ToInt32(textBox2.Text) - 1; i++)
{
dataGridView1.Columns.Add(Convert.ToString(i + 1), Convert.ToString(i + 1));
dataGridView1.Columns[i].Width = 25;
}
for (int i = 0; i <= Convert.ToInt32(textBox1.Text) - 1; i++)
{
dataGridView1.Rows.Add();
}
//заполняем таблицу
for (int i = 0; i <= Convert.ToInt32(textBox2.Text) - 1; i++)
{
for (int u = 0; u <= Convert.ToInt32(textBox1.Text) - 1; u++)
{
dataGridView1.Rows[i].Cells[u].Value = "1";
}
}
//заполняем зараженную клетку
dataGridView1.Rows[horizontal].Cells[vertically].Value = 10;
//запускаем таймер
timer1.Enabled = true;
}
else
{
MessageBox.Show("Введите данные");
}
}
private void новаяToolStripMenuItem_Click(object sender, EventArgs e)
{
Application.Restart();
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
textBox2.Text = textBox1.Text;
}
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
if (!Char.IsDigit(e.KeyChar))
{
e.Handled = !System.Text.RegularExpressions.Regex.IsMatch(e.KeyChar.ToString(), @"[0,1,2,3,4,5,6,7,8,9,\b]");
}
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void textBox2_KeyPress(object sender, KeyPressEventArgs e)
{
if (!Char.IsDigit(e.KeyChar))
{
e.Handled = !System.Text.RegularExpressions.Regex.IsMatch(e.KeyChar.ToString(), @"[0,1,2,3,4,5,6,7,8,9,\b]");
}
}
private void timer1_Tick(object sender, EventArgs e)
{
//создаем рамдомное число
Random rnd = new Random();
//делаем ход
for (int i = 0; i <= Convert.ToInt32(textBox2.Text) - 1; i++)
{
for (int j = 0; j <= Convert.ToInt32(textBox1.Text) - 1; j++)
{
if (dataGridView1.Rows[i].Cells[j].Value.ToString() != "0")
{
dataGridView1.Rows[i].Cells[j].Value = Convert.ToInt32(dataGridView1.Rows[i].Cells[j].Value.ToString()) - 1;
}
}
}
//находим зараженные клетки
for (int i = 0; i <= Convert.ToInt32(textBox2.Text) - 1; i++)
{
for (int j = 0; j <= Convert.ToInt32(textBox1.Text) - 1; j++)
{
//заражаем соседние клетки кроме крайних
if (i != 0 & j != 0)
{
if (i != Convert.ToInt32(textBox2.Text) - 1 & j != Convert.ToInt32(textBox1.Text) - 1)
{
int value = rnd.Next(0, 16);
if (value == 1 | value == 32)
{
if (Convert.ToInt32(dataGridView1.Rows[i - 1].Cells[j - 1].Value.ToString()) == 0)
dataGridView1.Rows[i - 1].Cells[j - 1].Value = 10;
}
if (value == 2 | value == 10)
{
if (Convert.ToInt32(dataGridView1.Rows[i - 1].Cells[j].Value.ToString()) == 0)
dataGridView1.Rows[i - 1].Cells[j].Value = 10;
}
if (value == 3 | value == 11)
{
if (Convert.ToInt32(dataGridView1.Rows[i - 1].Cells[j + 1].Value.ToString()) == 0)
dataGridView1.Rows[i - 1].Cells[j + 1].Value = 10;
}
if (value == 4 | value == 12)
{
if (Convert.ToInt32(dataGridView1.Rows[i].Cells[j - 1].Value.ToString()) == 0)
dataGridView1.Rows[i].Cells[j - 1].Value = 10;
}
if (value == 5 | value == 13)
{
if (Convert.ToInt32(dataGridView1.Rows[i].Cells[j + 1].Value.ToString()) == 0)
dataGridView1.Rows[i].Cells[j + 1].Value = 10;
}
if (value == 6 | value == 14)
{
if (Convert.ToInt32(dataGridView1.Rows[i + 1].Cells[j - 1].Value.ToString()) == 0)
dataGridView1.Rows[i + 1].Cells[j - 1].Value = 10;
}
if (value == 7 | value == 15)
{
if (Convert.ToInt32(dataGridView1.Rows[i + 1].Cells[j].Value.ToString()) == 0)
dataGridView1.Rows[i + 1].Cells[j].Value = 10;
}
if (value ==8 | value == 16)
{
if (Convert.ToInt32(dataGridView1.Rows[i + 1].Cells[j + 1].Value.ToString()) == 0)
dataGridView1.Rows[i + 1].Cells[j + 1].Value = 10;
}
}
}
}
}
//выводим результат
int Immunity = 0; //переменная для клеток с иммунитетом
int Patient = 0; //переменная для зараженных клеток
for (int i = 0; i <= Convert.ToInt32(textBox2.Text) - 1; i++)
{
for (int j = 0; j <= Convert.ToInt32(textBox1.Text) - 1; j++)
{
if (Convert.ToInt32(dataGridView1.Rows[i].Cells[j].Value.ToString()) >= 4)
{
Patient++;
dataGridView1.Rows[i].Cells[j].Style.BackColor = System.Drawing.Color.Red;
}
if (Convert.ToInt32(dataGridView1.Rows[i].Cells[j].Value.ToString()) >= 1 & Convert.ToInt32(dataGridView1.Rows[i].Cells[j].Value.ToString()) <= 3)
{
Immunity++;
dataGridView1.Rows[i].Cells[j].Style.BackColor = System.Drawing.Color.Green;
}
if (Convert.ToInt32(dataGridView1.Rows[i].Cells[j].Value.ToString()) == 0)
{
dataGridView1.Rows[i].Cells[j].Style.BackColor = System.Drawing.Color.White;
}
}
}
Course++;
dataGridView2.Rows.Add(Course, Patient, Immunity, (((Convert.ToInt32(textBox1.Text) * Convert.ToInt32(textBox2.Text)) - Patient) - Immunity));
//если зараженных клеток нет, то останавливаем таймер
if (Patient == 0 & Immunity == 0)
{
timer1.Enabled = false;
}
}
private void button2_Click(object sender, EventArgs e)
{
timer1.Enabled = false;
}
}
}
Помоги с кодом мне задачу решить
ОтветитьУдалить