Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/15: Рейтинг темы: голосов - 15, средняя оценка - 4.93
place status here
 Аватар для gunslinger
3186 / 2220 / 640
Регистрация: 20.07.2013
Сообщений: 6,014

Распространение инфекции

04.12.2014, 03:49. Показов 2942. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
По мотивам темы "Задача об инфекции стригущего лишая".
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
const n = 21, cont = 50, ill = 6, imm = 4, shift_from_top = 57;
int a[n][n] = {0}, b[n][n] = {0}, i, j;
//---------------------------------------------------------------------------
void TForm1::status()
{
  for (i = 0; i < n; i++)
    for (j = 0; j < n; j++)
    {
      if (a[i][j] > 0)
      {
        Canvas->Brush->Color = clRed;
        Canvas->FloodFill(ClientWidth * (i + .5) / n, (ClientHeight - shift_from_top) * (j + .5) / n + shift_from_top, clGreen, fsSurface);
      }
      else
        if (a[i][j] < 0)
        {
          Canvas->Brush->Color = clBlue;
          Canvas->FloodFill(ClientWidth * (i + .5) / n, (ClientHeight - shift_from_top) * (j + .5) / n + shift_from_top, clRed, fsSurface);
        }
      else
        {
          Canvas->Brush->Color = clGreen;
          Canvas->FloodFill(ClientWidth * (i + .5) / n, (ClientHeight - shift_from_top) * (j + .5) / n + shift_from_top, clBlue, fsSurface);
        }
    }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormPaint(TObject *Sender)
{
  Canvas->Brush->Color = clGreen;
  Canvas->Pen->Color = clBlack;
  Canvas->Rectangle(0, shift_from_top, ClientWidth, ClientHeight);
  UINT k;
  for (k = 1; k < n; k++)
  {
    Canvas->MoveTo(k * ClientWidth / n, shift_from_top);
    Canvas->LineTo(k * ClientWidth / n, ClientHeight + 1);
 
    Canvas->MoveTo(0, k * (ClientHeight - shift_from_top) / n + shift_from_top);
    Canvas->LineTo(ClientWidth + 1, k * (ClientHeight - shift_from_top) / n + shift_from_top);
  }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  if (!Tag)
  {
    a[n/2][n/2] = 1;
    status();
    randomize();
    Tag = 1;
  }
 
  Timer1->Enabled ^= 1;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
  for (i = 0; i < n; i++)
    for (j = 0; j < n; j++)
      b[i][j] = a[i][j];
  for (i = 0; i < n; i++)
    for (j = 0; j < n; j++)
    {
      if (a[i][j] > 0)
      {
        if ((i > 0) && (b[i-1][j] == 0) && (random(100) < cont))
          b[i-1][j] = 1;
        if ((j > 0) && (b[i][j-1] == 0) && (random(100) < cont))
          b[i][j-1] = 1;
        if ((i < n-1) && (b[i+1][j] == 0) && (random(100) < cont))
          b[i+1][j] = 1;
        if ((j < n-1) && (b[i][j+1] == 0) && (random(100) < cont))
          b[i][j+1] = 1;
        b[i][j]++;
        if (b[i][j] > ill)
          b[i][j] = -imm;
      }
      else
        if (a[i][j] < 0)
          b[i][j]++;
    }
  for (i = 0; i < n; i++)
    for (j = 0; j < n; j++)
      a[i][j] = b[i][j];
  status();
}
Миниатюры
Распространение инфекции  
Вложения
Тип файла: zip infection.zip (58.8 Кб, 47 просмотров)
1
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.12.2014, 03:49
Ответы с готовыми решениями:

Задача об инфекции стригущего лишая
Прошу помочь составить код Суть задачи: Промоделируйте процесс распространения инфекции стригущего лишая по участку кожи размером n...

Промоделировать процесс распространения инфекции
Помогите пожалуйста написать программу на языке Java. Задание: Промоделировать процесс распространения инфекции - стригущего лишая по...

Задача об инфекции стригущего лишая
Помогите разработать архитектуру программы для решения такой задачи: Промоделировать процесс распространения инфекции — стригущего...

6
0 / 0 / 0
Регистрация: 01.12.2014
Сообщений: 3
04.12.2014, 07:25
О, большое спасибо.

Только вопрос - исходный код в билдер вставить не смог (у меня C++ Builder 6), а файл в архиве выдал это:

"Запуск программы невозможен, так как на компьютере отсутствует rtl190.bpl". Попробуйте переустановить программу".

Добавлено через 9 минут
Если можно скиньте пожалуйста .срр'шники.
И еще раз спасибо, премного благодарен.

Добавлено через 2 часа 45 минут
А если быть точнее не понял только начиная с 4-ой строки и до конца этой функции
C++
1
 (void TForm1::status()
)
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
04.12.2014, 11:42
gunslinger, планерное ружье, райский сад? ))

Добавлено через 21 минуту
Парочка комментариев:
1) Цвета вынести в собственные цветовые переменные
2)
C++
59
60
61
  for (i = 0; i < n; i++)
    for (j = 0; j < n; j++)
      b[i][j] = a[i][j];
