zapętlenie pętli 2

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

Może tak:

var los, i:integer;
zmienna:array[1..10000] of integer;
...
repeat
los:=random(10000)+1;
i := 1;
repeat
if los=zmienna[i] then break;
inc(i);
until i=10001;
until // tu wpisz ile razy losować liczbę...

PS: chyba dobrze... ale nie gwarantuje

0

macie fajny typ zmiennych (boolean),
dlaczego z niego nie korzystacie?

const 
     dol=1;
     gora=10000; 
type 
     jakis_zakres=dol..gora;
     jakis_typ=integer; 

var 
    b:boolean; {!!!}
    a:array[jakis_zakres]of jakis_typ;
    i:jakis_zakres;
    j:jakis_typ;    {due to Pawlik67 - thnx}
begin
  {b:=true - tu jest źle}
  repeat
     b=true;  {!!! było inaczej zanim poprawiłem}
     j:=random(gora-dol+1)+dol; 
     for i:=dol to gora do b:=b and(a[i]<>j) {(true and false)=false}
  until b
end

Wystarczy że choć jedno a[i] będzie
równe j, a b będzie równe false.

0
     j:=random(gora-dol+1)+dol; 

Obawiam się, że wywali błąd (?)
(gora-dol+1)+dol >255 {!}

Może to tylko przykład flabra ale niech i one będą z sensem :-)

0
     j:=random(gora-dol+1)+dol; 

Obawiam się, że wywali błąd (?)
(gora-dol+1)+dol >255 {!}

Może to tylko przykład flabra ale niech i one będą z sensem :-)

Random... Poczytaj helpa... Dla podpowiedzi argumentem w delphi jest integer, a w tp word

0
     j:=random(gora-dol+1)+dol; 

Obawiam się, że wywali błąd (?)
(gora-dol+1)+dol >255 {!}

Może to tylko przykład flabra ale niech i one będą z sensem :-)

Random... Poczytaj helpa... Dla podpowiedzi argumentem w delphi jest integer, a w tp word

To czemu wywala mi błąd ?

0

Bo błąd jest gdzie indziej... (Mea maxima culpa!). Zmień j na powiedzmy: integer. Albo wyłącz range chcecking (sprawdzanie zakresu) {$r-}

A właściwie powinienem to zapisać tak:

var 
 b:boolean;
 a:array[1..10000]of integer;
 i,j:integer;
begin
  {b=true; - tu też tego nie ma}
  for i:=1 to 10000 do a[i]:=random(maxlongint); {whatever}
  repeat
     b:=true;    {a tu być powinno}
     j:=random(10000)+1;
     for i:=1 to 10000 do b:=b and(a[i]<>j)
  until b
end.

Za dużo, nie zdrowo. :-P

0

Nie jest to skuteczna procedura flebra, aby obalić :) Twoją procedurę posłużę się przykładem:

var i,los:integer;
b:boolean;
dane:array[1..10] of integer;
...
randomize;
b:=true;

for i:=1 to 10 do
dane[i]:=i;

repeat
application.processmessages;
los:=random(20)+1;
for i:=1 to 10 do b:=b and(dane[i]<>los)
until b;

label.caption:=inttostr(los);
...
Pętla nie zadziała :(, problem nierozwiązany.

0

Nie jest to skuteczna procedura flebra, aby obalić :) Twoją procedurę posłużę się przykładem:

var i,los:integer;
b:boolean;
dane:array[1..10] of integer;
...
randomize;
b:=true;

for i:=1 to 10 do
dane[i]:=i;

repeat
application.processmessages;
los:=random(20)+1;
for i:=1 to 10 do b:=b and(dane[i]<>los)
until b;

label.caption:=inttostr(los);
...
Pętla nie zadziała :(, problem nierozwiązany.

0

Nie jest to skuteczna procedura flebra, aby obalić :) Twoją procedurę posłużę się przykładem:

var i,los:integer;
b:boolean;
dane:array[1..10] of integer;
...
randomize;
b:=true;

for i:=1 to 10 do
dane[i]:=i;

repeat
application.processmessages;
los:=random(20)+1;
for i:=1 to 10 do b:=b and(dane[i]<>los)
until b;

label.caption:=inttostr(los);
...
Pętla nie zadziała :(, problem nierozwiązany.

Drobna pomyłka, fuckt: pomyśl i wstaw b:=true; do wnętrza repeat/until np. przed samego fora. Sam mogłeś wpaśc na to, że trzeba zły wynik wyzerować.

W każdym razie Thnx! Juz poprawiłem.

0

Ok, dzięki flabra, masz rację myślenie nie boli :), problem rozwiązany.

0

Ok, dzięki flabra, masz rację myślenie nie boli :), problem rozwiązany.

Dżizas, odkąd zacząłem postować chciałem to napisać:

Don't thank just think...

Dzięks za okazję... ;)

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