L11. Pętla repeat .. until.
Transkrypt
L11. Pętla repeat .. until.
Pętla repeat…until Wcześniej poznaliśmy bardzo uŜyteczną pętle for, która nie rozwiązuje jednak wszystkich problemów, na jakie moŜna natknąć się podczas programowania. Jak juŜ wiemy, pętla ta sprawdza się doskonale w sytuacjach, w których musimy wykonać skończoną liczbę iteracji, ale stąd teŜ wynika jej główna wada – przed jej rozpoczęciem musimy ściśle określić liczbę przebiegów. Nie dało się w łatwy i intuicyjny sposób uŜyć jej do powtarzania jakiejś czynności „aŜ do skutku” – moŜna co najwyŜej zrobić to dwa, trzy, sto, trzysta, N razy, ale zawsze musimy dokładnie wiedzieć ile. Nie zawsze moŜna określić ilość kroków, gdyŜ zaleŜą one od rodzaju rozwaŜanego problemu oraz czasami od wartości danych. Zadaniem pętli repeat jest wykonywanie danego kodu dopóki warunek podany po słowie Until nie będzie prawdziwy. Bardzo waŜną cechą tej pętli jest miejsce sprawdzania warunku. W pętli repeat po pierwszym wykonaniu instrukcji zostaje sprawdzony warunek. Znaczy to, Ŝe w pętli repeat instrukcje muszą wykonać się co najmniej jeden raz. PoniŜej pokazana jest postać pętli repeat: repeat instrukcja_1 instrukcja_n until <warunek> Tłumacząc to na polski otrzymujemy: Powtarzaj instrukcję, aŜ zostanie spełniony warunek Instrukcję repeat moŜna równieŜ wykorzystać do chwilowego zatrzymania programu w celu oczekiwania na naciśnięcie dowolnego klawisza, określonej litery lub konkretnego klawisza. Stosując w programie instrukcję: Repeat Until KeyPressed MoŜemy równieŜ zatrzymać program w celu oczekiwania na naciśnięcie określonej litery: REPEAT instrukcja_1; ……………; instrukcja_n; writeln(‘Jeszcze raz? (T)ak’); Tak_Nie:=UpCase(ReadKey) UNTIL NOT (Tak_Nie=’T’); co uniemoŜliwi ponowne uruchomienie (lub nie) instrukcji zawartej w bloku repeat until. Aby to zademonstrować działanie pętli napiszemy krótki program, który pogra z nami w grę. Program "pomyśli" liczbę, a Twoim zadaniem będzie ją zgadnąć. Dodatkowo program poinformuje Cię, czy podana liczba była większa, czy mniejsza od zgadywanej. Algorytm naszego programu moŜemy zapisać w kilku krokach: I. II. Wylosuj Liczbę Powtarzaj: i. Zapytaj gracza o Strzał ii. Jeśli Strzał większy od Liczby - powiedz graczowi iii. Jeśli Strzał mniejszy od Liczby - powiedz graczowi AŜ Strzał jest równy Liczbie III. Pogratuluj graczowi :D Kod programu: Program Zgadnij_liczbe; Var N : Byte; { Szukana liczba } S : Byte; { Strzał gracza } I : Byte; { Liczymy ile gracz potrzebował strzałów } Begin Randomize; { Włączamy generator liczb pseudolosowych } WriteLn('Losuje liczbe z przedzialu 0..99.'); N:=Random(100); I:=0; Repeat Write('Jaka liczbe mam na mysli? '); ReadLn(S); If (S>N) Then WriteLn(' Nie, to za duzo.'); If (S<N) Then WriteLn(' Za malo.'); Inc(I); { Ta procedura słuŜy do zwiększenia wartości zmiennej o 1 } Until (S=N); WriteLn('Dobrze! Szukana liczba to rzeczywiscie ', N, '.'); WriteLn('Zgadles(as) za ', I, ' razem.'); readln; End. Małe wyjaśnienie: pascal posiada generator liczb pseudolosowych, który jednak trzeba najpierw uruchomić. SłuŜy do tego procedura Randomize. Wywołujemy ją umieszczając jej identyfikator na początku programu. Jest to instrukcja wywołania, która spowoduje wykonanie procedury. Następnie, aby przypisać jakiejś zmiennej przypadkową wartość uŜywamy funkcji Random. Jako jej parametr podajemy liczbę określającą z ilu elementów chcemy losować. Np. jeśli będzie to 10 - wylosujemy liczby z przedziału 0..9. Inc(I) to to samo co I:=I+1, jednak ja uwaŜam, Ŝe lepiej to wygląda (niektórzy twierdzą teŜ, Ŝe szybciej działa). Jest to zatem instrukcja zwiększająca wartość zmiennej, niekoniecznie o 1. Wystarczy zapisać Inc(I, 3) by zwiększyć zmienną o 3. ZADANIA DO WYKONANIA Zadanie 1 Napisz program, który powtarza napis „Programowanie” dopóki nie wciśniesz klawisz „n” lub „N”. Zadanie 2 Napisz program obliczający sumę pięciu liczb wczytywanych z klawiatury. Zadanie 3 Napisz program, który czyta kolejne liczby i liczy ich sumę aŜ do napotkania liczby 0. Program wyświetla tymczasową sumę. Wynik obliczenia wyświetl z dokładnością do dwóch miejsc po przecinku. Zadanie 4 Napisz program, którego działanie polega na obliczeniu kwadratu dowolnie wprowadzonej z klawiatury liczby. Po wykonaniu obliczenia program powinien zapytać się, czy obliczyć sześcian następnej liczby. Powtarzanie działania programu powinno trwać tak długo dopóki nie naciśniesz klawisza innego niŜ „t” lub „T”. Zadanie 5 Napisz program obliczający pierwiastki równania kwadratowego o współczynnikach A, B i C. Program oblicza pierwiastki, aŜ do momentu podania A=0. ZADANIE DOMOWE (Trochę ambitniejsze, ale zapewniam, Ŝe posiadacie wystarczającą wiedzę, by je wykonać). Napisz program, który będzie „zgadywał” wybraną przez Ciebie liczbę, aŜ do momentu kiedy ją zgadnie.