26 marca 2011

Praktyczny kurs C++ za darmo - pętla WHILE i DO WHILE

Praktyczny kurs C++ za darmo - pętla WHILE i DO WHILE

Autorem artykułu jest Frycz Modrzewski



Pętle to również dobry wynalazek. Umożliwiają one cykliczne powtarzanie tego samego fragmentu programu. Umiejętne wykorzystane tego może posłużyć do tworzenia bardzo ciekawych aplikacji np.: program z menu, sprawdzanie poprawności podanych wartości, wczytywanie danych z pliku, pobieranie wartości z tablic i wiele, wiele innych.

Pętla ta działa następująco: Gdy spełniony jest warunek to wykonuj instrukcje



Gdy

while

spełniony jest warunek

(warunek)

to wykonuj instrukcje

{
// instrukcje
}

Całość:

while(warunek)
{
//instrukcje
}

Dla przykładu, program, który wypisuje na ekran liczby całkowite od zera do wartości wybranej przez użytkownika (ograniczenie):

int ograniczenie; // tu przypiszemy ograniczenie
int i=0; // tę wartość będziemy zwiększać od 0 do ograniczenia

cout<<"podaj ograniczenie: "<cin>>ograniczenie; // program pobiera ograniczenie

while(i<=ograniczenie) //gdy i mniejsze bądź równe ograniczenie to
{
cout<<"liczba "<
i=i+1; // WAŻNE: tu zwiększamy wartość i o jeden
// bo wiemy już, że znak = oznacza PODSTAW, czyli za i podstaw i+1
} // tutaj pętla zawraca i jeszcze raz sprawdza warunek

getch();

Kolejny przykład: program wypisuje na ekran liczby całkowite od wartości wybranej do zera:

int ograniczenie; // tu przypiszemy ograniczenie
int i; // tym razem i musi mieć wartość ograniczenia, jeszcze jej nie znamy

cout<<"podaj ograniczenie: "<cin>>ograniczenie; // program pobiera ograniczenie, teraz je znamy więc…

i=ograniczenie; // teraz i ma wartość ograniczenia

while(i>=0) //gdy i WIĘKSZE bądź równe 0
{
cout<<"liczba "<
i=i-1; // WAŻNE: tu zmniejszamy wartość i o jeden
} // tutaj pętla zawraca i jeszcze raz sprawdza warunek

getch();

UWAGA: w języku C++, zamiast pisać i=i+1 można krótko: i++. Teraz już wiesz, skąd nazwa C++. Zamiast i=i-1 można użyć i--. Zapamiętaj te skróty.

Wiem, wiem, myślisz, że te przykłady są bez sensu i nie wnoszą niczego nowego. Za karę jeszcze kilka równie głupich i jeszcze bardziej bez sensu przykładów do samodzielnego napisania ;-)

Napisz program, który wypisuje na ekranie Twoje imię wybraną przez Ciebie ilość razy (rozwiązania).
Napisz program, który wypisuje na ekranie liczy od 0 do wybranego ograniczenia co 10, czyli 0, 10, 20, 30…itd. (rozwiązania).

Chodzi o to, aby została zrozumiana przez Ciebie zasada działania i idea pętli while. Pętla będzie wykonywała instrukcje, tak długo jak będzie spełniony warunek. W naszym pierwszym przykładzie warunkiem jest to, aby liczba była mniejsza od ograniczenia. Jeśli będzie mniejsza, to zostanie wypisana na ekran i zwiększona o jeden, Jeśli nie, to pętla zostanie przerwana.

Podobnie jak w funkcji if, między nawiasami klamrowymi instrukcji while możemy wpisać dowolną ilość instrukcji. Powróć do pierwszego przykładu z tej lekcji. Zmodyfikujemy go poprzez wstawienie do pętli while funkcji if i dzięki temu zaznaczymy, która liczba jest parzysta.

int ograniczenie;
int i=0;

cout<<"podaj ograniczenie: "<cin>>ograniczenie;

while(i<=ograniczenie)
{
cout<<"liczba "< if((i%2)==0) // tu wstawiamy funkcje if
{
cout<<" – liczba parzysta"< }

i=i+1;
}

getch();

Teraz program, który żąda wciśnięcia klawisza z cyfrą 1. Pętla będzie działać tak długo jak długo nie będziemy chcieli wybrać klawisza 1:

char znak; // tu zapiszemy wciśnięty klawisz

cout<<"wcisnij klawisz 1: "<znak=getch(); // program pobiera znak

while(znak!='1') //jeśli nie wybraliśmy 1
{
cout<<"Zły klawisz! "<
cout<<"wcisnij klawisz 1: "< znak=getch(); // program pobiera znak

} // tutaj pętla zawraca i jeszcze raz sprawdza warunek

Zauważ, że w tym przypadku nie potrzeba wywoływania funkcji getch() na końcu programu. Taka pętla mogłaby posłużyć do napisania programu, który wielokrotnie wyświetla menu. Rozbudujmy go dalej i dodajmy dwie opcje wyboru.
Menu

