JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM Wykład 2 1
3. Pseudokod (zwykle jako lista kroków) o o o o o o ZAPIS ALGORYTMU Brak standardu. Najczęściej PASCAL pozbawiony informacji dla kompilatora (i czasem przetłumaczony na polski). Nie zawiera szczegółów implementacyjnych (np. inicjalizacja zmiennych, alokacja pamięci itp.). Nietrywialnie kroki algorytmu opisywane są z pomocą formuł matematycznych lub zdań w języku naturalnym. Zaleta: bardzo łatwa implementacja algorytmu za pomocą wybranego, istniejącego języka programowania. Wada: mniejsza przejrzystość zapisu (niż przy schemacie blokowym). albo: np. algorytm Euklidesa: 2
KLASYFIKACJA ALGORYTMÓW o proste i rozgałęzione; o cykliczne i mieszane; o sekwencyjne i równoległe/współbieżne; o numeryczne i nienumeryczne; o iteracyjne i rekurencyjne ; iteracja: wielokrotne wywołanie sekwencji poleceń aż do spełnienia warunku sterującego rekurencja: wywołanie procedury z wewnątrz tej samej procedury Żeby zrozumieć rekurencję trzeba najpierw zrozumieć rekurencję... 3
STRUKTURY DANYCH Struktura danych (ang. data structure) to sposób uporządkowania informacji w komputerze. Rozwiązując problem (nie tylko z użyciem komputera!) przyjmuje się pewien model rzeczywistości, np. należy określić jak przedstawić dane mające tą rzeczywistość reprezentować. Wykorzystuje się pewne specyficzne zbiory danych (struktury danych), które charakteryzują się: o różną wewnętrzną strukturą ułożenia danych; o różnym sposobem zapisu i dostępu do tych danych. Na strukturach danych operują algorytmy. Dobór struktur danych wpływa na złożoność obliczeniową algorytmu! 4
STRUKTURY DANYCH Wybór odpowiednich struktur danych uzależniamy od: o rozwiązywanego problemu; o możliwości obliczeniowych komputera; o przewidywanych operacji, jakie na danych będą wykonywane; o wykorzystywanego języka programowania (wiele języków programowania dostarcza biblioteki standardowe z zaimplementowanymi różnorodnymi strukturami danych). Przykładowe struktury danych: o tablica; o rekord lub struktura; o lista; o stos; o kolejka; o drzewo. 5
STRUKTURY DANYCH Tablica o jednorodna struktura, która składa się z elementów tego samego typu; o charakteryzuje się swobodnym dostępem do danych; o rozmiar tablicy jest albo ustalony z góry (tablice statyczne), albo może się zmieniać w trakcie wykonywania programu (tablice dynamiczne); o składowe tablicy są indeksowane (zazwyczaj numerycznie ) umożliwia to łatwy dostęp do składowych); o w matematyce odpowiednikiem tablicy jednowymiarowej jest ciąg, a tablicy dwuwymiarowej macierz; o praktycznie wszystkie języki programowania obsługują tablice. np. w C/C++: int t[5]; // statyczna tablica 5 obiektów typu całkowitego wrócimy do tego tematu... 6
STRUKTURY DANYCH Rekord lub struktura o złożony typ danych występujący w wielu językach programowania, grupujący logicznie powiązane ze sobą dane różnego typu w jednym obszarze pamięci; o składowe struktury pola mają swe unikatowe nazwy; o struktury są powszechnie stosowane w programowaniu pozwalają w przejrzysty sposób opisywać złożone obiekty. np. deklaracja struktury w Fortranie 90/95: TYPE::wojewodztwo INTEGER(KIND=4)::mieszkancy CHARACTER(30)::stolica END TYPE wojewodztwo i definicja: zachodniopomorskie = wojewodztwo(1715500, Szczecin ) 7
STRUKTURY DANYCH Lista (alternatywa dla tablicy) o struktura danych służąca do reprezentacji zbiorów dynamicznych, w której elementy (rekordy) ułożone są w liniowym porządku. o możliwość dodawania i usuwania obiektów w dowolnym miejscu listy; o dwa podstawowe typy: ojednokierunkowa (z każdego elementu można przejść do jego następnika); odwukierunkowa (można przejść zarówno do poprzednika jak i następnika); oponadto: listy cykliczne (pierwszy i ostatni rekord listy są ze sobą połączone). o Każdy element listy (rekord) składa się z co najmniej dwóch pól: danych oraz pola wskazującego na następny element listy (w listach dwukierunkowych także pole wskazujące poprzedni element). pusty wskaźnik korzeń listy https://pl.wikibooks.org/wiki/struktury_danych/listy 8
STRUKTURY DANYCH Stos o liniowa struktura danych; o dane są dokładane na wierzch stosu i wyłącznie stąd są pobierane (bufor LIFO Last In, First Out); o zastosowania: np. zapamiętywanie rejestrów procesora i przechowywanie zmiennych lokalnych; o do implementacji stosu o stałym rozmiarze n wystarczy n-elementowa tablica i jedna zmienna przechowująca aktualną liczbę elementów https://pl.wikibooks.org/wiki/struktury_danych/stosy 9
STRUKTURY DANYCH Kolejka o liniowa struktura danych będąca przeciwieństwem stosu; o dane są dopisywane są na końcu kolejki a pobierane wyłącznie z jej początku (bufor FIFO First In, First Out); o zastosowania: np. sytuacje związane z różnego rodzaju obsługą zdarzeń; o implementacja zwykle z zastosowaniem tablic. https://pl.wikibooks.org/wiki/struktury_danych/kolejki 10
Drzewo STRUKTURY DANYCH https://pl.wikibooks.org/wiki/struktury_danych/drzewa o struktura nieliniowa; o rodzaj grafu (graf skierowany, spójny i acykliczny); o struktura danych reprezentująca hierarchię danych; o ułatwia i przyspiesza wyszukiwanie; o składowe: wierzchołki (węzły) oraz łączące je krawędzie. Jeden z wierzchołków jest wyróżniony i nazywany korzeniem drzewa; o każdy węzeł ma dokładnie jednego rodzica, za wyjątkiem korzenia, który nie ma rodzica; o drzewo binarne: każdy wierzchołek na co najwyżej 2 dzieci; o zastosowania: np. bazy danych, grafika komputerowa, przetwarzanie tekstu. 11
PROGRAMOWANIE Podejścia do pisania programów komputerowych 1. Z dołu (bottom-up, wstępujące, syntetyczne) o najpierw są rozwiązywane wszystkie (elementarne) podproblemy, które mogą być potrzebne o następnie ich wyniki są używane do rozwiązywania większych podproblemów. 2. Z góry (top-down, zstępujące, analityczne ) o problem jest dzielony na podproblemy; o podproblemy są rozwiązywane, a wyniki zapamiętywane, jeżeli będą użyte później. 12
PROGRAMOWANIE Czas potrzebny na napisanie programu: 1. Koncypowanie (30-35%) 2. Kodowanie (20-25%) 3. Testowanie i usuwanie błędów (pozostały czas) Siedem złotych reguł (ogólnych!) str. 693 1. Zawsze planuj. Błędem jest rozpoczynanie pisania programu bez uprzedniego sporządzenia planu ukazującego strukturę programu i różne poziomy szczegółowości. 2. Podziel pracę na etapy. W programie dowolnego rozmiaru konieczne jest niezależne opracowanie każdej część programu. 3. Podziel program na moduły. Stosowanie procedur i modułów, które mogą być pisane i badane niezależnie jest szczególnie istotne w przypadku dużych programów. 13
PROGRAMOWANIE 4. Nie komplikuj. Skomplikowany program jest zazwyczaj zarówno nieefektywny jak i podatny na błędy. 5. Dokładnie przetestuj. Możliwie dokładnie przetestuj swój program na każdym etapie przygotowując się na tak wiele sytuacji (zarówno sensownych jak i bezsensownych), jak to możliwe. Zachowaj swoje dane testowe na przyszłość (rozbudowa programu) Nie ma programów bezbłędnie działających, są co najwyżej niedostatecznie przetestowane. 6. Dokumentuj. Nie ma nic gorszego, niż powrót do nieudokumentowane programu po pewnym czasie. Większość programów może być odpowiednio udokumentowana poprzez używanie sensownych nazw oraz przez włączenie stosownych komentarzy. Czas poświęcony na pisanie komentarzy zazwyczaj zwraca się po wielokroć! 7. Ciesz się programowaniem! Pisanie programów jest wyzwaniem i działalnością rozwijającą zdolność logicznego myślenia. Powinno być również przyjemne. Pamiętaj - poprawnie działający program to źródło ogromnej satysfakcji dla autora! 14
JĘZYKI PROGRAMOWANIA Język programowania: Forma zapisu instrukcji dla komputera i programów komputerowych. Postać programu wyrażona w języku programowania to kod źródłowy. Historia (pobieżnie): 1952 asemblery 1957 Fortran 1960 LISP 1960 Algol 1960 COBOL 1962 APL 1962 SIMULA 1964 BASIC 1964 PL/I 1971 Prolog 1972 C 1975 Pascal Do 1959 roku ok. 200 języków programowania! 1979 Modula-2 1980 dbase II 1983 Smalltalk-80 1983 Ada 1986 C++ 1987 Pearl 1988 Mathematica, 1995 Java, Visual Fortran 95, Ruby 2000 C# 15
JĘZYKI PROGRAMOWANIA 16
JĘZYKI PROGRAMOWANIA Generacje języków programowania Pierwszej generacji języki maszynowe: o instrukcje zapisywane w postaci binarnej, np.: 010100000000000001111111111111111100010011101000000010 Symboliczne języki programowania: pozwalają tłumaczyć (zrozumiałe dla człowieka) napisy na kod maszynowy (zrozumiały dla danego procesora). 17
JĘZYKI PROGRAMOWANIA Generacje języków programowania Drugiej generacji asemblery: o niskiego poziomu, składnia tożsama z maszynowym, zamiast liczb tzw. mnemoniki; o jedno polecenie odpowiada zasadniczo jednemu rozkazowi procesora; o wykonuje się na konkretnej maszynie działającej pod kontrolą danego systemu operacyjnego ; o np.: mov al, 12 mov ah, 0 ; wpisz do rejestru AX wartość 12 - wyzeruj starszą int 21h połówkę AX (czyli AH) i wpisz 12 do młodszej(al) ; wywołaj przerwanie nr 33 (21 szesnastkowo) 18
JĘZYKI PROGRAMOWANIA Generacje języków programowania Trzeciej generacji języki wysokiego poziomu, proceduralne: o jedna instrukcja jest tłumaczona na kilka (5-10) instrukcji procesora; o przykłady: o np.: - języki niestrukturalne (FORTH, BASIC); - języki strukturalne (FORTRAN, PASCAL, C); - języki zorientowane obiektowo (C++, Java); if(liczba==7) cout<< Liczba to 7 <<endl; else cout<< Liczba inna niż 7 <<endl; 19
JĘZYKI PROGRAMOWANIA Generacje języków programowania Czwartej generacji języki bardzo wysokiego poziomu, nieproceduralne: o najważniejszy problem a nie sposób jego rozwiązania; o składnia często przypomina język naturalny (np. SQL); o np.: SELECT * FROM pracownicy WHERE pensja > 2000 ORDER BY staz DESC; Piątej generacji języki sztucznej inteligencji: o najbardziej zbliżone do języka naturalnego; o inteligentne systemy wiedzy (systemy ekspertowe); o przykład: PROLOG (fr. Programmation en Logique, jeden z najpopularniejszych języków programowania logicznego) 20
JĘZYKI PROGRAMOWANIA (Orientacyjny) podział ze względu na zastosowanie: o skryptowe (np. skrypty powłoki systemu operacyjnego) o obsługi stron internetowych - po stronie serwera (np.: PHP, JSP) o obsługi stron internetowych - po stronie klienta (np.: JavaScript, ActionScript) o opisu dokumentów (np.: TeX, HTML) o opisu danych (np. XML) o przetwarzania tekstu i danych (np.: AWK, Perl) o programowania baz danych (np. PL/SQL) o ogólnego przeznaczenia (np.: C++, C#, Delphi, Java, Assembler) 21
JĘZYKI PROGRAMOWANIA Program (zapis algorytmu) może mieć postać: o źródłową - w konkretnym języku programowania; o kodu pośredniego - ciąg instrukcji wykonywanych przez interpreter; o binarną (skompilowaną) - ciąg instrukcji do bezpośredniego wykonania przez procesor. Interpretery: Np.: 1. Pobierają jedną instrukcję programu. 2. Tłumaczą ją na język maszynowy. 3. Przekazują do wykonania procesorowi. 4. Powracają do pkt. 1. BASIC, SQL, JavaScript 22
JĘZYKI PROGRAMOWANIA Kompilatory: o tłumaczą cały program na język maszynowy; o zapisują przetłumaczony program (w pamięci komputera, na dysku itp.); o skompilowany program jest gotowy do wykonania. Np.: Pascal, C, C++, Asembler (Zgrubne) porównanie: interpreter kompilator szybkość działania niska wysoka przenośność wysoka niska dodatkowe wymagania przy uruchamianiu niezbędny interpreter brak 23
JĘZYKI PROGRAMOWANIA Subiektywny (i bardzo krótki) przegląd języków programowania: FORTRAN ang. FORmula TRANslator Karta perforowana z podziałem na pola dla Fortranu IV. o pierwotnie (1957) zaprojektowany do zapisu programów obliczeniowych i jako język strukturalny; o obecnie (nadal rozwijany, Fortran 2008) język ogólnego przeznaczenia (również obiektowy). Cechy: o szybkość obliczeń (musiał konkurować z asemblerami); o doskonała skalowalność i przenośność (różne platformy sprzętowe i systemy operacyjne) o dostępność bibliotek dla programowania wieloprocesorowego i równoległego oraz bibliotek graficznych. o często obecnie stosowany np. do obliczeń aerodynamicznych, wytrzymałościowe i cieplnych. 24
JĘZYKI PROGRAMOWANIA BASIC (Beginner's All-purpose Symbolic Instruction Code) o napisany (1964) w oparciu o Fortran i Algol; o założenia: łatwość użytkowania, wszechstronność zastosowań, interaktywność i jasne komunikaty błędów; o istnieje ponad 200 różnych dialektów języka. Wybrane cechy: o starsze wersje - numerowanie wierszy (problem przy rozbudowie) o pętle konstruuje się za pomocą instrukcji skoku GOTO (trudny do zrozumienia kod) en.wikipedia.org/wiki/basic 25
JĘZYKI PROGRAMOWANIA Pascal o stworzony (1971) przez N. Wirtha z Politechniki w Zurychu jako język przeznaczony do nauki programowania strukturalnego; o nazwa na cześć nazwiska francuskiego fizyka, matematyka i filozofa Blaise Pascala; o popularność zdobył dzięki implementacji TurboPascal (1983) firmy Borland; Cechy: o rozbudowane struktury danych; o prosta składnia. https://pl.wikipedia.org/wiki/pascal(język_programowania) 26
JĘZYKI PROGRAMOWANIA Dlaczego języki wysokiego poziomu? o nie zmuszają programisty do zajmowania się takimi elementami budowy komputera, jak wewnętrzna reprezentacja danych, rejestry, kanały WE-WY itp; o możliwość (do pewnego stopnia) przenoszenia programów między procesorami i systemami; o zwięzłość programów (1 zdanie to ok. 10 instrukcji kodu maszynowego); o możliwość używania nazw zmiennych kojarzących się z danym problemem oraz wyrażeń matematycznych. Nie istnieje najlepszy język programowania... Jaki więc wybrać? To Państwa w ramach tego przedmiotu nie dotyczy, ale w innych przypadkach... 27
JĘZYKI PROGRAMOWANIA Np: Wybór języka na podstawie przedsięwzięcia: a) Wybierz język, który jest podobny do czegoś, co znasz. b) Wybierz język, do którego środowisko jest popularne i dostępne jest większa szansa, że ktoś odpowie na twoje pytania lub znajdziesz odpowiednią publikację. c) Wybierz język, do którego dostępne są biblioteki, przykłady lub moduły, mogące pomóc w realizacji zadania. Zwróć uwagę na ich: dostępność, zgodność, poprawność działania i licencję. d) Wybierz język, który oszczędzi Ci pracy jest relatywnie łatwy, patrz też: uwaga a) Wybieramy zatem język programowania i jest nim: C++ 28