Programowanie komputerów PC c.d. PASCAL - struktura blokowa programu Język PASCAL ma strukturę blokową, tzn. dopuszcza zagnieŝdŝanie funkcji i procedur Cezary Bolek Program główny Uniwersytet Łódzki Wydział Zarządzania Katedra Informatyki I poziomu Procedura I poziomu Procedura III poziomu II poziomu Procedura II poziomu II poziomu Zasięg zmiennych Język PASCAL ma klarowne reguły zasięgu zmiennych, związaną z jego strukturą blokową Przesłanianie zmiennych X : real; Y : real; Y zmienna OK (lokalna) Zasięg zmiennej (identyfikatora) oznacza fragment programu, w którym moŝna uŝywać tę zmienną i oznacza ona tę samą zmienną Zasięg zmiennej w PASCALU obejmuje blok, w którym tę zmienną zadeklarowano oraz wszystkie bloki w nim zagnieŝdŝone. X : real; X : real; X zmienna OK (lokalna) Jeśli zmienna lokalna ma taką samą nazwę jak zmienna w bloku zewnętrznym, to zmienna zewnętrzna jest przesłonięta przez zmienną lokalną. Na zewnątrz tego bloku nadal widoczna jest zmienna zewnętrzna. Zmienne globalne to zmienne zadeklarowane w bloku głównym programu, gdyŝ są widoczne we wszystkich blokach. X zmienna OK (globalna/lokalna) Zmienne lokalne to zmienne zadeklarowane w danym bloku, ale nie widoczne na zewnątrz tego bloku. X zmienna OK (globalna/lokalna) 1
Zasięg zmiennych a przekazywanie parametrów Program moŝe komunikować się z wywołanymi procedurami i funkcjami: poprzez parametry gdy trzeba przekazywać róŝne zmienne lub wartości, poprawia to równieŝ czytelność procedur i funkcji, gdyŝ posiadają one jasno zapisany interfejs komunikacji. poprzez zmienne globalne gdy dotyczy to zmiennych szczególnie waŝnych w obrębie całego programu lub gdy dotyczy to duŝych rozmiarowo struktur danych, ale ogólnie zmniejsza czytelność programu. Zasięgi - przykład PROGRAM scope(input,output); a,b,c : integer; PROCEDURE aa(var a,b: integer); a:=2; b:=b-1; END; PROCEDURE bb(var c: integer); c:=c+a; END; Poprawna organizacja wymiany informacji pomiędzy blokami programu jest kwestią kompromisu i stylu programowania. a:=1; aa(b,a); aa(c,b); bb(b); writeln(a, b, c); END. Jakie liczby wydrukuje ten program??? Rekurencja - przykład IDE zintegrowane środowisko programistyczne PROGRAM silnia(input,output); n: integer; s: integer; silnia jest wykorzystywana do rekurencyjnego obliczania wartości silni z n n!=n*(n-1)*(n-2)*1= n*(n-1)! Integrated Develpement Environment (IDE) edytor + syntax highlighting, bracket matching, macros kompilator debugger FUNCTION sil(x: integer): integer; IF x=0 THEN sil:=1 ELSE sil:=x*sil(x-1); END; END. write( Podaj n= ); read(n); s:=sil(n); writeln( Silnia wynosi =,s); Rekurencja polega na moŝliwości wywoływania funkcji przez samą siebie, oczywiście z innymi parametrami! Uwaga program liczy poprawnie silnię jedynie dla małych wartości n. Dlaczego? FreePascal IDE 2
Język C Konstrukcje sterujące - C Sekwencja (grupowanie): Selekcja IF-ELSE: C: 1972, Bell Laboratories, USA, Dennis Ritchie ( Język C, Brian Kerninghan Dennis Ritchie, WNT, kilka wydań od 1978r) język stworzony dla programistów, przez programistów : system UNIX zwięzła i prosta składnia szybka kompilacja i efektywny kod maszynowy zróŝnicowane i efektywne konstrukcje sterujące brak procedur: tylko funkcje operacje na wskaźnikach silny nacisk na separacje modułów: zmienne lokalne bardzo bogaty (z konieczności) zestaw procedur bibliotecznych podstawa dla współczesnych języków obiektowych: C++, Java, C# instrukcja; instrukcja; instrukcja; s1 s2 T wyr N s3 if (wyraŝenie) instrukcja1 else instrukcja2; (wyraŝenie zwraca wartość numeryczna: 0 oznacza niespełnienie warunku 0 oznacza spełnienie warunku) Selekcja + grupowanie : if (wyr) s1; s2; else s3; Konstrukcje sterujące - C Istnieją równieŝ konstrukcja typu: Cykle: while (wyraŝenie) instrukcja; do instrukcja while (wyraŝenie); for (wyr1; wyr2; wyr3) instrukcja; Selekcja wielokrotna switch (wyraŝenie) case wartość_1 : instrukcja_1; case wartość_2 : instrukcja_2; case wartość_n : instrukcja_n; Dla kaŝdej zadeklarowanej zmiennej w programie, kompilator przydziela miejsce w pamięci, gdzie przechowywana jest jej wartość np. int x=0; /* deklaracje zmiennej x o wartości 0 */ W języku C moŝna deklarować zmienne wskaźnikowe, tj. takie, których wartościami są wskazania (lokalizacja) innych obiektów w pamięci operacyjnej komputera int *w; Wskaźniki mogą wskazywać inne zmienne: w = &x; /* operator & zwraca lokalizację x */ Wskaźniki w C Pamięć (adresy) 100 101 102 103 104 105 106 107 108 109 10A Za pomocą wskaźników moŝna odwoływać się do wskazywanej zmiennej. W poniŝszych dwóch liniach wykonywana jest ta sama operacja zmiany wartości zmiennej x: 0 103 x = 2; /* przypisanie wartości 2 do zmiennej x */ *w = 2; /* operator * oznacza odwołanie do wskazywanego obiektu*/ x w 3
C - struktura programu Język C nie dopuszcza zagnieŝdŝania funkcji C - Zasięg zmiennych Język C charakteryzuje się silną hermetyzacją poszczególnych modułów programowych Program główny int X; int X,Y; X zmienna OK (lokalna) Y zmienna OK (lokalna) int Y; Y zmienna OK (lokalna) Zasięg zmiennej w C obejmuje tylko blok, w którym tę zmienną zadeklarowano. Zmienne globalne to zmienne zadeklarowane poza głównym blokiem programu Zmienne lokalne to zmienne zadeklarowane w danym bloku, ale nie widoczne na zewnątrz tego bloku. C - przekazywanie parametrów Przekazywanie parametrów moŝliwe jest tylko: przez wartość funkcja otrzymuje kopie wartości zmiennych i nie moŝe zmienić wartości oryginalnej zmiennej! PoniewaŜ istnieją zmienne typu wskaźnikowego, które teŝ mogą być przekazywane do funkcji, moŝliwe jest odwoływanie się funkcji do zmiennych z zewnątrz. Język C - podsumowanie Bardzo efektywny proces kompilacji i kod maszynowy Zwięzła składnia - efektywny zapis programu Łatwość odwoływania się do zasobów komputera Uniwersalność język tworzenia większości oprogramowania na świecie (w swojej podstawowej i obiektowej odmianie) int zero( int x) x = 0; int zero( int *x) *x = 0; Konieczność rozumienia podstaw architektury komputera Zwięzła składnia zawiły i trudny do zrozumienia program zero(a); funkcja zero nie zmienia wartości zmiennej a, w=&a; zero(w); funkcja zero zmienia (!!!) wartość zmiennej a, gdyŝ funkcja otrzymała wskaźnik (lokalizację) do tej zmiennej Bezpłatny kompilator + IDE: www.bloodshed.net 4
Programowanie proceduralne Programowanie proceduralne polega na tworzeniu programów w postaci modułowej (Pascal, C), gdzie oddzielnie deklarowane są struktury danych (proste i złoŝone) oddzielnie deklarowane są moduły programowe (funkcje, procedury) moduły programu komunikują się, przekazując sobie dane poprzez parametry podczas wywołania Programowanie proceduralne daje dobre efekty dla programów o średnim stopniu komplikacji (popularne do połowy lat 80 tych, zanim pojawiło się oprogramowanie dla środowisk graficznych). Wzrost rozmiaru programu (tysiące linii kodu programu i więcej), zwiększenie liczby struktur danych i komplikacja wzajemnych zaleŝności danych i modułów powoduje, Ŝe programowanie proceduralne staje się nieefektywne. Programowanie obiektowe Programowanie obiektowe polega na integracji struktur danych i funkcji które na nich operują. W językach obiektowych (C++, Java) deklaruje się razem struktury danych zwane obiektami i operacje, które moŝna wykonać na tych obiektach. Dzięki temu zabiegowi, programista nie musi juŝ pamiętać szczegółów stosowania wszystkich funkcji w programie i moŝe posługiwać się złoŝonymi strukturami danych. Programowanie obiektowe bardzo dobrze sprawdza się w programach, które operują na złoŝonych obiektach (np. elementy środowiska graficznego: okna, menu, przyciski, ikony, etc.). Idea obiektowości jest bliska postrzeganiu świata przez człowieka, w którym obiekty mają własne cechy i mogą wykonywać specyficzne tylko dla nich czynności: pies: kolor, waga, wiek; szczeka, biega, gryzie, konto bankowe: stan, waluta; wpłata, wypłata, odsetki, Przykład - Java class Pomieszczenie private int szer; int dlug, szer, wys; Pomieszczenie(int s, int d, int w) szer = s; dlug = d; wys = w; int podloga() return szer * dlug; Deklaracja typu danych (klasy) opisującej pomieszczenie. KaŜde pomieszczenie ma swoje dane: dlug, szer, wys oraz swoje operacje: obliczenie powierzchni podłogi i powierzchni ścian Języki skryptowe Wzrost szybkości przetwarzania komputerów powoduje coraz większą popularność nowoczesnych języków interpretowanych, ukierunkowanych na specyficzne zastosowania: przetwarzanie tekstów administracja systemami operacyjnymi organizacja wymiany informacji między aplikacjami tworzenie oprogramowania prototypowego int sciana() return 2*(szer*wys + dlug*wys); Pomieszczenie pokoj = new Pomieszczenie(3, 4, 2); Pomieszczenie kuchnia = new Pomieszczenie(2, 3, 2); int powierz; int sciany; powierz=pokoj.podloga() + kuchnia.podloga(); sciany =pokoj.sciana() + kuchnia.sciana(); deklaracja dwóch obiektów klasy Pomieszczenie odwołanie do obiektów i wykonania na nich operacji Cechy współczesnych języków skryptowych: interpretowany sposób wykonywania wysoki poziom abstrakcji danych (struktury asocjacyjne, czasem nawet brak podziału danych na typy) instrukcje bardzo wysokiego poziomu wysokospecjalizowane funkcje przetwarzania danych łatwość modyfikacji i dostosowania kodu do szybko zmieniających się wymagań niezaleŝność od systemu operacyjnego (przenośność) 5
Perl (Practical Extraction and Report Language) Perl - język ukierunkowany na wykonywanie zadań uŝytkowych które: 1) moŝna i trzeba zautomatyzować, 2) wymagają częstej modyfikacji swego działania 3) polegają na efektywnym łączeniu wyników pracy innych programów Brak konieczności deklarowania zmiennych ZłoŜone struktury danych: elastyczny dostęp, brak ograniczeń rozmiaru Bogactwo konstrukcji sterujących: if, unless, while, until, for, foreach MoŜliwości programowania proceduralnego i obiektowego Mnogość specjalizowanych funkcji bibliotecznych realizujących prosty dostęp do zaawansowanych funkcji systemu operacyjnego Dostępny dla wszystkich (popularnych) systemów operacyjnych Bezpłatny!!! Biblioteki Perla (oprócz operacji standardowych): operacje na plikach, interfejsy baz danych, zaawansowane przetwarzanie tekstu, zarządzanie procesami, archiwizacja, kompresja, szyfrowanie, przetwarzanie obrazów, programowanie sieciowe, tekstowe i graficzne interfejsy uŝytkownika, www.perl.com/perl, www.perl.org Tcl/Tk (Tool Command Language) Tcl/Tk - język ukierunkowany na wykonanie 1) aplikacji stanowiących interfejs do oprogramowania 2) aplikacji łączących wyniki działania róŝnych programów 3) prototypowych (szybkich) rozwiązań oprogramowania i interfejsów graficznych Nietypowa składnia oparta na substytucji poleceń i zmiennych Brak deklarowania zmiennych, brak typów zmiennych ZłoŜone struktury danych i bogactwo konstrukcji sterujących Mnogość specjalizowanych funkcji bibliotecznych realizujących prosty dostęp do zaawansowanych funkcji systemu operacyjnego Ukierunkowanie na tworzenie interfejsu interfejsu uŝytkownika Dostępny dla wszystkich (popularnych) systemów operacyjnych Bezpłatny!!! www.tcl.tk Tcl/Tk - porównanie Tcl/Tk - przykłady button.hello -text "Hello World" -command exit pack.hello Liczba instrukcji języka maszynowego na jedną instrukcję danego języka 1000 100 10 Tcl/Tk Assembler 1 Ŝadne Visual Basic Wymaganie deklarowania typów danych Java C++ C duŝe scale.s -from 0 -to 100 -orient horizontal -showvalue true \ -label Temperature -tickinterval 25 -length 300 \ -troughcolor red -relief raised pack.s foreach color white green red blue radiobutton.$color -text $color -variable dye -value $color pack.$color -side left.$color config -command wm title. $dye menubutton.m1 -text File -menu.m1.file menubutton.m2 -text Edit -menu.m2.help frame.l -width 150 -height 50 -bg yellow pack.l -side bottom pack.m1.m2 -side left menu.m1.file -tearoff false.m1.file add command -label New -command puts "New".m1.file add command -label Open -command puts "Open".m1.file add command -label Save -command puts "Save".m1.file add command -label Exit -command puts "Exit" menu.m2.help -tearoff false.m2.help add command -label Help -command puts "Help" 6