char znak; // tu zapiszemy wciśnięty klawisz

cout<<"MENU"<cout<<"1 – pole trojkata "<cout<<"2 – pole prostokata "<cout<<"3 - zakoncz "<
znak=getch(); // program pobiera znak
while(znak!='3') //jeśli nie wybraliśmy 3, czyli nie chcemy kończyć to:
{
if(znak=='1') // po kolei sprawdzamy wybór użytkownika
{
cout<<"Program obliczy pole trojkata"< }
if(znak=='2')
{
cout<<"Program obliczy pole prostokata"< }
if(znak!='1' && znak!='2') //jeśli użytkownik nie wybrał ani 1 ani 2
{
cout<<"Nie ma takiej opcji"< }

cout<<"Wybierz opcje"<znak=getch();// jeszcze raz dokonujemy wyboru

} // tutaj pętla zawraca i jeszcze raz sprawdza warunek

Skoro mamy dwie opcje więc co stoi na przeszkodzie aby dodać kolejną i kolejną? Nic. Wystarczy dopisać do menu koleją opcję i kolejną funkcję if. Uzupełnij powyższy program o dodatkową opcję "oblicz pole koła". Po uzupełnieniu mamy schemat programu, do którego neleży wstawić instrukcje z programu Menu v1.0.

Po wstawieniu otrzymujemy w pełni działający program, w którym możemy wielokrotnie wybierać opcje i obliczać pola. Zapisz program jako Menu v1.1.

char znak; // tu zapiszemy wciśnięty klawisz
const float pi=3.1415; // zmienne potrzebne do obliczeń
float wys_t, podst_t, prom_kola, boka_prost, bokb_prost, wynik;

cout<<"MENU"<<<<; // tworzymy menu
cout<<"1 – pole trojkata "<cout<<"2 – pole prostokata "<cout<<"3– pole prostokata "<cout<<"4 - zakoncz "<
znak=getch(); // program pobiera znak
while(znak!='4') //jeśli nie wybraliśmy 4, czyli nie chcemy kończyć to:
{
if(znak=='1') // sprawdzamy czy została wybrana opcja 1
{
cout<<"Program obliczy pole trojkata"< cout<<"Podaj wysokosc: ";
cin>>wys_t;
cout<<"Podaj dlugosc podstawy: ";
cin>>podst_t;

if(wys_t>0 "" podst_t>0)
{
wynik=(wys_t*podst_t)/2;
cout<<"Pole trojkata wynosi "< }
else
{
cout<<"Wymiary nie moga byc ujemne!"< }
}

if(znak=='2') // a może opcja 2
{
cout<<"Program obliczy pole kola"< cout<<"Podaj promien: ";
cin>>prom_kola;

if(prom_kola>0)
{
wynik=prom_kola*prom_kola*pi;
cout<<"Pole kola wynosi "< }
else
{
cout<<"Wymiary nie moga byc ujemne!"< }
}

if(znak=='3') // opcja 3?
{
cout<<"Program obliczy pole postokata"< cout<<"Podaj dlugosc boku a: ";
cin>>boka_prost;
cout<<"Podaj dlugosc boku b: ";
cin>>bokb_prost;

if(boka_prost>0 "" bokb_prost>0)
{
wynik=boka_prost*bokb_prost;
cout<<"Pole prostokata wynosi "< }
else
{
cout<<"Wymiary nie moga byc ujemne!"< }
}

if(znak!='1' "" znak!='2' "" znak!='3' ) // a może żadna z nich
{
cout<<"Nie ma takiej opcji"<}

cout<<"Wybierz opcje"<znak=getch();// jeszcze raz dokonujemy wyboru

} // tutaj pętla zawraca i jeszcze raz sprawdza warunek

Pętla while może również służyć do kontroli podawanych długości np.: długości boków lub wysokości. Tym razem jednak program nie będzie musiał kończyć działania zaraz po pierwszej błędnie podanej wartości. Będzie czekał tak długo i tak długo informował nas o błędzie aż w końcu się nauczymy i podamy wartość nieujemną. Tylko co zrobić, jeśli będziemy chcieli podać długość 30? Wtedy trzeba nacisnąć klawisze 3 i 0 a wiemy, że zmienna typu char przechowuje tylko jeden znak. Dlatego należy zastosować zmienne typu int lub float.

Prosty program obliczający pole prostokąta:

float a, b, wynik; // długości boków i wynik

cout<<"Podaj długosc boku a: "<cin>>a;
cout<<"Podaj długosc boku b: "<cin>>b;

wynik=a*b;
cout<<"pole wynosi "<
getch();

A po modyfikacji:

float a, b, wynik; // długości boków i wynik

cout<<"Podaj długosc boku a: "<cin>>a;

while(a<=0) //sprawdzamy czy długosc jest poprawna
{ // jeśli nie to
cout<<"Długosci nie mogą być ujemne!"< cout<<"Podaj długosc boku a: "< cin>>a;
}

