Programowanie w C++ – instrukcje warunkowe, strumienie wejścia i wyjścia

Witaj po raz kolejny. To już druga część kursu. Jeżeli nie zapoznałeś się jeszcze z pierwszą – zapraszam Cię do przeczytania artykułu o programowaniu w C++. Dowiesz się z niego między innymi kilku informacji o mnie, czyli kim jestem i dlaczego tworzę ten kurs dla Ciebie, oraz jak zainstalować środowisko programistyczne, które umożliwi nam pisanie programów w C++.

 

Praktyczne programowanie w C++

W tej części kursu zajmiemy się trzema zagadnieniami należącymi do najbardziej podstawowych. Mowa tutaj o deklaracji zmiennych, strumieniach wejścia i wyjścia oraz instrukcjach warunkowych. Bez nich wykonywanie nawet najprostszych czynności byłoby niemożliwe.

Zatem do dzieła!

 

Zmienne w programowaniu w języku C++

Z definicji zmienna to konstrukcja programistyczna, która umożliwia odwoływanie się poprzez jej nazwę do wartości (dokładniej mówiąc: do miejsca jej przechowywania). Teoria teorią, a w praktyce wygląda to następująco:

int liczba = 15;

Powyższa linijka kodu spowoduje, że komputer (po poprawnej kompilacji i uruchomieniu programu) zarezerwuje sobie w komórce pamięci miejsce, które będzie przeznaczone tylko do użytku właśnie przez zmienną o nazwie „liczba”. Dodatkowo, przypisze w to miejsce ustaloną przez Ciebie wartość liczbową, czyli 15.

 

W C++ mamy wiele typów danych. Na tym etapie nie ma potrzeby, abyście znali je wszystkie, lecz ich część. Oto one:

Rodzaj zmiennej Co przechowuje?
bool wartość logiczną false (0) lub true (1)
char pojedynczy znak, np. literę „a”
int liczbę całkowitą
double liczbę zmiennoprzecinkową, np. 12.83

Te cztery powyższe typy danych w zupełności wystarczą nam przez większość czasu, gdy będziemy się przygotowywać do rozszerzonej matury z informatyki. Warto jednak wspomnieć o jeszcze jednym typie danych:

string – przechowuje ciąg znaków, np. „Ala ma kota”

W żargonie informatycznym bardzo często nazywa się stringi zmiennymi, jednak gdy chcemy być bardzo dokładni – jest to błąd. Obiekt typu string to nie zmienna. Jest to obiekt klasy String. Czym jest obiekt, czym klasa – opowiemy sobie innym razem. Pojęcia te stosowane są w programowaniu obiektowym. Niestety na rozszerzonej maturze z informatyki umiejętność pisania programów obiektowo nie daje wiele korzyści. Zadania z części programistycznej kładą nacisk na algorytmikę, dlatego na tym my też będziemy się skupiać.

 

W C++ wszystkie zmienne deklarujemy w ten sam sposób, czyli najpierw podajemy typ zmiennej, a następnie jej nazwę. Przykładowe deklaracje zmiennych:

 char znak = 'c'; //zwróć uwagę na inny znak - nie cudzysłów, ale apostrof - do tego wrócę za chwilę
int zmienna1 = -11;
double b = 44.221;
bool czyZdalem = true; 

W pierwszej linijce powyższego kodu widać mój komentarz. Korzystając z okazji chciałbym o nich również wspomnieć. W C++ mamy dwa podstawowe rodzaje komentarzy: jednowierszowe i wielowierszowe. Ten, użyty przeze mnie to jak możesz się spodziewać – jednowierszowy.

Komentarze stosujemy wtedy, kiedy chcemy ująć jakąś informację w kodzie zarówno dla siebie, abyśmy o czymś nie zapomnieli, jak i dla innych osób, które mają dostęp do kodu (aby ułatwić im zadanie analizy działania programu). Wszystko co znajduje się w komentarzu jest pomijane przez kompilator.

 

