Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Динамические массивы. [D7, WinXP]


Tazik ©   (2004-11-28 15:48:00) 

Я в Д7 на информатику пишу решение такой задачи (в console): даю компу число а тот путем деления отрезка на два вложенных находит его. В качестве юазового отрезва я использую динамисеский массив(numbers). Его границы (top - верхняя & bot - нижняя) ввожу во время выполения проги. Потом ввожу цикл что бы массив заполнялся и одновременно смотрю на заполнение:

for I := bot to top do
begin
   numbers[i] := i;
   WriteLN(numbers[i]);  
end;

в конечном итоге, когда задаю какие-то грани, у меня последний элемент массива заполняется огромным числом:

output:
1
2
...
15
16
874353445

приблизительно так. Как этого избежать?
И еще можно ли прописать так:

SetLength(numbers,0);
SetLength(numbers,length(FstArr));
Numbers := FstArr;

FstArr - одно половина массива numbers. До этого момента я определил длину FstArr равной половине Numbers.
Спасибо!


begin...end   (2004-11-28 17:33:00) [1]

> Tazik   (28.11.04 15:48)

Насколько я понял, перед Вами стоит задача поиска числа в отсортированном по возрастанию массиве чисел методом деления пополам. Если так, то вовсе не обязательно создавать новые массивы делением старого. Достаточно работать с переменными, содержащими текущие левую и правую границу массива.

Вот один из вариантов решения (далеко не самый лучший):

var
 Numbers: array of Integer;
 Number: Integer;
 Left, Right, Mid: Integer;

begin
 { Заполнение массива }
 { ... }
 Left := Low(Numbers);
 Right := High(Numbers);
 while True do
 begin
   Mid := (Left + Right) div 2;
   if Numbers[Mid] < Number then
     Left := Mid
   else if Numbers[Mid] > Number then
     Right := Mid
   else
     Break
 end
end.

После окончания цикла в переменной Mid будет содержаться индекс искомого числа в массиве. Естественно, цикл может закончиться только в том случае, если искомое число действительно есть в массиве. Кроме того, этот вариант пригоден для целых чисел, но непригоден, например, для вещественных, потому что в случае последних простым сравнением уже не обойтись.

P.S. И прислушайтесь к [2].


raidan   (2004-11-28 16:42:00) [2]

>Tazik   (28.11.04 15:48)  
Привычка выражать свои мысли четко и проверять орфографию с пунктуацей в Word дадут намного больший эффект (и количество ответов), чем вываливание своих проблем кучей "абы как".


begin...end   (2004-11-28 16:13:00) [3]

> Tazik   (28.11.04 15:48)

> в конечном итоге, когда задаю какие-то грани, у меня последний
> элемент массива заполняется огромным числом

Возможно, выход за границы массива. Включите Range Checking в настройках компилятора.

> И еще можно ли прописать так:
>
> SetLength(numbers,0);
> SetLength(numbers,length(FstArr));
> Numbers := FstArr;

Можно, но что Вы хотите этим добиться?


Наверх

Титульная страница Поиск, карта сайта Написать письмо