Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-1101803179
DimonNew
2004-11-30 11:26
2004.12.12
Программа в виде мастера


1-1101452426
sergg
2004-11-26 10:00
2004.12.12
Надпись на BitBtn в две строки


1-1101287480
mid
2004-11-24 12:11
2004.12.12
Access violation


1-1101888371
Yurij-7
2004-12-01 11:06
2004.12.12
Логин в сети


14-1101378308
TUser
2004-11-25 13:25
2004.12.12
inline





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский