zapętlenie pętli

0

Najlepiej pytanie wyjaśnić na przykładzie:

mam taki kod:
los:=random(10); //nieistotne
zmienna[los]:=k[x] //gdzie k[x] to jakaś wartość

po zapętleniu otrzymamy:

repeat
zmienna[los]:=k //gdzie k to zmienna zapisana w pliku
until (zmienna[los]<>z[1])and(zmienna[los]<>z[2])and(zmienna[los]<>z[3]);

i tu tkwi problem jak to skrócić (bo 3 elementowa tablica potrafi się przemienić w 100 :)). Niestety niedziała taki zapis:

for i:=0 to 100 do
until (zmienna[los]<>z[i+1])

Mam nadzieję, że nie zostanę zbluzgany przez wytrawnych mistrzów Delfina :).

0

<font color="red">for i:=0 to 100 do
until (zmienna[los]<>z[i+1])</span>

Taka konstrukcja nie istnieje w pętli FOR.

0

function warunek:boolean;
var i:integer;
begin
result:=true;
for i:=1 to 100 do
if zmienna[los]=z[i] then result:=false;
end;

begin
repeat

coś tam....

until warunek;
end;

0

Jeżeli masz skończoną, stałą liczbę tych elementów z, to można tak:
until zmienna[los] in z;
Gdzie z to set of TDostepneWartosci.
Jeżeli jest to zmienne, to przedstawione wcześniej użycie funkcji, z taką tylko różnicą, że do poprawnej pracy fragment:
Result := False; należałoby zamienić na:
begin
Result := False;
Exit;
end;

0

MoG wskrzesiłeś fajną funkcję, tylko jedno mnie niepokoi, zwróć uwagę na fragment:
for i:=1 to 100 do
if zmienna[los]=z[i] then ...coś tam
Program skompiluje się prawidłowo, ale pętla nie wykona się, tak naprawdę
zmienna[los] nie zostanie porównana ze 100 wartościami zmiennej z. Sądzę, iż jest to analogiczna sytuacja do:
for i:=1 to 100 do
until zmienna[los]<>z[i];
Detox ma[sz] 100% racji, taka konstrukcja nie istnieje, po słowie do nie powinno być słowa kluczowego niedleko pada pętla od warunku :)).Delphi ku uciesze programisty program skompiluje, ale nie do końca wykona zamiary twórcy :).Aby dokładniej zilustrować problem posłużę się czytelniejszym przykładem:

var los:integer;
zmienna:array[1..10000] of integer;
...
repeat
los:=random(10000)+1;
until (los<>zmienna[1])and(los<>zmienna[2])and(los<>zmienna[3]) //i tak aż do (los<>zmienna[10000]);
...
Pisanie tego na piechotkę sprawi, iż na starość będę miał wykrzywione nadgarstki :). Jak to skrócić? PS.ratujcie proszę moje nadgarstki :)

0
Procedure Losuj;
Var
blad : Boolean;
i, xrazy, Los: Integer;
Begin
For xrazy:=1 To 3 Do
Begin
blad:=True;
Repeat
Los:=Random(10);
For i:=1 To (xrazy-1) Do
     If zmienna[i]=Los Then blad:=False;//i
Until (blad);
End;//xrazy
End; { koniec procedury }

Może to jest to ?
A przy okazji Mr.Pifko trzeba troszkę poczytać o pętlach :-)

0

Może taka funkcja pomoże:

function IsInTab(Element: integer; Tab: array of integer): boolean;
var
  i: integer;
begin
  Result := false;
  for i := Low(Tab) to High(Tab) do
    if Element = Tab[i] then
    begin
      Result := true;
      Exit;
    end;
end;

1 użytkowników online, w tym zalogowanych: 0, gości: 1