Помощь - Поиск - Пользователи - Календарь
Полная версия: Массив
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
BanneD
Всем доброго времени суток!
Помогите с программным кодам

program loto;
const n=90;
var i:integer;
a:array[1..n] of integer;
begin
randomize;
for i:=1 to 85 do
begin
a[i]:=random(91);
if a[i]<>0 then writeln(' a[',i,']=',a[i]);
end;
end.


Мне надо чтобы сгенерированные числа не повторялись! Как это сделать??
TarasBer
Перемешивание массива делается так:

for i := 1 to MAX do begin
j := random(MAX-i+1)+i; // случайный элемент из i..MAX
// меняем местами элементы i и j
tmp := a[i];
a[i] := a[j];
a[j] := tmp;
end;



(может, в ЧАВО добавить, вопрос частый)

Добавлено через 1 мин.
А тебе надо сначала заполнить массив числами от 1 до MAX просто последовательно, а потом перемешать массив.
BanneD
Цитата(TarasBer @ 20.01.2011 17:49) *

Добавлено через 1 мин.
А тебе надо сначала заполнить массив числами от 1 до MAX просто последовательно, а потом перемешать массив.


Спасибо большое=)
Ну это типа так...

Program loto;
Const n=90;
Type t=array [1..n] of integer;
Var a:t;
m,x,i:integer;
Begin
randomize;
for i:=1 to 85 do a[i]:=i;
for i:=1 to 85 do write(' a[',i,']=',a[i]);
writeln;
writeln('---------------------------------------------');
writeln;
for i:=1 to n-1 do begin
m:=random(n-i-1)+i+1;
x:=a[i]; a[i]:=a[m]; a[m]:=x
end;
for i:=1 to 85 do
if a[i]<>0 then write(' a[',i,']=',a[i]);
End.

М.б. кому пригодиться
TarasBer
m:=random(n-i-1)+i+1;

Неверно.

надо

m:=random(n-i+1)+i;

Должна быть возможность поменять элемент с самим собой (ну оставить на месте).
Сам подумай, чтобы при i=1, например, формула превратилась в random(MAX)+1.

А вообще я что-то понять не могу, то у тебя до 90 (в виде константы), то до 85, ты определись.
BanneD
Цитата(TarasBer @ 20.01.2011 19:39) *

m:=random(n-i-1)+i+1;

Неверно.

надо

m:=random(n-i+1)+i;

Должна быть возможность поменять элемент с самим собой (ну оставить на месте).
Сам подумай, чтобы при i=1, например, формула превратилась в random(MAX)+1.

Что то я тебя не понимать=\ задача решается, все верно!
Ты так хотел?

for i:=1 to 85 do a[i]:=i;
for i:=1 to 85 do write(' a[',i,']=',a[i]);
writeln;
writeln('---------------------------------------------');
writeln;
for i := 1 to 85 do begin
m:= random(85-i+1)+i;
X:=a[i];
a[i]:=a[m];
a[m]:=x;
end;
for i:=1 to 85 do
if a[i]<>0 then write(' a[',i,']=',a[i]);
End.


Цитата

А вообще я что-то понять не могу, то у тебя до 90 (в виде константы), то до 85, ты определись.

Это типа игра=)
Ну дали задание в лотореии (в лотке) 90 шаров, из них остаются 5 или 3 шара в лотке а остальные выпадают.
Короче это Лото(ты наверно знаешь что это такое=)).
TarasBer
> Что то я тебя не понимать=\ задача решается, все верно!

У тебя при i равном n-1 вызывается random(0), тебя не напрягает?
Что такое random(0)? Функция, возвращающая число от 0 до -1?
Жалко, что в язык не вставлена проверка аргумента для этого случая.
Короче, неправильно ты алгоритм мой переписал.

Если трудно, напиши лучше так (всё по процедурам):


function Rand(a, b: integer): integer;
// случ. число в a..b
begin
if a>b then begin
WriteLn('Error, invalid argument: ',a, ' ', b);
Halt;
end else begin
Rand := a + random(b-a+1);
end;
end;

procedure Swap(var a, b: integer);
// обмен
var
tmp: integer;
begin
tmp := a;
a := b;
b := tmp;
end;

procedure Shuffle(var A: array of integer; L, R: integer);
// перемешивает массив, фрагмент от L до R.
// Осторожно, внутри процедуры массив нумеруется с нуля,
// поэтому желательно и исходный массив нумеровать с 0
// во избежание непоняток!
var
i: integer;
begin
for i := L to R do Swap(A[i], A[Rand(i, R)]);
// для всех элементов меняем их с любым из тех, что за ними
end;

BanneD
Цитата(TarasBer @ 20.01.2011 20:13) *

> Что то я тебя не понимать=\ задача решается, все верно!

У тебя при i равном n-1 вызывается random(0), тебя не напрягает?
Что такое random(0)? Функция, возвращающая число от 0 до -1?
Жалко, что в язык не вставлена проверка аргумента для этого случая.
Короче, неправильно ты алгоритм мой переписал.

Если трудно, напиши лучше так (всё по процедурам):


я то условие поставил что не выводим ноль! и он все 85 эл-ов массива мне выводит=)

if a[i]<>0 then write(' a[',i,']=',a[i]);


Не ленись проверь мой ПК=)
А то что ты с процедурами написал я там нифига не понял так как мы до процедур еще не дошли lol.gif
Ладно не парься. Спасибо за все good.gif
TarasBer
> я то условие поставил что не выводим ноль!

Это называется костыль. Правильный алгоритм должен работать без костылей.

> А то что ты с процедурами написал я там нифига не понял

Не проходили ещё?
BanneD
Цитата(TarasBer @ 20.01.2011 20:23) *

> я то условие поставил что не выводим ноль!

Это называется костыль. Правильный алгоритм должен работать без костылей.

> А то что ты с процедурами написал я там нифига не понял

Не проходили ещё?


ага, еще не проходили=)
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.