[Pascal] writeln się jakby blokuje oraz jak zazębić pętle


(Mateusz61096) #1

Witam!

  1. Gdzieś w poniższej procedurze jest błąd. Mianowicie wszystko poniżej 'Wpisz' włącznie, co powinno się wyświetlać, wyświetla się dopiero, gdy wprowadzę ten 'zły klawisz', a potem oczywiście po 1,5 sekundzie znika. Gdzie jest błąd.

Oto część programu:

procedure pokaznw;

var ww: char;

label lab1;


begin;

    lab1:

    najwyniki;

    clrscr;

    writeln(' LISTA NAJLEPSZYCH WYNIKÓW');

    gotoxy(11,3);

    write(' Ilość trafień dla poszczególnych liczb:');

    gotoxy(1,4);

    write('Login:');

    gotoxy(15,4);

    write('6:');

    gotoxy(24,4);

    write('5:');

    gotoxy(33,4);

    write('4:');

    gotoxy(42,4);

    write('3:');

    gotoxy(51,4);

    write('2:');

    gotoxy(60,4);

    write('1:');

    gotoxy(69,4);

    write('0:');

    for i2:=1 to lbprof do

    begin

        gotoxy(1,5+i2);

        write(i2,'. ', profil[i2].login);

        gotoxy(15,5+i2);

        write(profil[i2].traf6);

        gotoxy(24,5+i2);

        write(profil[i2].traf5);

        gotoxy(33,5+i2);

        write(profil[i2].traf4);

        gotoxy(42,5+i2);

        write(profil[i2].traf3);

        gotoxy(51,5+i2);

        write(profil[i2].traf2);

        gotoxy(60,5+i2);

        write(profil[i2].traf1);

        gotoxy(69,5+i2);

        write(profil[i2].traf0);

    end;

    ww:=readkey;

    writeln;

    writeln;

    writeln;

    writeln('Wpisz:');

    writeln(' - "m" aby powrócić do menu,');

    writeln(' - "q" aby wyjść z programu.');

    case (ww) of

    'm','M' : begin

                if a1=0 then menugosc;

                if a1>0 then menuzal;

              end;

    'q','Q' : wyjscie;

    else begin

            writeln('Zły klawisz. Spróbuj ponownie.');

            delay(1500);

            goto lab1;

         end;

    end;

end;
  1. Czy da się w jakiś sposób zazębić pętle, tak aby uniknąć konieczność stosowania kotwic? Pisząc zazębić mam na myśli np.:

repeat

...

repeat

...

until ...(koniec pętli pierwszej )

...

until ... (koniec pętli drugiej )

Z góry dzięki za odpowiedź.


(MietekN) #2

Linie:

ww:=readkey;

przenieś tuż nad:

case (ww) of


(Mateusz61096) #3

no jasne, że działa

dzięki!

proszę jeszcze o odpowiedź na drugie pytanie


(Simplex111) #4

Pętle oczywiście można zagnieżdżać i nie trzeba do tego używać kotwic (label). Najlepiej w ogóle nie używać "label".

Nie można natomiast zagnieżdżać pętli tak, jak przedstawiłeś. Poprawnie będzie tak:

repeat {pętla zewnętrzna}

  repeat {pętla wewnętrzna}

    ...

  until {koniec pętli wewnętrznej}

until {koniec pętli zewnętrznej}

Ja rozwiązałbym problem tak:

begin

  repeat

    KoniecPetli:= true;

    {...}

    ww:= Readkey;

    case UpCase(ww) of

      'M': begin

             {...}

           end;

      'Q': Wyjscie;

      else begin

             Writeln('Zły klawisz. Spróbuj ponownie.');

             Delay(1500);

             KoniecPetli:= false;

           end;

    end;

  until KoniecPetli;

end;

Nie kompilowałem tego kodu, więc musisz poprawić ew. błędy. KoniecPetli to dodatkowa zmienna typu Boolean.


(Mateusz61096) #5

dzięki!

i rozumiem, że nie ma sposobu, żeby np. w jakiś sposób oznaczyć 2 pętle i zakończyć jedną w środku drugiej, tak jak to na początku pokazałem?


(klemensior15) #6

Ale jaki sens to by miało? Kończyłbyś wykonywanie jednej pętli i tym sposobem dalszych instrukcji.


(Mateusz61096) #7

na przykład tutaj:

begin

    clrscr;

    repeat

        kot5:

        a1:=0;

        writeln('Podaj login: Powrót do menu: wpisz "powrot" i potwierdź ENTEREM.');

        readln(login1);

        writeln;

        repeat

            if login1='powrot' then menugosc;

            if lbprof=0 then menugosc;

            inc(a1);

            if login1 = profil[a1].login then break;

            if a1=lbprof then

            begin

                writeln('Nie ma takiego loginu! Spróbuj ponownie');

                goto kot5;

                end;

        until a1=lbprof;

        writeln('Podaj hasło: ');

        readln(haslo1);

        writeln;

        if haslo1=profil[a1].haslo then

        begin

            menuzal;

            break;

        end;

        writeln('Nieprawidłowe hasło. Spróbuj jeszcze raz.');

        delay(1500);

    until haslo1=profil[a1].haslo;


end;

mógłbym zamiast kotwicy (która wychodzi z jednej pętli), zastosować zwykłą pętlę. W tym przypadku nawet nie za bardzo wiem jak zastosować to, co podał simplex