Transcript for

Inżynieria Środowiska

Wykład 6 Inżynieria 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 to algorytm obliczalny .

Algorytm

– przepis niezależny od implementacji (NARZĘDZIA)

Program

– zastosowanie algorytmu w języku komputer zrozumiałym przez

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

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 Stop

START STOP

Operacje wejścia wczytaj a,b,x i wyjścia pisz suma, wynik Instrukcja wykonawcza (proces) blok operacyjny oblicz suma:=a+b Łącznik stronicowy 1 Blok decyzyjny suma>0 ?

TAK 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

Metodyka

• algorytm "krok po kroku" • algorytmy rekurencyjne • algorytmy genetyczne • algorytmy sztucznej inteligencji

Dla utworzenia algorytmu konieczne są:

• opis obiektó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

Aby zatem tworzyć działające programy wymagane są: - jakaś metoda wprowadzania i przechowania danych (liczb, tekstów itp.) - jakieś instrukcje, które umożliwią obliczenia wyników - jakieś metody pokazania wyniku

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 sortujących 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 schemat blokowy zamiany wartości w dwóch zmiennych

A 1 2 obiekt pomocniczy B 3

Przykład 2 – z blokiem decyzyjnym i pętlą Ile razy trzeba podzielić na pół daną liczbę, aby uzyskać wartość mniejszą od  Opis słowny : 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,  licznik:=0 liczba:=liczba/2 licznik:=licznik+1 liczba<  TAK drukuj licznik NIE schemat blokowy czy algorytm jest poprawny??

A może tak lepiej?

wczytaj liczba,  licznik:=0 liczba:=liczba/2 licznik:=licznik+1 liczba< 

TAK

drukuj licznik

NIE

A może jeszcze inaczej?

wczytaj liczba,  licznik:=0

Który z tych trzech algorytmów jest poprawny?

TAK

liczba< 

NIE

drukuj licznik licznik:=licznik+1 liczba:=liczba/2 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) –

na obiektach

!

operacje

Mechanizm

sterowania

aktualnej operacji – co wykonać następnie po

Optymalny algorytm wyszukiwania indeksu najmniejszego elementu (czyli numeru elementu) 1. Umieszczamy elementy w obiektach od x[1] do x[ n ] 2. Zmiennej pomocniczej min 3. Dla zmiennej

i

przypisujemy 1 od 2 do n-1 z krokiem co 2 wykonujemy: Zmiennej pomocniczej min_lok przypisujemy indeks mniejszej liczby z pary x[i], x[i+1] (czyli przypiszemy i lub i+1) jeśli element x[min_lok] jest mniejszy (w sensie użytego operatora) od elementu x[min], to zmiennej min 4. Jeśli n przypisujemy wartość min_lok jest liczbą nieparzystą, to kończymy algorytm. Jeśli n jest liczbą parzystą to wykonujemy: jeśli element x[n] jest mniejszy (w sensie użytego operatora) od elementu x[min], to zmiennej min przypisujemy wartość n i kończymy algorytm

1 2 min_lok 3 4 min_lok 5 …

Podstawy programowania

Do 1954 roku – poziomu - dla język maszynowy (Eniac, Mark I- USA) – niskiego 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 liczbowych 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

Cechy Assemblera

- wąski zbiór rozkazów, prymitywna architektura ówczesnych komputerów, brak rejestrów (pamięci pomocniczych), brak operacji zmiennoprzecinkowych

1954 –języki tzw. wysokiego poziomu

(kod maszynowy i assembler to niski poziom – bliższy procesorowi)

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)

Kompilator

(ang. compiler) to program służący do tłumaczenia kodu napisanego w jednym języku (języku źródłowym) na równoważny kod w innym języku (języku wynikowym). Najczęściej jest to tłumaczenie z języka wysokiego poziomu (łatwiejszego dla programisty) ma język wewnętrzny procesora.

Proces ten nazywany jest kompilacją .

Języki wysokiego poziomu

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, Delphi, Java, C#

)

OBIEKTY - dane dana

(nazwa danej, wartość danej) deklaracje, definicje - opisy obiektów instrukcje - czynności na obiektach

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 pozostałymi jego częściami z

Deklaracja podprogramu - opis podprogramu Instrukcja wywołania podprogramu – wykonanie, zastosowanie podprogramu wewnątrz programu głównego lub innego podprogramu

Kod źródłowy

