Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

1 Wykład 8 Podprogramy. 2 Pojęcie i istota stosowania dzielenie programu na części (logicznie spójne) - nazwane - niezależne od pozostałych części - z.

Podobne prezentacje


Prezentacja na temat: "1 Wykład 8 Podprogramy. 2 Pojęcie i istota stosowania dzielenie programu na części (logicznie spójne) - nazwane - niezależne od pozostałych części - z."— Zapis prezentacji:

1 1 Wykład 8 Podprogramy

2 2 Pojęcie i istota stosowania dzielenie programu na części (logicznie spójne) - nazwane - niezależne od pozostałych części - z określonym sposobem wymiany informacji z innymi częściami (przekazywanie danych) korzyści: - krótszy zapis źródłowy - efektywniejsze wykorzystanie PaO (mniej) - czytelność - łatwiejsze uruchamianie i testowanie - tworzenie bibliotek i korzystanie

3 3 Podział różnice - sposób definiowania - funkcja przyjmuje wartość - procedura nie - sposób wywołania procedury nagłówek: procedure nazwa_proc ( sekw._deklaracji_parametrów_formalnych ); function nazwa_fun ( sekw._dekl._param._formal. ): nazwa_typu_wartości; lista_nazw_parametrów_formalnych: nazwa_typu var lista_nazw_parametrów_ formalnych : nazwa_typu elementy listy oddzielane ; mechanizm przekazywania danych funkcje Definiowanie

4 4 function nazwa (parametry formalne): typ funkcji ; definicje, deklaracje lokalne begin.... nazwa := wyrażenie ; //albo result:=wyrażenie end ; procedure nazwa (parametry formalne) ; definicje, deklaracje begin.... instrukcje.... end ; Definicje funkcji i procedury zawierają nagłówek, blok definicyjny i blok wykonawczy

5 5 Wywołanie (wykonanie) procedura – osobna instrukcja wykonania: nazwa_procedury( lista_parametrów_aktualnych ); Uwagi: parametry aktualne zgodne z parametrami formalnymi: - co do liczby - co do typu - co do kolejności funkcja – najczęściej w wyrażeniu (jako składniku instrukcji): nazwa_funkcji( lista_parametrów_aktualnych ); ale może być też osobną instrukcją, gdy nie zależy nam na zwracanej wartości parametry oddzielane przecinkami,

6 6 var a, b, c:real; begin a:=2; Edit1.text:= FloatToStr(srednia (6.7, 2*a)) ; end ; function srednia (x1, x2 : real): real ; begin result := (x1 + x2)/2 ; //albo srednia:= (x1 + x2)/2 ; end ; {koniec definicji funkcji} parametry formalne typ wyniku procedure TForm1.Button1Click(Sender: TObject); Przykład funkcji obliczającej średnią arytmetyczną Definicja lokalna funkcji – funkcja dostępna tylko wewnątrz procedury Button1Click parametry aktualne

7 7 Przekazywanie danych z/do podprogramu - parametr formalny bez var - jest zmienną lokalną - wartość początkowa w momencie wywołania - argument aktualny - wyrażenie typu zgodnego - przekazywanie danych tylko na wejściu do podprogramu przez zmienną (adres) - określonego typu (referencyjnie) - parametr formalny z var - faktycznie nie dane lecz adres argumentu aktualnego - argument aktualny - zmienna tego samego typu - przekazywanie danych na wyjściu (czyli w większości przypadków zwrot wyniku lub wyników) - ale może być także na wejściu przez wartość

8 8 implementation //własna procedura procedure alfa(x1,x2:real; var wynik:real); begin wynik:=x1-x2; end; procedure TForm1.Button1Click(Sender: TObject); var w:real; begin alfa(5,2,w); Memo1.Lines.Add(FloatToStr(w)) ; alfa(4,2,w); Memo1.Lines.Add(FloatToStr(w)) ; end; definicja Przykład

9 9 implementation //własna procedura procedure alfa(var x1,x2:real; var wynik:real); begin wynik:=x1 - x2; //zmienne są deklarowane w nagłówku definicji end; procedure TForm1.Button1Click(Sender: TObject); var a,b,w:real; begin a:=5; b:=4; alfa(a,b,w); Memo1.Lines.Add(FloatToStr(w)) ; alfa(w,w,w); Memo1.Lines.Add(FloatToStr(w)) ;//jaki będzie wynik? end;... ale można też tak....

10 10 deklaracje globalne – zmienne widoczne w całym programie (chyba że przesłonięte w B, C lub D – nowe definicje) deklaracje lokalne w B (zewnętrzne dla C) deklaracje lokalne w C (zmienne z deklaracji A i B można przesłaniać) tu można wykorzystać procedurę C deklaracje lokalne w D (zmienne z deklaracji A można przesłaniać, procedura C niewidoczna) inna procedura, tu można wywołać procedury B i D, nie można procedury C unit A implementation deklaracje A procedure TForm1.Button1Click(Sender: TObject); begin end ; procedure B deklaracje B begin end procedure C deklaracje C begin end procedure D deklaracje D begin end Zasięg deklaracji i definicji

