Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
0 / 0 / 0
Регистрация: 12.01.2020
Сообщений: 17

Ошибка программы при выполнении цикла перебора

12.03.2020, 10:09. Показов 3083. Ответов 21

Студворк — интернет-сервис помощи студентам
Добрый день коллеги )))

Помогите разобраться.
При выполнении процедуры - цикла перебора комбинаций чисел по условию выдает ошибку - "Out of memory"
Условие выполнения:
{Перебор комбинаций чисел отвечающих правилу:}
{1. - Комбинация чисел соответствует выбранным комбинациям в Массиве !-KombGrop-!}
{2. - Найденная комбинация соответствует условию по сумме чисел равное массиву !-KombSum-!}

Зависает именно на цикле перебора комбинаций For N1....N6 и проверка по условию соответствия комбинации чисел по распределению по группам:
{Группа-1 от 01 до 09}
{Группа-2 от 10 до 19}
{Группа-3 от 20 до 29}
{Группа-4 от 30 до 39}
{Группа-5 от 40 до 45}

Как можно оптимизировать цикл, чтобы избежать зависания и ошибки "Out of memory"?

Кликните здесь для просмотра всего текста

Delphi
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
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
{-------------------------------------------------------------------------------------------------------------------------------------}
{Перебор комбинаций по условиям ограничения выпадения числа}
procedure TForm1.BitBtn5Click(Sender: TObject);
Var
Start, Finish: Cardinal; {Переменные для подсчета времени выполнения процедуры}
{}
KombGrop: array of array of Integer; {Массив по таблице StringGrid14 - по столбцам c 0 по 7 - Варианты по Группам}
{}
KombSum : array of array of Integer; {Массив по таблице StringGrid10 - по столбцам c 0 по 3 - Варианты Сумм}
{}
i, j : Integer;
{}
N1, N2, N3, N4, N5, N6  : Integer;    {Переменные для перебора чисел - отыскание комбинаций отвечающих условиям}
KolKomb                       :  Integer;   {Счетчик количества комбинаций по условию комбинациям в Массиве !-KombGrop-!}
NomGrup                      :  Integer;   {для записи номера комбинации в соответствии с  группами в массиве !-KombGrop-!}
MasKomb : array[1..6] of integer;     {Массив комбинации чисел во время перебора}
{}
Gruppa1, Gruppa2, Gruppa3, Gruppa4, Gruppa5: Integer; {Счетчики количества чисел в определенной группе}
Gruppa  : array[1..5] of integer;                                      {Массив распределения цифр в комбинации по группам}
N           :  Integer;                   {Переменная для проверки равенства комбинации}
NKomb   :  Integer;                   {№ комбинации найденной при сравнении}
{}
begin {0}
 Start := GetTickCount;   {Фиксируем время начала выполнение процедуры}
{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
 {Задание размера массива KombGrop}
 SetLength(KombGrop,StrToInt(LabeledEdit19.Text), 7);  {Задание размера Массива KombGrop равного количеству записей в таблице, где 5 количество столбцов Групп1-5}
 {Запись Массива KombGrop данными из таблицы StringGrid14}
 for i:=0 to Length(KombGrop)-1 do   {перебор по строкам Массива KombGrop для записи данных- количество строк}
    begin {1}
         For j:=0 to 6 do {Перебор по столбцам Таблицы и Массива}
            Begin {2}
                 KombGrop[i,j]:=StrToInt(StringGrid14.Cells[j+1,i+1]); {Запись по строкам в Массив (KombGrop) данных из таблицы StringGrid14}
            end; {2}
       {Проверка записи данных из таблицы с данными Групп по тиражам в массив KombGrop}
       LabeledEdit20.Text:=IntToStr(Length(KombGrop));  {Проверка количество записей в Массиве должно соответствовать количеству Записей}
    end; {1}
 {Запись данных из Массива KombGrop в таблицу StringGrid21}
 StringGrid21.RowCount:=Length(KombGrop)+1;  {Присвоение значения количество строк равное количеству записей в Массиве}
 {Обозначение столбцов в таблице StringGrid21}
 StringGrid21.Cells[0,0]:='№';   {№ ГРУППЫ количества комбинаций выпадения чисел по Группам из таблицы StringGrid21}
 StringGrid21.Cells[1,0]:='01-09';   {Группа-1 от 01 до 09}
 StringGrid21.Cells[2,0]:='10-19';   {Группа-2 от 10 до 19}
 StringGrid21.Cells[3,0]:='20-29';   {Группа-3 от 20 до 29}
 StringGrid21.Cells[4,0]:='30-39';   {Группа-4 от 30 до 39}
 StringGrid21.Cells[5,0]:='40-45';   {Группа-5 от 40 до 45}
 StringGrid21.Cells[6,0]:='КолВып';  {Количество выпадений комбинации}
 StringGrid21.Cells[7,0]:='Среднее'; {Среднее}
 for i:=0 to Length(KombGrop)-1 do   {перебор по Массиву KombGrop - и запись данных из массива в таблицу StringGrid21}
    begin {3}
         For j:=0 to 6 do
            Begin {4}
            {Для Проверки Запись данных из Массива KombGrop вариантами распределения по Группам в таблицу StringGrid21}
                 StringGrid21.Cells[j+1,i+1]:=IntToStr(KombGrop[i,j]);
            end; {4}
         StringGrid21.Cells[0,i+1]:=IntToStr(i+1); {нумерация строк в таблице StringGrid21.}
         {Количество записей должно соответствовать количеству записей}
            end; {3}
 LabeledEdit21.Text:=IntToStr(StringGrid21.RowCount-1);  {Проверка количества записей в таблице}
{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
 {Задание размера массива KombSum}
 SetLength(KombSum,StrToInt(LabeledEdit22.Text), 2);  {Задание размера Массива KombSum равного количеству записей в таблице, где 3 количество столбцов в Таблице}
 {Запись Массива KombGrop данными из таблицы StringGrid14}
 for i:=0 to Length(KombSum)-1 do   {перебор по строкам Массива KombSum для записи данных- количество строк}
    begin {1}
         For j:=0 to 1 do {Перебор по столбцам Таблицы и Массива}
            Begin {2}
                 KombSum[i,j]:=StrToInt(StringGrid10.Cells[j+1,i+1]); {Запись по строкам в Массив (KombGrop) данных из таблицы StringGrid14}
            end; {2}
       {Проверка записи данных из таблицы с данными Групп по тиражам в массив KombGrop}
    end; {1}
 {Запись данных из Массива KombSum в таблицу StringGrid22}
 StringGrid22.RowCount:=Length(KombSum)+1;  {Присвоение значения количество строк равное количеству записей в Массиве}
 {Обозначение столбцов в таблице StringGrid21}
 StringGrid22.Cells[0,0]:='№';   {№ количества комбинаций выпадения чисел по Группам из таблицы StringGrid21}
 StringGrid22.Cells[1,0]:='СумТир';   {Сумма}
 StringGrid22.Cells[2,0]:='КолВып';   {количество раз}
  {}
 for i:=0 to Length(KombSum)-1 do   {перебор по Массиву KombGrop - и запись данных из массива в таблицу StringGrid21}
    begin {3}
         For j:=0 to 1 do
            Begin {4}
            {Для Проверки Запись данных из Массива KombGrop вариантами распределения по Группам в таблицу StringGrid21}
                 StringGrid22.Cells[j+1,i+1]:=IntToStr(KombSum[i,j]);
            end; {4}
         StringGrid22.Cells[0,i+1]:=IntToStr(i+1); {нумерация строк в таблице StringGrid22.}
         {Количество записей должно соответствовать количеству выборок из LabeledEdit22}
    end; {3}
 {Сортировка данных в таблице LabeledEdit22 по столбцу - Сумма}
 GridSort1(StringGrid22,1); {РАБОТАЕТ где 1- номер столбца по которому производиться сортировка}
 {}
{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
{Перебор комбинаций чисел отвечающих правилу:}
{1. - Комбинация чисел соответствует выбранным комбинациям в Массиве !-KombGrop-!}
{2. - Найденная комбинация соответствует условию по сумме чисел равное массиву !-KombSum-!}
{}
 StringGrid23.Cells[0,0]:='№';    {№ комбинации}
 StringGrid23.Cells[1,0]:='№1';   {Число №1 Найденное отвечающее правилу комбинации по Группам}
 StringGrid23.Cells[2,0]:='№2';   {Число №2 Найденное отвечающее правилу комбинации по Группам}
 StringGrid23.Cells[3,0]:='№3';   {Число №3 Найденное отвечающее правилу комбинации по Группам}
 StringGrid23.Cells[4,0]:='№4';   {Число №4 Найденное отвечающее правилу комбинации по Группам}
 StringGrid23.Cells[5,0]:='№5';   {Число №5 Найденное отвечающее правилу комбинации по Группам}
 StringGrid23.Cells[6,0]:='№5';   {Число №6 Найденное отвечающее правилу комбинации по Группам}
 StringGrid23.Cells[7,0]:='№Комб';  {Количество выпадений комбинации}
// StringGrid23.Cells[7,0]:='Сумма'; {Сумма}
 KolKomb:=0;
{}
For N1:=1 to 40 do
  Begin {For N1}
     MasKomb[1]:=N1;
     For N2:= N1+1 to 41 do
       Begin {For N2}
          MasKomb[2]:=N2;
          For N3:= N2+1 to 42 do
            Begin {For N3}
               MasKomb[3]:=N3;
               For N4:= N3+1 to 43 do
                 Begin {For N4}
                    MasKomb[4]:=N4;
                    For N5:= N4+1 to 44 do
                      Begin {For N5}
                         MasKomb[5]:=N5;
                         For N6:= N5+1 to 45 do
                           Begin {For N6}
                             MasKomb[6]:=N6;                           {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
                            {Обнуление начальных значений счетчиков количества чисел в определенной группе}
                               Gruppa1:=0;
                               Gruppa2:=0;
                               Gruppa3:=0;
                               Gruppa4:=0;
                               Gruppa5:=0;
                             for i:=1 to 5 do 
                             {перебор по столбцам Массива MasKomb - количество столбцов в MasKomb =(5)}
                             Begin {for i}
                               IF (MasKomb[i]>=1)   AND  (MasKomb[i]<=9)  Then Gruppa1:=Gruppa1+1;  {Число входит в Группу-1}
                               IF (MasKomb[i]>=10)  AND  (MasKomb[i]<=19) Then Gruppa2:=Gruppa2+1;  {Число входит в Группу-2}
                   IF (MasKomb[i]>=20)  AND  (MasKomb[i]<=29) Then Gruppa3:=Gruppa3+1;  {Число входит в Группу-3}
                       IF (MasKomb[i]>=30)  AND  (MasKomb[i]<=39) Then Gruppa4:=Gruppa4+1;  {Число входит в Группу-4}
                       IF (MasKomb[i]>=40)  AND  (MasKomb[i]<=45) Then Gruppa5:=Gruppa5+1;  {Число входит в Группу-5}
                     end; {for i}
                             Gruppa[1]:= Gruppa1;   {Запись распределения в массив}
                             Gruppa[2]:= Gruppa2;   {Запись распределения в массив}
                             Gruppa[3]:= Gruppa3;   {Запись распределения в массив}
                             Gruppa[4]:= Gruppa4;   {Запись распределения в массив}
                             Gruppa[5]:= Gruppa5;   {Запись распределения в массив}
                             {Проверка на попадание Gruppa комбинации в Группу отобранную в массив KombGrop}
                              N:=0;
                              for i:=0 to  Length(KombGrop)-1 do  {Перебор массива KombGrop по строкам}
                                Begin {for i}
                                   for j:=1 to 5 do
//                                   Begin {for j}                                    
                                       If  Gruppa[j]=KombGrop[i,j] then N:=N+1; {В случае совпадения комбинации N=5}
//                                   end;  {for j}
                                   If N=5 Then
                                     begin {If N=5}
                                     {Присваиваем номер найденной комбинации}
                                     {Найдена комбинация}
                                     {Выполняем запись найденной комбинации в таблицу StringGrid23}
                                     {Выполняем подсчет суммы чисел в найденной комбинации}
                                        NKomb:=i;
                                        KolKomb:=KolKomb+1;        {Счетчик найденных комбинаций}
                                        {Запись найденной комбинации в таблицу StringGrid23}
                                        StringGrid23.Cells[0,KolKomb]:=IntToStr(KolKomb);      {№ найденной комбинации отвечающая условию}
//                                        StringGrid23.Cells[1,KolKomb]:=IntToStr(MasKomb[1]);   {Число1 Найденное отвечающее правилу комбинации по Группам}
//                                        StringGrid23.Cells[2,KolKomb]:=IntToStr(MasKomb[2]);   {Число2 Найденное отвечающее правилу комбинации по Группам}
//                                        StringGrid23.Cells[3,KolKomb]:=IntToStr(MasKomb[3]);   {Число3 Найденное отвечающее правилу комбинации по Группам}
//                                        StringGrid23.Cells[4,KolKomb]:=IntToStr(MasKomb[4]);   {Число4 Найденное отвечающее правилу комбинации по Группам}
//                                        StringGrid23.Cells[5,KolKomb]:=IntToStr(MasKomb[5]);   {Число5 Найденное отвечающее правилу комбинации по Группам}
//                                        StringGrid23.Cells[6,KolKomb]:=IntToStr(NKomb);        {Количество выпадений комбинации}
                                        StringGrid23.Cells[7,KolKomb]:=IntToStr(MasKomb[1]+MasKomb[2]+MasKomb[3]+MasKomb[4]+MasKomb[5]); {Сумма чисел комбинации}
//                                        Break;
                                     end;  {If N=5}
                                                               {Найдена комбинация}
                                end;  {for i}
{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
                           end;  {For N6}
                      end;  {For N5}
                 end;  {For N4}
            end; {For N3}
       end;  {For N2}
  end; {For N1}
 
  StringGrid23.RowCount:=KolKomb+1; {Количество строк в таблице=Количеству комбинаций чисел по Группам из таблицы StringGrid2}
{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
Finish := GetTickCount;   {Засекаем время окончание выполнение процедуры}
{Вывод времени выполнения процедуры на Кнопку BitBtn1}
BitBtn5.Caption:='BitBtn5 Перебор комбинаций по условиям. ВРЕМЯ='+ FloatToStr((Finish - Start)/1000);
  {}
end;  {0} {BitBtn5Click - Перебор комбинаций по условиям ограничения выпадения числа}
{-------------------------------------------------------------------------------------------------------------------------------------}

0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.03.2020, 10:09
Ответы с готовыми решениями:

Ошибка 'External: SIGPFE' при выполнении программы
Здравствуйте. Дана задача, страшная на первый взгляд. Дана страшная формула, много значений и все подобное. Необходимо найти значение Т из...

Ошибка при выполнении задач(уже запущенной программы) Делфи
Программа запустилась, но не выполняет никаких команд. Выходит ошибка, запустившись, программа начинает лагать.

Зависание программы при выполнении длительного цикла
В моей программе выполняется долго, очень долго цикл, так как много данных обрабатывается. Программа работает и отрабатывает цикл...

21
 Аватар для mr-Crocodile
3054 / 1673 / 657
Регистрация: 19.03.2019
Сообщений: 5,380
12.03.2020, 16:17
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Zwergio Посмотреть сообщение
Спасибо вечером попробую откомпилировать.
зачем вечер ждать, держи готовый EXE // компилировал через FPC
Вложения
Тип файла: zip perebor.exe.zip (15.0 Кб, 1 просмотров)
1
4195 / 1841 / 223
Регистрация: 06.10.2010
Сообщений: 4,127
12.03.2020, 16:23
Для подсчёта количества комбинаций, удовлетворяющих шаблону можно использовать такой код.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{$APPTYPE CONSOLE}
uses
  Math;
const
  combs: array[0..4] of byte=(9,10,10,10,6);
var
  GroupTemplate: array[0..4] of byte=(1,0,2,1,2);
begin
  writeln(trunc(intPower(combs[0],GroupTemplate[0])*
                intPower(combs[1],GroupTemplate[1])*
                intPower(combs[2],GroupTemplate[2])*
                intPower(combs[3],GroupTemplate[3])*
                intPower(combs[4],GroupTemplate[4])));
  readln;
end.
Для 1-0-2-1-2 получается 324000. И всё ещё не понятно зачем выводить на экран такое количество информации.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.03.2020, 16:23

Ошибка при выполнении программы
//set.h #pragma once typedef unsigned short WORD; class Set { private: int minElem; int maxElem;

Ошибка при выполнении программы
Вот код, как только начинаю использовать вторую процедуру прога перестаёт запускаться, дело не в содержимом процедуры, проверял эту...

Ошибка при выполнении программы
Выдает вот такую ошибку при выполнении программы. Компиляция происходит нормально. а работать не хочет. Уже запустил легкую программу, но...

Ошибка при выполнении программы
Добрый вечер. Проблема следующая: при выполнении программы выдает ошибку, когда начинаю вводить элементы массива (нецелые числа), затем,...

Ошибка при выполнении программы
Привет всем! Очень давно не прогал на masm32 но вот необходимо выполнить одно простенькое задание, которое у меня не совсем удачно...


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

Или воспользуйтесь поиском по форуму:
22
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru