Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
0 / 0 / 0
Регистрация: 06.12.2019
Сообщений: 22

Изменить алгоритм с "топорного" на "хороший"

06.06.2022, 15:36. Показов 1459. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую вас, друзья. Нужна помощь в написании другой реализации кода, не такой как у меня ( топорной ).

Нужно изменить код который включает генераторы ( то есть меняет их цвет на зеленый ), у меня это реализовано через case и работает с ошибкой, когда наш i равен 5 ( из-за того что генераторы не покрывают расходы потребителей ) программа не знает , что такое 5 и отключает генераторы вообще, и включает их уже когда наш i равен 4 - ём. Да можно просто создать 5-ый case и тогда все будет работать, но это , думаю вы понимаете, не очень(
Первый раз работаю с формами, я не понимаю как можно сделать данный алгоритм лучше... Буду благодарен за помощь!

Вот кусок кода, который нужно менять, ниже будет весь код.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
 switch (i) //включаем нужные
            {
            case 1: { Form1->Shape1->Brush->Color = clGreen; } break;
            case 2: { Form1->Shape1->Brush->Color = clGreen;
                      Form1->Shape2->Brush->Color = clGreen; } break;
            case 3: { Form1->Shape1->Brush->Color = clGreen;
                      Form1->Shape2->Brush->Color = clGreen;
                      Form1->Shape3->Brush->Color = clGreen; } break;
            case 4: { Form1->Shape1->Brush->Color = clGreen;
                      Form1->Shape2->Brush->Color = clGreen;
                      Form1->Shape3->Brush->Color = clGreen;
                      Form1->Shape4->Brush->Color = clGreen; } break;
            };




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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
//---------------------------------------------------------------------------
 
#include <vcl.h>
#include <math.h>
#pragma hdrstop
 
//#include "Header.h"
#include "MainUnit.h"
#include "GrafikUnit.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1* Form1;
 
 
HANDLE hThread1;
HANDLE hThread2;
TRTLCriticalSection sect;
 
double G1; //Общая выработка на данный час
double P; //Общее потребление на данный час
int h; //часы
//---------------------------------------------------------------------------
DWORD WINAPI ThreadFunc1(void* p) //1 поток - моделирует работу электростанции
{
    double G[4] = { 100, 100, 120, 120 }; //мощности генераторов
    while (1)
    {
        if (!Form1->stop)
        {
            Sleep(1000); //Задержка 1 с
            EnterCriticalSection(&sect); //Входим в критическую секцию
 
            G1 = 0;
            int i = 1;
            double s;  //       = 0
            for (; i <= 4; i++)
            { //определяем сколько генераторов покроет текущие потери
                G1 += G[i - 1];
                if (G1 > P) break;
            }
 
            //Выводим величину текущей выработки на график
            AnsiString buf;
            buf.sprintf("%3.1lf", G1);
 
            Form1->Label15->Caption = buf;
            Form2->Series2->AddXY(h, G1, h, clGreen);
            LeaveCriticalSection(&sect);
 
            //"отключаем" все генераторы
            Form1->Shape1->Brush->Color = clWhite;
            Form1->Shape2->Brush->Color = clWhite;
            Form1->Shape3->Brush->Color = clWhite;
            Form1->Shape4->Brush->Color = clWhite;
 
 
            switch (i) //включаем нужные
            {
            case 1: { Form1->Shape1->Brush->Color = clGreen; } break;
            case 2: { Form1->Shape1->Brush->Color = clGreen;
                      Form1->Shape2->Brush->Color = clGreen; } break;
            case 3: { Form1->Shape1->Brush->Color = clGreen;
                      Form1->Shape2->Brush->Color = clGreen;
                      Form1->Shape3->Brush->Color = clGreen; } break;
            case 4: { Form1->Shape1->Brush->Color = clGreen;
                      Form1->Shape2->Brush->Color = clGreen;
                      Form1->Shape3->Brush->Color = clGreen;
                      Form1->Shape4->Brush->Color = clGreen; } break;
            };
        }
    }
 
}
//---------------------------------------------------------------------------
DWORD WINAPI ThreadFunc2(void* p) //2-ой поток моделирует потребление энергии
{
    while (1)
    {
        if (!Form1->stop)
        {
            Form1->Label8->Caption = h;
            AnsiString buf;
 
            Sleep(1000);
            //расчёт потребления
            double P1 = 100 + 20 * sin((M_PI / 2) * (h / 6 - 1));
            buf.sprintf("%3.1lf", P1);
            Form1->Label5->Caption = buf;
 
            double P2 = 180 + 50 * sin((M_PI / 2) * (h / 6 - 1));
            buf.sprintf("%3.1lf", P2);
            Form1->Label6->Caption = buf;
 
            double P3 = 90 + 20 * sin((M_PI / 2) * (h / 6 - 1));
            buf.sprintf("%3.1lf", P3);
            Form1->Label7->Caption = buf;
 
            EnterCriticalSection(&sect); //входим в критическую секцию
            P = P1 + P2 + P3;
 
            buf.sprintf("%3.1lf", P);
 
            Form1->Label11->Caption = buf;
            Form2->Series1->AddXY(h, P, h, clRed);
 
            LeaveCriticalSection(&sect);
 
            h++; //переход на следующий час
            if (h == 24)
            {
                h = 0;//"обнуляем" часы при наступлении новых суток
                Form2->Series1->Clear();
                Form2->Series2->Clear(); 
            }
        }
    }
 
}
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject* Sender)
{
    //снимаем с паузы потоки
    if (stop)
    {
        stop = false;
        Button2->Caption = "СТОП";
        Form2->Button2->Caption = "СТОП";
    }
    else
    {
        stop = true;
        Button2->Caption = "ПУСК";
        Form2->Button2->Caption = "ПУСК";
    }
 
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject* Sender)
{
    P = 0.0;
    G1 = 0.0;
    h = 0;
    stop = true;
    InitializeCriticalSection(&sect); //инициализируем критическую секцию
 
    hThread1 = CreateThread(0, 0, ThreadFunc1, 0, 0, NULL);
    hThread2 = CreateThread(0, 0, ThreadFunc2, 0, 0, NULL);
 
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject* Sender, TCloseAction& Action)
{
 
    if (hThread1 != NULL)
        TerminateThread(hThread1, 0);  //завершаем 1-ый поток
    if (hThread2 != NULL)
        TerminateThread(hThread1, 0);  //завершаем 2-ой поток
 
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject* Sender)
{
    Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject* Sender)
{
    Form2->Show();
}
//---------------------------------------------------------------------------
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.06.2022, 15:36
Ответы с готовыми решениями:

