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

Lekcja 2

IF  Instrukcja warunkowa w C++

  1. schemat
  2. zadania
  3. operatory
  4. zagnieżdżanie
  5. wybór
  6. formatowanie
  7. zadania
  8. rozwiązania

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ą.


Schemat instrukcji warunkowej

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 "=".


Warunki zagnieżdżone

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"); 
}
		


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


Zadania
Wyniki na ekranie, jak na załączonych obrazkach

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;

//wersja IF zagniezdzona if (P >= 0 && P <= 39) ocena="niedostateczny"; else if (P >= 40 && P <= 54) ocena="dopuszczający"; else if (P >= 55 && P <= 69) ocena="dostateczny"; else if (P >= 70 && P <= 84) ocena="dobry"; else if (P >= 85 && P <= 98) ocena="bardzo dobry"; else if (P >= 99 && P <= 100) ocena="celujący"; else ocena="BRAK OCENY"; 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");
}