Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Делфи _ Инициализация массивов

Автор: status 10.10.2007 0:16

Я вот у здесь нашел http://forum.pascal.net.ru/index.php?showtopic=2694 "Инициализация массивов случайными значениями", а как правильно сделать инициализацию массива случаайными значениями и так чтобы это значения в массиве не повторялись в диопозоне 1 до 1000? Помогите пожалуйста!

я делаю так и незнаю как правильно сделать проверку на повторение :

Код

rocedure TForm1.Button1Click(Sender: TObject);
const
k=1000;
var
mas:array of integer;
i,n:integer;
begin
n:=StrToInt(Edit1.Text);
SetLength(Mas, n);
Stringgrid1.RowCount:=1;
randomize;
for i:=0 to n do mas[i]:=random(k);
Stringgrid1.RowCount:=n;
For i:=0 to n do
        Stringgrid1.cells[0,i]:=inttostr(mas[i]);
end;

Автор: volvo 10.10.2007 0:33

Обрати внимание - дин. массив индексируется от 0 до N - 1...


procedure TForm1.Button5Click(Sender: TObject);
const
k = 1000;
var
mas: array of integer;
i, n, T, swap: integer;

begin
n := StrToInt(Edit1.Text);
SetLength(mas, k);
StringGrid1.RowCount := 1;

Randomize;
for i := 0 to k - 1 do mas[i] := i + 1;

// реализуем алгоритм перемешивания - Shuffle
for i := 0 to k - 1 do begin
swap := random(k);
T := mas[i];
mas[i] := mas[swap];
mas[swap] := T;
end;
StringGrid1.RowCount := n;
For i := 0 to n - 1 do
StringGrid1.Cells[0, i] := IntToStr(mas[i]);

SetLength(mas, 0); // Освобождаем массив
end;


Автор: status 10.10.2007 20:44

Получается размер массива равен константе к , а мне надо размерность вводить самому т.е. размер массива должен быть равен N. При попытке изменить размер на N не выполняет ининцилизацию, почему?

Автор: volvo 10.10.2007 20:54

Цитата
размер массива должен быть равен N

Это у тебя где написано? У тебя написано, что тебе надо проинициализировать StringGrid.Cells случайными значениями (по крайней мере это следует из твоей программы)... А уж каким способом - это не оговаривается... Не нравится std::shuffle из стандартной библиотеки С++ - придумывай свой велосипед...

Добавлено через 6 мин.
В крайнем случае всегда можно после перемешивания массива уменьшить его размер до требуемого:
SetLength(mas, n);

Автор: status 10.10.2007 21:02

А зжесь нельзя размер массива самому произвольно вводить через Edit (n := StrToInt(Edit1.Text) - это должно быть размером массива ) ?


Добавлено через 2 мин.
ой, предидущее сообщен ие написал до редоктирования!

Автор: volvo 10.10.2007 21:06

Можно-то оно можно, только пойми: если ты установишь размер массива не в 1000, то тебе придется при занесении элементов в этот массив проверять дубликаты вместо того чтобы просто заполнить элементы значениями индексов как это сделал я...

Автор: status 10.10.2007 21:13

Да я понял, просто мне надо было изменить размер массива на N что бы потом в этом массиве производить поиск ключа. SetLength(mas, n); - это вроде помогло! Спасибо за помощь!