Подскажите хороший алгоритм масштабирования входных данных
Какой алгоритм масштабирования посоветуете для задачи прогнозирования с использованием нейронных сетей?

Задача о раскройке прямоугольника многоугольниками. Нужно найти "хороший" алгоритм
Привет читающим! Условия задачи: Задан прямоугольник со сторонами А и В. А,В принадлежат дествительным числам(или к большим целым числам)....

Изменить алгоритм на рекурсивный. x^2+y^2<n
Здравствуйте, никак не могу переделать алгоритм на рекурсивный. Прошу помочь. #include &lt;stdio.h&gt; #include &lt;math.h&gt; int...

3
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
06.06.2022, 17:02
Лучший ответ Сообщение было отмечено Extel как решение

Решение

Extel, от ваших switch... case... в первом потоке можно отказаться, например, применив такой код.
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
DWORD WINAPI ThreadFunc1(void* p) //1 поток - моделирует работу электростанции
{
    double G[4] = { 100, 100, 120, 120 }; //мощности генераторов
    while (1)
    {
        if (!Form1->stop)
        {
            Sleep(1000); //Задержка 1 с
            EnterCriticalSection(&sect); //Входим в критическую секцию
 
            G1 = 0;
            int i = 1;
            double s;  //       = 0
            for (; i <= 4; i++)
            { //определяем сколько генераторов покроет текущие потери
                G1 += G[i - 1];
                if (G1 > P) break;
            }
 
            //Выводим величину текущей выработки на график
            AnsiString buf;
            buf.sprintf("%3.1lf", G1);
 
            Form1->Label15->Caption = buf;
            Form2->Series2->AddXY(h, G1, h, clGreen);
            LeaveCriticalSection(&sect);
 
            Form1->Shape1->Brush->Color = i>0 ? clGreen : clWhite;   // new
            Form1->Shape2->Brush->Color = i>1 ? clGreen : clWhite;   // new
            Form1->Shape3->Brush->Color = i>2 ? clGreen : clWhite;   // new
            Form1->Shape4->Brush->Color = i>3 ? clGreen : clWhite;   // new
  /*
            //"отключаем" все генераторы
            Form1->Shape1->Brush->Color = clWhite;
            Form1->Shape2->Brush->Color = clWhite;
            Form1->Shape3->Brush->Color = clWhite;
            Form1->Shape4->Brush->Color = clWhite;
 
            switch (i) //включаем нужные
            {
            case 1: { Form1->Shape1->Brush->Color = clGreen; } break;
            case 2: { Form1->Shape1->Brush->Color = clGreen;
                      Form1->Shape2->Brush->Color = clGreen; } break;
            case 3: { Form1->Shape1->Brush->Color = clGreen;
                      Form1->Shape2->Brush->Color = clGreen;
                      Form1->Shape3->Brush->Color = clGreen; } break;
            case 4: { Form1->Shape1->Brush->Color = clGreen;
                      Form1->Shape2->Brush->Color = clGreen;
                      Form1->Shape3->Brush->Color = clGreen;
                      Form1->Shape4->Brush->Color = clGreen; } break;
            };
     */
        } 
    }
 
}
Но в целом с алгоритмом что-то не так, и дело здесь не в формах.
1
0 / 0 / 0
Регистрация: 06.12.2019
Сообщений: 22
06.06.2022, 18:20  [ТС]
Спасибо большое, но почему код не хочет работать , выдает такую ошибку : Access violation at address 0924225C in module ‘dclite60.bpl’. Read of address 00302F34.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33379 / 21503 / 8236
Регистрация: 22.10.2011
Сообщений: 36,899
Записей в блоге: 12
06.06.2022, 19:56
Лучший ответ Сообщение было отмечено Extel как решение

