Wstęp do programowania

Podobne dokumenty
Programowanie obiektowe

Wstęp do programowania

Podstawy programowania. Wykład: 4. Instrukcje sterujące, operatory. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Wstęp do programowania

Wstęp do programowania

Warunki logiczne instrukcja if

Myśl w języku Python! : nauka programowania / Allen B. Downey. Gliwice, cop Spis treści

ECDL Podstawy programowania Sylabus - wersja 1.0

lekcja 8a Gry komputerowe MasterMind

Programowanie obiektowe

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.

7. Pętle for. Przykłady

Wstęp do programowania

Kod doskonały : jak tworzyć oprogramowanie pozbawione błędów / Steve McConnell. Gliwice, cop Spis treści. Wstęp 15.

Algorytm poprawny jednoznaczny szczegółowy uniwersalny skończoność efektywność (sprawność) zmiennych liniowy warunkowy iteracyjny

Programowanie i techniki algorytmiczne

Elżbieta Kula - wprowadzenie do Turbo Pascala i algorytmiki

Schematy blokowe I. 1. Dostępne bloki: 2. Prosty program drukujący tekst.

Algorytmy. dr Dariusz Banaś (UJK) Seminarium w ramach projektu Fascynujący Świat Nauki dla uczniów gimnazjów. wersja 0.9. Start.

Strategia "dziel i zwyciężaj"

Język JAVA podstawy. Wykład 3, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Zapis algorytmów: schematy blokowe i pseudokod 1

Pętla for. Wynik działania programu:

Nazwa implementacji: Nauka języka Python wyrażenia warunkowe. Autor: Piotr Fiorek. Opis implementacji: Poznanie wyrażeń warunkowych if elif - else.

1 Wprowadzenie do algorytmiki

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Wstęp do programowania

Podstawy programowania w Pythonie

Programowanie w C++ Wykład 2. Katarzyna Grzelak. 5 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 41

Po uruchomieniu programu nasza litera zostanie wyświetlona na ekranie

Informatyka I. Wykład 3. Sterowanie wykonaniem programu. Instrukcje warunkowe Instrukcje pętli. Dr inż. Andrzej Czerepicki

Instrukcje sterujące. wer. 11 z drobnymi modyfikacjami! Wojciech Myszka :53:

6. Pętle while. Przykłady

Python wprowadzenie. Warszawa, 24 marca PROGRAMOWANIE I SZKOLENIA

Ogólne zasady projektowania algorytmów i programowania

Temat 20. Techniki algorytmiczne

Wstęp do programowania

Algorytmy i struktury danych

Wstęp do programowania

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

- - Ocena wykonaniu zad3. Brak zad3

Analiza i projektowanie oprogramowania. Analiza i projektowanie oprogramowania 1/32

Wstęp do programowania

Język Python. Język Python 1/35

Programowanie w języku Python. Grażyna Koba

Wstęp do programowania

Zapisywanie algorytmów w języku programowania

Pętle. for, while, do... while, foreach. Materiał pomocniczy do kursu Podstawy programowania Autor: Grzegorz Góralski ggoralski.

Robert Barański, AGH, KMIW State Machine v1.0. Maszyna stanów (State Machine)

Celem tego projektu jest stworzenie

Programowanie komputerowe. Zajęcia 2

Programowanie i projektowanie obiektowe

Podstawy programowania w języku Visual Basic dla Aplikacji (VBA)

1. Informatyka - dyscyplina naukowa i techniczna zajmująca się przetwarzaniem informacji.

1 Wielokrotne powtarzanie tych samych operacji

ZASADY PROGRAMOWANIA KOMPUTERÓW

Odczyt danych z klawiatury Operatory w Javie

LABORATORIUM 3 ALGORYTMY OBLICZENIOWE W ELEKTRONICE I TELEKOMUNIKACJI. Wprowadzenie do środowiska Matlab

Instrukcje sterujące. Programowanie Proceduralne 1

Matematyka Dyskretna. Andrzej Szepietowski. 25 czerwca 2002 roku

Operatory cd. Relacyjne: ==!= < > <= >= bool b; int i =10, j =20; dzielenie całkowitych wynik jest całkowity! Łączenie tekstu: + string s = "Ala ma ";

