INFORMATYKA Studia Niestacjonarne Elektrotechnika Wydział Elektrotechniki i Informatyki dr inż. Michał Łanczont Wydział Elektrotechniki i Informatyki p. E419 tel. 81-538-42-93 m.lanczont@pollub.pl http://lanczont.pollub.pl Zakres wykładu Procedury Funkcje Biblioteki DLL Dynamiczne i statyczne korzystanie z bibliotek DLL Zapis i Odczyt danych z i do pliku 2 1
Programowanie proceduralne Polega na wydzieleniu powtarzających się fragmentów kodu programu do zewnętrznych podprogramów zwanych procedurami lub funkcjami Rozwiązanie to sprawia że kod programu zostaje w sposób znaczący skrócony, staje się przejrzystszy Wydzielone fragmenty kodu są we właściwych miejscach wywoływane jako procedury lub funkcje 3 Procedury Procedury są wydzielonymi fragmentami kodu programu głównego wykonującymi określone zadanie wyświetlenie tekstu na ekranie, rysunku, zapisanie danych do pliku, wysłanie danych na port itp. Procedura nie może zwracać żadnej wartości Nazwa procedury powinna być unikalna 4 2
Procedury Procedury deklaruje się w obszarze nagłówkowym programu Zastosowanie procedur powoduje że w programie mogą wystąpić zmienne globalne (zdefiniowane dla całego programu) oraz lokalne, wewnątrz procedury i tylko w niej występują 5 Procedury Zmienna o tej samej nazwie może występować jako lokalna jak i globalna program test; var x:string; procedure foo; var x:string; x:='ala'; writeln(x); x:='ola'; foo; writeln(x); readln; end. 6 3
Procedury program test; var x:string; procedure foo; writeln(x); x:='ala'; writeln(x); x:='ola'; foo; writeln(x); readln; end. 7 Funkcje Funkcje spełniają identyczną rolę jak procedury W odróżnieniu od procedury funkcje zwracają jakąś wartość jako efekt działania Funkcje jako zmiennej wyjściowej używają zmiennej o nazwie funkcji Przy wybraniu opcji obiektowej kompilatora {$mode objfpc} można stosować zmienną niejawną Result jako zmienną wyjściową funkcji 8 4
Funkcje program test; {$mode objfpc} var x:string; function imie:string; write('podaj swoje imie '); readln(result); x:=imie; writeln('twoje imię to: ',x); readln; end. 9 Funkcje program test; var x:string; function imie:string; write('podaj swoje imie '); readln(imie); x:=imie; writeln('twoje imie to: ',x); readln; end. 10 5
Procedury i funkcje Mogą mieć kilka, jeden lub nie mieć żadnych parametrów wejściowych Parametrem wejściowym może być zmienna, tablica lub zbiór W przypadku funkcji wielkość wyjściowa może być zmienną, tablica lub zbiorem Możliwe jest zdefiniowanie wartości domyślnych parametrów, w takim wypadku parametr domyślny nie musi być podawany jako wielkość wejściowa 11 Procedury i funkcje Deklaracja funkcji bez parametrów wejściowych: Function GetName:string; Deklaracja procedury z jednym parametrem wejściowym: Procedure SetName(Name:string); Parametry wejściowe tego samego typu mogą być grupowane: Function SetName(FN:string, SN:string; age: byte): string; Function SetName( FN,SN:string; age: byte): string; 12 6
Procedury i funkcje Tablica może być parametrem wejściowym funkcji i procedury, jak również wielkością zwracaną przez funkcję Procedure ArrayProc(A: array of string); Function ArrayFunc: array of string; Parametrami mogą być także zmienne zdefiniowane jako type Type TBar = array of string Function ArrayFunc: Tbar; 13 Procedury i funkcje W definicji funkcji lub procedury nie można przekazywać ograniczeń rozmiaru Procedure Foo(S: String[20]); Możliwe to jest poprzez zdefiniowanie nowego typu zmiennej: Type MyString = string[20]; Procedure Foo(S: MyString); 14 7
Procedury i funkcje Można ustawić domyślną wartość prarametru Procedure SetName(FN: string; SN: string= Nieznany ; age:byte=25); Wywołanie funkcji lub procedury z domyślnymi parametrami realizowane jest poprzez ich pominięcie SetName( Adam ); Możliwe jest zastąpienie wartości domyślnych podanymi SetName( Adam, Nowak,30); 15 Procedury i funkcje Przy definiowaniu wartości domyślnych nie można grupować zmienneych Procedure SetName(FN,SN: string= Nieznane ; age: byte=25); Parametry nie posiadające wartości domyślnych muszą być zadeklarowane jako pierwsze Function Funk(X:integer = 0; Y:integer):integer; 16 8
Procedury i funkcje Parametr wejściowy zdefiniowany jako stała nie może być zmieniony wewnątrz procedury Procedure show(const Message: string); Procedury i funkcje mogą być zagnieżdżane Pamiętać należy aby procedura lub funkcja zagnieżdżona zdefiniowana została przez słowem funkcji lub procedury nadrzędnej. 17 Procedury i funkcje Przekazywanie parametrów przez referencję program test; procedure setval(var mess:string); mess:='ala ma kota'; var s: string; s:='ola ma kota'; writeln(s); setval(s); writeln(s); readln; end. bez var z var Polega na umożliwieniu zmiany wartości parametry wewnątrz procedury lub funkcji. Jest to możliwe wtedy gdy deklarację parametry poprzedzi się słowem kluczowym var. 18 9
Program wyznacza przybliżenie liczby Pi metodą Monte-Carlo Podawany jest promień okręgu i liczba prób r 19 program PI; {$mode objfpc} uses crt, math; var Funkcja r,n: integer; p:single; clrscr; randomize; writeln('program wyznacza przybliżenie liczby Pi metodą Monte-Carlo'); write('podaj wymiar obszaru losowania, promień okręgu R='); readln(r); write('podaj liczbę prób do wyznaczaniu liczby Pi, N='); readln(n); p:=pi(n,r); writeln('przybliżenie liczby Pi=',p:11:10); readln; end. 20 10
function pi(t,k:integer):single; var i,x,y,m:integer; d:single; r m:=0; for i:=1 to t do x:=random(2*k+1); y:=random(2*k+1); d:=power((power(x-k,2))+(power(y-k,2)),0.5); if d<k then m:=m+1; Result:=4*m/t; 21 R 10 100 1000 1000 1000 1000 5000 N 10000 1000 1000 10000 100000 10000000 10000000 Pi 2,7767 3,1520 3,1440 3,1220 3,1384 3,1377 3,1418 22 11
Zmodyfikować program aby sam poszukiwał parametrów funkcji pi() w poszukiwaniu najdokładniejszego przybliżenia liczby Pi Wzorcowa wartość Pi= 3.14159265 Modyfikacja ma polegać optymalizacji poszukiwania parametrów funkcji pi() Liczba Pi wyznaczana jest za pomocą funkcji pi() z poprzedniego przykładu 23 program PI; {$mode objfpc} uses crt, math; var d:single; r:integer; clrscr; randomize; Funkcja i procedura writeln('program wyznacza przyblizenie liczby Pi metoda Monte-Carlo'); write('podaj wymiar obszaru losowania, promien okregu R='); readln(r); write('podaj oczekiwana dokładnosc wyznaczenia liczby Pi, n(%)='); readln(d); optymal(d,r); readln; end. 24 12
procedure optymal(a:single;b:integer); var i:longword; pw,p,n: single; i:=b; pw:=4*arctan(1); repeat i:=i*2; p:=pi(i,b); n:=(pw-p)/pw*100; writeln('pi=', p:5:4,' dokladnosc n(%)=',abs(n):5:4,' liczba prob N=', i); until (abs(n)<=a); writeln('wyznaczono przyblizenie liczby PI=', p:5:4,', po wykonaniu ', i,' prob.'); 25 26 13
27 Biblioteki DLL DLL to skrót do Dynamic Link Library DLL jest plikiem z skompilowanym kodem źródłowym który może być wykorzystany w połączeniu z aplikacją W bibliotekach DLL zazwyczaj umieszcza się procedury i funkcje wydzielano z głównego kodu aplikacji Wydzielone w ten sposób funkcje i procedury mogą być wykorzystywane przez różne programy 28 14
Biblioteki DLL Kod źródłowy biblioteki DLL tworzy się analogicznie jak zwykłego programu Kod biblioteki rozpoczyna się od słowa kluczowego library Funkcje i procedury zdefiniowane w bibliotece powinny być opatrzone odpowiednią dyrektywą, najczęściej stdcall procedure nazwa(x:single);stdcall; 29 Biblioteki DLL Procedury i funkcje które mają być dostępne poza biblioteką muszą zostać wskazane za pomocą instrukcji exports; exports nazwa name Moja_funkcja, nazwa index 1; 30 15
Biblioteki DLL Procedury i funkcje z biblioteki mogą być w kodzie programu podpięte statycznie, co oznacza że dana procedura lub funkcja jest cały czas dostępna w pamięci komputera Procedure nazwa(x:typ); stdcall external nazwa.dll name nazwa ; Procedure nazwa(x:typ); stdcall external nazwa.dll index numer ; Function nazwa(x:typ):typ; stdcall external nazwa.dll name nazwa ; Function nazwa(x:typ):typ; stdcall external nazwa.dll index numer ; 31 library biblioteka; {$mode objfpc} uses math; function sqrt(x:single):single; stdcall; result:=power(x,0.5); procedure dwa(x:single); stdcall; write(x:8:2); exports sqrt name 'pierwiastek', dwa name 'dwapoprzecinku'; end. 32 16
Program testowy; {$mode objfpc} uses crt, sysutils; procedure dwapo(x:single); stdcall external 'biblioteka.dll' name 'dwapoprzecinku'; function pier(x:single):single; stdcall external 'biblioteka.dll' name 'pierwiastek'; 33 var x,y:single; i:integer; clrscr; randomize; for i:=1 to 15 do x:=((random(10000)/13)+123)*5; y:=pier(x); dwapo(x); write(' pierwiastek '); dwapo(y); writeln; readln; end. 34 17
35 Biblioteki DLL Ładowanie dynamiczne polega na załadowaniu biblioteki, procedury lub funkcji wtedy gdy jest potrzebna, a następnie zwolnienie z pamięci. Kod wywołania dynamicznego jest o wiele bardziej złożony jak przy wywołaniu statycznym Dynamiczna obsługa biblioteki dll jest możliwa po podpięciu modułu dynlibs 36 18
Biblioteki DLL Funkcje i procedury są definiowane jako typ zmiennych Nazwy funkcji i procedury przypisana jest do nowych typów Utworzone jest zaczepienie dla biblioteki Biblioteka ładowana jest funkcją LoadLibrary Funkcje i procedury przypisywane są za pomocą funkcji GetProcedureAddress Biblioteka zwalniana jest z pamięci funkcą FreeLibrary 37 Program testowy; {$mode objfpc} uses crt,sysutils,dynlibs; type MyFunc = function(x:single):single;stdcall; MyProc = procedure(x:single);stdcall; var DLL: TLibHandle=dynlibs.NilHandle; dwapo: MyProc; pier: MyFunc; x,y:single; i:integer; 38 19
Biblioteki DLL clrscr; randomize; DLL:=Loadlibrary('biblioteka.dll'); pier:=myfunc(getprocedureaddress(dll, 'pierwiastek')); dwapo:=myproc(getprocedureaddress(dll,'dwapoprzecinku')); 39 Biblioteki DLL for i:=1 to 15 do x:=((random(10000)/13)+123)*5; y:=pier(x); dwapo(x); write(' pierwiastek '); dwapo(y); writeln; FreeLibrary(DLL); readln; end. 40 20
Biblioteki DLL 41 Pliki Pliki służą do przechowywania danych Dane z plików mogą być przetwarzane przez programy Przechowuje się w nich dane wyjściowe programów Zachowane w plikach dane zachowywane są po zamknięciu pracy z programem, umożliwiają kontynuowanie pracy nad nimi w późniejszym czasie Dane można przechowywać w plikach Tekstowych Binarnych 42 21
Pliki tekstowe Obsługa plików tekstowych jest analogiczna do wysyłania treści na ekran monitora lub odczytywanie danych z klawiatury Operacje na pliku są możliwe po jego podpięciu do aplikacji poleceniem Assign Rozpoczęcie pracy z podpiętym plikiem jest możliwe po aktywacji metody dostępu procedurą Reset, Rewrite lub Append Zapis i odczyt realizowany jest funkcjami Write i Read Dostęp do pliku zamykany jest instrukcją Close 43 Program plikdane; {$mode objfpc} uses crt; var plik:text; dane:string; clrscr; writeln(plik,dane); close(plik); reset(plik);//otwiera plik readln(plik,dane); close(plik); writeln(dane); readln; end. Assign(plik,'plik.txt'); rewrite(plik);//tworzy plik na dysku writeln('podaj tekst do zapisu'); write(':/>'); readln(dane); 44 22
45 Pliki Zazwyczaj aplikacje nie tylko tworzą nowe pliki ale korzystają z już istniejących Funkcja FileExists() sprawdza czy podany plik istnieje na dysku, zwraca wartość true lub false Funkcja EOF() i Eoln() ułatwia odczytywanie danych z pliku informując o końcu pliku i linii Odczyt i zapis danych do pliku wygodnie realizować jest w konstrukcji testowej try..finally lub try..except 46 23
Program plikdane2; {$mode objfpc} uses crt; var plik:text; dane:string; tab: array[1..10,1..10] of byte; i,j:byte; clrscr; Assign(plik,'plik.txt'); rewrite(plik); 47 for i:=1 to 10 do for j:=1 to 10 do tab[i,j]:=i*j; write(i*j,' '); write(plik,i*j,' '); writeln; writeln(plik,''); close(plik); 48 24
writeln('dopisanie danych do pliku'); append(plik); writeln('podaj podpis do danych jakie zostały wprowadzone'); write(':>'); readln(dane); writeln(plik,dane); close(plik); 49 writeln('odczyt danych z pliku'); reset(plik); while not Eof(plik) do while not Eoln(plik) do read(plik,dane); write(dane); readln(plik); writeln; readln; end. 50 25
51 Program plikdane; {$mode objfpc} uses crt; var plik:text; dane:string; clrscr; write('podaj nazwę pliku:'); readln(dane); 52 26
try try assign(plik,dane); writeln('odczyt danych z pliku:,dane); reset(plik); while not Eof(plik) do while not Eoln(plik) do read(plik,dane); write(dane); readln(plik); writeln; 53 finally close(plik); except writeln('plik o podanej nazwie nie istnieje!'); readln; end. 54 27
55 Program plikdane; {$mode objfpc} uses crt,sysutils; var plik:text; dane:string; clrscr; write('podaj nazwę pliku:'); readln(dane); 56 28
if fileexists(dane) then assign(plik,dane); writeln('odczyt danych z pliku'); reset(plik); while not Eof(plik) do while not Eoln(plik) do read(plik,dane); write(dane); readln(plik); writeln; end else writeln('plik o podanej nazwie nie istnieje!'); readln; end. 57 58 29
Zadanie Napisać program do gromadzenia danych kontaktowych (osobowe, adresowe, komunikacyjne) Dane przechowywane są w pliku tekstowym Program umożliwia wyszukiwanie osób po nazwisku lub imieniu 59 Zadania W kodzie źródłowym obu projektów należy wykorzystać procedury i funkcje dla wydzielonych zadań Procedury i funkcje z obu projektów umieścić w bibliotece DLL Sprawdzić działanie bibliotek w formie statycznej i dynamicznej 60 30