Форум: "Основная";
Текущий архив: 2004.12.12;
Скачать: [xml.tar.bz2];
ВнизДинамические массивы. Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.034 c