Na maturze z informatyki warto stosować komentarze przed każdym z podpunktów, które wykonujemy. Czyli np. pisząc funkcję (więcej o funkcjach w kolejnych częściach), która jest rozwiązaniem na podpunkt pierwszy wybranego zadania, warto umieścić komentarz np. „ // Odp. A”. Dzięki temu osoba, która może zajrzeć do naszego kodu (w tym przypadku egzaminator) będzie miała wszystko „podane na talerzu” 🙂

Komentarze wielowierszowe stosujemy, gdy chcemy skomentować większą część kodu. Przykład:

 /*
int a = 15;
int b;
b = 15;
*/

W tym momencie, wszystko umieszczone pomiędzy znakami „/* */„ będzie traktowane jako komentarz, czyli kompilator to po prostu pominie.

 

Podczas rozwiązywania zadań maturalnych komentarze wielowierszowe pełnią bardzo ważną rolę – to dzięki nim możemy w łatwy sposób zweryfikować dlaczego nasz program nie działa tak jak powinien. Przez komentowanie kolejnych części kodu możemy bardzo szybko dość do sedna problemu i odnaleźć moment, w którym program się przysłowiowo „sypie”.

 

Odnosząc się do fragmentu kodu, w którym pokazywałem jak można deklarować zmienne o różnych typach danych, wspomniałem tam o różnicy między cudzysłowem, a apostrofem. Otóż jeżeli chcemy użyć fragmentu tekstu, zawsze stosujemy cudzysłów. Natomiast jeżeli chcemy wykorzystać konkretny znak, używamy apostrof. To drobna różnica, jednak nie można o tym zapomnieć, by uniknąć niepotrzebnych błędów kompilacji.

 

Strumienie wejścia i wyjścia w C++

Pod tą dziwną nazwą kryje się coś bardzo oczywistego. Dzięki bibliotece „iostream” możemy skorzystać z gotowych funkcji obsługi strumieni. W Code::Blocks biblioteka jest dodawana automatycznie i wygląda to tak:

 #include < iostream >

Powyżej widzimy klasyczną metodę dodania biblioteki do programu. W ten sam sposób będziemy dodawać wiele innych bibliotek, które będą zawierać więcej, bardzo przydatnych funkcji.

 

Obsługa strumienia wejścia to nic innego, jak np. umożliwienie użytkownikowi wpisywanie wartości do programu. Przykładowe użycie:

 cin >> liczba; 

Wykonanie tej linijki spowoduje, że w konsoli pojawi się migający kursor – program będzie czekał na podanie przez użytkownika wartości. Po wpisaniu liczby i kliknięciu enter, program przejdzie do kolejnej części kodu. Strumień wejścia obsługiwany jest przez użytą funkcję „cin”. Zwróć proszę uwagę na kierunek znaków „>>” – początkowi programiści często o tym zapominają i dziwią się dlaczego kompilator zwraca błąd, gdy piszą je na odwrót: “<<” 🙂

 

Obsługa strumienia wejścia to analogicznie, wyświetlanie informacji na ekranie. Używa się do tego funkcji „cout”. Przykład:

 cout << "Wartosc naszej zmiennej to: " << liczba; 

Efekt wywołania tej linijki kodu to wypisanie w konsoli: „Wartość naszej zmiennej to 15”. Ważne! Wszystkie teksty umieszczamy w cudzysłowie. Jeżeli chcemy wydobyć wartość zmiennej to robimy to bez cudzysłowów. Dla przykładu:

 cout << "Wartosc naszej zmiennej to: " << "liczba"; 

Linijka ta wypisze „Wartosc naszej zmiennej to: liczba”, czyli nie osiągniemy planowanego rezultatu. Zwróć uwagę na sposób połączenia tekstu i zmiennej, czyli na łącznik „<<„. W ten sposób można łączyć wyświetlane teksty. Używa się tego, gdy chcemy (tak jak w tym przypadku) wyświetlić kawałek tekstu, a następnie wartość zmiennej.