Решение

Просто напишу это, вдруг кому пригодится...

Цитата Сообщение от Extel Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
            switch (i) //включаем нужные
            {
            case 1: { Form1->Shape1->Brush->Color = clGreen; } break;
            case 2: { Form1->Shape1->Brush->Color = clGreen;
                      Form1->Shape2->Brush->Color = clGreen; } break;
            case 3: { Form1->Shape1->Brush->Color = clGreen;
                      Form1->Shape2->Brush->Color = clGreen;
                      Form1->Shape3->Brush->Color = clGreen; } break;
            case 4: { Form1->Shape1->Brush->Color = clGreen;
                      Form1->Shape2->Brush->Color = clGreen;
                      Form1->Shape3->Brush->Color = clGreen;
                      Form1->Shape4->Brush->Color = clGreen; } break;
            };
Меняется на
C++
1
2
3
4
5
6
7
            switch (i) //включаем нужные
            {
            case 4: Form1->Shape4->Brush->Color = clGreen;
            case 3: Form1->Shape3->Brush->Color = clGreen;
            case 2: Form1->Shape2->Brush->Color = clGreen;
            case 1: Form1->Shape1->Brush->Color = clGreen;
            };
(безо всяких break-ов...)
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.06.2022, 19:56
Помогаю со студенческими работами здесь

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

Изменить алгоритм поиска
Помогите изменить алгоритм поиска, внести изменения в программу и откомпилировать Вот что получилось у меня #include...

Изменить алгоритм выбора файла
Добрый вечер, нашел тут один алгоритм шифрования файлов, довольно простой в своем роде, но есть проблемка, он выбирает файлы в ручную, а...

Можно ли изменить алгоритм работы скрипта?
Добрый день! Пытаюсь сделать систему комментирования для сайта без перезагрузки страницы, но пока что нахожусь на стадии макета. ...

Нужно немного изменить алгоритм Краскала
Здравствуйте, У меня есть алгоритм краскала использующий систему непересекающихся множеств (disjoint set). Код под спойлером. ...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru