WYKAAD 4/5 INSTRUKCJE JZYKA C++ 64 M. JANKOWSKA PROGRAMOWANIE I JZYK C++ WYRAŻENIA Wyrażenie wartość lub kombinacja wartości, operatorów i znaków przestankowych określających sposób wykonania danego obliczenia. lub według innej definicji ... Wyrażenie ewaluowana (wartościowana) zgodnie z regułami określonymi w danym języku kombinacja wartości, zmiennych, operatorów i funkcji, która zwraca inną wartość. UWAGA W języku C++ każde wyrażenie ma swoją wartość. Mówimy, że wyrażenie ewaluuje się do tej wartości. PRZYKAADY 10 + 50 Wyrażenie składające się z dwóch wartości oraz operatora dodawania. Wartość wyrażenia równa jest 60. x = 35 W języku C++ wartość wyrażenia z przypisaniem definiowana jest jako wartość lewego argumentu. Tak więc wartość wyrażenia równa jest 35. 65 M. JANKOWSKA PROGRAMOWANIE I JZYK C++ PRZYKAADY CIG DALSZY x = 21 + (y = 5); Wyrażenie przypisania ma wartość (zob. pkt. 2). Tak więc wyrażenie y = 5 ma wartość równą 5. Ostatecznie zmienna x przyjmie wartość 26. x = y = z = 0; W powyższy sposób możemy w szybki sposób przypisać kilku zmiennym tę samą wartość. Zgodnie z priorytetem operatora = (operacja przypisania jest łączona od strony prawej do lewej) wartość 0 zostanie najpierw przypisane do zmiennej z, następnie do zmiennej y, a na końcu do zmiennej x. 66 M. JANKOWSKA PROGRAMOWANIE I JZYK C++ INSTRUKCJE Instrukcja samodzielny element języka programowania umożliwiający zapis algorytmu oraz, co za tym idzie, sterowanie przebiegiem programu. Do instrukcji języka C++ zaliczamy: " instrukcję pustą, " instrukcje iteracyjne (pętle) (for, while, do ... while), " instrukcje warunkowe (if, if ... else ...), " instrukcję wyboru (switch), " instrukcje sterujące, (np. break, continue, return, goto). INSTRUKCJA PUSTA Instrukcja pusta umieszczona w kodzie zródłowym nie powoduje wykonania żadnych czynności. W języku C/C++ instrukcję taką zapisuje się w postaci średnika, którego nie poprze- dzamy żadnym słowem kluczowym, ani wyrażeniem. Dobrym nawykiem jest umieszczanie instrukcji pustej w oddzielnym wierszu programu. Np. for (int i=0; i<=10; i++) ; UWAGA Może się zdarzyć, że w trakcie pisania programu składnia języka wymaga podania w danym miejscu kodu wyrażenia lub instrukcji, podczas gdy implementowany algorytm nie wykonuje tam jakiejkolwiek czynności. W takiej sytuacji wystarczy 67 umieścić w danym miejscu programu instrukcję pustą. M. JANKOWSKA PROGRAMOWANIE I JZYK C++ INSTRUKCJE ITERACYJNE Instrukcje iteracyjne (inaczej instrukcje powtórzeń, pętle) umożliwiają wielokrotne wykonywanie określonych czynności tak długo, jak jest spełniony pewien warunek. Do instrukcji iteracyjnych języka C/C++ zaliczamy: " instrukcję dla (for), " instrukcje dopóki (while), " instrukcje wykonuj ... dopóki (do ... while). 1. Instrukcja dla (for) Ogólna postać instrukcji w języku C/C++ przedstawia się następująco: for (wyrażenie-inicjujące; wyrażenie-warunkowe; wyrażenie-aktualizujące) instrukcja1 gdzie wyrażenie-inicjujące może być dowolnego rodzaju jednak najczęściej jest ono wyrażeniem wyliczeniowym, które zawiera listę inicjacji liczników pętli. W języku C++ wyrażenie inicjujące może być połączone z deklaracją zmiennych; wyrażenie-warunkowe musi być typu skalarnego; wyrażenie-aktualizujące może być dowolnym wyrażeniem języka C/C++; instrukcja może być dowolną instrukcją języka C/C++ (w tym instrukcją grupującą). 68 M. JANKOWSKA PROGRAMOWANIE I JZYK C++ INSTRUKCJE ITERACYJNE CIG DALSZY PRZYKAAD Kolejne kroki wykonywane w trakcie for (k = 1; k<=5; k++) działania pętli: { 1. Obliczamy wyrażenia-inicjujących a[k] = k; i inicjujemy liczniki pętli (w przykładzie } inicjujemy jeden licznik kwartością 1). 2. Obliczamy wyrażenie-warunkowe. Jeżeli jego wartość jest niezerowa (true) wówczas wykonywane są instrukcje związane z pętlą for (w przykładzie wykonane zostanie podstawienie a[k] = k). 3. Obliczamy wyrażenia-aktualizujące. W wyniku otrzymujemy zwiększenie lub zmniejszenie wartości liczników pętli (w przykładzie wartość licznika kbędzie równa 2). 4. Ponownie obliczamy wyrażenie-warunkowe, a następnie jeżeli jego wartość jest niezerowa powtarzamy czynności począwszy od punktu 2. 69 M. JANKOWSKA PROGRAMOWANIE I JZYK C++ INSTRUKCJE ITERACYJNE CIG DALSZY UWAGI Dozwolone jest pominiecie każdego z wyrażeń występujących w instrukcji for. Jeżeli usuniemy wszystkie wyrażenia występujące w instrukcji for otrzymamy puste wyrażenie warunkowe, które ma wartość logiczną prawda. PRZYKAAD for (;;) for (;1;) { { // instrukcje // instrukcje } } Powyższe pętle są sobie równoważne. Będą one wykonywane do momentu napotkania instrukcji sterujących break, return lub goto, które przeniosą wykonywanie programu poza obszar pętli. 70 M. JANKOWSKA PROGRAMOWANIE I JZYK C++ INSTRUKCJE ITERACYJNE CIG DALSZY 2. Instrukcja dopóki (while) Ogólna postać instrukcji w języku C/C++ przedstawia się następująco: while (wyrażenie-warunkowe) instrukcja gdzie wyrażenie-warunkowe musi być typu skalarnego; instrukcja może być dowolną instrukcją języka C/C++ (w tym instrukcją grupującą). Sposób działania instrukcji while: " Sprawdzamy, czy wyrażenie-warunkowe ma wartość niezerową (true). Jeżeli tak, wówczas wykonujemy instrukcję związaną z pętlą while. " Kontynuujemy wykonywanie instrukcji dopóki wyrażenie-warunkowe ma wartość niezerową (true). " Przyjęcie przez wyrażenie-warunkowe wartości równej 0 (false) powoduje przeniesienie wykonywania programu poza pętlę while. 71 M. JANKOWSKA PROGRAMOWANIE I JZYK C++ INSTRUKCJE ITERACYJNE CIG DALSZY 3. Instrukcja wykonuj ... dopóki (do ... while) Ogólna postać instrukcji w języku C/C++ przedstawia się następująco: do instrukcja while (wyrażenie-warunkowe); gdzie wyrażenie-warunkowe musi być typu skalarnego; instrukcja może być dowolną instrukcją języka C/C++ (w tym instrukcją grupującą). Sposób działania instrukcji do ... while: " Wykonujemy instrukcje. (Uwaga: Instrukcje zostaną wykonane co najmniej raz, gdyż wyrażenie-warunkowe sprawdzane jest po zakończeniu pierwszej iteracji). " Sprawdzamy, czy wyrażenie-warunkowe ma wartość niezerową (true). Jeżeli tak, wówczas wykonujemy instrukcje po raz kolejny. " Kontynuujemy wykonywanie instrukcji dopóki wyrażenie-warunkowe ma wartość niezerową (true). " Przyjęcie przez wyrażenie-warunkowe wartości równej 0 (false) powoduje przeniesienie wykonywania programu poza pętlę do ... while. 72 M. JANKOWSKA PROGRAMOWANIE I JZYK C++ INSTRUKCJE ITERACYJNE PORÓWNANIE 1. Pętla for Przykład pokazuje jak przy for (i=0; i<=4; i++) pomocy trzech różnych pętli a[i] = i; iteracyjnych for, while oraz do ... while wykonać to samo zadanie. 2. Pętla while i = 0; while (i<=4) { a[i] = i; UWAGI i++; Licznik iw pętli for jest inicjowany w pętli } przed rozpoczęciem wykonywania instrukcji. 3. Pętla do ... while Pętle while oraz do ... while wymagają i = 0; inicjacji licznika przed rozpoczęciem do instrukcji w pętli. { a[i] = i; i++; } while (i<5); 73 M. JANKOWSKA PROGRAMOWANIE I JZYK C++ INSTRUKCJE WARUNKOWE Instrukcje warunkowe umożliwiają sprawdzenie, czy spełniony jest określony warunek i na tej podstawie wykonanie (lub zaniechanie wykonania) określonych czynności. Do instrukcji warunkowych języka C/C++ zaliczamy: " instrukcję jeżeli (if), " instrukcję jeżeli ... w przeciwnym przypadku (if ... else). 1. Instrukcja jeżeli (if) Ogólna postać instrukcji w języku C/C++ przedstawia się następująco: if (wyrażenie-warunkowe) instrukcja gdzie wyrażenie-warunkowe musi być typu skalarnego, instrukcja może być dowolną instrukcją (w tym instrukcją grupującą). 74 M. JANKOWSKA PROGRAMOWANIE I JZYK C++ INSTRUKCJE WARUNKOWE CIG DALSZY 2. Instrukcja jeżeli ... w przeciwnym przypadku (if ... else) Ogólna postać instrukcji w języku C/C++ przedstawia się następująco: if (wyrażenie-warunkowe1) instrukcja1 else if (wyrażenie-warunkowe2) instrukcja2 ... else instrukcja3 gdzie wyrażenie-warunkowe1, wyrażenie-warunkowe2 muszą być typu skalarnego, instrukcja1, instrukcja2, instrukcja3 mogą być dowolnymi instrukcjami (w tym instrukcjami grupującymi). UWAGI Instrukcja if jest wykonywana, gdy wyrażenie-warunkowe jest niezerowe (lub wartość logiczna true). W przeciwnym razie (tj. gdy jest ono równe zero, lub ma wartość logiczną false) jest wykonywana druga instrukcja (lub sprawdzane kolejne wyrażenie-warunkowe). W miejsce wyrażenia-warunkowego możemy użyć dowolnego wyrażenia arytmetycznego lub wskaznikowego. 75 M. JANKOWSKA PROGRAMOWANIE I JZYK C++ INSTRUKCJE WARUNKOWE CIG DALSZY PRZYKAAD 1 PRZYKAAD 2 PRZYKAAD 3 Niech x będzie typu Niech i będzie typu Niech x będzie typu logicznego. Wówczas całkowitego. Wówczas wskaznikowego. Wówczas następujące instrukcje następujące instrukcje następujące instrukcje są sobie równoważne: są sobie równoważne: są sobie równoważne: 1. Sprawdzamy (bezpośrednio), 1. 1. if (x) if (i) czy p jest niezerowe, tzn. czy // instrukcja // instrukcja p wskazuje na poprawny obiekt . 2. 2. if (x == true) if (i > 0) if (p) // instrukcja // instrukcja // instrukcja 2. Porównujemy p z wartością 0, 3. 3. if (x != false) if (i != 0) o której wiemy, \e nie // instrukcja // instrukcja wskazuje na \aden obiekt. Sprawdzamy przez to UWAGI (pośrednio), podobnie jak W wyrażeniach-warunkowych często używa się: w pkt. 1, czy p wskazuje na operatorów porównania (==, !=, <, >, <=, >=), poprawny obiekt . które dają w wyniku wartości logiczne (true, false), if (p != 0) operatory logiczne (&&, ||, !). // instrukcja 76 M. JANKOWSKA PROGRAMOWANIE I JZYK C++ INSTRUKCJE WARUNKOWE CIG DALSZY UWAGA Niektóre proste instrukcje if mogą być zastąpione wygodniejszą formą, w której użyjemy operatora warunkowego ?: . Przykładowo następującą instrukcję: if (a >= b) max_value = a; else max_value = b; możemy zapisać równoważnie w postaci: max_value = a >= b ? a : b lub dodatkowo ujmując warunek w nawiasy (przez co zwiększamy czytelność kodu) w postaci: max_value = (a >= b) ? a : b 77 M. JANKOWSKA PROGRAMOWANIE I JZYK C++ INSTRUKCJA WYBORU Instrukcja wyboru (switch) służy do testowania pewnej wartości względem danego zbioru stałych oraz podjęcia określonych działań w przypadku, gdy wartość ta należy do tego zbioru. Ogólna postać instrukcji switch w języku C/C++ przedstawia się następująco: switch (wyrażenie-sterujące) { UWAGA case wyrażenie-stałe1: Wykonanie instrukcji wyboru rozpoczyna się instrukcja1 od obliczenia wartości wyrażenia-sterującego. break; Program jest wykonywany począwszy od case wyrażenie-stałe2: pierwszej instrukcji należącej do gałęzi , dla instrukcja2 której wartość wyrażenia-sterującego równa break; jest wartości wyrażenia-stałego. default: W przypadku, gdy żadne z wyrażeń-stałych nie instrukcja3 jest równe wartości wyrażenia-sterującego break; wówczas program wykonuje instrukcje } począwszy od domyślnej etykiety default, lub gdzie wyrażenie-sterujące jeżeli jej nie ma, kończy wykonywanie instrukcji musi być typu całkowitego, a switch. instrukcja1, ... ,instrukcja3 mogą być dowolnymi instrukcjami 78 (w tym instrukcjami grupującymi). M. JANKOWSKA PROGRAMOWANIE I JZYK C++ INSTRUKCJA WYBORU CIG DALSZY UWAGA W przypadku, gdy założeniem programisty jest wykonanie danego zadania jedynie w obrębie danej gałęzi, wówczas każda z nich musi być w jakiś sposób zakończona. Najczęściej wykorzystuje się do tego celu instrukcje break lub return. PRZYKAAD W przypadku, gdy zmienna klawisz // ... // typu char będzie odpowiadała switch (klawisz) znakowi litery p lub P wówczas { program wywoła funkcję obliczającą case p : pole prostokąta. case P : Gałąz rozpoczynająca się od PoleProstokata(); etykiety wyboru case p break; nie została zakończona. Oznacza to, że będzie ona case t : kontynuowana aż do instrukcji case T : break, która kończy gałąz PoleTrojkata(); następującą po niej. break; default: cout << Nie wybrano zadnej opcji << endl; } 79 M. JANKOWSKA PROGRAMOWANIE I JZYK C++ INSTRUKCJA WYBORU CIG DALSZY UWAGA Instrukcję switch możemy zastąpić zbiorem instrukcji if. Działanie ich będzie takie samo, lecz preferuje się pierwszą z nich ze względu na możliwość jawnego wyrażenia właściwej natury operacji testowania wartości względem pewnego zbioru, przez co zapis staje się bardziej czytelny. PRZYKAAD switch (wybor) { if (wybor == 1) case 1: Opcja1(); Opcja1(); break; else if (wybor == 2) Opcja2(); case 2: Opcja2(); else if (wybor == 3) break; Opcja3(); case 3: else Opcja3(); Opcja4(); break; default: Opcja4(); } 80