Podstawy
programowania
Ćwiczenie laboratoryjne:
Analiza algorytmów i programów. Sterowanie w programie i śledzenie przebiegu obliczeń
autor: dr inż. Michał Łabowski
▪ michal.labowski@wat.edu.pl
▪ www.mlabowski.wel.wat.edu.pl
Debugowanie Tzw. debugowanie (pol. odpluskwianie):
• specjalny tryb pracy programu,
• instrukcje wykonywane są krok po kroku (stąd też inna nazwa – praca krokowa),
• programista ma możliwość podejrzenia „co dzieje się w programie”,
• możliwe jest wstawianie pułapek, czyli miejsc w kodzie, w których jego wykonywanie jest chwilowo zatrzymywane,
• przydatne przy tropieniu błędów ☺
Zadania
3
Przykład. Przenalizuj działanie zamieszczonego obok programu z wykorzystaniem debuggera.
Zmienna logiczna bool Typ zmiennej bool – typ przeznaczony do pracy ze stanami logicznymi. Zmienna tego typu może przyjmować dwie wartości: true lub false. Przykład [1]:
Nr linii Opis
1, 4, 6 Pominięte fragmenty kodu
3 Definicja zmiennej niepelnoletni typu logicznego (bool)
5 Przetwarzanie linii rozpoczyna się od strony prawej do lewej. Po prawej stronie operatora przypisania (=) znajduje się wyrażenie (lat < 18).
Komputer oblicza wartość tego wyrażenia i wynik (true lub false)
Pozostałe sposoby reprezentacji prawdy i fałszu
5
Przed wprowadzeniem typu bool do standardu języka C++ prawda i fałsz reprezentowane były przez wartości zmiennych typów fundamentalnych. W myśl tej logiki jeśli wartość zmiennej wynosi zero to interpretowane jest to jako stan false, natomiast każda wartość różna od zera traktowana jest jako stan true.
Operatory relacyjne W C++ jest sześć operatorów relacyjnych, służących do porównywania liczb, znaków lub string-ów. Wynikiem porównania jest wartość typu bool [2].
Operator Znaczenie Przykład
< mniejsze a < b
<= mniejsze lub równe a <= b
== równe a == b
> większe a > b
>= większe lub równe a >= b
!= różne a != b
Należy zwrócić szczególną uwagę na różnice pomiędzy operatorem przypisania (=) i porównania (==)!
Operator Działanie Przykład
Operatory logiczne
7
Operatory logiczne służą do budowania złożonych warunków logicznych.
Operator Znaczenie Przykład Opis
|| suma logiczna (alternatywa)
( a == b ) || ( a == c ) a jest równe b lub a jest równe c
&& iloczyn logiczny (koniunkcja)
( a >= b ) && ( a <= c ) a jest większe bądź równe b i jednocześnie a
jest mniejsze bądź równe c (zetem a należy
do przedziału <b, c>)
! negacja !a zmienia stan logiczny
argumentu na przeciwny W C++11 wprowadzono „tekstowe” postaci operatorów logicznych:
Operator Nowa postać Przykład
|| or ( a == b ) or ( a == c )
&& and ( a >= b ) and ( a <= c )
! not not a
Zaleca się wstawiać nawiasy, aby uniknąć problemów z priorytetami operatorów
Instrukcja warunkowa if Instrukcja warunkowa if powoduje, że w razie spełnienia warunku program wykonuje instrukcję bądź blok instrukcji, natomiast jeśli warunek nie jest spełniony wówczas instrukcje te są pomijane. Składnia:
if ( warunek ) {
instrukcje;
} Przykład 1. Napisz program, który poprosi użytkownika o podanie wieku, a następnie sprawdzi czy jest on pełnoletni. Jeśli jest, powinien zostać wypisany komunikat Jestes pełnoletni.
Instrukcja warunkowa if
9
Przykład 1. Napisz program, który poprosi użytkownika o podanie wieku, a następnie sprawdzi czy jest on pełnoletni. Jeśli jest, powinien zostać wypisany komunikat Jestes pełnoletni.
Nr linii Opis
7 Definicja zmiennej wiek. Dobra praktyka programistyczna zaleca, aby zmienne definiować jak najbliżej miejsca ich użycia (tutaj w ramach obiektu cin).
10 Instrukcja warunkowa if. Wyrażenie warunkowe przyjmuje wartość true, jeśli zmienna wiek jest większa bądź równa (>=) od 18
11-13 Blok instrukcji (tutaj jedna) wykonywanych po spełnieniu warunku
Instrukcja warunkowa if else Instrukcja warunkowa if else pozwala zdecydować, który z dwóch bloków instrukcji będzie wykonywany. Składnia:
if ( warunek ) {
instrukcje_bloku_1;
} else {
instrukcje_bloku_2;
}
Powyższe wyrażenie należy czytać: jeśli spełniony jest warunek to wykonaj instrukcje_bloku_1, w przeciwnym wypadku (tzn. jeśli warunek nie jest spełniony) wykonaj instrukcje_bloku_2.
Zadanie 2. Zmodyfikuj program z zadania 1, tak aby w przypadku podania wieku mniejszego od 18 lat wyświetlany był komunikat: Jestes niepełnoletni.
Instrukcja warunkowa if else
11
Przykład 2. Zmodyfikuj program z zadania 1, tak aby w przypadku podania wieku mniejszego od 18 lat wyświetlany był komunikat: Jestes niepełnoletni.
Nr linii Opis
15-16 Blok instrukcji wykonywanych w przypadku niespełnienia warunku z linii 10
Instrukcja warunkowa if else – wybór wielowariantowy Składnia wielowariantowej instrukcji if:
if ( warunek_1 ) {
instrukcje_bloku_1;
}
else if (warunek_2) {
instrukcje_bloku_2;
} else {
instrukcje_bloku_3;
}
Powyższe wyrażenie należy czytać: jeśli spełniony jest warunek_1 to wykonaj instrukcje_bloku_1, w przeciwnym wypadku jeśli spełniony jest warunek_2 to wykonaj instrukcje_bloku_2, w przeciwnym wypadku (ostatnie else) wykonaj
Instrukcja warunkowa if else – wybór wielowariantowy
13
Przykład 3. Napisz program, który prosi o podanie wieku użytkownika. Następnie sprawdzi, czy jest on pełnoletni i może kandydować na prezydenta (wiek co najmniej 35 lat) lub czy jest on pełnoletni, ale nie może kandydować na prezydenta lub czy użytkownik jest niepełnoletni.
Operator wyboru: ? Operator wyboru „?” jest jedynym trójargumentowym operatorem w C++.
Stosowany do zastąpienia „krótkich” instrukcji if…else. Składnia:
wyrazenie_1 ? wyrazenie_2 : wyrazenie_3
Powyższe wyrażenie należy czytać: jeśli wyrażenie_1 jest prawdziwe to wartością całego wyrażenia z operatorem wyboru jest wyrażenie_2, w przeciwnym wypadku wartością całego wyrażenia jest wyrażenie_3. Zaletą operatora wyboru ? jest możliwość skrócenia zapisu - 1 linia zamiast 2-3.
Przykład 4. Wykorzystując poznany operator wyboru napisz program pobierający dwie liczby całkowite oraz wypisujący informację, która z nich jest większa.
Przykładowy rezultat:
Operator wyboru: ?
15
Nr linii Opis
8 Wczytanie wartości dwóch zmiennych oddzielonych spacją lub znakiem nowej linii
10 Zastosowanie operatora wyboru ?: jeśli wartość zmiennej a jest większa od wartości zmiennej b, wówczas wartością całego wyrażenia po prawej stronie operatora przypisania (=) jest wartość zmiennej a, w przeciwnym wypadku – wartość zmiennej b. Po określeniu wartości wyrażenia jest ona przypisywana wartości zmiennej c.
Instrukcja switch
Switch służy do podejmowania wielowariantowych decyzji. Składnia:
switch (wyrazenie_wybierające) {
case wyrazenie_stale_1:
instrukcje_1;
break;
case wyrazenie_stale_2:
instrukcje_2;
break;
default:
instrukcje_default;
}
Jeśli wyrazenie_wybierającejest równe wyrazenie_stale_1 program przechodzi tutaj
Jeśli wyrazenie_wybierającejest różne od testowanych wyrażeń program przechodzi tutaj
case – słowo kluczowe. Jeśli wartość wyrazenia_wybierajacego zgadza się z wartością wyrażenia stałego podaną obok jednej z etykiet case wówczas wykonywane są instrukcje poczynając od tego miejsca [1].
Instrukcja switch
17
Switch służy do podejmowania wielowariantowych decyzji. Składnia:
switch (wyrazenie_wybierające) {
case wyrazenie_stale_1:
instrukcje_1;
break;
case wyrazenie_stale_2:
instrukcje_2;
break;
default:
instrukcje_default;
}
Jeśli wyrazenie_wybierającejest równe wyrazenie_stale_1 program przechodzi tutaj
Jeśli wyrazenie_wybierającejest różne od testowanych wyrażeń program przechodzi tutaj
break – powoduje wyjście z instrukcji switch (zaczyna się wykonywać kolejna instrukcja po klamrze zamykającej instrukcję switch). Jeśli jej nie umieścimy, to zaczną się wykonywać instrukcje związane z następną etykietą case.
Różnice pomiędzy switch oraz if…else Różnice pod względem wyrażenia wybierającego [1]:
• w instrukcji switch musi to być wyrażenie typu całkowitego (int, char itp.) lub dającego się rzutować na typ całkowity
• w if...else typ wyrażenia wybierającego nie ma znaczenia
Różnice pod względem tego, z czym wyrażenie wybierające się porównuje [1]:
• w switch porównanie musi odbywać się ze stałymi wartościami całkowitymi
• w if…else porównywać można z wyrażeniem zmiennym, tzn. takim, którego wartość jest znana dopiero w momencie wykonania sprawdzenia.
Różnice co do operacji porównującej [1]:
• w instrukcji switch porównanie polega na sprawdzeniu, czy wyrażenie wybierające jest równe x
• w instrukcji if…else porównanie może być dowolnym operatorem logicznym (np. ==, >=, itd.)
Zadanie 5
19
Przykład 5. Napisz program, wyświetlający menu w postaci: wybierz kolor: 1 – czerwony, 2 – zielony, 3 – niebieski. Program powinien umożliwić użytkownikowi wprowadzenie wartości. Używając instrukcji switch wyświetl komunikat o wybranym kolorze. Przykładowy rezultat:
Zadanie 5 Przykład 5. Napisz program, wyświetlający menu w postaci: wybierz kolor: 1 – czerwony, 2 – zielony, 3 – niebieski. Program powinien umożliwić użytkownikowi wprowadzenie wartości. Używając instrukcji switch wyświetl komunikat o wybranym kolorze. Przykładowy rezultat:
Algorytmy
21
Algorytm - przepis postępowania prowadzący do rozwiązania ustalonego problemu, określający ciąg czynności elementarnych, które należy w tym celu wykonać [PWN]. Może być przedstawiony za pomocą: opisu słownego, pseudokodu, schematu blokowego.
Start/Stop
Blok
wejścia/wyjścia
Blok operacji
Blok warunkowy
Algorytmy Zadanie 6. Opracuj algorytm dodawania dwóch liczb, pod warunkiem, że obie są dodatnie.
Start
Pobierz a, b
a > 0
w = a + b b > 0
Wyświetl błąd
T N T
N
Algorytmy
23
Zadanie 1. Opracuj algorytm wyznaczania pierwiastków równania kwadratowego.
Przyjmij następujące oznaczenia:
- a, b, c – parametry równania (różne od zera liczby rzeczywiste), - wyniki: x1, x2 – wartości pierwiastków,
- d – zmienna przechowująca obliczoną wartość tzw. delty równania.
Załóż, że równanie jest zawsze kwadratowe, tzn. współczynnik a jest zawsze różny od zera. Następnie napisz program realizujący ten algorytm. Wskazówka – funkcja wyznaczająca pierwiastek to sqrt(), zaś jej deklaracja znajduje się w pliku nagłówkowym cmath. Algorytm opracuj w postaci listy kroków, a następnie w postaci schematu blokowego. Przykładowy rezultat:
Zadania Zadanie 2. Napisz prosty symulator bankomatu:
• powitaj użytkownika: Witaj w naszym banku!
• pobierz PIN: Podaj numer pin:
• wczytaj odpowiedź użytkownika
• załóż, że poprawny PIN to 1729
• sprawdź, czy wprowadzono poprawny numer PIN
• wypisz komunikat (Poprawny PIN / Niepoprawny PIN)
Następnie zmień poprawny numer PIN na 0123, czy Twój program dalej działa poprawnie? Jeśli nie, zastanów się nad typem zmiennej przechowującej PIN oraz nad sposobem wprowadzania liczb oktadecymalnych do komputera.
Zadanie 3. Napisz symulator logowania. Zadania wykonywane przez program:
• wyświetl ekran logowania, pobierz login i hasło,
• poprawny login: admin, poprawne hasło: wat,
• sprawdź, czy oba warunki są spełnione
• wypisz stosowany komunikat informujący o rezultacie logowania i o tym, który z
Zadania
25
Zadanie 4. Napisz program pobierający wartość temperatury T (użytkownik wprowadza ją za pomocą klawiatury – liczba zmiennoprzecinkowa). Następnie sprawdź i wypisz komunikat zgodnie z poniższymi zasadami:
• jeśli T jest mniejsza od -20 – komunikat: zimno
• jeśli T jest z przedziału <-20, 0) - komunikat: chlodno
• jeśli T jest z przedziału <0, 20) - komunikat: cieplo
• jeśli T jest większe bądź równe 20 – komunikat: goraco
Zadanie 5. Napisz program realizujący wybór trybu lotu dla bezzałogowego statku powietrznego. Załóż, że użytkownik wprowadza liczbę, która następnie powoduje uruchomienie odpowiedniego trybu zgodnie z zasadami:
1 – tryb manual (sterowanie ręczne) 2 – tryb loiter (krążenie)
3 – tryb auto (wykonywanie zaprogramowanej trasy)
Wyświetl komunikat o wybranym trybie lotu. Wykorzystaj instrukcję switch, pamiętaj o etykiecie default.
Zadania Zadanie 6. Napisz prosty kalkulator realizujący operacje dodawania, odejmowania, mnożenia i dzielenia:
• wyświetl menu informujące o dostępnych działaniach i sposobie ich wyboru,
• pobierz wartości argumentów,
• jeśli to możliwe wyświetl rezultat obliczeń.
Wykorzystaj instrukcję switch. Przykład:
Zadanie 7. Zmodyfikuj program z zdania 10, tak aby zamiast instrukcji switch wykorzystać instrukcję if…else.
Zadania
27
Zadanie 8. Zmodyfikuj algorytm, a następnie program wyznaczający pierwiastki równania kwadratowego tak, aby sprawdzane było czy równanie jest kwadratowe (wtedy wyznacz pierwiastki – jeśli są), liniowe (wypisz miejsce zerowe), sprzeczne (brak miejsc zerowych) czy tożsamościowe (nieskończenie wiele miejsc zerowych).
Algorytm opracuj w postaci listy kroków, a następnie w postaci schematu blokowego.
Zadanie 9. Opracuj algorytm i napisz program który prosi użytkownika o podanie liczby. W przypadku, gdy liczba jest dodatnia i całkowita komputer powinien zidentyfikować, czy liczba jest parzysta czy nieparzysta. Algorytm opracuj w postaci listy kroków, a następnie w postaci schematu blokowego. Wskazówka: wykorzystaj funkcję round z biblioteki cmath.
Zadanie 10. Opracuj algorytm i napisz program sprawdzający, czy z boków o długościach a, b, c można zbudować trójkąt. Algorytm opracuj w postaci listy kroków, a następnie w postaci schematu blokowego. Wskazówka: aby z trzech odcinków zbudować trójkąt, najdłuższy z nich musi być krótszy niż suma długość dwóch pozostałych.
Zadania Zadanie 11. Zmodyfikuj algorytm oraz program z zadania 10, tak aby używać zmiennych i operatorów logicznych.
Zadanie 12. Podajemy jeden ze znaków: ’a’, ’b’, ’c’, ’d’ lub ’k’. W zależności od podanego znaku, program powinien policzyć odpowiednie pole:
znak a – liczymy pole kwadratu znak b – liczymy pole prostokąta znak c – pole trójkąta
znak d – pole trapezu
znak k – wyjście z programu
Po wybraniu opcji program powinien pytać o długości odpowiednich boków, wykonać obliczenia i zwrócić ich rezultat.
Zadanie 13. Zmodyfikuj program z zadania 12, tak aby program wykonywał
odpowiednie obliczenia po wciśnięciu nie tylko małej litery, lecz także dużej, tzn.
pole kwadratu powinno być liczone po wciśnięciu znaku ’a’ lub znaku ’A’.
Zadania
29
Zadanie 14. Napisz program, który stwierdzi, czy wprowadzony za pomocą klawiatury znak jest dużą literą, małą literą, cyfrą, czy innym znakiem.
Zadanie 15. Napisz program, który określi, czy podany rok jest rokiem przestępnym. Rok jest przestępny gdy jest podzielny przez 4, ale nie jest podzielny przez 100 lub jest podzielny przez 400.
Zadanie 16. Napisz program, który posortuje rosnąco trzy liczby całkowite.
Wejście: trzy liczby oddzielone spacjami.
Wyjście: trzy liczby posortowane rosnąco oddzielone spacjami.
Przykład: wejście: 5 7 4, wyjście: 4 5 7
Zadanie 17. Podajemy trzycyfrową liczbę. Program sprawdza, czy ta liczba jest palindromem. Palindrom to taka liczba, która czytana z lewej do prawej wygląda tak samo jak z prawej do lewej np. 121.
Wejście: Jedna liczba trzycyfrowa
Wyjście: Tak, jeśli podana liczba jest palindromem, Nie w przeciwnym wypadku Przykład: wejście: 123, wyjście: Nie
Zadania Zadanie 18. Jaś bardzo lubi rysować okręgi. Ostatnio podczas rysowania wymyślił, że przez środki dwóch wybranych okręgów poprowadzi prostą. Następnie nasz bohater zaznaczył zielonym flamastrem średnicę pierwszego okręgu, a czerwonym średnicę drugiego Kiedy już skończył zaczął się zastanawiać na jakiej długości narysowane średnice się pokrywają. Jako, że już od dłuższego czasu szukałeś wymówki, żeby się nie uczyć do egzaminu postanowiłeś mu pomóc. Zdecydowałeś, że napiszesz program, który mając odległość między środkami tych okręgów oraz długości ich promieni obliczy szukaną przez Jasia wartość.
Wejście:
Trzy liczby rzeczywiste nieujemne d, r1, r2, gdzie r1 i r2 to długości promieni okręgów, natomiast d to odległość między środkami tych okręgów.
Wyjście:
Jedna liczba szukana przez Jasia Przykład
Wejście:
31
Literatura:
[1] Grębosz J., Opus Magnum C++, Helion, Gliwice, 2018
[2] Prata S., Język C++ Szkoła programowania, Helion, Gliwice, 2013 [3] Prata S., Język C Szkoła programowania, Helion, Gliwice, 2012