Cześć i witaj. W tym wykładzie chciałbym porozmawiać o while i pętlach while.
Rozmawialiśmy o pętli for, która zasadniczo umożliwia powtórzenie kodu.
Istnieją inne konstrukcje w języku c, wywoływane while i do while, które robią to
samo z inną składnią.
Zatem pętla while, pętla while jest mechanizmem powtarzania zestawu instrukcji
i pozwala na kontynuowanie wykonywania tak długo, jak długo określone wyrażenie logiczne przyjmuje wartość true.
Więc więcej tego samego tutaj. Tak jak instrukcje if wykonają określony
kod, podczas gdy instrukcje wykonają określony kod na podstawie wartości logicznej wiele razy.
Wszystko, co możesz zrobić w pętli for, możesz zrobić w pętli
while, to po prostu inna składnia.
Więc to, jak wyglądają pętle while, jest mniej więcej tak.
Na bardzo wysokim poziomie, jeśli patrzymy na pseudokod, podczas
gdy ten warunek jest prawdziwy, rób to dalej.
Więc aby odnieść to do przykładu bardziej światowego.
Zasadniczo, gdy jesteś głodny, jedz kanapki, coś w tym rodzaju.
Więc zamierzasz powtórzyć kod. Będziesz jadł wiele kanapek, gdy będziesz głodny.
Ogólna składnia pętli while jest następująca.
A to pokazuje składnię jednej instrukcji
w treści, więc nie musisz podawać nawiasów ani nawiasów klamrowych.
Zwykle używam terminów nawiasy klamrowe i nawiasy
klamrowe w tej samej terminologii.
Oto jak wygląda składnia, gdy mamy jedną instrukcję w porównaniu z wieloma instrukcjami.
Wiele instrukcji, musisz mieć te nawiasy, jedno stwierdzenie,
którego nie masz, są opcjonalne. Nie możesz ich mieć lub nie musisz ich mieć.
Wyrażenie znajduje się w nawiasach, podobnie jak pętla
for i instrukcja if. Wyrażenie tutaj różni się od
pętli for tym, że jest to pojedynczy warunek wyjścia.
To tylko wyrażenie. Nie inicjujesz zmiennej sterującej pętli.
Nie modyfikujesz zmiennej kontrolnej pętli pomiędzy nawiasami.
To tylko wyrażenie, tylko warunek wyjścia.
Warunek kontynuacji pętli while jest testowany na starcie.
Więc to jest szczyt pętli.
Oznacza to, że jest to pętla przedtestowa. A to oznacza, że
może wykonać 0 razy lub może wykonać wiele razy w ciele.
I znowu, będzie to istotne, ponieważ pętla do while robi coś innego.
Jeśli wyrażenie zaczyna się jako fałsz, żadna z instrukcji
pętli w treści nie zostanie wykonana.
Dlatego jest na szczycie testu.
Jeśli więc odpowiesz na pierwsze pytanie „nie jestem głodny”,
to nigdy nie zjesz żadnych kanapek. Masz zamiar przejść od razu do kawy
lub do następnej linii kodu. Nie wejdziesz w treść pętli.
Jeśli warunek pętli zaczyna się jako
prawdziwy, treść pętli musi zawierać mechanizm zmiany tego, jeśli
pętla ma się zakończyć. W przeciwnym razie będziesz mieć nieskończoną pętlę.
Tak więc w przypadku pętli for, w której modyfikujesz zmienną sterującą pętli w pojedynczej instrukcji, w pętli while jest
to samo, z wyjątkiem tego, że musisz to zrobić w treści.
Pętla while zainicjuje
gdzieś zmienną sterującą pętli, a następnie
zmodyfikuje ją w treści kodu.
Jak już wspomniałem, pętla while może zrobić wszystko, co robi pętla for, ma po prostu inną składnię.
I znowu pętla for jest dłuższa, jest krótsza. Możesz zrobić wszystko w jednej
linii, podczas gdy pętla while musisz zrobić te 3 rzeczy w oddzielnych wierszach.
W tym przykładzie
mamy liczbę int równą 0. To jest zmienna sterująca pętlą. Jest to poza instrukcją pętli while.
Jeśli użyjesz instrukcji for, wejdzie to do pętli for, tak jak przed pierwszym średnikiem.
To jest miejsce, w którym inicjalizuje zmienną sterującą pętli.
Następnie masz słowo kluczowe while, a wewnątrz nawiasów znajduje się wyrażenie boolowskie.
Byłoby to odpowiednikiem pętli for, drugiej instrukcji
tuż przed drugim średnikiem.
Więc to jest to, co sprawdzasz pod kątem prawdy lub fałszu. A jeśli to prawda, czy fałsz, wchodzisz w treść pętli.
Jeśli liczba jest mniejsza niż 5, wydrukujesz liczbę.
Następny wiersz kodu jest bardzo ważny,
liczba plus plus, ponieważ to modyfikuje zmienną sterującą pętli.
Musisz to zrobić plus plus liczyć lub nigdy nie wyjdziesz z pętli, ponieważ warunek na
górze mówi, czy liczba jest mniejsza niż równa 5. Jeśli liczba jest zawsze równa 1, masz
nieskończoną pętlę.
Więc to plus plus liczy się bardzo, bardzo ważne.
Pamiętaj, że liczba plus plus to operator inkrementacji.
Chodzi tylko o to, że liczba równa się liczba plus 1.
Ta pętla będzie działać 5 razy.
Będzie działać z liczbą równą 1,
liczbą równą 2, liczbą równą 3, liczbą równą 4 i liczbą równą 5.
Gdy liczba jest równa 6, wyskoczy z pętli i
nie zamknie więcej instrukcji w treści.
Ponownie powinieneś myśleć w kategoriach pętli for.
To tylko zmienna sterująca pętli, a modyfikacja zmiennej kontrolnej
pętli nie znajduje się w deklaracji rzeczywistej pętli.
Nie jest to wszystko w jednej linii, tak jak w pętli for.
Oto kolejny przykład, w którym logika jest kontrolowana w celu zakończenia pętli.
W tym pierwszym przykładzie, który pokazałem, jest to pętla sterowania licznikiem.
Będzie zawsze wykonywał tę samą liczbę razy, czyli 5.
W następnym przykładzie jest to przykład, w którym pętla może wykonać
100 razy lub 0 razy.
Warunek, który oceniamy tutaj w naszym kluczu while, gdzie liczba nie jest równa minus
1, zależy od tego, co wprowadzi użytkownik, ponieważ liczba
jest tym, co wprowadza użytkownik.
Więc ta pętla może wykonać 0 razy, może wykonać 100 razy.
Wszystko zależy od wejścia z klawiatury.
Nazywa się to pętlą kontrolną wartownika. To nie jest kontrolowane.
Opiera się na logice i zmiennej, która może się zmieniać.
Tak więc, podczas gdy num nie jest równe minus 1, a następnie
num jest zapisywana wartość, którą wprowadzamy na klawiaturze.
Jeśli użytkownik nigdy nie wprowadzi ujemnej 1 na klawiaturze, pętla ta nigdy nie zostanie zakończona.
Taki sam typ składni tutaj z naszym while.
Nasza zmienna kontrolna pętli to num. Inicjalizujemy 0 u góry, a
następnie czytamy, modyfikujemy je, aby zobaczyć, czy zamierzamy wejść w pętlę na podstawie
tego, co użytkownik wprowadził na klawiaturze.
Następnie wewnątrz nawiasu dla słowa kluczowego while sprawdzamy je,
aby sprawdzić, czy jest ujemne 1.
A potem w treści pętli while z nawiasami, nawiasy
nie muszą tam być, ponieważ jest jedna instrukcja, ale lubię je tam umieszczać.
Następnie czytamy również następne wejście i zapisujemy w num.
Jeśli użytkownik wprowadzi ujemną 1 dla tego następnego wejścia, wyskoczy ono z pętli.
Jeśli tego nie zrobią, będzie kontynuowane i poprosi o wprowadzenie informacji.
Pętla do while różni się nieco od pętli
for w pętli while, ponieważ jest uważana za pętlę po teście.
Zatem w pętli while ciało jest wykonywane, gdy warunek jest prawdziwy.
W pętli do while, w której treść jest wykonywana bezwarunkowo po raz pierwszy,
pętla do while, ponieważ test znajduje się na
dole, oznacza, że pętla zawsze zostanie wykonana przynajmniej raz.
Zawsze będziesz wykonywał ciało przynajmniej raz,
może to być więcej, ale zawsze jedno, nigdy nie jest 0.
Ponieważ warunek do przetestowania wyjścia jest na dole.
Nazywa się to pętlą posttestową. Nazywa się to również pętlą kontrolowaną przez wyjście.
Więc użyłbyś pętli do while, gdybyś chciał, aby pętla pojawiła się
co najmniej raz.
Zwykle nie musisz używać pętli do while,
ponieważ jeśli chcesz, nadal możesz zrobić to samo w pętli for,
po prostu umieściłbyś kod poza pętlą.
Więc pętla do while nie jest tak naprawdę konieczna, ale są przypadki, gdy chcesz jej użyć.
Po wykonaniu początkowym treść jest
wykonywana tylko wtedy, gdy warunek jest spełniony. Więc po pierwszej iteracji pętli będzie
zachowywać się jak zwykłe pętle. Wyskoczy, jeśli warunek jest fałszywy.
Więc oto jak to wygląda. Do znajduje się na górze,
a test warunku na dole za pomocą słowa kluczowego while.
Więc to jest nowe
słowo kluczowe, a potem będziesz mieć nawiasy lub nie, w zależności
od tego, czy masz wiele instrukcji w treści.
Jeśli masz tylko jedną instrukcję w treści, nie będziesz mieć nawiasu. Musisz po prostu zrobić to na
górze, a potem będziesz mieć chwilę na dole pętli.
A wewnątrz while, w nawiasach, otrzymasz wartość logiczną, która będzie
warunkiem, który sprawdzasz. Ale znowu, ponieważ
ten warunek jest na dole, zawsze masz gwarancję wykonania instrukcji co najmniej raz.
Tak więc przykład po lewej to jedna instrukcja, przykład po
prawej to wiele instrukcji. Więc masz nawiasy, klamry kręcone.
I znowu, w tym drugim przykładzie, mówisz, że możesz mieć coś takiego jak monit o hasło, czytać dane
wejściowe użytkownika i chociaż dane wejściowe nie są równe hasłu.
Ale zawsze będziesz pytać o to hasło przynajmniej raz.
A więc kolejny przykład pętli while.
Pierwszy przykład z góry to przykład tego, jak
pętla może być wykonywana
raz lub wiele razy, ale nigdy 0.
Wszystko zależy od tego, co wprowadzi użytkownik. Zawsze będzie wykonywany przynajmniej raz, ale jest to
odczyt danych wejściowych z klawiatury. Widzimy funkcję scanf.
Dopóki użytkownik nie wprowadzi 20, będzie
wykonywał tę pętlę.
Pętla while może być również pętlą sterowania licznikiem, co oznacza, że będzie wykonywana określoną liczbę razy.
W tym przypadku w tym przykładzie wykona 4 razy.
Mamy liczbę int równą 4. Następnie mamy zrobić na górze,
a
następnie mamy nawiasy, ponieważ mamy wiele instrukcji wewnątrz ciała.
I zwiększamy tę zmienną kontrolną pętli wewnątrz ciała, liczba plus plus.
A potem warunek do sprawdzenia jest nadal na dole. Więc wykonasz to 4 razy.
Zauważysz, że słowo kluczowe while nie musi znajdować się w tym samym wierszu, co prawy nawias klamrowy.
Zazwyczaj tak jest, ale nie musi.
A słowo kluczowe while na dole również kończy się średnikiem, również powinieneś to zauważyć.
Więc dowiedzieliśmy się wszystkiego o tych pętlach; pętla for, while i do while.
Jakich pętli użyć?
Cóż, pierwszą rzeczą, którą musisz zdecydować, której pętli chcesz użyć, jest najpierw, czy chcesz, aby była
ona przed testem, czy po teście? Czy chcesz, aby wykonywał się co najmniej raz, czy
nie chcesz, aby wykonywał się co najmniej raz? Jeśli chcesz, aby wykonywał się
co najmniej raz, użyjesz funkcji do while. Jeśli to nie jest
warunek, możesz użyć for lub while lub do while.
Więc w większości przypadków, kiedy decydujesz, której pętli użyć, zawsze
będzie to pętla przed testem. Powinieneś trzymać się z dala od pętli do while.
W większości przypadków jest to po prostu lepsza opcja. Dużo łatwiej się czyta.
O wiele lepiej jest spojrzeć, zanim faktycznie zapętlisz.
Po prostu nie zaczynaj pętli, lepiej sprawdzić ten stan u góry.
Ze względu na czytelność, jeśli pętla jest na teście, jest znacznie bardziej intuicyjna.
Więc miej to sprawdzenie pętli na początku, użyj przez chwilę.
W wielu przypadkach ważne jest, aby całkowicie pominąć pętlę, jeśli początkowo test nie zostanie spełniony.
Ponownie, ponieważ tak jest, test powinien być na górze. Nie powinieneś zawsze wykonywać co najmniej raz.
W przeważającej części zawsze możesz nie chcieć wykonywać.
Więc powinieneś użyć przez chwilę.
Teraz pytanie sprowadza się do dobrze, którego powinienem użyć, na chwilę.
To naprawdę kwestia osobistych preferencji. To nie ma znaczenia, bo
tak jak powiedziałem na początku tego wykładu, wszystko, co możesz zrobić za chwilę, możesz zrobić w for.
Więc jeśli po prostu podoba ci się pętla for, czasami for jest
trochę szybszy, ponieważ wszystkie modyfikacje sterowania pętlą oraz inicjalizacja i warunek wyjścia
mogą znajdować się w jednej linii.
Ale to naprawdę zależy od ciebie.
Zwykle używam pętli for do pętli kontrolowanych za pomocą licznika.
Ale znowu możesz użyć tego samego. Jeśli faktycznie chcesz użyć pętli for
i sprawić, by wyglądała na chwilę, po prostu
nie masz pierwszego i trzeciego wyrażenia,
po prostu masz jedno. Tak więc dla testów ze średnikami średnik jest taki sam jak podczas testu.
To tylko pokazuje, że for in the while może zrobić to samo, po prostu
trochę zmień składnię.
Jeśli chcesz faktycznie użyć pętli while, ale chcesz, aby działała
jak pętla for, powinieneś poprzedzić ją inicjalizacją i dołączyć instrukcje update w treści.
Więc to, co byś zrobił, to coś takiego i zwykle zawsze robisz to na chwilę w pętli.
Ale jest to odpowiednik pętli for. Inicjalizacja znajduje się poza
pętlą zmiennej sterującej, zmiennej sterującej pętli.
Warunek testu znajduje się w nawiasach,
a następnie aktualizujesz zmienną sterującą pętli w treści pętli while.
I to jest to samo, co aktualizacja testu inicjalizacji pętli for,
a następnie treść. Nie ma różnicy.
Ponownie, jak wspomniałem, używam pętli for może trochę więcej do pętli kontroli licznika.
Ale będę używać zamiennie zarówno for, jak i while, w zależności od tego, jak się czuję tego dnia.
Więc pętla for może być trochę bardziej odpowiednia, jeśli chcesz
zainicjować i zaktualizować zmienną w jednej linii.
Pętla while jest lepsza, gdy warunki są inne.
Ponownie, pętle kontroli licznika dla, pętle kontrolne wartownika mogą być pętlą while.
A oto przykład pętli while z pętlą kontrolną wartownika
i pętlą for, która robi to samo, lub pętla for dla kontrolowanego licznika.
Chociaż pętla może działać wiele razy w zależności
od tego, co wprowadza użytkownik, pętla for jest kontrolowana przez licznik.
A więc to jest chwila do zrobienia. Miejmy nadzieję, że to jasne.
Zapoznaj się z tymi pętlami, ponieważ często chcesz powtórzyć kod.
Porozmawiamy trochę o zagnieżdżonych pętlach, a także trochę innych
mechanizmach wyjścia z pętli za pomocą przerwy
lub kontynuacji. Dziękuję Ci.