Wstęp do Informatyki zadania ze złożoności obliczeniowej z rozwiązaniami

Opis: Instrukcja warunkowa Składnia: IF [NOT] warunek [AND [NOT] warunek] [OR [NOT] warunek].

Pętle i tablice. Spotkanie 3. Pętle: for, while, do while. Tablice. Przykłady

Podstawy Programowania Algorytmy i programowanie

ForPascal Interpreter języka Pascal

Poprawność semantyczna

System operacyjny Linux

Szkoła programisty PLC : sterowniki przemysłowe / Gilewski Tomasz. Gliwice, cop Spis treści

Programowanie w C++ Wykład 2. Katarzyna Grzelak. 4 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 44

EGZAMIN MATURALNY 2011 INFORMATYKA

Programowanie funkcyjne wprowadzenie Specyfikacje formalne i programy funkcyjne

Python wstęp do programowania dla użytkowników WCSS

Środowisko programisty

Literatura. adów w cyfrowych. Projektowanie układ. Technika cyfrowa. Technika cyfrowa. Bramki logiczne i przerzutniki.

Paradygmaty programowania

Wstęp do informatyki- wykład 7

Technologie Informacyjne Mechatronika 2012/2013 Algorytmy. Podstawy programowania

Lab 9 Podstawy Programowania

Wstęp do programowania

ALGORYTMY Algorytm poprawny jednoznaczny szczegółowy uniwersalny skończoność efektywność (sprawność) zmiennych liniowy warunkowy iteracyjny

ZMIENNE. Podstawy PHP

Liczby losowe i pętla while w języku Python

Testowanie i walidacja oprogramowania

Warsztaty dla nauczycieli

Języki C i C++ Wykład: 2. Wstęp Instrukcje sterujące. dr Artur Bartoszewski - Języki C i C++, sem. 1I- WYKŁAD

Wstęp do Informatyki i Programowania Laboratorium: Lista 1 Środowisko programowania

Sortowanie przez scalanie

Język C : programowanie dla początkujących : przewodnik dla adeptów programowania / Greg Perry, Dean Miller. Gliwice, cop

Prof. Danuta Makowiec Instytut Fizyki Teoretycznej i Astrofizyki pok. 353, tel danuta.makowiec at gmail.com

Pisząc kod w Pythonie na pewno już nie raz coś poszło nie tak i Shell wypisał komunikat o błędzie podobny do poniższego:

Programista samouk : profesjonalny przewodnik do samodzielnej nauki kodowania / Cory Althoff. Gliwice, copyright Spis treści

Zaawansowany kurs języka Python

Etapy życia oprogramowania

LibreOffice Calc VBA

Podstawy Programowania C++

Wymagania Uczestnik szkolenia musi mieć możliwość korzystania z Internetu. Kurs nie zakłada znajomości podstaw programowania.

Język skryptowy: Laboratorium 1. Wprowadzenie do języka Python

Transkrypt:

Wstęp do programowania Jak pisać poprawne programy. Kilka ładnych rozwiązań. Paweł Daniluk Wydział Fizyki Jesień 2014 P. Daniluk(Wydział Fizyki) WP w. V Jesień 2014 1 / 33

Poważne decyzje Problem Przed przystąpieniem do pracy problem musi być dokładnie określony. Specyfikuje się rodzaj danych wejściowych, oczekiwany wynik oraz dodatkowe wymagania i ograniczenia. Algorytm Musi być dostosowany do wymagań. Struktury danych Często reprezentacja danych jest determinowana przez wybrany algorytm, ale nie zawsze. Bez określenia w/w nie należy przystępować do programowania. P. Daniluk(Wydział Fizyki) WP w. V Jesień 2014 2 / 33

Cykl rozwoju oprogramowania P. Daniluk(Wydział Fizyki) WP w. V Jesień 2014 3 / 33

Cykl rozwoju oprogramowania 1 Określenie wymagań 2 Projektowanie 3 Implementacja 4 Testy 5 Konserwacja W praktyce wielokrotnie wraca się do faz poprzedzających i wprowadza korekty problemów ujawniających się podczas implementacji lub testów. P. Daniluk(Wydział Fizyki) WP w. V Jesień 2014 4 / 33