cout<<"Podaj długosc boku b: "<cin>>b;

while(b<=0) //sprawdzamy czy długosc jest poprawna
{ // jeśli nie to
cout<<"Długosci nie mogą być ujemne!"< cout<<"Podaj długosc boku b "< cin>>b;
}

wynik=a*b;
cout<<"pole wynosi "<
getch();

Myślę, że po tym przykładzie idea, zasady użycia i zastosowanie pętli while nie pozostawia wątpliwości. Teraz możesz już napisać program Menu v1.2, który będzie czekał do skutku na podanie wartości większej od zera.

Zauważ taką rzecz: w pętli while warunek sprawdzany jest za początku, następnie wykonywane są instrukcje. Wspominałem również o pętli DO WHILE. Różnica między tymi dwiema pętlami jest właśnie taka, że w pętli WHILE warunek sprawdzany jest na początku a w pętli DO WHILE – na końcu.
Schemat pętli DO WHILE

do
{
//instrukcje
}
while(warunek); //średnik!

Trudno jest jednoznacznie powiedzieć kiedy używać jednej a kiedy drugiej. Zależy to od konkretnego problemu, jaki chcemy rozwiązać. Pokarzę programy napisane z użyciem jednej i drugiej pętli.

Program pobiera z klawiatury dowolne liczby. Gdy zostanie wybrane zero, pobieranie zostaje zakończone. (Użyteczne w programie pobierającym liczby i obliczający średnią np. ocen)

float liczba;

cout<<"Podaj liczbe (0 – konczy wpis): "<
do
{
cin>>liczba;
}
while(liczba!=0);

Przy użyciu WHILE:

float liczba;

cout<<"Podaj liczbe (0 – konczy wpis): "<cin>>liczba; // trzeba wczytać wartość aby można było sprawdzić warunek

while(liczba!=0)
{
cin>>liczba;
}

Działają identycznie. W tym przypadku niewiele mniej pisania jest przy użyciu DO WHILE. Skoro takie wczytywanie liczb można wykorzystać do obliczania średniej, więc napiszmy taki program. Aby obliczyć średnią potrzebujemy sumę wszystkich liczb oraz ich ilość.

float liczba; // tu zapiszemy liczbę pobraną z klawiatury
float suma=0; // to będzie suma liczb, na początku wynosi 0
float srednia; // do tej zmiennej przypiszemy średnią
int n=0; // tego użyjemy do zliczania ilości liczb
// wartość początkowa 0, gdyż na początku mamy zero liczb ;-)

cout<<"Podaj liczbe (0 – koniec wpisu):"; // prosimy o liczbę
cin>>liczba; // pobieramy liczbę

while(liczba!=0) //jeżeli liczba jest różna od zera to
{
suma=suma+liczba; //powiększamy sumę o wartość podanej liczby
n++; // zwiększamy o jeden ilość liczb

cout<<"Podaj liczbe (0 – koniec wpisu):"; // i po raz kolejny wczytujemy liczbę
cin>>liczba;
} // gdy podamy zero, pętla kończy działanie
if(n>0) // sprawdzamy czy ilość podanych liczb jest większa od 0
{
srednia=suma/n; //jeśli tak, obliczamy średnią
cout<<"Srednia liczb wynosi "<}
else // jeżeli nie podano liczb
{
cout<<"Nie podano zadnej liczby!"; // informujemy o tym
}

getch();

Zapisz program jako Średnia v1.0. Możesz go użyć do obliczania średnich: ocen, wydatków, dochodów, pomiarów itd. Program można wzbogacić o dodatkowe warunki choćby liczenie średniej tylko liczb dodatnich. Przykład:

float liczba;
float suma=0;
float srednia;
int n=0;

cout<<"Podaj liczbe większą od 0 (0 – koniec wpisu):";
cin>>liczba;

while(liczba!=0)
{
if(liczba>0) //tutaj dajemy warunek. Jeśli liczna jest >0
{
suma=suma+liczba; // to zostanie dodana do sumy
n++; // a ilość liczb zostanie zwiększona o 1
}
cout<<"Podaj liczbe (0 – koniec wpisu):";
cin>>liczba;
}
if(n>0)
{
srednia=suma/n;
cout<<"Srednia liczb dodatnich wynosi "<}
else
{
cout<<"Nie podano zadnej liczby!";
}

getch();

Do pętli while i do while jeszcze powrócimy, gdyż na pewno jeszcze się przydadzą. W kolejnej części kursu (lekcja 7) opowiem, jak ułatwić sobie życie, stosując pętle FOR. Jest to lepsza wersja pętli WHILE, jeżeli chodzi np. o wypisanie liczb z żądanego przedziału.

---

Więcej na Praktyczny kurs CPP


Artykuł pochodzi z serwisu www.Artelis.pl

Brak komentarzy:

Prześlij komentarz