Instrukcje warunkowe C++

Mówiąc o instrukcjach warunkowych, będziemy używali dopiero co zdobytej wiedzy z zakresu deklarowania i używania zmiennych oraz obsługi strumieni wejścia i wyjścia. Jak sama nazwa wskazuje, instrukcja warunkowa to pewnego rodzaju sprawdzenie. Na przykład możemy sprawdzić, czy dana zmienna przechowuje wartość większą niż 10. W C++ do instrukcji warunkowych używa się funkcji if. Przykład użycia:

 int zmienna = 123;
if (zmienna > 10)
{
    cout << "Wartosc zmiennej jest wieksza od 10!";
}

Wydaje mi się, że powyższy kod jest na tyle jasny, że nie ma potrzeby komentowania co się wydarzy. Jeżeli jednak nie jesteś pewien – skopiuj kod do Code::Blocks i zobacz efekt! Dobrze, powiedzieliśmy sobie jak coś sprawdzić, a co w sytuacji, gdy chcemy wykonać daną czynność, gdy zmienna NIE będzie spełniać sprawdzanego warunku? Teoretycznie, można to zrobić w ten sposób:

 int a = 6;
if (zmienna > 10)
{
    cout << "Wartosc zmiennej jest wieksza od 10";
}
if (zmienna <= 10)
{
    cout << "Wartosc zmiennej jest mniejsza lub rowna 10";
}

Jednak jest na to prostszy sposób, a mianowicie użycie funkcji „else”. Funkcja ta wykonuje się za każdym razem, gdy sprawdzany przez nas warunek okazał się nieprawidłowy. Użycie funkcji:

int a = 6;
if (zmienna > 10)
{
    cout << "Wartosc zmiennej jest wieksza od 10";
}
else
{
    cout << "Wartosc zmiennej jest mniejsza lub rowna 10";
}

Jest to po prostu forma skrótu. My, programiści, bardzo lubimy skróty 🙂

Spójniki Mówiąc o instrukcjach warunkowych, należy wspomnieć o spójnikach, jakich można używać do łączenia warunków. Używa się ich, jeżeli chcemy np. aby wykonał się jeden ORAZ drugi warunek. Inny przykład, to jeżeli chcemy, aby wykonał się jeden LUB drugi warunek. W praktyce wygląda to następująco:

  • && – ORAZ
  • || – LUB

Proszę nie mylić spójnika LUB (zwana również jako alternatywa nierozłączna) z ALBO (zwaną alternatywą rozłączną)! Gdy używamy LUB to jeżeli więcej niż jeden warunek jest spełniony – wynik wyrażenia logicznego to prawda. W przypadku użycia spójnika ALBO, jeżeli więcej niż jeden warunek jest spełniony – wynikiem końcowym wyrażenia będzie fałsz. W C++ wygląda to następująco:

 int a = 10, b = 15, c = -1;
if( a > 0 && b > 0 && c > 0 ) // wynik wyrażenia to FAŁSZ, bo C < 0 if( a > 0 || b > 0 || c > 0 )
if( a > 0 || b > 0 || c > 0 ) // wynik wyrażenia to PRAWDA, bo co najmniej jeden z warunków jest prawidłowy.

Ostatnia rzecz, o której dzisiaj chcę Wam powiedzieć to instrukcja warunkowa lecz trochę bardziej rozbudowana. Jest nią funkcja switch case. Zacznę od przedstawienia przykładu użycia.

int liczba;
cin >> liczba;
switch (liczba)
{
    case 1:
        cout << "Liczba ma wartosc 1";
        break;
    case 2:
        cout << "Liczba ma wartosc 2";
        break;
    default:
        cout << "Liczba nie ma wartosc 1 ani 2";
        break;
}

