1
W
YKŁAD
2 I
NSTRUKCJE JĘZYKA
C
++
DR INŻ.
M
AŁGORZATA
J
ANKOWSKA
2
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.
PRZYKŁADY
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.
M
.
J
ANKOWSKA –
W
YKŁAD
2 I
NSTRUKCJE JĘZYKA
C
++
3
PRZYKŁADY – CIĄG 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.
M
.
J
ANKOWSKA –
W
YKŁAD
2 I
NSTRUKCJE JĘZYKA
C
++
4
M
.
J
ANKOWSKA –
W
YKŁAD
2 I
NSTRUKCJE JĘZYKA
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 źró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++)
;
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
umieścić w danym miejscu programu instrukcję pustą.
UWAGA
5
M
.
J
ANKOWSKA –
W
YKŁAD
2 I
NSTRUKCJE JĘZYKA
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ą).
6
M
.
J
ANKOWSKA –
W
YKŁAD
2 I
NSTRUKCJE JĘZYKA
C
++
INSTRUKCJE ITERACYJNE – CIĄG DALSZY
Kolejne kroki wykonywane w trakcie
działania pętli:
1. Obliczamy wyrażenia-inicjujących
i inicjujemy liczniki pętli (w przykładzie
inicjujemy jeden licznik k wartością 1).
for (k = 1; k<=5; k++)
{
a[k] = k;
}
PRZYKŁAD
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 k bę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.
7
M
.
J
ANKOWSKA –
W
YKŁAD
2 I
NSTRUKCJE JĘZYKA
C
++
INSTRUKCJE ITERACYJNE – CIĄG DALSZY
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.
UWAGI
PRZYKŁAD
for (;;)
{
// instrukcje
}
for (;1;)
{
// 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.
8
M
.
J
ANKOWSKA –
W
YKŁAD
2 I
NSTRUKCJE JĘZYKA
C
++
INSTRUKCJE ITERACYJNE – CIĄG 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.
9
M
.
J
ANKOWSKA –
W
YKŁAD
2 I
NSTRUKCJE JĘZYKA
C
++
INSTRUKCJE ITERACYJNE – CIĄG 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.
10
M
.
J
ANKOWSKA –
W
YKŁAD
2 I
NSTRUKCJE JĘZYKA
C
++
INSTRUKCJE ITERACYJNE – PORÓWNANIE
for (i=0; i<=4; i++)
a[i] = i;
1. Pętla for
i = 0;
while (i<=4)
{
a[i] = i;
i++;
}
2. Pętla while
i = 0;
do
{
a[i] = i;
i++;
} while (i<5);
3. Pętla do ... while
Licznik i w pętli for jest inicjowany w pętli
przed rozpoczęciem wykonywania
instrukcji.
Pętle while oraz do ... while wymagają
inicjacji licznika przed rozpoczęciem
instrukcji w pętli.
UWAGI
Przykład pokazuje jak przy
pomocy trzech różnych pętli
iteracyjnych
for, while oraz do ...
while wykonać to samo zadanie.
11
M
.
J
ANKOWSKA –
W
YKŁAD
2 I
NSTRUKCJE JĘZYKA
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ą).
12
M
.
J
ANKOWSKA –
W
YKŁAD
2 I
NSTRUKCJE JĘZYKA
C
++
INSTRUKCJE WARUNKOWE – CIĄG 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 wskaźnikowego.
13
M
.
J
ANKOWSKA –
W
YKŁAD
2 I
NSTRUKCJE JĘZYKA
C
++
INSTRUKCJE WARUNKOWE – CIĄG DALSZY
Niech x będzie typu
logicznego. Wówczas
następujące instrukcje
są sobie równoważne:
1.
if (x)
// instrukcja
2.
if (x == true)
// instrukcja
3.
if (x != false)
// instrukcja
PRZYKŁAD 1
Niech i będzie typu
całkowitego. Wówczas
następujące instrukcje
są sobie równoważne:
1.
if (i)
// instrukcja
2.
if (i > 0)
// instrukcja
3.
if (i != 0)
// instrukcja
PRZYKŁAD 2
Niech x będzie typu
wskaźnikowego. Wówczas
następujące instrukcje
są sobie równoważne:
1. Sprawdzamy (bezpośrednio),
czy p jest niezerowe, tzn. „czy
p
wskazuje na poprawny
obiekt”.
if (p)
// instrukcja
2. Porównujemy p z wartością 0,
o której wiemy, że nie
wskazuje na żaden obiekt.
Sprawdzamy przez to
(pośrednio), podobnie jak
w pkt. 1, „czy p wskazuje na
poprawny obiekt”.
if (p != 0)
// instrukcja
PRZYKŁAD 3
UWAGI
W
wyrażeniach-warunkowych często używa się:
operatorów porównania (==, !=, <, >, <=, >=),
które dają w wyniku wartości logiczne (true, false),
operatory logiczne (&&, ||, !).
14
M
.
J
ANKOWSKA –
W
YKŁAD
2 I
NSTRUKCJE JĘZYKA
C
++
INSTRUKCJE WARUNKOWE – CIĄG DALSZY
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
UWAGA
15
M
.
J
ANKOWSKA –
W
YKŁAD
2 I
NSTRUKCJE JĘZYKA
C
++
Ogólna postać instrukcji
switch w języku C/C++ przedstawia się następująco:
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.
switch (wyrażenie-sterujące)
{
case wyrażenie-stałe1:
instrukcja1
break;
case wyrażenie-stałe2:
instrukcja2
break;
default:
instrukcja3
break;
}
gdzie
wyrażenie-sterujące
musi być typu całkowitego, a
instrukcja1, ... ,instrukcja3
mogą być dowolnymi instrukcjami
(w tym instrukcjami grupującymi).
UWAGA
Wykonanie instrukcji wyboru rozpoczyna się
od obliczenia wartości
wyrażenia-sterującego.
Program jest wykonywany począwszy od
pierwszej instrukcji należącej do „gałęzi”, dla
której wartość
wyrażenia-sterującego równa
jest wartości
wyrażenia-stałego.
W przypadku, gdy żadne z wyrażeń-stałych nie
jest równe wartości
wyrażenia-sterującego
wówczas program wykonuje instrukcje
począwszy od domyślnej etykiety
default, lub
jeżeli jej nie ma, kończy wykonywanie instrukcji
switch.
16
M
.
J
ANKOWSKA –
W
YKŁAD
2 I
NSTRUKCJE JĘZYKA
C
++
INSTRUKCJA WYBORU – CIĄG DALSZY
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.
UWAGA
// ... //
switch (klawisz)
{
case ’p’:
case ’P’:
PoleProstokata();
break;
case ’t’:
case ’T’:
PoleTrojkata();
break;
default:
cout << ”Nie wybrano zadnej opcji” << endl;
}
PRZYKŁAD
W przypadku, gdy zmienna klawisz
typu char będzie odpowiadała
znakowi litery
p lub P wówczas
program wywoła funkcję obliczającą
pole prostokąta.
„Gałąź” rozpoczynająca się od
etykiety wyboru
case ’p’
nie została zakończona.
Oznacza to, że
będzie ona
kontynuowana aż do instrukcji
break, która kończy „gałąź”
następującą po niej.
17
M
.
J
ANKOWSKA –
W
YKŁAD
2 I
NSTRUKCJE JĘZYKA
C
++
INSTRUKCJA WYBORU – CIĄG DALSZY
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.
UWAGA
PRZYKŁAD
switch (wybor)
{
case 1:
Opcja1();
break;
case 2:
Opcja2();
break;
case 3:
Opcja3();
break;
default:
Opcja4();
}
if (wybor == 1)
Opcja1();
else if (wybor == 2)
Opcja2();
else if (wybor == 3)
Opcja3();
else
Opcja4();