INSTRUKCJE ITERACYJNE WHILE, DO WHILE, FOR Instrukcje iteracyjne pozwalają powtarzać daną instrukcję programu określoną liczbę razy lub do momentu osiągnięcia określonego skutku. Pętla iteracyjna while pozwala wykonywać daną instrukcję aż do chwili osiągnięcia kreślonego skutku, test wykonuje się przed każdym wykonaniem instrukcji. Dlatego dana instrukcja może nie być wykonana albo zostać wykonana jeden raz lub wiele razy. Składnia instrukcji WHILE: WHILE (wyrażenie) instrukcja; Instrukcja iteracyjna DO WHILE pozwala wykonywać instrukcję programu aż do momentu osiągnięcia określonego skutku, ale test robi się dopiero po każdym wykonaniu danej instrukcji. Dlatego ta instrukcja iteracyjna wykonywana jest co najmniej jeden raz
INSTRUKCJA WARTOŚĆ WYRAŻENIA TESTUJĄCEGO RÓŻNA OD zera NIE TAK Składnia instrukcji DO WHILE: do instrukcja WHILE (wyrażenie); Najpierw wykonuje się jeden raz instrukcję pętli, następnie testuje się wyrażenie. Jeśli wartość wyrażenia jest różna od 0, to ponownie wykonuje się instrukcję, a po jej wykonaniu ponowny test. Natomiast jeżeli wartość wyrażenia jest równa 0, to nie jest wykonywana instrukcja, następuje przerwanie iteracji (wyjście z pętli). Wyrażenie testujące zawsze podaje się w nawiasach. 1) Co zostanie wydrukowane po wykonaniu pętli: a = 1; b = 3; while (a < b) { a = 5 * a 1; b = 2 * b + 1; } cout << a << endl << b; 2) Co zostanie wydrukowane po wykonaniu pętli:
a = 21; b = 3; while (a!= b) { a = a 1; b = b + 1; } cout << a << endl << b; Przykładowe programy: Algorytm ten polega na doprowadzeniu do równości wprowadzonych liczb a i b przez iteracyjne odejmowanie od liczby większej liczby mniejszej. Wynikiem jest jedna z liczb, gdyż obie są równe po zakończeniu działania algorytmu. Wprowadzone liczby mogą być równe. Wynikiem wprost jest jedna z liczb. while (a!=b) if (a>b) a-=b; else b-=a; Program działa poprawnie dla prawidłowych danych, to jest dla liczb a i b całkowitych i większych od 0. Ta wersja algorytmu jest mało efektywna, co można stwierdzić doświadczalnie, wprowadzając jedną dużą a drugą małą liczbę, np. 10 9 i 2. Wtedy należy wykonać aż 5 10 8 odejmowań, co dla komputera jest poważnym obciążeniem i wymaga dłuższego czasu pracy procesora. Efektywniejszy jest algorytm Euklidesa w wersji z dzieleniem (reszta z dzielenia). Istota działania tego algorytmu polega na zastępowaniu liczby większej resztą z dzielenia liczby większej przez mniejszą. Powtarza się tę czynność do uzyskania reszty zerowej. Wynikiem jest wtedy liczba niezerowa. Wykonać należy co najmniej jedno dzielenie. Algorytm wymaga także poprawnych danych (liczb całkowitych większych od 0).
Innym przykładem zastosowania iteracji może być odwracanie kolejności cyfr w liczbie całkowitej metodą arytmetyczną liczba 987 po odwróceniu cyfr staje się liczbą 789. W języku C++ ten algorytm zastąpimy jedną linijką programu While (n) m=10*m + n%10, n/=10;
Ćwiczenia: 1. Napisz program, który obliczy sumę cyfr wprowadzonej liczby n, maksymalnie 18-cyfrowej. Na przykład dla n = 56783 suma wynosi 29. 2. Napisz program obliczający najmniejszą wspólną wielokrotność dwóch liczb całkowitych, według następującego algorytmu: krok pierwszy - jeśli dane liczby są równe, to wynikiem jest jedna z nich; jeśli nie - przejdź do kroku drugiego; krok drugi - do liczby mniejszej dodaj początkową wartość tej liczby mniejszej, przejdź do kroku pierwszego. 3. Napisz program dokonujący rozkładu danej liczby naturalnej n na czynniki pierwsze. Na przykład dla n = 24 są to czynniki 2 2 2 3. 4. Napisz program obliczający tzw. jednocyfrową sumę cyfr liczby n. Na początku oblicza się sumę cyfr liczby n; jeśli wynikiem jest liczba wielocyfrowa, to znowu oblicza się sumę cyfr tej poprzedniej sumy i tak powtarza (iteruje), aż do uzyskania liczby jednocyfrowej, która jest wynikiem końcowym. Na przykład dla n =48 suma jednocyfrowa wynosi 3. Zadania 1. Napisz program stwierdzający, czy zadana liczba n jest pierwsza. 2. Napisz program obliczający sumę wprowadzanych z klawiatury liczb rzeczywistych nie większych od 50 3. Napisz program wyznaczający sumę n początkowych liczb parzystych. Liczbę n należy pobrać od użytkownika. 4. Napisz program wczytujący z klawiatury liczbę całkowitą. Program powinien przyjmować jedynie liczbę dodatnią. Jeśli użytkownik poda liczbę ujemną, to powinien zostać poinformowany, że wymagana jest liczba dodatnia i poproszony o kolejną liczbę. Próbę wczytywania liczby powtarzamy dopóty, dopóki
użytkownik nie poda liczby poprawnej (dodatniej). Taki sposób zapewnienia poprawności wczytywanych danych nazywać będziemy pętlą zaporową. 5. Wykorzystując pętlę zaporową napisz program, wyznaczający pole dowolnej figury. Program jako dane (długości boków figury) powinien przyjmować wyłącznie liczby dodatnie. 6. Wykorzystując pętlę zaporową napisz program, wyznaczający objętość dowolnej bryły. Program jako dane (długości boków bryły) powinien przyjmować wyłącznie liczby dodatnie. 7. Napisz program wyznaczający wartość pierwiastka kwadratowego z liczby. Wprowadzane dane zabezpiecz pętlą zaporową.