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