Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.12.12;
Скачать: CL | DM;

Вниз

Динамические массивы.   Найти похожие ветки 

 
Tazik   (2004-11-28 15:48) [0]

Я в Д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 16:13) [1]

> Tazik   (28.11.04 15:48)

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

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

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

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


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

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


 
begin...end ©   (2004-11-28 17:33) [3]

> 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].



Страницы: 1 вся ветка

Текущий архив: 2004.12.12;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.026 c
1-1101732165
Bobby Digital
2004-11-29 15:42
2004.12.12
Restart


14-1100741392
ИМХО
2004-11-18 04:29
2004.12.12
Приснился сон...


3-1100076696
Yurij-7
2004-11-10 11:51
2004.12.12
Информация из DBGrid


14-1101352312
Думкин
2004-11-25 06:11
2004.12.12
С днем рождения! 25 ноября


14-1100851819
БареллО
2004-11-19 11:10
2004.12.12
Совместимость