[ muhay @ 02.06.2004. 14:29 ] @
Dali neko moze da resi sledeci zadatak u Pascalu, ili da postavi barem dio koda

Neka N ljudi obelezenih redom od 1 do N (N<=100) obrazuje krug. Pocevsi od K-tog coveka krecuci se u smeru kazaljke na satu, svaki M-ti covek izlazi iz reda. Preostali ljudi u krugu zatim ponovo obrazuju manji krug. Za ucitane vrednosti N, K i M sa standardnog ulaza ispisati u datoteku Izlaz.dat redosled izlaska ljudi iz kruga. (po rednim brojevima). Kraj programa je kad svi ljudi izadju iz kruga.
[ broker @ 02.06.2004. 16:31 ] @
Imas mogucnost vise resenja.

Ono na koje verovatno ciljaju tim zadatkom je da napravis dvostruko povezanu listu od N elemenata u kojoj svaki element ima tri atributa: oznaku, vezu ka prethodnom elementu i vezu ka sledecem elementu.

Kretanje po listi vrsis tako sto za tekuci element vidis koji je sledeci pa predjes na njega i tako u krug.

Izbacivanje elementa vrsis tako sto je...

tekuci.prethodni.sledeci := tekuci.sledeci;
tekuci.sledeci.prethodni := tekuci.prethodni;

...nakon cega tekuci mozes da obrises a pre toga zapamtis koji je bio ili ga odmah upises u izlaznu datoteku.



Istu stvar mozes da napravis i sa nizovima ali uz mnogo vise zongliranja podacima.

Ne znam koju verziju Pascal-a koristis, u poslednjim bi trebao da postoji tip TList koji sam po sebi predstavlja povezanu listu. Ne secam se vise, mnogo je godina proslo otkad ne koristim Pascal.
[ IgLo @ 02.06.2004. 16:58 ] @
Evo ga kod koji bi trebao da odradi posao, s tim sto se pri svakom smanjenju kruga resetuju indeksi ljudi u krugu, ako trebaju da ostanu, probaj sam da doradis kod.

Program JosifovProblem;

Var
n,
k,
m,
x,
y : Integer;

Krug : String;

Izlazak : Array [1..100] Of Integer;

Begin
Write ('Upisi broj ljudi: '); ReadLn (n);
Write ('Upisi k-tog coveka: '); ReadLn (k);
Write ('Upisi korak: '); ReadLn (m);

Krug := '';
For X := 1 To n Do
Krug := Krug + 'x';

x := 1;
Y := 1;
Repeat
Krug [x] := ' ';
If (x + k - 1) > Length (Krug) Then
Izlazak [y] := x + k - 1 - Length (Krug)
Else
Izlazak [y] := x + k - 1;
Inc (y);
Inc (x, m);
If X > Length (Krug) Then
Begin
X := 1;
While Pos (' ', Krug) > 0 Do
Delete (Krug, Pos (' ', Krug), 1);
End;
If Length (Krug) < m Then
Begin
For X := y To Length (Krug) + y Do
Izlazak [x] := 1;
Krug := '';
End;
Until Length (Krug) = 0;

For X := 1 To n Do
Write (Izlazak [x], ', ');
End.

PS. Zaboravih da napravim snimanje u fajl, .... doradi i to sam. :)