Можно заменить на
C++
59
memcpy( b, a, n*n *sizeof( a[0][0] ) );
И восемьдесят третья строка соответственно.
3) Было б хорошо комментарии небольшие делать все ж. Типа там /*лево*/, /*право*/, /*верх*/, /*заражаем*/. Это ж вы напоказ код сделали.
1
place status here
 Аватар для gunslinger
3186 / 2220 / 640
Регистрация: 20.07.2013
Сообщений: 6,014
04.12.2014, 13:58  [ТС]
начинаю, в настройках проекта слетели галки, поэтому проблемы с ехе; исправил.
Во сложениях "рабочий" (независимо от наличия среды) ехе-шник [infection] и проект [epidemy] целиком (надеюсь, догадаешься, что взять для своего билдера).
В комментариях к коду по возможности подробно расписал все строки.
cpp:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
// размер области, заразность в процентах, время болезни, длительность иммунитета и сдвиг относительно верха формы
const n = 21, cont = 50, ill = 6, imm = 4, shift_from_top = 57;
int a[n][n] = {0}, b[n][n] = {0}, i, j;
// цвета клеток - здоровая, зараженная и невосприимчивая к инфекции
TColor cell_color[3] = {clGreen, clRed, clBlue};
TColor healthy_cell_color = cell_color[0];
TColor sick_cell_color = cell_color[1];
TColor immune_cell_color = cell_color[2];
//---------------------------------------------------------------------------
void TForm1::status()  // функция для "отрисовки" клеток
{
  // проверяем в циклах все клетки
  for (i = 0; i < n; i++)
    for (j = 0; j < n; j++)
    {
      if (a[i][j] > 0)  // если клетка больная (значение больше 0)
      {
        // выбираем цвет клетки (цвет кисти) как красный
        Canvas->Brush->Color = sick_cell_color;
        // закрашиваем клетку красным; так как зараженной может стать только здоровая клетка, то закрасить можем лишь зеленую клетку
        Canvas->FloodFill(ClientWidth * (i + .5) / n, (ClientHeight - shift_from_top) * (j + .5) / n + shift_from_top, healthy_cell_color, fsSurface);
      }
      else
        if (a[i][j] < 0)  // если клетка невосприимчива к болезни (значение меньше 0)
        {
          // выбираем цвет клетки (цвет кисти) как синий
          Canvas->Brush->Color = immune_cell_color;
          // закрашиваем клетку синим; так как невосприимчивой может стать только больная клетка, то закрасить можем лишь красную клетку
          Canvas->FloodFill(ClientWidth * (i + .5) / n, (ClientHeight - shift_from_top) * (j + .5) / n + shift_from_top, sick_cell_color, fsSurface);
        }
      else  // если клетка здорова (значение равно 0)
        {
          // выбираем цвет клетки (цвет кисти) как зеленый
          Canvas->Brush->Color = healthy_cell_color;
          // закрашиваем клетку зеленым; так как здоровой может стать только невосприимчивая к инфекции клетка, то закрасить можем лишь синюю клетку
          Canvas->FloodFill(ClientWidth * (i + .5) / n, (ClientHeight - shift_from_top) * (j + .5) / n + shift_from_top, immune_cell_color, fsSurface);
        }
    }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormPaint(TObject *Sender)  // отрисовка клеток
{
  // задаем цвета текстовых подсказок (статусы клеток)
  Label2->Font->Color = healthy_cell_color;
  Label3->Font->Color = sick_cell_color;
  Label4->Font->Color = immune_cell_color;
  // цвет кисти
  Canvas->Brush->Color = healthy_cell_color;
  // цвет линий черный
  Canvas->Pen->Color = clBlack;
  // рисуем большой прямоугольник на форме
  Canvas->Rectangle(0, shift_from_top, ClientWidth, ClientHeight);
  UINT k;
  for (k = 1; k < n; k++)
  {
    // рисуем вертикальные линии, разделяющие клетки
    Canvas->MoveTo(k * ClientWidth / n, shift_from_top);
    Canvas->LineTo(k * ClientWidth / n, ClientHeight + 1);
 
    // рисуем горизонтальные линии, разделяющие клетки
    Canvas->MoveTo(0, k * (ClientHeight - shift_from_top) / n + shift_from_top);
    Canvas->LineTo(ClientWidth + 1, k * (ClientHeight - shift_from_top) / n + shift_from_top);
  }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)  // запуск / пауза инфекции
{
  if (!Tag)  // вначале
  {
    a[n/2][n/2] = 1;  // заражение идет от центральной клетки
    status();  // отрисовываем статусы клеток
    randomize();  // запускаем ГСЧ
    Tag = 1;  // инициализацию делаем один раз, поэтому меняем значение
  }
 
  Timer1->Enabled ^= 1;  // если таймер включен - выключаем, иначе включаем
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
  memcpy(b, a, n * n * sizeof(a[0][0]));  // присваиваем значения элементов массива a массиву b
  // проверяем в циклах все клетки
  for (i = 0; i < n; i++)
    for (j = 0; j < n; j++)
    {
      if (a[i][j] > 0)  // если клетка больная
      {
        // если не первый столбец клеток, клетка слева здоровая и выполнено условие заражения
        if ((i > 0) && (b[i-1][j] == 0) && (random(100) < cont))
          b[i-1][j] = 1;  // заражаем клетку слева
        // если не первая строка клеток, клетка сверху здоровая и выполнено условие заражения
        if ((j > 0) && (b[i][j-1] == 0) && (random(100) < cont))
          b[i][j-1] = 1;  // заражаем клетку сверху
        // если не крайний правый столбец клеток, клетка справа здоровая и выполнено условие заражения
        if ((i < n-1) && (b[i+1][j] == 0) && (random(100) < cont))
          b[i+1][j] = 1;  // заражаем клетку справа
        // если не нижняя строка клеток, клетка снизу здоровая и выполнено условие заражения
        if ((j < n-1) && (b[i][j+1] == 0) && (random(100) < cont))
          b[i][j+1] = 1;  // заражаем клетку снизу
        // увеличиваем значение в клетке (имитация процесса развития инфекции)
        b[i][j]++;
        if (b[i][j] > ill)  // если клетка переболела
          b[i][j] = -imm;  // переводим ее в невосприимчивые к болезни (иммунные)
      }
      else
        if (a[i][j] < 0)  // если клетка иммунная
          b[i][j]++;  // увеличиваем значение в ней
      // со здоровыми клетками (a[i][j] = 0) без влияния больных ничего не происходит
    }
  memcpy(a, b, n * n * sizeof(b[0][0]));  // присваиваем значения элементов массива b массиву a
  status();  // отрисовываем статусы клеток
}
h:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class TForm1 : public TForm
{
__published:    // IDE-managed Components
    TButton *Button1;
    TTimer *Timer1;
    TLabel *Label1;
    TLabel *Label2;
    TLabel *Label3;
    TLabel *Label4;
    void __fastcall FormPaint(TObject *Sender);
    void __fastcall Button1Click(TObject *Sender);
    void __fastcall Timer1Timer(TObject *Sender);
private:    // User declarations
public:     // User declarations
    __fastcall TForm1(TComponent* Owner);
    void status ();
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
SatanaXIII, пожелания выполнил.
Насчет "кода напоказ". В исходной теме задача подробно описывается, я лишь "немного переработал" код (изначально посчитал комментарии излишними).
Поэтому не вижу никакой показухи. Зашел на форум, когда захотелось, увидел задачу, понравилась - сделал.
Нравилось бы "выставляться" - я задался б тогда целью стать модератором и толкал умные вещи (это не камень в чей-то огород, лишь собственное мнение).
К тому же показуха сродни "потемкинским деревням" - красивый фасад, а за ним ничего.
У меня же за фасадом не скрывается домик из соломы (пусть и не элитный дом из кирпича, но жить вполне можно).
Тут я потихоньку начал "толкать речи", но я не модератор, мне простительно.
0
place status here
 Аватар для gunslinger
3186 / 2220 / 640
Регистрация: 20.07.2013
Сообщений: 6,014
04.12.2014, 14:09  [ТС]
Вложения.
Вложения
Тип файла: zip infection.zip (1.36 Мб, 47 просмотров)
Тип файла: zip epidemy.zip (1.51 Мб, 54 просмотров)
1
04.12.2014, 18:44

Не по теме:

gunslinger, не хочу показаться адвокатом, но в данном контексте "напоказ" - это значит не для показухи, а для того, чтобы ПОКАЗАТЬ вариант решения задачи таким, к примеру, как я сам, кто по-честному пытается изучать C++Builder. В этом случае комментарии в коде - очень значимая вещь.

0
05.12.2014, 12:24  [ТС]

Не по теме:

Возможно, не так понял. Однако всегда не очень любил объяснять другим код, который сам написал / самому понятен. Код обычно обладает большей информативной (информационной) емкостью на единицу текста по сравнению с его полным / подробным описанием (если переделать рекламу, то можно резюмировать - слова излишни, когда есть строчка кода).

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.12.2014, 12:24
Помогаю со студенческими работами здесь

Распространение
Написал прогу и появилась такая проблема. Как запаковать проект (т.е exe и прилогающиеся к моей проге dll в месте с необходимыми файлами...

Распространение программ
Привет! Подскажите правильный способ распространения питоновских программ. Вчера хотел брату кинуть программу на питоне для пробы. Но...

Распространение контента
Здравствуйте! Планирую создать сайт для распространения приложений для портативных платформ: Android, Windows Phone, iOS. Всё ПО будет...

Распространение ПО (deployment)
Как по мне, чем дальше, тем больше головной боли с установкой ПО на другой компьютер. Когда-то баловался с Visual Basic 6. Создание...

Распространение гриппа
Привет=) Вот такая задача: на форме расположен StringGrid с размерами 9х9. На самом центре стоит точка - эта источник заражения(в нашем...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru