mgr inż. Wacław Libront * Bobowa 2019
ZSO Bobowa, ul. Długoszowskich 1, 38-350 Bobowa, tel: 0183514009, fax: 0183530221, email: sekretariat@zsobobowa.eu, www: zsobobowa.eu
Proste programy działają "liniowo", to znaczy instrukcja po instrukcji, w kolejności, w jakiej zostały wpisane. Działanie bardziej skomplikowanych programów zależne jest (między innymi) od spełnienia (bądź nie) określonych warunków logicznych. Wszystkie języki programowania wykorzystują w tym celu instrukcję warunkową.
if (warunek) instrukcja;
if (warunek) instrukcja; else instrukcja;
if (warunek) { instrukcje;… }
if (warunek) { instrukcje;… } else { instrukcje;… }
Zadanie - parzystość
Wczytaj liczbę z klawiatury i sprawdź czy jest parzysta.
int L; cout << "SPRAWDZAMY PARZYSTOŚĆ" << endl; cout << "Wpisz liczbę: "; cin >> L; if (L % 2 == 0) cout << L << " - parzysta"; else cout << L << " - nieparzysta"; cout << endl; |
Wczytujemy z klawiatury liczbę do zmiennej L. Jeżeli wartość w zmiennej L podzielona całkowicie przez 2 (modulo) jest równa 0, to wypisujemy komunikat o parzystości, w przeciwnym razie komunikat o nieparzystości
Zadanie - prostokąt
Wczytaj dwie liczby z klawiatury – boki prostokąta. Jeśli są większe od zera to oblicz pole o obwód tego prostokąta.
cout << "wpisz boki: "; double BOK1,BOK2; cin >> BOK1 >> BOK2; if (BOK1>0 && BOK2>0){ double POL=BOK1*BOK2; double OBW=2*BOK1+2*BOK2; cout << " POLE=" << POL << endl; cout << "OBWÓD=" << OBW << endl; } else cout << "wpisz boki > 0"; |
Wczytujemy dwie liczby z klawiatury. Po każdej liczbie ENTER lub wpisujemy obie od razu - rozdzielone SPACJĄ i ENTER na końcu. Jeżeli BOK1 jest większy od zera i BOK2 jest większy od zera, to obliczamy pole i obwód, w przeciwnym razie wypisujemy komunikat. W instrukcji warunkowej wykonujemy kilka instrukcji, więc stosujemy instrukcję blokową {}.
Operatory i operacje logiczne
Wynikiem operacji logicznych są prawda true 1 i fałsz
false 0 Wszystkie warunki logiczne konstruujemy z użyciem operatorów
logicznych, takich samych, jakie stosuje się na matematyce w nierównościach. Aby
prześledzić poniższe przykłady użyjemy dwóch zmiennych: w zmiennej A znajduje
się liczba 1, w zmiennej B liczba 2.
Przypisanie - porównanie
Wszystkie języki programowania "mają problem" z dokładnym określeniem różnicy pomiędzy przypisaniem (nadawaniem wartości zmiennej), a porównywaniem dwóch wartości. W C++ do przypisywania służy operator
"=", a do porównywania "==". W Pascalu na przykład przypisujemy za pomocą operatora
":=" a porównujemy operatorem "=". Istnieją również języki, które starają się same domyślić co programista miał na myśli i obie operacje wykonujemy operatorem
"=".
Zadanie - egzamin
Wczytaj z klawiatury punkty za egzamin (0..60) i przypisz je do jednej z grup: (0..20) – podstawowa, (21..40) – średnia (41..60) – zaawansowana.
Ponieważ instrukcja warunkowa porównuje tylko dwie wartości, musimy użyć kilku instrukcji warunkowych i porównywać kilka razy stosując złożone operatory logiczne. Możemy też zagnieździć instrukcje warunkowe. W pierwszym przypadku porównujemy tyle razy ile jest instrukcji warunkowych, nawet gdy w pierwszej instrukcji warunkowej otrzymamy pozytywne rozwiązanie. W drugim przypadku, otrzymanie pozytywnego rozwiązania nie uruchamia kolejnych instrukcji warunkowych - program działa szybciej i sprawniej! Nie musimy tworzyć osobnego warunku logicznego dla ostatniej zależności – skoro punkty nie należą do poprzednich zakresów, to muszą należeć do ostatniego zakresu.
int punkty; cout << "STOPIEŃ ZAAWANSOWANIA" << endl; cout << "Wpisz liczbę punktów: "; cin >> punkty; if (punkty>=0 && punkty <=20) cout << "grupa podstawowa"; if (punkty>20 && punkty <=40) cout << "grupa średnia"; if (punkty>40 && punkty <=60) cout << "grupa zaawansowana"; cout << endl; |
if (punkty>=0 && punkty <=20) cout << "grupa podstawowa"; else if (punkty>20 && punkty <=40) cout << "grupa średnia"; else cout << "grupa zaawansowana"; |
Instrukcja wyboru
Instrukcja wielokrotnego wyboru pełni podobną rolę jak zagnieżdżona instrukcja wyboru – decydujemy o wykonywaniu instrukcji na podstawie wartości jednej zmiennej. W C++ ta zmienna decydująca o wyborze musi być typu całkowitego (lub znakowego).
Zadanie – kalkulator
Napisz prosty kalkulator dla dwóch liczb, obsługujący cztery działania matematyczne +, -, *, /.
#include < stdlib.h> #include < iostream > using namespace std; int main(){ setlocale(LC_ALL, ""); //kalkulator double L1,L2; char Z; cout << "KALKULATOR" << endl << endl; cout << "Wpisz liczbę, znak i liczbę" << endl; cout << "ENTER" << endl; //spacje pomiędzy i ENTER lub 3xENTER cin >> L1 >> Z >> L2; cin.ignore(); cout << "=" << endl; switch (Z){ case '+': cout << L1+L2 << endl; break; case '-': cout << L1-L2 << endl; break; case '*': cout << L1*L2 << endl; break; case '/': //sprawdzamy podzielność przez zero if (L2!=0) cout << L1/L2 << endl; else cout << "ERROR /0" << endl; break; default: //gdy nie wpisano poprawnie działania cout << "ERROR +-*/" << endl; break; } system("pause"); } |
Zwróć uwagę, że teksty wpisujemy w cudzysłowie, a zmienne znakowe char w apostrofach.
Gdy wczytujemy kilka elementów: po każdym ENTER lub spacje pomiędzy i na końcu ENTER.
Jeżeli druga liczba jest zerem, to nie mamy możliwości dzielenia, co jest sprawdzane i sygnalizowane komunikatem o błędzie.
Jeżeli nie wybierzemy poprawnie działania, to podejmowane jest działanie po słowie default – wypisujemy komunikat o błędzie.
Wpisywanie danych z klawiatury kończy się naciśnięciem klawisza ENTER, który też zostanie zapamiętany przez komputer i mogą pojawić się problemy podczas wczytywania kolejnych danych (np. wczytywanie w pętli). Dzięki użyciu polecenia cin.ignore(); system nie powinien sprawiać problemów.
Sprawdzanie poprawnego wczytywania danych w konsoli
Co się stanie, jeśli napisany przez nas program oczekiwać będzie na wpisanie z klawiatury liczby (np. długości boku), a użytkownik wstawi tekst? Prawdopodobnie program się zawiesi lub zakończy swoje działanie z wyliczeniem złego wyniku.
Czy mamy możliwość sprawdzania, jaki rodzaj danych został wpisany z klawiatury: liczba całkowita, rzeczywista, pojedynczy znak czy tekst?
Wszystkie języki programowania mają z tym problem i prawdopodobnie najwięcej
czasu należy poświęcić na uodpornienie naszego programu na różne „dziwne”
zachowania potencjalnego użytkownika.
Sposób formatowania kodu źródłowego
Formatowanie tekstu programu (kod źródłowy) ma bardzo ważne znaczenie, bo pozwala szybko i bezboleśnie zrozumieć to, co kiedyś napisaliśmy (lub ktoś inny napisał). Każdy porządny programista powinien przyswoić sobie podstawowe techniki edycji i stosować je wszędzie, gdzie to tylko możliwe: akapity, wcięcia, odstępy i właściwe nazewnictwo. Przyznacie sami, że istnieje zdecydowana różnica w próbach zrozumienia „co autor miał na myśli” pisząc drugi z programów – oba wykonują takie same operacje.
int suma = 0; int iloczyn = 1; for (int i = 1; i <= 10; i=i+1) { suma = suma + i; iloczyn = iloczyn * i; } |
int s=0;int l=1;for(int i=1;i<=10;i++){s+=i;l*=i;} |
Elementarz poprawnego formatowania
dziel na akapity każdą odrębną instrukcję
stosuj wcięcia bloków programu
nawiasy klamrowe {} wyrównuj do odpowiednich instrukcji
nadawaj opisowe (ale niezbyt długie) nazwy zmiennym (zamiast l utwórz zmienną liczba)
stosuj odstępy pomiędzy operatorami (zamiast l%2==0 napisz liczba % 2 == 0)
1) Sprawdzamy, czy liczba wpisana z klawiatury jest podzielna przez 3, 5, 7, 10.
2) Sprawdzamy czy wpisane z klawiatury boki trójkąta spełniają warunek istnienia trójkąta.
3) Wyliczamy deltę na podstawie wpisanych z klawiatury parametrów równania kwadratowego i wypisujemy liczbę rozwiązań.
4) Napisz program, który wystawi ocenę z testu. Użyj zagnieżdżonej instrukcji if - else 0 - 39 pkt - ocena niedostateczna 40 - 54 pkt - ocena dopuszczająca 55 - 69 pkt - ocena dostateczna 70 - 84 pkt - ocena dobra 85 - 98 pkt - ocena bardzo dobra 99 - 100 pkt - ocena celująca
5) Napisz program który sprawdza, która z podanych 2 liczb przez użytkownika jest najmniejsza.
6) Napisz program, który dla danego punktu na płaszczyźnie (X, Y) sprawdzi, w której ćwiartce układu współrzędnych się on znajduje. Jeżeli punkt leży w środku układu współrzędnych, program powinien wypisać liczbę 0. Jeżeli na osi X program powinien wypisać OX, jeśli na osi Y – wypisać OY.
Przykładowe rozwiązania zadań
Jedynie ciężka umysłowa praca i zrozumienie działania
programu może nauczyć programowania!
//zadanie 1 cout << "PODZIELNOŚĆ 3,5,7,10" << endl; int liczba; cout << "Wpisz liczbę: "; cin >> liczba; if (liczba % 3 == 0) cout << liczba << " podzielna przez 3" << endl; if (liczba % 5 == 0) cout << liczba << " podzielna przez 5" << endl; if (liczba % 7 == 0) cout << liczba << " podzielna przez 7" << endl; if (liczba % 10 == 0) cout << liczba << " podzielna przez 10" << endl; |
//zadanie 2 cout << "TRÓJKĄT" << endl; double B1,B2,B3; cout << "Wpisz boki trójkąta" << endl; cin >> B1 >> B2 >> B3; if (B1 <= B2+B3 && B2 <= B1+B3 && B3 <= B1+B2) cout << "Trójkąt OK" << endl; else cout << "nie może być taki trójkąt"; cout << endl; |
//zadanie 3 cout << "RÓWNANIE KWADRATOWE" << endl; double a,b,c; cout << "Wpisz parametry a, b, c: "; cin >> a >> b >> c; double delta=b*b-4*a*c; if (delta < 0) cout << "brak rozwiązań" << endl; if (delta == 0) { cout << "jedno rozwiązanie" << endl; cout << "X=" << -b / (2*a) << endl; } if (delta > 0) { cout << "dwa rozwiązania" << endl; cout << "X1=" << (-b - sqrt(delta))/ (2*a) << endl; cout << "X2=" << (-b + sqrt(delta))/ (2*a) << endl; } |
//zadanie 4 cout << "TEST" << endl; int P; string ocena="BRAK OCENY"; cout << "Wpisz punkty: "; cin >> P; if (P >= 0 && P <= 39) ocena="niedostateczny"; if (P >= 40 && P <= 54) ocena="dopuszczający"; if (P >= 55 && P <= 69) ocena="dostateczny"; if (P >= 70 && P <= 84) ocena="dobry"; if (P >= 85 && P <= 98) ocena="bardzo dobry"; if (P >= 99 && P <= 100) ocena="celujący"; cout << ocena << endl; |
//zadanie 5 cout << "MINIMUM" << endl; cout << "Wpisz dwie liczby: "; double L1,L2; cin >> L1 >> L2; if (L1 < L2) cout << L1 << " mniejsze od " << L2 << endl; if (L2 < L1) cout << L2 << " mniejsze od " << L1 << endl; if (L1 == L2) cout << L1 << " równe " << L2 << endl; |
//zadanie 6 cout << "KTÓRA ĆWIARTKA" << endl; cout << "Wpisz współrzędne punktu X i Y "; double X,Y; cin >> X >> Y; string C=""; string C1; if (X > 0 && Y > 0) C="ćwiartka pierwsza"; if (X < 0 && Y > 0) C="ćwiartka druga"; if (X < 0 && Y < 0) C="ćwiartka trzecia"; if (X > 0 && Y < 0) C="ćwiartka czwarta"; if (Y == 0) C="oś OX"; if (X == 0) C="oś OY"; cout << C << endl; |
//SZABLON #include <stdlib.h> //system #include <iostream> //cout #include <iomanip> //fixed #include <cmath> //pow using namespace std; int main(){ setlocale(LC_ALL, ""); system("pause"); } |