Programowanie komputerów PC c.d. Cezary Bolek Uniwersytet Łódzki Wydział Zarządzania Katedra Informatyki PASCAL - struktura blokowa programu Język PASCAL ma strukturę blokową, tzn. dopuszcza zagnieŝdŝanie funkcji i procedur Program główny Funkcja I poziomu Funkcja II poziomu Procedura I poziomu Procedura III poziomu Procedura II poziomu Funkcja II poziomu 1
Zasięg zmiennych Język PASCAL ma klarowne reguły zasięgu zmiennych, związaną z jego strukturą blokową VAR X : real; VAR Y : real; Y zmienna OK (lokalna) Y??? Y??? X zmienna OK (globalna/lokalna) Y??? 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. Zmienne globalne to zmienne zadeklarowane w bloku głównym programu, gdyŝ są widoczne we wszystkich blokach. Zmienne lokalne to zmienne zadeklarowane w danym bloku, ale nie widoczne na zewnątrz tego bloku. Przesłanianie zmiennych VAR X : real; VAR 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. X zmienna OK (globalna/lokalna) 2
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. Poprawna organizacja wymiany informacji pomiędzy blokami programu jest kwestią kompromisu i stylu programowania. Zasięgi - przykład PROGRAM scope(input,output); VAR a,b,c : integer; PROCEDURE aa(var a,b: integer); BEGIN a:=2; b:=b-1; END; PROCEDURE bb(var c: integer); BEGIN c:=c+a; END; BEGIN a:=1; aa(b,a); aa(c,b); bb(b); writeln(a, b, c); END. Jakie liczby wydrukuje ten program??? 3
Rekurencja - przykład PROGRAM silnia(input,output); VAR n: integer; s: integer; Funkcja silnia jest wykorzystywana do rekurencyjnego obliczania wartości silni z n n!=n*(n-1)*(n-2)*1= n*(n-1)! FUNCTION sil(x: integer): integer; BEGIN IF x=0 THEN sil:=1 ELSE sil:=x*sil(x-1); END; BEGIN 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? IDE zintegrowane środowisko programistyczne Integrated Develpement Environment (IDE) edytor + syntax highlighting, bracket matching, macros kompilator debugger FreePascal IDE 4
Język C 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# Konstrukcje sterujące - C Sekwencja (grupowanie): Selekcja IF-ELSE: instrukcja; instrukcja; instrukcja; if (wyraŝenie) instrukcja1 else instrukcja2; (wyraŝenie zwraca wartość numeryczna: 0 oznacza niespełnienie warunku 0 oznacza spełnienie warunku) s1 s2 T wyr N s3 Selekcja + grupowanie : if (wyr) s1; s2; else s3; 5
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 6
C - struktura programu Język C nie dopuszcza zagnieŝdŝania funkcji Funkcja Funkcja Program główny C - Zasięg zmiennych Język C charakteryzuje się silną hermetyzacją poszczególnych modułów programowych int X; Y??? 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. 7
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. int zero( int x) x = 0; int zero( int *x) *x = 0; 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 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) Konieczność rozumienia podstaw architektury komputera Zwięzła składnia zawiły i trudny do zrozumienia program Bezpłatny kompilator + IDE: www.bloodshed.net 8
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, 9
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 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 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 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ść) 10
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 11
Tcl/Tk - porównanie Liczba instrukcji języka maszynowego na jedną instrukcję danego języka 1000 100 10 1 Tcl/Tk Assembler Ŝadne Visual Basic Wymaganie deklarowania typów danych Java C++ C duŝe Tcl/Tk - przykłady button.hello -text "Hello World" -command exit pack.hello 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" 12