Powyżej zaprezentowana funkcja switch case podbiera (w czwartej linijce kodu) parametr, czyli to co zostało podane w nawiasach. Jak widzisz, w tym przypadku jest to zmienna „liczba”. To oznacza, że funkcja switch będzie sprawdzać wartość tej zmiennej przez podane przez Ciebie przypadki (case).

 

Czyli, jeżeli zmienna ma wartość 1, to wykona się „case 1:”, jak 2 to „case 2:”, a jak nie będzie miała wartości ani 1 ani 2, to wykona się przypadek „default:”.

 

Bardzo ważne jest używanie funkcji „break”. Będziemy ją stosować wielokrotnie, podczas mówienia o działaniach na pętlach. Funkcja break powoduje przerwanie trwającej instrukcji sterującej (w tym przypadku instrukcja switch case). Jeżeli dany case się wykonuje, to break oznacza, że wszystko co miało się wykonać już się wykonało, a program powinien przejść do kolejnych linijek kodu (za switch case).

 

W praktyce, gdybyśmy nie napisali funkcji break to kod wyglądałby w następujący sposób: 

int liczba;
cin >> liczba;
switch (liczba)
{
    case 1:
        cout << "Liczba ma wartosc 1";
    case 2:
        cout << "Liczba ma wartosc 2";
    default:
        cout << "Liczba nie ma wartosc 1 ani 2";
}

Gdy użytkownik podałby wartość 1, to wynikiem programu, który by się pojawił w konsoli byłby napis:

Liczba ma wartosc 1Liczba ma wartosc2Liczba nie ma wartosc 1 ani 2

Jak widzisz, wykonały się wszystkie trzy case. Pomiędzy tekstami nie ma żadnej przerwy, ani spacji, dlatego że ich nie dodaliśmy. Na końcu każdego wywołania funkcji cout moglibyśmy dopisać „<< endl” i wówczas po każdym zdaniu pojawiłby się enter.

 

Podsumowanie

Postarałem się wytłumaczyć wszystko możliwie najprostszymi słowami. Zmienne, strumienie wejścia i wyjścia oraz instrukcje warunkowe w C++ to absolutne podstawy, które umożliwią nam dalszą naukę programowania i przygotowania do matury z informatyki. Może się to wydawać bardzo proste – jeżeli tak jest to naprawdę świetnie. Mimo wszystko, bardzo Ciebie proszę o wykonanie poniższych zadań domowych.

Pamiętaj, że zawsze możesz się umówić na indywidualne zajęcia w formie korepetycji z informatyki. Jest to o tyle fajne, że mogę udzielić odpowiedzi na każde z Twoich pytań. W razie czego – kontakt znajdziesz tutaj.

 

Praca domowa

  • Napisz program, który poprosi użytkownika o podanie liczby komunikatem „Proszę wpisz liczbę i kliknij enter”. Po wpisaniu przez użytkownika liczby, niech program sprawdzi, czy liczba jest z zakresu [0, 9]. Jeżeli tak: niech wyświetli „To jest cyfra!”. W przeciwnym przypadku, niech wypisze „Podana przez Ciebie liczba to: i tutaj wartość wpisanej przez użytkownika liczby”.
  • Napisz program na obliczenie średniej prędkości, z jaką poruszał się samochód na trasie. Aby to zrobić, pobierz od użytkownika dwie wartości: drogę, jaką samochód przebył oraz czas przejazdu. Następnie przy użyciu wzoru v = s/t obliczysz wartość średniej prędkości.
    Uwaga! Pamiętaj, że podawane przez użytkownika zmienne oraz otrzymywany wynik nie muszą być liczbami całkowitymi! Uwzględnij to w swoim programie.
  • Napisz program, który poprosi użytkownika o podanie dowolnego jednego znaku. Przy użyciu funkcji switch case sprawdź, czy jest to któraś z pierwszych 6 liter alfabetu angielskiego. Jeżeli tak – wypisz tę literę. W przeciwnym wypadku nie pisz nic i zakończ program.

Wpisy, które mogą Cię zainteresować: