-2.3 Petla while ~ programowej. Instrukcja s~erujaca while3 pozwala na realizacje tak zwanej petli.' blok instrukcji) wykonywane sa "w kólko", dopóki spelniony jest Ijakis Taka warunek. petla programowa polega na tym, ze pewna instrukcja (lub ~ Instrukcja sterujaca while ma forme: while (warunek) instrukcja1; Oczywiscie zamiast tego, co oznaczylismy tu umou.mie jako instrukcja 1, moze byc instrukcja skladana. Inaczej: moze tam byc blok instrukcji, czyli kilka instrukcji ujetych w klamry }. Przystepujac do wykonania instrukcji while - komputer najpierw sprawdza warunek..:. Jesli nie jest spelniony, wówczas instrukcja1 niejestwcalewykonywana. :. Jesli jednak warunek jest spelniony, wówczas wykonywana jest instrukcja 1, po czym ponownie sprawdzany jest warunek. Jesli tym razem warunek ten nadal jest spelniony, wówczas ponownie wykonywana jest instrukcja 1- i tak dalej, wielokrotnie dopóki (while!) warunek jest spelniony. Jesli w koncu, za któryms obiegiem petli, warunek stanie sie niespelniony, wówczas dopiero praca petli zostanie przerwana. Zwracam uwage, ze pierwsze sprawdzenie warunku (obliczenie jego wartosci) odbywa sie przed wykonaniem instrukcji1 #include <iostream> int ile; std::cout «"Ile gwiazdek ma miec kapitan? std::cin» ile; std: :cout «"\n No to narysujmy wszystkie" «ile «" "; II petla while rysujaca gwiazdki while (ile) 3) ang. while - podczas gdy, dopóki [czytaj: "lajl"] ".,
std::cout «"*1'; ile = ile - 1; } II na dowód, ze mial prawo przerwac petle std::cout «"\n Teraz zmienna ile ma wartosc " «ile; A oto przykladowy wyglad ekranu po wykonaniu tego programu Ile gwiazdek ma miec kapitan? : 4 No to narysujmy wszystkie 4 : **** Teraz zmienna ile ma wartosc O 2.4 Petla do... while... Slowa te oznaczaja po angielsku: Rób... Dopóki...4. Instrukcja ta pozwala na realizacje innego rodzaju petli programowej. Petla taka ma forme do instrukcja1 while (warunek) ; Czyli jakby po polsku rób instrukcja1 dopóki (warunek); Dzialanie jej jest takie: Najpierw wykonywana jest instrukcja1. Nastepnie sprawdzany jest warunek. Jesli jest on spelniony, to wykonanie instrukcji 1 zostanie powtórzone, po czym znowu sprawdzany jest warunek... i tak w kólko, dopóki warunek bedzie spelniony. ~ Jak widac, dzialanie tej petli przypomina te opisana poprzednio. Róznica polega tylko na tym, ze warunek sprawdzany jest nie przed, ale po wykonaniu instrukcji1. Wynika stad, ze instrukcja1 zostanie wykonana co najmniej raz. Czyli nawet wtedy, gdy warunek nie bedzie nigdy spelniony. Na przyklad: #inc1ude <iostream> char litera; do std::cout «"Napisz std::cin» litera; jakas litere: "; std::cout «"\n Napisales: " «litera «" \n"; }while(litera!= 'K'); II O 4) [czytamy:"du..jajl"]
D std::cout «"\n Skoro Napisales K to konczymy!"; A oto przykladowy programu Napisz jakas litere: A Napisales: A Napisz jakas litere: K Napisales: K wyglad ekranu po wykonaniu tego. i ~ Skoro Napisales K to konczymy Program nasz oczekuje na napisanie (przez uzytkownika) litery. Petla wczytywania liter odbywa sie dopóki nie podamy litery K (wielkiej). Wtedy to wykonywanie petli zakonczy sie. Zwracam uwage - petla wczytujaca znaki zostanie wykonana przynajmniej raz. W programie - w miejscu, które oznaczylem jako O - pojawil sie w wyrazeniu nieznany nam jeszcze dotad operator!= który oznacza: Nrózny od...n. Zatem zapis while(litera!= 'K') jest jako Ndopóki li tera jest rózna od K N. Temu i innym operato rozumiany rom przyjrzyjmy sie dokladnie pózniej. ~ Jak widac, mamy tu do czynienia z petla o nieco innym dzialaniu niz poprzednia. Znawcy twierdza, ze w tej petli - czesciej robi sie bledy. Zatem jesli nie wiesz, która z nich sie posluzyc, to wybierz raczej petle whil e. 2.5 Petla for Najprawdopodobniej ta petla bedziesz poslugiwal sie najczesciej. Ma ona forme for (instr_ini ; warunek; instr_krok) tresc_petli; co w przykladzie moze wygladac chocby tak: for(i=o ; i < 10 ; i=i+l) std: :cout «"Ku-ku! "; Wyjasnijmy, co oznaczaja poszczególne czlony:.:. for (ang. for - dla) oznacza: dla takich warunków rób... :. insir _ini - jest to instrukcja inicjalizujaca prace petli, wykonywana jednokrotnie, zanim zostanie wykonana wlasciwa praca petli. W naszym przykladzie jest to podstawienie i = O.
.:. warunek - jest to wyrazenie, które obliczane jest przed kazdym obiegiem petli. Jesli jest prawdziwe, to wykonywane zostaja instrukcje bedace trescia petli. U nas WYrazeniem warunkowym jest WYrazenie: i < 10. Jesli rzeczywiscie owo i jest mniejsze od 10, wówczas wykonywana zostaje instrukcja bedaca trescia petli (czyli wypisanie tekstu "Ku-ku!"). :. instr _krok - to instrukcja kroku petli, wykonywana na zakonczenie kazdego obiegu (kroku) petli. Jest to jakby ostatnia instrukcja, wykonywana bezposrednio przed obliczeniem wyrazenia warunek. U nas jest to po prostu i = i+1 Co oznacza: do dotychczasowej wartosci zmiennej i dodaj 1, a nastepnie wstaw ten rezultat z powrotem do obiektu i. Innymi slowy - chodzi o to, by obiekt i przy kazdym obiegu petli zwiekszal swoja wartosc o 1. Praca tej petli odbywa sie wiec jakby wedlug takiego harmonogramu: 1) Najpierw wykonuja sie instrukcje inicjalizujace prace petli. 2) Obliczane jest wyrazenie warunkowe. Jesli warunek nie jest spelniony - praca petli jest przerywana. Jesli zas warunek jest spelniony, wówczas wykonywane zostaja instrukcje bedace trescia petli. 3) Po wykonaniu tresci petli wykonana zostaje instrukcja kroku petli (inst_krok) - po czym powtarzana jest akcja (2). Oto kilka ciekawostek: instr _ini - nie musi byc tylko jedna instrukcja. Moze byc ich kilka, wtedy oddzielone sa przecinkami. Podobnie w przypadku instrukcji kroku petli (instr _krok). Wyszczególnione elementy: instr _ini, wyraz_warun, instr _krok - nie musza wystapic. Dowolny z nich mozna opuscic, zachowujac jednak srednik oddzielajacy go od sasiada. Opuszczenie WYrazenia warunkowego traktowane jest tak, jakby stalo tam WYrazenie zawsze prawdziwe (warunek spelniony). Tak wiec zapis for( ; ; ) // tresc petli jest nieskonczona petla. Inny typ nieskonczonej petli, to oczywiscie:
while(true) I I tresc petli Przyklad albo do I I tresc petli } while(true); Przyjrzyjmy sie petli for w programie #include <iostream> std::cout «"Stewardzie, ilu leci pasazer6w? "; int ile; std::cin» ile; I I liczba pasazerów int i; for(i = l ; i <= ile II licznik obiegów petli i = i + 1) std: :cout «"Pasazer nr " «i «" prosze zapiac pasy! \n"; D std::cout «"Skoro wszyscy juz zapieli, to ladujemy. "; Jesli w trakcie wykonywanie programu steward odpowie, ze leci 4 pasazerów to na ekranie pojawi sie: Stewardzie, ilu leci pasazer6w?4 Pasazer nr 1 prosze zapiac pasy ~ Pasazer nr 2 prosze zapiac pasy! Pasazer nr 3 pros ze zapiac pasy! Pasazer nr 4 pros ze zapiac pasy! Skoro wszyscy juz zapieli, to ladujemy. Krótki komentarz o Definicja obiektu o nazwie i. To bedzie jakby licznik obiegów petli. @ Jak widzisz, w wyrazeniu inicjalizacyjnym zmiennej (obiektowi) o nazwie i nadajemy wartosc 1, po czym przy kazdym obiegu petli wartosc tego licznika rosnie. Licznik i jest wiec zmienna, której potrzebujemy tylko na uzytek tej petli. Skoro tak, to lepiej posluzyc sie nastepujaca skladnia for(int i = 1 ; i <= ile; i = i + 1) std: :cout «"Pasazer nr " «i