Podstawy programowania. Wykład 5 – pętle

Małgorzata Nalbach-Moszyńska

7

Pętle ...............................................................................................................................2

7.1

Instrukcja for ........................................................................................................2

7.2

Instrukcja while....................................................................................................4

7.3

Pętla do..while ........................................................................................................7

7.4

Instrukcja break....................................................................................................9

7.5

Instrukcja continue.............................................................................................9

7.6

Wprowadzanie danych z wykorzystaniem cin .....................................................10

1

Podstawy programowania. Wykład 5 – pętle

Małgorzata Nalbach-Moszyńska

7 Pętle

SłuŜą do zapisu powtarzania czynności.

Zawsze powinny zawierać warunek stopu. Jeśli warunek stopu jest spełniony pętla się kończy.

Pętla bez warunku stopu lub z warunkiem stopu zawsze prawdziwym jest nazywana pętlą nieskończoną, moŜe spowodować zapętlenie programu (program nigdy się nie skończy.

7.1 Instrukcja for

• Składnia:

for (< inicjacja> ; <test> ; <aktualizacja> ) // uwaga na nawiasy i średniki !

<instrukcja>

• Działanie:

• Przykład 1

// forloop.cpp -- petla for po raz pierwszy

#include <iostream>

using namespace std;

int main()

{

int i; // zadeklaruj licznik

// inicjalizacja; test; aktualizacja

for (i = 0; i < 5; i++)

cout << "C++ zna petle.\n";

cout << "C++ wie, kiedy przestac.\n";

return 0;

}

2

Podstawy programowania. Wykład 5 – pętle

Małgorzata Nalbach-Moszyńska

• Przykład 2

// sumowanie kolejnych liczb od 1

#include <iostream>

using namespace std;

int main()

{

int doIlu;

int suma = 0;

cout << "Do ilu: ";

cin >> doIlu;

if (doIlu<1) //błąd

{

cout << "Podales "<< doIlu << " a zakres musi byc wiekszy od 0"; return -1;

}

// sumowanie kolejnych liczb od 1 do doIlu

for (int i = 1; i <= doIlu; i++)

suma += i;

cout<<"Suma kolejnych liczb od 1 do "<< doIlu << " wynosi "<< suma<<endl;

// sumowanie kolejnych liczb od doIlu do 1

suma = 0;

for (int i = doIlu; i >= 1; i--)

suma += i;

cout<<"Suma kolejnych liczb od "<< doIlu << " do 1 wynosi "<< suma<<endl; cout << "\nDo widzenia.\n";

return 0;

}

3

Podstawy programowania. Wykład 5 – pętle

Małgorzata Nalbach-Moszyńska

7.2 Instrukcja while

• Składnia:

while (<warunek-testowy> )

<instrukcja1>

• Działanie:

4

Podstawy programowania. Wykład 5 – pętle

Małgorzata Nalbach-Moszyńska

• Przykład 1 suma liczb od 1 do n

// sumowanie kolejnych liczb od 1 instr while

#include <iostream>

using namespace std;

int main()

{

int doIlu;

int suma = 0;

int i = 1;

cout << "Do ilu: "; // wczytanie danych

cin >> doIlu;

if (doIlu<1) //błąd

{

cout << "Podales "<< doIlu << " a zakres musi byc wiekszy od 0"; return -1;

}

// sumowanie kolejnych liczb od 1 do doIlu

while (i<= doIlu){

suma += i;

cout <<"i= "<<i <<"; Suma = "<<suma<<endl;

++i;

}

cout<<"Suma kolejnych liczb od 1 do "<< doIlu << " wynosi "<< suma<<endl;

// sumowanie kolejnych liczb od doIlu do 1

suma = 0;

i = doIlu;

while (i >= 1){

suma += i;

cout <<"i= "<<i <<"; Suma = "<<suma<<endl;

--i;

}

cout<<"Suma kolejnych liczb od "<< doIlu << " do 1 wynosi "<< suma<<endl; cout << "\nDo widzenia.\n";

return 0;

}

5

Podstawy programowania. Wykład 5 – pętle

Małgorzata Nalbach-Moszyńska

• Przykład 2

// czytamy liczby dopóki sa na cin;

//przerywa nieliczba lub koniec pliku (CTRLD)

#include <iostream>

using namespace std;

int main() {

int liczba;

while (cin>> liczba)

cout <<" kolejna "<<liczba<<endl;

cout << "po while \n";

return 0;

}

• Przykład 3 menu

// switch.cpp -- uzycie instrukcji switch

#include <iostream>

using namespace std;

void showmenu(); // prototypy funkcji

void report();

void comfort();

int main()

{

int choice;

showmenu();

while (true)

{

cin >> choice;

switch(choice)

{

case 1 : cout << "\a\n";

break;

case 2 : report();

break;

case 3 : cout << "Szef nigdzie nie wychodzil.\n";

break;

case 4 : comfort();

break;

case 5 : cout << "Do zobaczenia!\n";

return 0;

default : cout << "Nie ma takiej opcji.\n";

}

}

6

Podstawy programowania. Wykład 5 – pętle

Małgorzata Nalbach-Moszyńska

}

void showmenu()

{

cout << "Wybierz 1, 2, 3, 4 albo 5:\n"

"1) alarm 2) raport\n"

"3) alibi 4) luzik\n"

"5) koniec\n";

}

void report()

{

cout << "To byl naprawde wspanialy tydzien.\n"

"Sprzedaz wzrosla o 120%, wydatki zmalaly o 35%.\n";

}

void comfort()

{

cout << "Pracownicy uwazaja cie za najfajniejszego\n"

"dyrektora w calej branzy. Zarzad sadzi, ze jestes\n"

"najlepszym dyrektorem w calym przemysle.\n";

}

7.3 Pętla do..while

• Pętla z warunkiem wyjściowym – sprawdzanym na koniec, po wykonaniu ciała pętli

• Instrukcja w pętli zawsze wykonuje się co najmniej raz.

• Składnia:

do

<instrukcja w pętli>

while (< warunek testowy>)

• Działanie

7

Podstawy programowania. Wykład 5 – pętle

Małgorzata Nalbach-Moszyńska

• Przykład

// petla z kontrola warunku na koniec; zgadywanka

#include <iostream>

using namespace std;

int main()

{

int n;

int losowa;

int licznik =0;

srand((unsigned)time(0)); // inicjacja funkcji losujacej

losowa =(rand()%10)+1; // losowanie; ograniczamy zakres do <1;10>

cout << "Wylosowalem liczbe od 1 do 10. \n";

cout << "Wygrasz jesli trafisz w co najwyzej 3 probach. \n";

do

{

cin >> n;

++licznik; // wykonaj treść

} while (n != losowa && licznik <3); // potem sprawdź warunek

if (n == losowa)

cout << "Gratuluje. Wygrales\n" ;

else

cout<< "Przykro mi. Przegrales"<<endl;

cout << "Wylosowana liczba to "<<losowa<<endl;

return 0;

8

Podstawy programowania. Wykład 5 – pętle

Małgorzata Nalbach-Moszyńska

}

7.4 Instrukcja break

• Pozwala pominąć część kodu – po break następuje natychmiastowe przerwanie

wykonywanej instrukcji;

• Stosuje się w instrukcji switch i pętlach

o W instrukcji switch umoŜliwia zaprzestanie sprawdzania dalszych warunków po stwierdzeniu, Ŝe dany warunek zachodzi.

o W pętlach powoduje natychmiastowe wyjście z pętli.

7.5 Instrukcja continue

• Powoduje pominięcie kodu w pętli aŜ do sprawdzenia warunku.

• W pozostałych miejscach programu nic nie robi.

• Przykład

// pomijanie instrukcji - wykorzystanie continue

#include <iostream>

using namespace std;

int main()

{

for (int i = 0; i < 10; i++) {

if (i%4==0) {

continue;

}

cout << i << " "; //ta instrukcja jest pomijana dla i=4 i i=8

}

cout << endl;

for (int j = 0; j < 2; j++) {

for (int k = 0; k < 5; k++) { //continue dotyczy tylko tej petli

if (k == 3) continue;

cout << j << k << " "; //ta instrukcja jest pomijana dla k==3

}

}

return 0;

}

9

Podstawy programowania. Wykład 5 – pętle

Małgorzata Nalbach-Moszyńska

7.6 Wprowadzanie danych z wykorzystaniem cin

• Przykład 1

• Chcemy zliczyć znaki wprowadzane z klawiatury. Warunek stopu – wystąpienie

konkretnego znaku ‘#’

// w5p10.cpp -- wczytywanie znakow w petli while

#include <iostream>

using namespace std;

int main()

{

char ch;

int count = 0; // najprostsza metod wprowadzania

cout << "Podawaj znaki; # konczy wprowadzanie:\n";

cin >> ch; // pobierz znak

while (ch != '#') // sprawdz znak

{

cout << ch; // wyswietl znak na ekranie

++count; // dolicz znak

cin >> ch; // pobierz nastepny znak

}

cout << endl << " Wczytano " << count << " znakow\n"; return 0;

}

• Znikają spacje. Wina po stronie sposobu czytania. Odczytując wartości typu char, cin jak przy innych typach ignoruje znaki spacji i nowego wiersza. W rezultacie otrzymana liczba znaków nie zawiera wystąpień tych ignorowanych znaków.

• Rozwiązanie – czytanie za pomocą cin.get()

• Przykład

// w5p12.cpp -- wczytywanie znaków do konca pliku

#include <iostream>

using namespace std;

int main() {

int znak; // konieczna deklaracja int a nie char

znak=cin.get(); // wczytaj 1 znak

while (znak != EOF) {

cout.put((char)znak); // wypisz 1 znak

znak=cin.get(); // wczytaj 1 znak

}

return 0;

}

10

Podstawy programowania. Wykład 5 – pętle

Małgorzata Nalbach-Moszyńska

Komentarz:

• Nie moŜemy zastosować konstrukcji cin >> znak, poniewaŜ operator >> pomija na przykład spacje. Musimy uŜyć funkcji, która wczytuje jeden znak. Taką funkcją jest get() bez argumentu. Pobiera ona jeden znak ze strumienia wejściowego i zwraca go jako wartość funkcji. Jeśli napotka w strumieniu koniec pliku, zwraca znacznik końca pliku EOF. PoniewaŜ funkcja ta dotyczy strumienia cin, który jest obiektem specjalnego typu, musimy uŜyć składni obiekt.funkcja(). Więcej informacji na ten temat -

wykład " Programowanie obiektowe".

• Stała EOF symbolizuje znacznik końca pliku i jest zdefiniowana w pliku nagłówkowym iostream. Aby odróŜnić znacznik od elementów zbioru znaków, często reprezentuje się go za pomocą liczby –1 (znak jest reprezentowany przez kod ASCII, a więc przez liczbę dodatnią). Zmienną, która przyjmuje wynik funkcji get() trzeba zatem zdeklarować jako int, tak aby mogła przyjmować zarówno wartości znaków jak i wartość stałej EOF.

• Odpowiednikiem funkcji get() dla strumienia wyjściowego cout jest funkcja put().

Wstawia ona jeden znak (swój argument) do strumienia wyjściowego.

11