• Nie Znaleziono Wyników

L2 i L3 – Analiza algorytmów i programów

N/A
N/A
Protected

Academic year: 2021

Share "L2 i L3 – Analiza algorytmów i programów"

Copied!
31
0
0

Pełen tekst

(1)

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

(2)

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 ☺

(3)

Zadania

3

Przykład. Przenalizuj działanie zamieszczonego obok programu z wykorzystaniem debuggera.

(4)

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)

(5)

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.

(6)

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

(7)

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

(8)

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.

(9)

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

(10)

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.

(11)

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

(12)

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

(13)

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.

(14)

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:

(15)

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.

(16)

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

(17)

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.

(18)

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

(19)

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:

(20)

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:

(21)

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

(22)

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

(23)

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:

(24)

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

(25)

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.

(26)

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.

(27)

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.

(28)

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

(29)

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

(30)

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)

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

Cytaty

Powiązane dokumenty

Znaleźć wartość oczekiwaną pola prostokąta, którego obwód równy jest 20, a jeden bok jest zmienną losową X o rozkładzie jednostajnym na odcinku [1, 10].. Niech X będzie

zadania domowe 2, 27 października

Na podstawie danych zawartych w arkuszu znaleźć 90% oraz 95% przedziały ufności dla parametrów strukturalnych liniowego modelu zmienności wysokości poborów

zadania domowe 2, 18 listopada 2011.. Wyznaczyć dystrybuantę zmiennej losowej (X,

Niech X będzie

Jeśli parametr α jest całkowity, to jest to rozkład czasu oczekiwania na α-ty sukces w ciągu prób Bernoulliego, czyli jest to tzw..

Zmienna losowa X przyjmuje warto±ci równe sumie wspóªrz¦dnych wylosowanego punktu.. Wyznaczy¢ rozkªad zmiennej

Wyznaczyć funkcję tworzącą zmiennej losowej X o rozkładzie Pascala tj.. Następnie obliczyć wartość oczekiwaną i wariancję tej