Przykra rzeczywistość Praktycznie nie zdarza się, żeby program zadziałał poprawnie przy pierwszym uruchomieniu. P. Daniluk(Wydział Fizyki) WP w. V Jesień 2014 5 / 33

Przykra rzeczywistość Praktycznie nie zdarza się, żeby program zadziałał poprawnie przy pierwszym uruchomieniu. Jak pisać możliwie poprawne programy? Jak szukać błędów? P. Daniluk(Wydział Fizyki) WP w. V Jesień 2014 5 / 33

Jak pisać możliwie poprawne programy? Metoda małych kroków 1 Zacznij od małego programu, który robi coś widocznego. 2 Dodawaj po kilka linii kodu i za każdym razem sprawdzaj, jak działa. 3 Rób tak, aż skończysz. Testy Warto od razu obmyślać sposób testowania poszczególnych komponentów. Każda zmiana jest przetestowana i poprawna. Łatwo lokalizować błędy. W dobrze zaprojektowanym programie komponenty są możliwie niezależne. P. Daniluk(Wydział Fizyki) WP w. V Jesień 2014 6 / 33

Modularyzacja Jeżeli widzisz kawałek kodu, który robi coś spójnego i (być może) powtarzalnego, zrób z niego funkcję. Wielokrotne występowanie podobnych fragmentów kodu powinno budzić zaniepokojenie. Uogólnianie 1 dodanie parametrów 2 instrukcją warunkowa służąca do wyboru właściwej ścieżki 3 funkcje pomocnicze P. Daniluk(Wydział Fizyki) WP w. V Jesień 2014 7 / 33

Przykład parametry Przed def inc_by_two ( l ) : return [ i +2 f o r i i n l ] def inc_by_three ( l ) : return [ i +3 f o r i i n l ] Po def inc_by_number ( l, n ) : return [ i+n f o r i i n l ] def inc_by_two ( l ) : return inc_by_number ( l, 2) def inc_by_three ( l ) : return inc_by_number ( l, 3) P. Daniluk(Wydział Fizyki) WP w. V Jesień 2014 8 / 33

Przykład instrukcja warunkowa Przed # f ragment A... # f ragment A B1 ( ) # f ragment C... # f ragment C # f ragment A... # f ragment A B2 ( ) # f ragment C... # f ragment C Po def f ( v ) : # f ragment A... # f ragment A f ( 1 ) f ( 2 ) i f v==1: B1 ( ) e l i f v==2: B2 ( ) # f ragment C... # f ragment C P. Daniluk(Wydział Fizyki) WP w. V Jesień 2014 9 / 33

Przykład funkcje pomocnicze Przed # f ragment A... # f ragment A B1 ( ) # f ragment C... # f ragment C # f ragment A... # f ragment A B2 ( ) # f ragment C... # f ragment C Po def A ( ) : # f ragment A... # f ragment A def C ( ) : # f ragment C... # f ragment C A( ) B1 ( ) C ( ) A( ) B2 ( ) C ( ) P. Daniluk(Wydział Fizyki) WP w. V Jesień 2014 10 / 33

Szybkie prototypowanie W początkowej fazie można stosować rozwiązania uproszczone np. mniej wydajne. Przykłady wyszukiwanie liniowe zamiast binarnego metoda brute-force pomijanie obsługi sytuacji nietypowych (np. błędów w danych wejściowych) P. Daniluk(Wydział Fizyki) WP w. V Jesień 2014 11 / 33

Częste błędy Zbyt duże przyrosty Duże kawałki nowego kodu są trudne do poprawiania. Upór Nie należy przywiązywać się do błędnego kodu. Błądzenie losowe Wprowadzanie losowych zmian donikąd nie prowadzi. Uleganie komunikatom kompilatora/interpretera Komunikaty o błędach mogą wprowadzać w błąd. P. Daniluk(Wydział Fizyki) WP w. V Jesień 2014 12 / 33

Projektowanie dwie strategie Top-down Problem jest rozbijany na podproblemy, które można rozwiązać niezależnie. Podproblemy są dalej sukcesywnie dzielone do poziomu łatwo implementowalnych funkcji. Bottom-up Najpierw definiowane są podstawowe elementy, następnie składane są z nich coraz większe komponenty. P. Daniluk(Wydział Fizyki) WP w. V Jesień 2014 13 / 33

