Не могу найти ошибку в алгоритме функции

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Не могу найти ошибку в алгоритме функции

Сообщение MamonovKirill » 23.09.2016 01:07:55

Пишу функцию одним из шагов которых является разбиение массива двумерного оформленного в виде отдельной переменной chunk.
В зависимости от введённого параметра, разбиение будет идти на столько же частей сколько указано. Всё работает в алгоритме(если что, то это черновой вариант, оптимизировать можно всегда), но иногда происходят странные явления в проверочном выводе множества. Оно показывает порой, что элементов множество не столько сколько заданно в вызове функции, а на один меньше. Никак не могу найти где этот баг засел и как его исправить.
Код: Выделить всё
function generate_chunk(number_of_buildings:integer):chunk;
var
   i,j,coord:integer;
   checked:boolean;
   side_x:set of byte;
   checking:array [1..10] of integer;
begin
   side_x:=[];
   for i:=1 to 10 do checking[i]:=0;
   for i:=1 to number_of_buildings div 2 do begin
      repeat
         coord:=random(N-1)+1;
         checked:=true;
         for j:=1 to 10 do
            if checking[j] = 0
               then break
               else if ((checking[j]+2)<coord)and((checking[j]-2)>coord)
                  then begin
                     checked:=false;
                     break;
                  end;
         if checked and (not(coord in side_x))
            then begin
               for j:=1 to 10 do
                  if checking[j] = 0
                     then begin
                        checking[j]:=coord;
                        break;
                     end;
               break;
            end;
      until true;
      side_x:=side_x+[coord];
   end;
   for j:=1 to N do if j in side_x then writeln(j);
   writeln();
end;


Добавлено спустя 19 минут 23 секунды:
Почистил код, но проблема осталась та же, при generate_chunk(2) выводит иной раз только один элемент.
Код: Выделить всё
function generate_chunk(number_of_buildings:integer):chunk;
var
   i,j,coord:integer;
   side_x,check_x:set of byte;
begin
   side_x:=[];
   check_x:=[];
   for i:=1 to number_of_buildings div 2 do begin
      repeat
         coord:=random(N-1)+1;
         if not (coord in check_x)
            then begin
               check_x:=check_x+[coord]+[coord-2]+[coord+2];
               break;
            end;
      until true;
      side_x:=side_x+[coord];
   end;
   for j:=1 to N do if j in side_x then writeln(j);
   writeln();
end;


Добавлено спустя 14 минут 42 секунды:
На удивление проблему решил, но... не понял как :lol:
Если не трудно, то кто-нибудь объясните, что это было.
Код: Выделить всё
function generate_chunk(number_of_buildings:integer):chunk;
var
   i,j,coord:integer;
   side_x,check_x:set of byte;
begin
   side_x:=[];
   check_x:=[];
   for i:=1 to number_of_buildings div 2 do begin
      repeat
         repeat coord:=random(N-1)+1 until not(coord in check_x);
         if (coord>0)
            then begin
               check_x:=check_x+[coord]+[coord-2]+[coord+2]+[coord-1]+[coord+1];
               break;
            end;
      until true;
      side_x:=side_x+[coord];
   end;
   for j:=1 to N do if j in side_x then write(j, ' ');
   writeln();
end;

Вот так я её решил.
Аватара пользователя
MamonovKirill
незнакомец
 
Сообщения: 7
Зарегистрирован: 15.09.2016 19:01:09
Откуда: г. Краснодар

Re: Не могу найти ошибку в алгоритме функции

Сообщение resident » 23.09.2016 09:56:09

MamonovKirill писал(а):until true;
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 22

Рейтинг@Mail.ru