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