Главная страница
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.057 c
6-1096747272
denkop
2004-10-03 00:01
2004.12.12
Передача структуры которая содержит поле типа pointer


4-1098876608
VZup
2004-10-27 15:30
2004.12.12
OpenDialog - кто сталкивался???


4-1099204232
X-shadow
2004-10-31 09:30
2004.12.12
Как установить на фаил специфическую иконку?


1-1101390432
Ricko
2004-11-25 16:47
2004.12.12
Использование DLL написанной на С++


14-1101020968
zokzok
2004-11-21 10:09
2004.12.12
М. Кэнту - Delphi 7 для проф.