załadowany td

Transkrypt

załadowany td
Informatyka MT DI 1
Wykład 4
Algorytmy
Schematy blokowe
Inżynieria programowania
Rozwój języków programowania
ALGORYTMY
Algorytm
jest to sformalizowany ciąg
logicznie powiązanych instrukcji (poleceń,
rozkazów), których wykonanie pozwoli na
przetworzenie informacji wejściowych (danych)
w informacje wyjściowe (wyniki).
Algorytm - rozwiązywanie "krok po kroku" dowolnego
problemu.
Algorytm ma przeprowadzić system z pewnego
stanu początkowego do pożądanego stanu
końcowego.
Badaniem algorytmów zajmuje się algorytmika.
Każdy algorytm komputerowy musi być wprowadzony
do komputera w bardzo rygorystycznie
zdefiniowanym języku - jednoznaczne instrukcje.
Jeżeli dany algorytm da się wykonać na maszynie o
dostępnej mocy obliczeniowej i pamięci oraz
akceptowalnym czasie, to mówi się że jest algorytm
obliczalny.
Algorytm – przepis niezależny od implementacji
Program – zastosowanie algorytmu w języku zrozumiałym
przez komputer
Proces – załadowany do pamięci i wykonywany program
Czynności służące do rozwiązania zadania:
• analiza treści zadania
• wykaz danych wejściowych; wiadomych i
niewiadomych oraz relacji między nimi
• sprawdzenie czy zadanie posiada
jednoznaczne rozwiązanie
• wybór metody rozwiązania zadania
• opis czynności dla wybranej metody
rozwiązania
• sporządzenie i przedstawienie wyników
rozwiązania zadania
Sposoby zapisu algorytmów
• Opis słowny (pseudokod) - przedstawienie
kolejnych czynności (akcji) na elementach
(danych). Przykład: przepis kulinarny
• Schemat blokowy – operacje na danych
przedstawione graficznie w postaci
elementarnych bloków.
ZASADY BUDOWY SCHEMATU BLOKOWEGO
1) Każda operacja jest umieszczona w bloku
2) Schemat ma tylko jeden blok "START"
i przynajmniej jeden blok "STOP"
3) Bloki mają połączenia ukierunkowane (strzałki)
4) Z bloku wychodzi jedno połączenie;
wyjątki:
- "STOP" (nie wychodzą żadne połączenia)
- blok "warunkowy" ( wychodzą dwa połączenia
opisane TAK i NIE)
5) W bloku "operacyjnym" odbywa się nadanie
wartości (przypisanie) znak "="
Reguły graficzne tworzenia schematów blokowych
Start i stop
START
Operacje wejścia
wczytaj a,b
Instrukcja wykonawcza (proces)
blok operacyjny
oblicz
suma=a+b
Łącznik stronicowy
1
STOP
i wyjścia
pisz suma, wynik
Blok decyzyjny
?
TAK
suma>0
NIE
Klasy problemów
• algorytmy obliczeniowe ( - np. całkowanie
numeryczne, obliczanie funkcji z sumy wyrazów
ciągu, wyznaczanie liczb pierwszych, zamiana
systemów liczbowych itp.)
• algorytmy sortujące
• algorytmy wyszukujące
• algorytmy kompresji
• inne
Metodyka
• algorytm "krok po kroku"
• algorytmy rekurencyjne
• algorytmy genetyczne
• algorytmy sztucznej inteligencji
Dla utworzenia algorytmu konieczne są:
• opis elementów do przechowywania danych
wejściowych, danych pośrednich i wyników
• opis czynności jakie należy wykonać z obiektami,
co realizujemy przy pomocy instrukcji, które opisują:
sposób działania
kolejność ich wykonywania
ewentualne warunki jakie muszą być spełnione
• opis wyników - zawiera sposób udostępnienia
wyników rozwiązanego zadania
Zmienna służy do identyfikacji wartości i jej
przechowywania w trakcie przebiegu
programu
Każda zmienna jest określonego typu (liczba,
tekst, tablica itp.) - tworzona w pamięci
komputera w momencie nadania jej wartości
5.78
x
nazwa
(identyfikator)
wartość typu liczbowego
Rodzaje sieci działań
Proste (sekwencyjne) - kolejność realizacji poszczególnych
operacji jest ściśle określona i żadna z nich nie może być
pominięta ani powtórzona - nie używa się bloków
warunkowych.
Z rozwidleniem - zawiera w sobie wybór jednej z kilku
możliwych dróg realizacji danego zadania, istnieje przynajmniej
jeden blok warunkowy.
Z pętlą, często w trakcie realizacji zadania konieczne jest
powtórzenie niektórych operacji różniących się zestawem
danych. Pętla obejmuje tę część bloków, która ma być
powtarzana.
Złożone - będące kombinacją powyższych sieci.
Przykład
W algorytmach sortowania elementów zbioru potrzebny
jest mechanizm zamiany wartości umieszczonych w
dwóch zmiennych, jeśli są w niewłaściwej kolejności
Algorytm wymaga zmiennej pomocniczej (jak do
zamiany zawartości dwóch szklanek potrzebna jest
trzecia szklanka)
Opis słowny:
1. Wczytaj dane do obiektów 1 i 2
2. Przepisz zawartość obiektu 1 do obiektu pomocniczego
3. Przepisz zawartość obiektu 2 do obiektu 1
4. Przepisz zawartość obiektu pomocniczego do obiektu 1
5. Wyprowadź wartości obiektów 1 i 2
wczytaj a,b
pom=a
a=b
b=pom
drukuj a, b
Prosty schemat
blokowy:
Zamiana wartości
w dwóch
zmiennych
obiekt
pomocniczy
3
1
A
B
2
Przykład 2 – z blokiem decyzyjnym i pętlą
Ile razy trzeba podzielić na pół daną liczbę, aby uzyskać
wartość mniejszą od ε
Pseudokod:
1. Wczytaj liczbę i ε
2. Ustal wartość licznika równą 0
3. Podziel liczbę przez 2
4. Zwiększ licznik o 1
5. Sprawdź czy wynik jest mniejszy od ε, jeśli tak, to
przejdź do punktu 6, jeśli nie to wróć do punktu 3
6. Wyprowadź wartość licznika
wczytaj liczba, ε
schemat
blokowy
licznik=0
liczba=liczba/2
licznik=licznik+1
liczba< ε
TAK
drukuj licznik
NIE
czy algorytm
jest
poprawny??
A może tak
Który z tych
algorytmów jest
poprawny?
wczytaj liczba, ε
licznik=0
licznik=licznik+1
liczba< ε
NIE
liczba=liczba/2
TAK
drukuj licznik
Widzimy, że
potrzebna jakaś
ocena
poprawności
A więc, aby tworzyć efektywne algorytmy i móc je
aplikować programowo, potrzebne są następujące
elementy:
Spektrum obiektów programowych,
możliwość ich odróżniania, klasyfikacja do
typu, umieszczanie ich identyfikatorów
(nazw) i wartości w pamięci
Spektrum operacji (operatorów nadawania
wartości, arytmetycznych, porównania) –
operacje na obiektach!
Mechanizm sterowania – co wykonać
następnie po aktualnej operacji
Algorytmy wyszukiwania ekstremum
najczęściej w obiektach indeksowanych czyli tablicach
X[indeks elementu]
• Wyszukaj ekstremalną maksymalną wartość
(numerycznie lub tekst w sensie alfabetycznym)
• Zbadaj, który ! element ma ekstremum
Najprostszy algorytm znalezienia minimum w zbiorze:
1. zakładamy, że min=X[k] dla k=1 !!! pierwszy element
2. k=2
3. zbadaj czy k=N jeśli tak to zakończ, jeśli nie rób dalej
4. zbadaj czy X[k] <min, jeśli tak to min=X[k], jeśli nie to
rób dalej
5. nowe k=k+1 i wróć do punktu 3
Algorytmy sortujące
Sortowanie bąbelkowe
Algorytm polega porównywaniu kolejnych par elementów
sąsiadujących i zamianie miejscami w przypadku
niewłaściwej kolejności
1
2
3
4
.....
N-1 porównań
Wykonujemy N przebiegów
N
1 przebieg
12
5
5
5
5
5
2 przebieg
5
5
5
5
5
5
3 przebieg
5
4
4
4
4
4
4 przebieg
4
4
4
4
4
4
5
12
11
11
11
11
11
11
12
4
4
4
4
4
4
12
7
7
7
7
7
7
12
2
2
2
2
2
2
12
11
11
4
4
4
4
4
4
11
7
7
7
7
7
7
11
2
2
2
2
2
2
11
11
12
12
12
12
12
12
4
5
5
5
5
5
7
7
7
2
2
2
2
2
2
7
7
7
11
11
11
11
11
11
12
12
12
12
12
12
5
5
2
2
2
2
2
2
5
5
5
5
7
7
7
7
7
7
11
11
11
11
11
11
12
12
12
12
12
12
zamiana 1
zamiana 2
zamiana 3
zamiana 4
zamiana 5
efekt ostatniej zamiany – największy na końcu
N=6
zmiana 6
zmiana 7
zmiana 8
zauważamy nadmiarowe porównania
zamiana 9
zamiana 10
zauważamy nadmiarowe porównania
zamiana 11
5 przebieg
4
2
2
2
2
2
6 przebieg
2
2
2
2
2
2
4
4
4
4
4
5
5
5
5
5
5
7
7
7
7
7
7
11
11
11
11
11
11
12 zmiana 12
12
12
12
12
12
4
4
4
4
4
5
5
5
5
5
7
7
7
7
7
11
11
11
11
11
12
12
12
12
12
30 operacji= (N-1)*N=6*5
Sortowanie bąbelkowe skrócone
Algorytm polega na porównywaniu kolejnych par
elementów sąsiadujących, z tym, że w każdym
kolejnym przebiegu liczba analizowanych par jest
zmniejszana o 1
Przebiegów wykonujemy N-1
1 przebieg
12
5
5
5
5
5
5
12
11
11
11
11
11
11
12
4
4
4
4
4
4
12
7
7
7
7
7
7
12
2
2
2
2
2
2
12
zamiana 1
zamiana 2
zamiana 3
zamiana 4
zamiana 5
efekt
5
5
5
5
5
11
11
4
4
4
4
4
11
7
7
7
7
7
11
2
2
2
2
2
11
12
12 zamiana 6
12 zamiana 7
12 zamiana 8
12
efekt
5
4
4
4
4
5
5
5
7
7
7
2
2
2
2
7
11
11
11
11
12 zamiana 9
12
12 zamiana 10
12
efekt
4
4
4
5
5
2
2
2
5
7
7
7
11
11
11
12
12 zamiana 11
12
efekt
4
2
2
4
5
5
7
7
11
11
12 zamiana 12
12
efekt
5
2 przebieg
4
15 operacji
3 przebieg
3
4 przebieg
2
5 przebieg
1
1 przebieg
12
5
5
4
4
2
5
12
12
12
12
12
11
11
11
11
11
11
4
4
4
5
5
5
7
7
7
7
7
7
2
2
2
2
2
4
zamiana 1
2
2
2
2
2
12
11
5
5
4
11
12
12
12
12
5
5
11
11
11
7
7
7
7
7
4
4
4
4
5
2
2
2
2
4
4
4
4
12
11
7
5
11
12
12
12
7
7
11
11
5
5
5
7
zamiana 7
zamiana 8
zamiana 9
2
2
2
4
4
4
5
5
5
12
11
7
11
12
12
7
7
11
zamiana 10
zamiana 11
2
2
4
4
5
5
7
7
12
11
11
12
zamiana 12
zamiana 2
zamiana 3
najmniejszy na początku
2 przebieg
zamiana 4 .. więc zaczynamy od 2-go
zamiana 5
zamiana 6
3 przebieg
4 przebieg
5 przebieg
15 operacji
Podstawy programowania
Do 1954 roku – język maszynowy (Eniac, Mark I- USA)
Kodowanie instrukcji procesora w postaci ciągu liczb
dwójkowych (elementarny rozkaz i dane)
- pracochłonność (same liczby, długie algorytmy
działań takich jak dodawanie i mnożenie) – np.
rzymskie
- trudność śledzenia błędów
lata 50-te
zastąpienie kodów operacji nazwami mnemotechnicznymi
np. mnożenie MPY (multiply)
język symboliczny - assembler
ASSEMBLER – także program tłumaczący na kod
maszynowy (wewnętrzny)
DISSASSEMBLER – tłumaczenie odwrotne
stosowany do dziś – np. oprogramowanie interfejsów
pomiarowych, wprowadzanie danych z pomiarów i ich
obróbka komputerowa
CECHY:
•
•
•
•
•
•
zmniejszona ale nadal duża pracochłonność
błędy – prawie każda kombinacja znaków mogła
być wykonana
ukierunkowanie na konkretny komputer
(procesor) dla którego program był pisany
wąski zbiór rozkazów, prymitywna architektura
ówczesnych komputerów,
brak rejestrów,
brak operacji zmiennoprzecinkowych
Etap przejściowy – tzw. systemy automatycznego
programowania – „sztuczki” programistyczne
1954 – FORTRAN – języki tzw. wysokiego poziomu
(kod maszynowy i assembler to niski poziom – bliski procesorowi)
Fortran (Formula Translator)
Zapis operacji w sposób łatwiejszy, zrozumiały i dobrze
kontrolowany przez programistę
Po stworzeniu kodu programu w języku następuje proces
translacji (tłumaczenia, kompilacji) na język wewnętrzny
komputera.
Problemy:
- zrozumiałość
- jednoznaczność
- skuteczność tłumaczenia
Języki wysokiego poziomu po etapie
początkowym stały się maszynowo niezależne z
powodu wielu wersji translatorów (programów
kompilujących)
COBOL – dla przedsiębiorstw, język prawie naturalny (ang)
MULTIPLY – mnożenie, ADD – dodawanie, czy dobrze??
Do dziś specjaliści potrzebni (w USA 500 $/godz za zmiany daty w
2000)
W kolejnych latach - obfitość języków programowania
BASIC, LOGO – prostota, interpretacja w odróżnieniu od
kompilacji, tłumaczenie „na bieżąco” każdej instrukcji a nie
programu w całości
PASCAL, C, C+, C++ - języki strukturalne z elementami tzw.
programowania obiektowego
OOP (Object Oriented Programming) – języki zorientowane
obiektowo (PROLOG, Visual Basic, Turbo Vision dla Pascala,
Delphi, Java) – o tym później
Klasyfikacja języków programowania
- do przetwarzania danych: COBOL, Dbase, SQL
- do obliczeń naukowych : Fortran, Pascal (w zasadzie uniwersalne)
- do programowania systemowego – tworzenie systemów
operacyjnych: C, BCPL, BLISS
- opisu poleceń - DOS, MVS
- konwersacyjne: LISP, zmiany z terminala w trakcie konwersacji
- symulacyjne – symulacja procesów (najczęściej w czasie
rzeczywistym): mechanika, elektronika, termodynamika itp. – SIMULA,
CSSL
- dla potrzeb internetu: HTML, PHP, JavaScript, ASP i inne
- algorytmiczne (większość): programowanie to zapis sposobu wykonania
- niealgorytmiczne: nie jak ale co ma być zrobione – sterowanie nie
algorytmem lecz danymi – problematyka sztucznej inteligencji
- obiektowe – pewien zbiór danych (obiekty) są aktywne i mają swoje
cechy (własności); poprzez zdarzenia (zwykle wymuszone przez
użytkownika ale nie tylko) mogą te własności zmieniać lub wywoływać
akcje obliczeniowe
- specjalizowane – ukierunkowane na pewną klasę problemów, np.
analizę układów elektronicznych itp.
CO TO JEST JĘZYK PROGRAMOWANIA ?
DANE – reprezentują świat rzeczywisty lub abstrakcyjny i opis jego
obiektów
OBIEKTY mają przypisany zbiór operacji – działań na tych obiektach
Alfabet języka - skończony zbiór znaków.
Słowo - skończony ciąg znaków alfabetu
Język formalny- zbiór słów nad określonym alfabetem
Język programowania – zbiór konwencji i umów
umożliwiających komunikatywność (zrozumiałość) umów (dla
kompilatora).
Określa się przy tym:
• syntaktykę (składnię) języka - zbiór reguł opisujących
poprawne konstrukcje językowe
• semantykę - zasady interpretacji tych konstrukcji
Błędy składniowe – np. zapomnieć słowa
kluczowego instrukcji lub je przekręcić
Błędy semantyczne – zły typ danych, licznik pętli
nie jest typu całkowitego, j=0; k=1/j (dzielenie
przez zero), nie ma pliku do czytania itp.
Jeżeli ponadto:
- syntaktyka pozwala na analizę poprawności
konstrukcji językowych
- opis języka obejmuje pragmatykę (zalecenia
do używania poprawnych struktur)
to język formalny może być językiem
programowania.
Identyfikacja danych dzięki nadanej nazwie
dana ⇒(nazwa danej, typ danej, wartość danej)
deklaracje, definicje - opisy danych
instrukcje
- czynności na danych
Program - algorytm zapisany
w języku programowania
Podprogram - wyodrębniona część programu
(ze względu na czytelność lub wielokrotne użycie)
posiadająca wyodrębnioną nazwę i sposób
wymiany informacji z pozostałymi jego częściami
Definicja podprogramu - opis działania podprogramu wraz z
jego nazwą, określeniem potrzebnych danych wejściowych i
zwracanych wyników
Instrukcja wywołania podprogramu – wykonanie, zastosowanie
podprogramu wewnątrz programu głównego (lub innego
podprogramu)
Kod źródłowy - tekst programu w języku programowania (zwykle
plik tekstowy)
Kompilacja – tłumaczenie całego kodu źródłowego na
wykonywaną postać binarną, ładowalną (plik exe) – odrębny
proces (wyszukanie wszystkich błędów, jeśli co najmniej jeden
błąd to program się nie wykona)
Interpretacja – tłumaczenie kolejnych instrukcji w trakcie procesu
wykonywania (wykonają się kolejne poprawne instrukcje, aż do
instrukcji z błędem)
Przetwarzanie programu użytkowego
Komunikaty
o błędach
postać
źródłowa
programu
EDYCJA
wyniki
postać
ładowalna
Kompilacja
Wykonanie
parametry
dane
PROGRAMISTA
W przypadku przetwarzania programu,
wymagającego wykorzystania programów
bibliotecznych, uzyskany po procesie kompilacji
kod wynikowy należy poddać procesowi
łączenia, konsolidacji (link) z kodami
dołączanymi a następnie wykonać kod
ładowalny.
Sposoby pisania programu:
• program źródłowy utworzony dowolnym
edytorem tekstu – kompilacja – konsolidacja (link
– łączenie z podprogramami bibliotecznymi
(modułami)- wykonanie
lub
• korzystanie ze zintegrowanych pakietów
programistycznych (wewnętrzne narzędzia
edycji, kompilacji i konsolidacji, weryfikacji
błędów itp.)
Co świadczy o przydatności i skuteczności języka programowania
•
•
•
•
•
•
•
•
•
•
Dobra notacja, przejrzystość, prostota (łatwość przyswojenia
zasad)
Jednoznaczność zapisu
Funkcjonalność
Weryfikacyjność – test błędów, czasem te cechy w
sprzeczności bo deklaracje explicite poszerzają strukturę
programu ale ułatwiają kontrolę zmiennych, np. błąd literowy
w nazwie obiektu bez deklaracji to nowa zmienna albo błąd
braku deklaracji
Elastyczna opisywalność obiektów: np. data to liczby, pewne
operacje liczbowe dopuszczalne, ale np. dzielenie dwóch dat
jest bezsensowne
Czytelność struktury programu
Dostępność
Cena
Efektywność – skuteczność kompilacji, szybkość programu
wynikowego
Dobra dokumentacja

Podobne dokumenty