2 - Instrukcje warunkowe i pętle
Cele lekcji
Nabycie umiejętności używania instrukcji warunkowych i pętli
Co powinieneś już wiedzieć?
- W jaki sposób uruchomić środowisko do tworzenia programów w języku C/C++. W jaki sposób skompilować program. Co to znaczy skompilować i uruchomić program.
- Jak wygląda struktura programu w C/C++.
- Jakie są podstawowe typy zmiennych w C/C++. W jaki sposób obsługuje się polecenia wejścia/wyjścia w C/C++.
- Jak wyglądają podstawowe operacje w języku C/C++, np. jak zadeklarować zmienną, przypisać wartość do zmiennej, wykonać podstawowe operacje arytmetyczne.
Instrukcje warunkowe
Instrukcje warunkowe to takie instrukcje, które umożliwiają wykonywanie różnych czynności w zależności od tego, czy pewien podany warunek jest spełniony.
Konstrukcja instrukcji warunkowej w języku C/C++ wygląda następujaco:
if (wyrażenie) operacja_prawda;
else operacja_fałsz;
Jeśli wyrażenie jest prawdziwe, wykonana zostanie operacja_prawda.
Jeśli wyrażenie jest fałszywe, wykonana zostanie operacja_fałsz.
Słowo else nie musi wystąpić w instrukcji warunkowej. Wówczas operacja zostanie wykonana, jeśli wyrażenie jest spełnione, a jeśli nie jest, nie wydarzy się nic.
Każda operacja (operacja_prawda lub operacja_fałsz) może być równie dobrze blokiem operacji rozpoczynającym się od znaku { a kończącym znakiem }.
Konstrukcja instrukcji warunkowej w języku C/C++ wygląda następujaco:
if (wyrażenie) operacja_prawda;
else operacja_fałsz;
Jeśli wyrażenie jest prawdziwe, wykonana zostanie operacja_prawda.
Jeśli wyrażenie jest fałszywe, wykonana zostanie operacja_fałsz.
Słowo else nie musi wystąpić w instrukcji warunkowej. Wówczas operacja zostanie wykonana, jeśli wyrażenie jest spełnione, a jeśli nie jest, nie wydarzy się nic.
Każda operacja (operacja_prawda lub operacja_fałsz) może być równie dobrze blokiem operacji rozpoczynającym się od znaku { a kończącym znakiem }.
Prawda/Fałsz
Problem rozróżniania prawdy od fałszu w C/C++ sprowadza się do sprawdzania, czy wyrażenie ma wartość 0, czy też ma inną wartość.
0 (zero) zawsze oznacza fałsz. Każda inna wartość oznacza prawdę.
Np. fragment kodu:
i = 1;
if (i) printf("Prawda");
else printf("Fałsz");
wypisze na ekranie słowo "Prawda". Gdyby jednak napisać:
i = 0;
if (i) printf("Prawda");
else printf("Fałsz");
wówczas na ekranie pojawi się słowo "Fałsz".
W nawiasach można też umieszczać dowolne operacje arytmetyczne, a do określenia prawdy lub fałszu wzięty zostanie wynik działań.
0 (zero) zawsze oznacza fałsz. Każda inna wartość oznacza prawdę.
Np. fragment kodu:
i = 1;
if (i) printf("Prawda");
else printf("Fałsz");
wypisze na ekranie słowo "Prawda". Gdyby jednak napisać:
i = 0;
if (i) printf("Prawda");
else printf("Fałsz");
wówczas na ekranie pojawi się słowo "Fałsz".
W nawiasach można też umieszczać dowolne operacje arytmetyczne, a do określenia prawdy lub fałszu wzięty zostanie wynik działań.
Jaki według Ciebie będzie efekt działania poniższego kodu?
i = 1;
if (2*i-3+1/i) printf("Prawda");
else printf("Fałsz");
i = 1;
if (2*i-3+1/i) printf("Prawda");
else printf("Fałsz");
Operacje porównania
Podczas sprawdzania spełnialności wyrażenia można używać standardowych operatorów porównania, które w języku C/C++ wyglądają następująco:
równe: ==
różne: !=
mniejsze: <
mniejsze lub równe: <=
większe: >
większe lub równe: >=
Wyrażenie umieszczone w nawiasie zawsze zwraca wartość 1 lub 0 w zależności od tego, czy dane porównanie jest prawdą, czy też fałszem.
Np. dla kodu:
i = 1;
if (i==1) printf("Prawda");
else printf("Fałsz");
na ekranie pojawi się słowo "Prawda".
równe: ==
różne: !=
mniejsze: <
mniejsze lub równe: <=
większe: >
większe lub równe: >=
Wyrażenie umieszczone w nawiasie zawsze zwraca wartość 1 lub 0 w zależności od tego, czy dane porównanie jest prawdą, czy też fałszem.
Np. dla kodu:
i = 1;
if (i==1) printf("Prawda");
else printf("Fałsz");
na ekranie pojawi się słowo "Prawda".
Zastanów się
Jak myślisz, co pojawi się na ekranie w wyniku uruchomienia takiego kodu?
int x,i;
i = 1;
x = (i==1)
printf("%d",x);
int x,i;
i = 1;
x = (i==1)
printf("%d",x);
Operatory logiczne
Wyrażenia można ze sobą łączyć używając odpowiednich operatorów logicznych. Najważniejsze z nich to:
koniunkcja: &&
alternatywa: ||
negacja: !
Można je łączyć dowolnie, używając odpowiedniego ponawiasowania. Np:
if (i>=0 && i<=10 && !(i==5)) printf("Prawda");
else printf("Fałsz");
Program wypisze słowo "Prawda", jeśli i jest w przedziale od 0 do 10, ale nie jest równe 5. W przeciwnym wypadku wypisze "Fałsz".
koniunkcja: &&
alternatywa: ||
negacja: !
Można je łączyć dowolnie, używając odpowiedniego ponawiasowania. Np:
if (i>=0 && i<=10 && !(i==5)) printf("Prawda");
else printf("Fałsz");
Program wypisze słowo "Prawda", jeśli i jest w przedziale od 0 do 10, ale nie jest równe 5. W przeciwnym wypadku wypisze "Fałsz".
Pętle
W języku C/C++ wyróżniamy 3 rodzaje pętli:
Pętla while:
while (warunek) operacja;
Tak długo, jak warunek jest prawdziwy, wykonywana jest operacja (operacja może być również blokiem operacji rozpoczynającym się od znaku { a kończącym znakiem }).
Pętla do while:
do operacja; while (warunek);
Operacja zostanie wykonana raz, a następnie, tak długo jak warunek jest prawdziwy, będzie powtarzana (operacja może być również blokiem operacji rozpoczynającym się od znaku { a kończącym znakiem }).
Pętla for:
for (wartość_początkowa; warunek_kontynuacji; modyfikacja_zmiennej_sterującej) operacja;
Wartość_początkowa - ciąg instrukcji, które są wykonywane na początku, przy inicjalizacji pętli. Najczęściej jest to nadanie wartości początkowych zmiennej sterującej.
Modyfikacja_zmiennej_sterującej - ciąg instrukcji, które są wykonywane natychmiast po zakończeniu każdego obiegu pętli. Najczęściej jest to modyfikacja zmiennej sterującej, np. zwiększenie jej wartości.
Warunek_kontynuacji - warunek sprawdzany przed rozpoczęciem wykonania każdego obrotu pętli. Jeśli warunek ten nie jest prawdziwy, wówczas pętla kończy swoje działanie.
Operacja może być także blokiem operacji rozpoczynającym się od znaku { a kończącym znakiem }.
Np:
for (int i=0; i<5; i++) operacja;
Taka pętla na początku zainicjuje zmienną i przypisując jej wartość zero. Następnie operacja zostanie wykonana 5 razy. Będzie tak, gdyż kiedy 5 razy zwiększymy wartość zmiennej i o jeden, warunek i<5 przestanie być spełniony.
Poniższe pętle działają w nieskończoność:
while (1)
{
}
for (;;)
{
}
Pętla while:
while (warunek) operacja;
Tak długo, jak warunek jest prawdziwy, wykonywana jest operacja (operacja może być również blokiem operacji rozpoczynającym się od znaku { a kończącym znakiem }).
Pętla do while:
do operacja; while (warunek);
Operacja zostanie wykonana raz, a następnie, tak długo jak warunek jest prawdziwy, będzie powtarzana (operacja może być również blokiem operacji rozpoczynającym się od znaku { a kończącym znakiem }).
Pętla for:
for (wartość_początkowa; warunek_kontynuacji; modyfikacja_zmiennej_sterującej) operacja;
Wartość_początkowa - ciąg instrukcji, które są wykonywane na początku, przy inicjalizacji pętli. Najczęściej jest to nadanie wartości początkowych zmiennej sterującej.
Modyfikacja_zmiennej_sterującej - ciąg instrukcji, które są wykonywane natychmiast po zakończeniu każdego obiegu pętli. Najczęściej jest to modyfikacja zmiennej sterującej, np. zwiększenie jej wartości.
Warunek_kontynuacji - warunek sprawdzany przed rozpoczęciem wykonania każdego obrotu pętli. Jeśli warunek ten nie jest prawdziwy, wówczas pętla kończy swoje działanie.
Operacja może być także blokiem operacji rozpoczynającym się od znaku { a kończącym znakiem }.
Np:
for (int i=0; i<5; i++) operacja;
Taka pętla na początku zainicjuje zmienną i przypisując jej wartość zero. Następnie operacja zostanie wykonana 5 razy. Będzie tak, gdyż kiedy 5 razy zwiększymy wartość zmiennej i o jeden, warunek i<5 przestanie być spełniony.
Poniższe pętle działają w nieskończoność:
while (1)
{
}
for (;;)
{
}
Zakłócanie przebiegu pętli
Aby zmienić bieg działania pętli, można użyć jednego z dwóch poleceń
zakłócających przebieg pętli:
continue - przerywa działanie pętli i przechodzi do jej następnej iteracji
break - opuszcza pętlę i kończy jej działanie
continue - przerywa działanie pętli i przechodzi do jej następnej iteracji
break - opuszcza pętlę i kończy jej działanie
Zadania
Jaki będzie wynik działania następującego programu?
int i=4;
if ((i<1) || (i>5) || (i!=10)) printf("Prawda");
else printf("Fałsz");
int i=4;
if ((i<1) || (i>5) || (i!=10)) printf("Prawda");
else printf("Fałsz");
Prawda
| |
Fałsz
|
Ile razy wykonana zostanie operacja w następującej pętli?
for (int i=0; i<11; i+=2)
{
for (int i=0; i<11; i+=2)
{
operacja;}
11
| |
6
| |
5
| |
4
| |
0
|