tekstowy pas) - tekst programu w języku programowania (plik

Kompilacja

- tłumaczenie (w całości) kodu źródłowego na wykonywaną postać binarną, ładowalną (plik exe) – odrębny proces

Interpretacja

– tłumaczenie kolejnych instrukcji procesu wykonywania w trakcie

Przetwarzanie programu użytkowego

Komunikaty o błędach EDYCJA

postać źródłowa programu

Kompilacja

postać ładowalna

Wykonanie

wyniki parametry dane

PROGRAMISTA

Przykładowy język

Javascript

JavaScript jest to interpretowany,

zorientowany obiektowo

, skryptowy

język programowania

.

JavaScript jest oddzielnym językiem (nie jest uproszczoną wersją Javy). Może być osadzany w innych programach, na przykład w przeglądarce internetowej , aby, mając dostęp do obiektów otoczenia (np. modelu obiektowego przeglądarki internetowej DOM), można sprawować nad tym otoczeniem kontrolę.

Javascript jest łatwy w nauce i pozwala na pewne „zdynamizowanie” stron internetowych. Przeglądarki mogą pytać o zezwolenie na wykonanie skryptu .

Wstawienie skryptu do dokumentu HTML

Skrypty JavaScript są zagnieżdżane w dokumentach HTML. Skrypt JavaScript umieszczane są między znacznikami .

To jest tekst 1

To jest tekst 2

Może istnieć wiele skryptów naprzemiennie z pozostałym kodem HTML

Aby tworzyć działające skrypty JavaScript wymagane są: - jakaś metoda wprowadzania i przechowania danych (liczb, tekstów) - jakieś instrukcje, które umożliwią obliczenia wyników - jakieś metody pokazania wyniku

Wykorzystanie skryptu Javascript w dokumencie HTML

a to już akapit poza skryptem

właściwość obiektu

Kilka zasad pisania skryptów

Komentarze

Komentarz o kilku wierszach,

/* treść komentarza */

Jednowierszowy komentarz // tekst

Wykorzystywane są w celu:

- opisy wyjaśniające - dezaktywowanie instrukcji (testy, błędy)

Identyfikatory

Są to nazwy elementów (zmiennych, obiektów, funkcji) Zmienne służą do

przechowania wartości

określonego typu Jednym z podstawowych sposobów nadania wartości zmiennej jest instrukcja przypisania (nadania wartości) Ciąg liter, cyfr, znaków podkreślenia (nie wolno spacji!) Musi się zaczynać od litery Ważne duże i małe litery ! (w odróżnieniu od innych języków) Przykłady identyfikatorów dla zmiennych: x

alfa Alfa

mojaZmienna B11 to dwie różne zmienne styl "wielbłądzi" c_33

Operatory

Arytmetyczne : + * / %(reszta z dzielenia) Przypisania : = += x+=5 odpowiada x=x+5, –= x–=5 odpowiada x=x–5, *= x*=5 odpowiada x=x*5, /= x/=5 odpowiada x=x/5, ++ inkrementacja – zwiększenie o 1 x++ odpowiada x=x+1 - dekrementacja – zmniejszenie o 1 x-- odpowiada x=x-1 %= x%=5 odpowiada x=x%5 (reszta z dzielenia) + konkatenacja (łączenie tekstów) "Mateusz " + 'Kowalski'

para " lub para '

Przykładowo:

Operatory porównania

== !=(nierówne) <= < > >= Przykładowo: x==5 x>=3 a+b> 3*y jest to pytanie: czy jest spełnione?

odpowiedź: tak lub nie (TRUE/FALSE)

Operatory logiczne

• koniunkcja (i) • alternatywa (lub) • negacja && !

|| true && false daje !false daje true false

Instrukcje – wykonanie akcji!

Instrukcje języka oddzielamy średnikami (jeśli zapisujemy w tym samym wierszu). Czasem blok kilku instrukcji otaczamy klamrami { } zazwyczaj we wnętrzu instrukcji warunkowych i iteracyjnych (np. if, for, while) – o nich za chwilę

Typy instrukcji

- przypisania (nadania wartości); - warunkowe - pętle - wykonania funkcji (metody obiektu)

Instrukcja przypisania

zmienna = wyrażenie ;

Po lewej stronie znaku = tylko nazwa zmiennej!!!

Po prawej stronie znaku = piszemy wyrażenie (bardzo podobne jak w Excelu), zawierające liczby, operatory, nawiasy okrągłe, funkcje – metody obiektów, oraz zmienne o ZNANYCH WARTOŚCIACH Wyrażenie jest obliczane i jego wartość przechowana w zmiennej Przykłady: x=5; alfa= 3*x; b15=(3-x)+2/alfa;

Instrukcja wypisania na ekranie

document.write

(element); document

to wbudowany obiekt w Javascript, a

write

funkcji (tzw. metoda) (pisz) to jedna z jego

identyfikator obiektu i identyfikator jego metody oddzielamy kropką

Przykład

Jak widzimy można wysyłać znaczniki (do pozycjonowania, formatowania itp.)

Obiekt Math

(uwaga! – z dużą literą M) Wbudowany obiekt Math zawiera wartości matematyczne, jako właściwości (ang.

property

)

i metody (ang.

method

)

.

Są tutaj przechowywane pewne stałe matematyczne : Math .property lub gotowe funkcje Math .method

gdzie

property

lub

method

niżej elementów.

jest jednym z podanych

property

(właściwości)

E PI e stała Eulera, która wynosi ok. 2.718

wartość liczby

, czyli ok. 3.14159

method

(metody)

abs ( wyrażenie) cos ( wyrażenie) sin (wyrażenie) tan (liczba) ceil (liczba) floor (liczba) round (liczba) exp (liczba) log (liczba) pow (liczba1,liczba2) random () sqrt (liczba) wartość bezwzględna liczby funkcje trygonometryczne ( argument w radianach!!!

) zaokrąglenie do całkowitej w górę zaokrąglenie do całkowitej w dół zaokrąglenie do najbliższej całkowitej e x UWAGA!!!

logarytm naturalny liczby

!

wartość liczby1 podniesionej do potęgi

liczby2

wartość pseudolosowa z przedziału (0,1)

– bez argumentu

pierwiastek kwadratowy liczby

Przykłady:

lub wykorzystując zmienną:

Sekwencja obliczeń:

Oczywiście gdy delta będzie ujemne, to błąd!

NaN

– nieokreślone Jak przeciwdziałać? Instrukcja badania warunku if (test, sprawdzenie!)

Przykład pisania wyrażeń y 

sin

2 x  3 x  3

(

x  3

)

x  4

zapis w skrypcie JavaScript

x=Math.PI; //musimy określić wartość x y= (Math.pow(Math.sin(x),2) - Math.pow((x-3)*x,1/3)) /(Math.abs(Math.pow(x,-3))+4); document.write(y);

łatwo o błędy (dużo nawiasów!)

Uwaga: wolno spacje, ale nie wewnątrz nazw wolno przenieść do następnego wiersza

jak sobie ułatwić? wprowadzać zmienne pomocnicze liczymy etapami….

y 

sin

2 x  3 x  3

(

x  3

)

x  4

Inna metoda wyprowadzenia danych wyświetlanie w dodatkowym okienku

alert

Metoda dla obiektu numeryczną.

window

, tworząca okienko dialogowe z napisem informacyjnym lub wartością

dokładniej window.alert

, ale domyślny obiekt to window

Instrukcja warunkowa

if...else

Instrukcja if powoduje wykonanie kodu źródłowego instrukcja1 tylko wtedy, gdy warunek logiczny jest spełniony. Jeżeli zostanie użyty poszerzony wariant instrukcji if, to po spełnieniu warunku zostanie wykonany kod instrukcja1 lecz w przeciwnym wypadku zostanie wykonany kod instrukcja2.

if (warunek) {

kod wykonywany jeżeli warunek spełniony

} else { }

kod wykonywany jeżeli warunek nie spełniony

opcjonalnie czyli można opuścić-wówczas przy niespełnionym warunku nic nie jest wykonywane

Prosty przykład dla instrukcji warunkowej

tak

Najogólniejsza postać instrukcji warunkowej – jeśli mamy kilka warunków if (warunek1) {

kod wykonywany jeżeli warunek spełniony

} else if (warunek2){ }

instrukcje wykonywane jeżeli warunek2 spełniony

else if (warunek3){

instrukcje wykonywane jeżeli warunek2 spełniony

} else { }

instrukcje wykonywane jeżeli warunki powyższe niespełnione

Przykład badania kilku warunków:

Instrukcja iteracyjna - "pętla" for

(dla) Instrukcja wykorzystywana do

wielokrotnego wykonania

pewnego zestawu instrukcji.

Pętla

for

powtarza instrukcje wnętrza pętli aż do momentu, kiedy testowany warunek staje się fałszywy. W JavaScript pętla

for

jest podobna do pętli w Java i C.

Pętla for posiada następującą składnię:

for ( inicjalizacja licznika; test_logiczny; inkrementacja ) instrukcja;

lub

for { ( inicjalizacja licznika; test_logiczny; inkrementacja ) instrukcja1; instrukcja2; ...

w klamrach { } instrukcje wewnętrzne jeśli jest ich więcej niż jedna

}

Przykład dla iteracji for

< SCRIPT LANGUAGE="JavaScript"> for (i=0; i<11; i++) { } document.write(i+"
");

można wykorzystywać licznik 0 1 2 3 4 5 6 7 8 9 10

Przykład

metoda

write

może też być wieloargumentowa (argumenty oddzielane plusami lub przecinkami)

document.write(i," ", Math.sin

(i* Math.PI

/180),"
");

Przykład pętli zagnieżdżanej

jedna spacja

dla każdego kroku pętli zewnętrznej wykonywana jest pętla wewnętrzna, czyli instrukcja wykona się 3*4=12 razy wykorzystuje się np. w tablicach dwuwymiarowych 2 4 3 1 3 2 3 3 3 4 1 1 1 2 1 3 1 4 2 1 2 2 2 3

Pętla while

}

while

(warunek) { instrukcje

przechodzi dalej. Sprawdzenie warunku odbywa się przed wykonaniem instrukcji.

n = 0; x = 0;

while( n < 10 ) { n++; //zwiększ n o 1 x += n; // zwiększ x o n } document.write(x+"
");

21 28 36 45 55 1 3 6 10 15