Projektowanie dwie strategie c.d. Top-down Brakujące elementy całości trzeba tymczasowo uzupełnić przed uruchomieniem. W naturalny sposób przechodzi od ogólnego zarysu do szczegółowych rozwiązań. Wymaga kompletnego projektu. Ułatwia delegowanie zadań i programowanie zespołowe. Pozwala poprawnie zaprojektować system od podstaw. Bottom-up Szybko uzyskuje się fragmenty, które można testować. Trzeba z góry przewidzieć jakie komponenty są niezbędne. Można rozpocząć kodowanie bez ostatecznej koncepcji. Zwiększa prawdopodobieństwo, że bloki funkcjonalne będą uniwersalne. Pozwala rozwijać istniejący program. P. Daniluk(Wydział Fizyki) WP w. V Jesień 2014 14 / 33

Wypisywanie Warto od razu przygotowywać funkcje służące do wypisywania danych. P. Daniluk(Wydział Fizyki) WP w. V Jesień 2014 15 / 33

Błędy składniowe Typowe błędy SyntaxError: invalid syntax np.: brak dwukropka po instrukcji if, albo while próba użycia słowa kluczowego jako nazwy zmiennej IndentationError: expected an indented block IndentationError: unexpected indent NameError: global name is not defined np: użycie zmiennej bez inicjalizacji literówka (np. imput zamiast input TypeError: Can t convert int object to str implicitly P. Daniluk(Wydział Fizyki) WP w. V Jesień 2014 16 / 33

Błędy wykonania Śledzenie przebiegu wykonania print doskonale się do tego nadaje. Program się zawiesza Nieskończona pętla lub rekurencja. Należy zlokalizować problematyczną pętlę i sprawdzić co się dzieje z warunkiem. while x > 0 and y < 0 : \{ // do something to x // do something to y p r i n t "x : ", x, "y : ", y p r i n t " c o n d i t i o n : ", ( x > 0 and y < 0) P. Daniluk(Wydział Fizyki) WP w. V Jesień 2014 17 / 33

Błędy wykonania wyjątki Błędy arytmetyczne OverflowError przepełnienie obliczona wartość jest zbyt duża ZeroDivisionError dzielenie przez zero FloatingPointError błąd operacji zmiennoprzecinkowej Brak elementu IndexError w liście KeyError w słowniku NameError zmienna/funkcja nie istnieje AttributeError atrybut nie istnieje TypeError błąd typu (np. liczba w zamiast napisu) KeyboardInterrupt naciśnięto Ctrl+C P. Daniluk(Wydział Fizyki) WP w. V Jesień 2014 18 / 33

Błędy wykonania kiedy wszystko zawodzi Zmniejsz rozmiar danych. Usuń nieistotne fragmenty kodu. Znajdź minimalną wersję, która zawiera błąd. Jeżeli zmiana, która nie powinna mieć efektu, zmienia działanie programu, należy zwrócić na to uwagę. P. Daniluk(Wydział Fizyki) WP w. V Jesień 2014 19 / 33

Błędy logiczne program działa, ale źle Należy zrozumieć, co program naprawdę robi. Czy program ewidentnie powinien coś robić, ale nie robi? Czy robi coś czego nie powinien? Czy jakiś kawałek kodu daje niespodziewany rezultat? Częste błędy Dzielenie liczb całkowitych daje całkowity wynik. Operacje na liczbach zmiennoprzecinkowych nie są dokładne. Operator przypisania (=) zamiast (==). P. Daniluk(Wydział Fizyki) WP w. V Jesień 2014 20 / 33

Kiedy wszystko zawodzi Komputery emitują fale zaburzające pracę mózgu, które powodują: frustrację i gniew przesądność ( komputer mnie nienawidzi ) i myślenie magiczne ( program działa wyłącznie, gdy trzymam się za lewe ucho ) pesymizm ( ten program jest beznadziejny ) Metoda gumowej kaczki P. Daniluk(Wydział Fizyki) WP w. V Jesień 2014 21 / 33

Stacje benzynowe Problem Na zamkniętym torze znajduje się N stacji benzynowych. W ich zbiornikach jest w sumie dokładnie tyle paliwa, ile potrzeba do przejechania całego toru. Należy wskazać stację (o ile istnieje), od której można zacząć jazdę z pustym bakiem tak, aby tankując całe paliwo na odwiedzanych stacjach można było przejechać dookoła toru. Zakładamy, że samochód ma nieograniczenie duży zbiornik. Dane wejściowe liczba stacji odległości pomiędzy stacjami (położenie stacji na torze) ilość paliwa na stacjach P. Daniluk(Wydział Fizyki) WP w. V Jesień 2014 22 / 33

Stacje benzynowe c.d. Metoda Jeżeli istnieje stacja i, z której startując z pustym bakiem można dojechać do następnej stacji (i + 1), to rozwiązania zadania dla układu, w którym paliwo z i + 1 jest w i, jest rozwiązaniem dla problemu wyjściowego. P. Daniluk(Wydział Fizyki) WP w. V Jesień 2014 23 / 33

Stacje benzynowe c.d. Metoda Jeżeli istnieje stacja i, z której startując z pustym bakiem można dojechać do następnej stacji (i + 1), to rozwiązania zadania dla układu, w którym paliwo z i + 1 jest w i, jest rozwiązaniem dla problemu wyjściowego. Algorytm 1 Znaleźć odpowiednią parę kolejnych stacji 2 Przelać paliwo 3 Tak postępować, aż całe paliwo będzie na jednej stacji. P. Daniluk(Wydział Fizyki) WP w. V Jesień 2014 23 / 33

Stacje benzynowe c.d. Metoda Jeżeli istnieje stacja i, z której startując z pustym bakiem można dojechać do następnej stacji (i + 1), to rozwiązania zadania dla układu, w którym paliwo z i + 1 jest w i, jest rozwiązaniem dla problemu wyjściowego. Algorytm 1 Znaleźć odpowiednią parę kolejnych stacji 2 Przelać paliwo 3 Tak postępować, aż całe paliwo będzie na jednej stacji. Nie wiadomo, które stacje wybierać, ani jak je znajdować. P. Daniluk(Wydział Fizyki) WP w. V Jesień 2014 23 / 33

Stacje benzynowe c.d. Reprezentacja danych n liczba stacji dist lista zawierająca odległości fuel lista zawierająca ilość paliwa P. Daniluk(Wydział Fizyki) WP w. V Jesień 2014 24 / 33

Rozwiązanie chaotyczne n = 5 d i s t = [ 2 3, 4 5, 1 3, 3 3, 3 0 ] f u e l = [ 3 0, 2 3, 4 5, 1 3, 3 3 ] c n t = n w h i l e c n t > 1 : f o r i i n range ( n ) : i f f u e l [ i ] > 0 : d = d i s t [ i ] pos = ( i + 1) % n #n e x t ( i ) w h i l e f u e l [ pos ] == 0 : # next_nonempty ( i ) d += d i s t [ pos ] pos = ( pos + 1) % n #n e x t ( i ) p r i n t p r i n t d i s t f u e l i f f u e l [ i ] >= d : f u e l [ i ] += f u e l [ pos ] f u e l [ pos ] = 0 c n t = 1 P. Daniluk(Wydział Fizyki) WP w. V Jesień 2014 25 / 33

DRY - Don t Repeat Yourself def next ( i ) : r e t u r n ( i + 1) % n w h i l e c n t > 1 : f o r i i n range ( n ) : i f f u e l [ i ] > 0 : d = d i s t [ i ] pos = next ( i ) w h i l e f u e l [ pos ] == 0 : # next_nonempty ( i ) d += d i s t [ pos ] pos = next ( pos ) i f f u e l [ i ] >= d : f u e l [ i ] += f u e l [ pos ] # pump( i, pos ) f u e l [ pos ] = 0 c n t = 1 P. Daniluk(Wydział Fizyki) WP w. V Jesień 2014 26 / 33

Modularyzacja def next ( i ) : r e t u r n ( i + 1) % n def next_nonempty ( i ) : d = d i s t [ i ] pos = next ( i ) w h i l e f u e l [ pos ] == 0 : d += d i s t [ pos ] pos = next ( pos ) r e t u r n ( pos, d ) def pump( to, f r ) : f u e l [ to ] += f u e l [ f r ] f u e l [ f r ] = 0 w h i l e c n t > 1 : f o r i i n range ( n ) : i f f u e l [ i ] > 0 : pos, d = next_nonempty ( i ) i f f u e l [ i ] >= d : pump( i, pos ) c n t = 1 P. Daniluk(Wydział Fizyki) WP w. V Jesień 2014 27 / 33

Optymalizacja 1 def n e x t _ u n r e a c h a b l e ( i ) : d = d i s t [ i ] f = f u e l [ i ] pos = next ( i ) w h i l e f >= d and pos!= i : d += d i s t [ pos ] f += f u e l [ pos ] pos = next ( pos ) r e t u r n pos w h i l e c n t > 1 : f o r i i n range ( n ) : i f f u e l [ i ] > 0 : pos = n e x t _ u n r e a c h a b l e ( i ) j = next ( i ) w h i l e j!= pos : pump( i, j ) c n t = 1 j = next ( j ) Zamiast szukać niepustej stacji można szukać pierwszej, do której nie można dojechać. P. Daniluk(Wydział Fizyki) WP w. V Jesień 2014 28 / 33

Optymalizacja 2 i = 0 w h i l e c n t > 1 : pos = n e x t _ u n r e a c h a b l e ( i ) j = next ( i ) w h i l e j!= pos : pump( i, j ) c n t = 1 j = next ( j ) i = pos Nie trzeba sprawdzać stacji już opróżnionych. P. Daniluk(Wydział Fizyki) WP w. V Jesień 2014 29 / 33

Optymalizacja 3 def n e x t _ u n r e a c h a b l e ( i ) : d = d i s t [ i ] f = f u e l [ i ] pos = next ( i ) c n t = 0 w h i l e f >= d and pos!= i : d += d i s t [ pos ] f += f u e l [ pos ] pump( i, pos ) c n t += 1 pos = next ( pos ) r e t u r n pos, c n t i = 0 w h i l e c n t > 1 : pos, c = n e x t _ u n r e a c h a b l e ( i ) c n t = c i = pos Można przepompowywać paliwo w momencie sprawdzania, czy da się pojechać dalej. P. Daniluk(Wydział Fizyki) WP w. V Jesień 2014 30 / 33

Optymalizacja 4 n s t a = r a n g e ( 1, 5) + [ 0 ] d e f n e x t ( i ) : r e t u r n n s t a [ i ] d e f n e x t _ u n r e a c h a b l e ( i ) : pos = n e x t ( i ) c n t = 0 w h i l e f u e l [ i ] >= d i s t [ i ] and pos!= i : pump ( i, pos ) c n t += 1 pos = n e x t ( pos ) r e t u r n pos, c n t d e f pump ( to, f r ) : d i s t [ t o ] += d i s t [ f r ] f u e l [ t o ] += f u e l [ f r ] n s t a [ t o ] = n s t a [ f r ] f u e l [ f r ] = 0 i = 0 w h i l e c n t > 1 : pos, c = n e x t _ u n r e a c h a b l e ( i ) c n t = c i = pos Zamiast szukać następnej niepustej stacji można przechowywać jej numer. P. Daniluk(Wydział Fizyki) WP w. V Jesień 2014 31 / 33

Ostateczny program n s t a = range ( 1, 5 ) + [ 0 ] c n t = n def next ( i ) : r e t u r n n s t a [ i ] def pump( to, f r ) : d i s t [ to ] += d i s t [ f r ] f u e l [ to ] += f u e l [ f r ] n s t a [ to ] = n s t a [ f r ] f u e l [ f r ] = 0 i = 0 w h i l e c n t > 1 : pos = next ( i ) i f f u e l [ i ] >= d i s t [ i ] : pump( i, pos ) c n t = 1 pos = next ( pos ) i = pos Wystarczy jedna pętla. P. Daniluk(Wydział Fizyki) WP w. V Jesień 2014 32 / 33

Strona wykładu http://bioexploratorium.pl/wiki/wstęp_do_programowania 2014z P. Daniluk(Wydział Fizyki) WP w. V Jesień 2014 33 / 33