. Instrukcje warunkowe Przykłady.1. Napisz program, który pobierze od użytkownika liczbę i wypisze na ekran słowo ujemna lub nieujemna, w zależności od tego czy dana liczba jest ujemna czy nie. 1 #include <iostream> 2 using namespace std; 4 int main() { 5 cout << "Podaj liczbe: "; 7 int n; 8 cin >> n; 9 10 if (n >= 0) { 11 cout << "nie"; 12 } 1 cout << "ujemna"; 14 15 return 0; 1 } W zadaniu tym zachodzi potrzeba wykonania pewnego fragmentu kodu tylko jeżeli pewien warunek jest spełniony. W tym wypadku musimy wypisać najpierw słowo nie, jeżeli dana liczba jest większa lub równa 0. Możemy do tego użyć wyrażenia warunkowego if, jak w liniach 10-12. Wyrażenie to składa się z trzech części: najpierw słowo kluczowe if, następnie warunek w nawiasach okrągłych, a następnie, w nawiasach klamrowych, kod który ma być wykonany jeżeli warunek jest prawdziwy. Najprostsze warunki możemy tworzyć używając operatorów porównania, takich jak < (mniejsze), > (większe), == (równe)!= (różne), <= (mniejsze lub równe) i >= (większe lub równe). Ich znaczenie jest dokładnie takie samo jak odpowiadających im znaków porównania w matematyce. 1
Uwaga! Nie należy mylić operatora przypisania (=) z operatorem równości (==). Pierwszy z nich służy do zmiany wartości zmiennej, a drugi do porównania dwóch wartości. Użycie operatora przypisania tam, gdzie powinien być użyty operator porównania nie spowoduje błędu kompilatora (program się uruchomi), ale może prowadzić do nieoczekiwanych wyników. Między klamrami znajduje się tylko jedno polecenie: wypisania na ekran słowa nie, które powinno pojawić się na ekranie, jeżeli dana liczba jest większa lub równa 0. Uwaga! Zwróć uwagę na wcięcie o dodatkowy poziom kodu znajdującego się między klamrami wyrażenia warunkowego. Nie jest ono niezbędne do działania programu, ale zdecydowanie ułatwia późniejsze czytanie kodu. Warto wyrobić sobie nawyk prawidłowego formatowania kodu już na samym początku nauki. Linia 1, znajdująca się już poza klamrami bloku warunkowego, zostanie wykonana zawsze, niezależnie od wartości danej przez użytkownika liczby..2. Napisz program, który pobierze od użytkownika liczbę i wypisze na ekran jej wartość bezwzględną. 1 #include <iostream> 2 using namespace std; 4 int main() { 5 cout << "Podaj liczbe: "; 7 int n; 8 cin >> n; 9 10 cout << "Jej wartosc bezwzgledna wynosi "; 11 if (n > 0) { 12 cout << n << endl; 1 } else { 14 cout << -n << endl; 15 } 1 17 return 0; 18 } 17
W tym zadaniu potrzebujemy wykonać jeden fragment kodu, jeżeli warunek jest spełniony, a inny fragment, jeżeli ten sam warunek nie jest spełniony. Moglibyśmy wykorzystać do tego dwa następujące po sobie wyrażenia warunkowe, z przeciwnymi sobie warunkami. Z tym podejściem wiążą się jednak problemy. Po pierwsze, musimy samodzielnie napisać warunek przeciwny do danego, co jest bardzo częstym źródłem pomyłek. Po drugie, warunek może zależeć od wartości jakiejś zmiennej, której wartość zmienia się wewnątrz kodu tego warunku. Przez to może się okazać, że oba warunki będą spełnione, mimo że są przeciwne. Po trzecie, otrzymujemy w ten sposób duplikację kodu: jeżeli będziemy chcieli zmienić warunek, musimy zmienić go w dwóch miejscach. Dlatego dużo lepszym rozwiązaniem jest rozszerzenie wyrażenia warunkowego o dodatkowy blok else, co oznacza w przeciwnym wypadku, jak w liniach 1-15. Tym razem nie potrzebujemy określać drugiego warunku, potrzebny jest tylko dodatkowy fragment kodu między kolejną parą nawiasów klamrowych. Warunek dany w bloku warunkowym (linia 11) jest sprawdzany tylko raz, a następnie w zależności od tego czy jest on prawdziwy wykonywany jest kod znajdujący się zaraz za warunkiem lub kod znajdujący się po słowie else... Napisz program, który pobierze od użytkownika liczbę i wypisze na ekran słowo tak, jeżeli jest ona parzysta, nie w przeciwnym wypadku. 1 #include<iostream> 2 using namespace std; 4 int main() { 5 cout << "Podaj liczbe: "; 7 int n; 8 cin >> n; 9 10 if (n % 2 == 0) { 11 cout << "tak" << endl; 12 } else { 1 cout << "nie" << endl; 14 } 15 1 return 0; 17 } Przykładem mniej oczywistego rodzaju warunku, który możemy chcieć sprawdzić jest podzielność jednej liczby przez drugą. Szczególnym przypadkiem takiego warunku jest sprawdzanie parzystości liczby (podzielność przez 2). Nie jest jednak to tak oczywiste jak proste porównania między liczbami. 18
C++ nie posiada wbudowanego operatora który pozwoli nam sprawdzić podzielność. Możemy jednak w tym celu wykorzystać operator reszty z dzielenia (%), poznany już w pierwszym rozdziale. Z definicji, a dzieli b, jeżeli reszta z dzielenia b przez a wynosi 0. Stąd matematyczny zapis a b (a dzieli b) możemy zapisać w C++ w postaci warunku b % a == 0. W tym zadaniu chcemy w szczególności sprawdzić, czy dana przez użytkownika liczba jest parzysta. W tym celu sprawdzamy czy reszta jej dzielenia przez 2 wynosi 0 czy też nie (linia 10). Uwaga! Operator reszty z dzielenia działa tylko i wyłącznie dla liczb całkowitych. O ile w innych zadaniach zmiana typu int na double mogła spowodować co najwyżej problemy z precyzją otrzymanych wyników, tak tutaj program po prostu się nie uruchomi, jeżeli użyjemy typu double..4. Napisz program, który pobierze od użytkownika liczbę i wypisze na ekran słowo tak, jeżeli jest ona dodatnia, ale mniejsza od 10, nie w przeciwnym wypadku. 1 #include <iostream> 2 using namespace std; 4 int main() { 5 cout << "Podaj liczbe: "; 7 int n; 8 cin >> n; 9 10 if (n > 0 && n < 10) { 11 cout << "tak" << endl; 12 } else { 1 cout << "nie" << endl; 14 } 15 1 return 0; 17 } Warunki możemy rozszerzać używając spójników logicznych. W C++ mamy do dyspozycji takie łączniki: && (i), (lub) oraz! (nie). Mają one takie samo znaczenie jak odpowiadające im łączniki w logice. Możemy je także zastąpić słowami, odpowiednio, and, or i not. 19
Uwaga! Nie można łączyć warunków przy użyciu przecinków (np. a < b, b < c) spowoduje to błąd kompilacji. Nie są dopuszczalne także podwójne nierówności (jak a < b < c) te niestety nie sprawią, że program się nie uruchomi, ale mogą prowadzić do nieoczekiwanych wyników. Kolejność wykonywania działań wygląda następująco: najpierw negacja, następnie koniunkcja, a na końcu alternatywa. Negacja ma również pierwszeństwo przed operatorami porównania, ale operatory porównania mają pierwszeństwo przed koniunkcją i alternatywą..5. Napisz program, który pobierze od użytkownika liczbę i wypisze na ekran słowo dodatnia, ujemna lub zero, w zależności od tego czy dana liczba jest dodatnia, ujemna lub jest zerem. 1 int main() { 2 cout << "Podaj liczbe: "; 4 int n; 5 cin >> n; 7 if (n > 0) { 8 cout << "dodatnia" << endl; 9 } else if (n == 0) { 10 cout << "zero" << endl; 11 } else { 12 cout << "ujemna" << endl; 1 } 14 15 return 0; 1 } Może zajść potrzeba sprawdzenia lub więcej wykluczających się wzajemnie warunków. Możemy do tego wykorzystać konstrukcję else if, co oznacza w przeciwnym wypadku, jeżeli. W ten sposób, jeżeli pierwszy warunek jest spełniony, pozostałe warunki nie są sprawdzane, a jeżeli nie jest, to sprawdzany jest drugi warunek itd. Z reguły na końcu takiego łańcucha warunków umieszczamy blok else, który zostanie wykonany jeżeli żaden z warunków nie jest spełniony. Tutaj mamy wykluczające się warunki: n > 0, n == 0 i n < 0. Najpierw sprawdzamy pierwszy z nich używając konstrukcji if, tak jak dotychczas. Następnie po kodzie związanym z tym warunkiem umieszczamy słowa else if i kolejny warunek, z kolejnym fragmentem kodu. Po tym fragmencie umieszczamy słowo else i kolejny fragment kodu, tym razem już bez warunku. 20
Linia 8 zostanie wykonana jeżeli pierwszy warunek będzie spełniony. Jeżeli nie, to sprawdzony zostanie drugi warunek w linii 9. Jeżeli ten będzie spełniony, wykona się linia 10, a jeżeli nie, to linia 12. Uwaga! Kolejne warunki nie muszą się wzajemnie wykluczać. Pamiętać należy jedynie o tym, że wykonany zostanie zawsze fragment kodu związany tylko z jednym warunkiem: pierwszym warunkiem który będzie spełniony. Kolejne warunki są ignorowane. Pytania.1. Jaki będzie wynik działania poniższego fragmentu kodu? 1 int n = 1; 2 if (n > 0) { n = n-2; 4 } 5 if (n < 0) { n = n+2; 7 } 8 cout << n << endl;.2. Jaki będzie wynik działania poniższego fragmentu kodu? 1 int n = 0; 2 if (n = 5) { cout << "piec" << endl; 4 } 5 cout << n << endl;.. Jaki będzie wynik działania poniższego fragmentu kodu? 1 int n = 0; // inna wartosc niz w poprzednim pytaniu! 2 if (n > 0) { n = n-; // inna wartosc niz w poprzednim pytaniu! 4 } 5 if (n < 0) { n = n+2; 7 } 8 cout << n << endl; 21
.4. Jaki będzie wynik działania poniższego fragmentu kodu? 1 int n = 2; 2 int k = 0; 4 if (k!= 0 && n/k > 1) { 5 cout << "A" << endl; } else { 7 cout << "B" << endl; 8 }.5. Jaki będzie wynik działania poniższego fragmentu kodu? 1 int a = 10; 2 int b = 10; 4 if (a <= b) { 5 cout << "<=" << endl; } else if (a == b) { 7 cout << "==" << endl; 8 } else if (a!= b) { 9 cout << "!=" << endl; 10 } else { 11 cout << "zaden" << endl; 12 } Zadania.1. (+20) Napisz program, który pobierze od użytkownika dwie liczby: n i k, a następnie wypisze na ekran słowo tak, jeżeli n jest podzielne przez k lub nie w przeciwnym wypadku..2. (+20) Ciąg Collatza. Napisz program, który pobierze od użytkownika liczbę n, a następnie wypisze na ekran wartość n 2 jeżeli n jest parzysta lub n + 1 w przeciwnym wypadku... (+20) Napisz program, który pobierze od użytkownika liczbę, a następnie wypisze na ekran słowo tak, jeżeli jej wartość bezwzględna jest większa od 5, nie w przeciwnym wypadku..4. (+20) Napisz program, który pobierze od użytkownika trzy liczby: a, b i c, a następnie znajdzie i wypisze na ekran miejsca zerowe funkcji f(x) = ax 2 + bx + c lub słowa Brak miejsc zerowych, jeżeli żadne zera nie istnieją. 22
.5. (+0) Napisz program, który określi czy podany przez użytkownika rok jest przestępny czy nie. Rok jest przestępny, jeżeli dzieli się na 4, ale nie na 100, chyba że dzieli się na 400... (+0) Napisz program, który pobierze od użytkownika dwie liczby, a następnie da użytkownikowi możliwość obliczenia sumy lub iloczynu tych liczb. Po pobraniu dwóch liczb program powinien wypisać na ekran listę możliwości i poprosić użytkownika o podanie liczby odpowiadającej wybranej przez niego opcji..7. (+40) Napisz program, który pobierze od użytkownika dwie liczby, a następnie da użytkownikowi możliwość obliczenia różnicy lub ilorazu tych liczb. Program powinien wypisać na ekran komunikat o błędzie, jeżeli wybrany zostanie iloraz, a druga z liczb będzie zerem..8. (+40) Napisz program, który będzie wystawiał oceny za klasówki. Powinien pobrać od użytkownika maksymalną liczbę punktów, a następnie liczbę punktów zdobytą przez ucznia. Skala ocen wygląda następująco: od 90% włącznie ocena bardzo dobra, od 75% włącznie ocena dobra, od 50% włącznie ocena dostateczna, od 40% ocena dopuszczająca, a poniżej 40% niedostateczna..9. (+0) Napisz program, który pobierze od użytkownika liczb: współrzędne lewego górnego rogu prostokąta, wysokość i szerokość prostokąta oraz współrzędne punktu. Program powinien następnie wypisać na ekran słowo wierzchołek, krawędź, wewnątrz lub poza, w zależności od tego gdzie, względem prostokąta, znajduje się dany punkt..10. (+0) Napisz program, który pobierze od użytkownika liczb, opisujących współrzędne wierzchołków pewnego trójkąta. Program powinien wypisać na ekran słowo ostrokatny, prostokatny lub rozwartokatny w zależności od tego czy opisany trójkąt jest ostrokątny, prostokątny czy rozwartokątny..11. (+80) Napisz program, który pobierze od użytkownika osiem liczb, opisujących współrzędne punktów A, B, C i D, a następnie sprawdzi czy odcinki AB i CD przecinają się. Rozszerzenie.1. (+80) Napisz program, który znajdzie miejsca zerowe danego wielomianu trzeciego stopnia..2. (+10) Napisz program, który sprawdzi czy dane słowo jest palindromem (czyta się je tak samo od początku jak od końca)... (+210) Napisz program, który określi czy dana liczba naturalna jest kwadratem innej liczby naturalnej czy też nie. 2