11 11 procedure srednia (liczba1, liczba2 : real ; var wynik : real) ; begin wynik := (liczba1 + liczba2)/2 ; end ; {koniec definicji procedury} procedure TForm1.Button1Click(Sender: TObject); var a, b, c:real; begin a:=2; b:=3; srednia (6.7, 2*a, c) ; {trzeci parametr aktualny musi być zmienną} Memo1.Lines.Add (FloatToStr(c)) ; {c jest równe (6.7+2*2)/2=5.35} srednia (a, b, c) ; Memo1.Lines.Add (FloatToStr(c)) ; {c jest równe (2+3)/2=2.5} srednia (a, c, c) ; Memo1.Lines.Add (FloatToStr(c)) ; {c jest równe (2+2.5)/2=2.25} srednia (c, b, a) ; Memo1.Lines.Add (FloatToStr(a)) ; {a jest równe (2.25+3)/2=2.67.. end; Przykład procedury obliczającej średnią arytmetyczną parametry formalne parametry aktualne

12 12 Uwagi: parametry formalne opcjonalne (nie wymagane )- jeśli nie ma to pomijamy "( )" definicje dodatkowych zmiennych lokalnych - opcjonalne typ parametru formalnego - dowolny (plik tylko przez zmienną) - nazwa typu (nie opis) - także tylko string (bez rozmiaru) typ wartości funkcji - tylko prosty lub string (bez rozmiaru) - nazwa typu (nie opis) dla definicji funkcji musi być w części akcyjnej nadanie wartości funkcji nazwa_funkcji := W typu_zgodnego ze środka podprogramu (procedury|funkcji) można "wychodzić" przy pomocy wykonania procedury standardowej exit; (wymuszenie zakończenia podprogramu)

13 13 procedure ff1 (x:real;var y:real); begin if x=0 then begin Showmessage('Argument ujemny'); exit; end else y:=sin(x)/x end; procedure TForm1.Button1Click(Sender: TObject); var v:real; begin ff1(0,v); ff1(-3,v); edit1.Text:= floattostr(v); end; Przykład:

14 14 procedure TForm1.Button2Click(Sender: TObject); procedure linia_poz; begin Memo1.Lines.Append( '--------------------' ); end; procedure linia_pion; begin Memo1.Lines.Append( '| |' ); end; begin linia_poz; linia_pion; Memo1.Lines.Append( '| DELPHI |' ); linia_pion; linia_poz; end; Przykład procedury bezargumentowej:

15 15 var i: integer; function fun( k: integer): real; begin if k <= 10 then fun := 2*k else fun := 40 - 2*(k-1) end; begin Memo1.Font.Name := 'Courier'; for i:= 1 to 20 do Memo1.Lines.Append( format('%3d %10.1f ',[i, fun(i)] )); end; Przykład- tabela funkcji : definicja lokalna

16 16 Przykład - łączenie dwóch plików uporządkowanych są pliki tekstowe: gr_1.txt oraz gr_2.txt opisują uporządkowany opis ciągu osób: numer, nazwisko i pensję kluczem uporządkowania jest numer osoby plik gr_1.txt: 1 Nowak 1234.50 4 Kowalski 1300.0 7 Miodowicz 888.88 10 Kowal 1155.0 plik gr_2.txt: 3 Nowacki 1734.0 10 Kowal 2300.0 13 Malinowski 1256.10

17 17 dwie procedury pomocnicze: czytaj - wczytanie do rekordu jednych danych z plik przepisz - wpisanie danych z rekordu os_A do pliku wynikowego, jeżeli nie ma końca pliku gr_A to wczytanie nowej danej, w przeciwnym razie przepisanie reszty pliku gr_B do pliku wynikowego type osoba= record nr:integer; nazwisko:string[20]; pensja:real; end; var gr_1, gr_2, grupa:TextFile; os_1, os_2:osoba; koniec:boolean; deklaracje globalne

18 18 procedure czytaj( var gr:textFile; var os:osoba ); // wczytanie danych o jednej osobie z pliku gr do rekordu os begin with os do begin readln( gr, nr); readln( gr, nazwisko ); readln( gr, pensja ); end end; Definicje procedur

19 19 procedure przepisz( var os_A, os_B:osoba; var gr_A, gr_B:textFile ); begin writeln( grupa, os_A.nr:3, os_A.nazwisko:12, os_A.pensja:9:2 ); if eof( gr_A ) then begin // koniec pliku while not eof( gr_B ) do begin // kopiowanie writeln( grupa, os_B.nr:3, os_B.nazwisko:12, os_B.pensja:9:2 ); czytaj( gr_B, os_B ) end; writeln( grupa, os_B.nr:3, os_B.nazwisko:12, os_B.pensja:9:2 ); koniec := true; // ustawienie - koniec łączenia end else czytaj( gr_A, os_A ); // nie koniec, więc wczytanie nowego end;

20 20 begin // procedura główna assignFile( gr_1, 'gr_1.txt' ); // przygotowanie plików assignFile( gr_2, 'gr_2.txt' ); assignFile( grupa, 'grupa.txt' ); reset( gr_1 ); reset( gr_2 ); rewrite( grupa ); koniec := eof( gr_1 ) or eof( gr_2 ); if koniec then showMessage( 'Brak danych' ) else begin czytaj( gr_1, os_1 ); czytaj( gr_2, os_2 ); repeat // główna pętla łączenia if os_1.nr < os_2.nr then przepisz( os_1, os_2, gr_1, gr_2 ) // dopisanie os_1 else if os_1.nr > os_2.nr then przepisz( os_2, os_1, gr_2, gr_1 ) // dopisanie os_2 else begin showMessage( 'Dwie takie same osoby nr ' + intToStr( os_1.nr ) ); czytaj( gr_2, os_2 ); end until koniec; end; CloseFile(gr_1); CloseFile(gr_2); CloseFile(grupa); end;


Pobierz ppt "1 Wykład 8 Podprogramy. 2 Pojęcie i istota stosowania dzielenie programu na części (logicznie spójne) - nazwane - niezależne od pozostałych części - z."

Podobne prezentacje


Reklamy Google