Podstawy języka OBJECT PASCAL Paweł Mazurek
WSTĘP Object Pascal podstawowym językiem programowania w Delphi; Object Pascal od zwykłego Pascala różni się tylko programowaniem obiektowym. W Pascalu programowania obiektowego nie ma (brakuje klas). 2
Tworzenie aplikacji w Delphi komponenty w Delphi; podstawy języka Object Pascal: zmienne, stałe, operatory, typy języka i definiowane przez użytkownika, instrukcje warunkowe, pętle, procedury i funkcje, moduły, pakiety, wykorzystanie obiektów, strukturalna obsługa wyjątków; 3
Słowa kluczowe Słowa kluczowe są to nazwy zarezerwowane przez język Object Pascal. Ich użycie w programie zawsze związane jest z wydaniem konkretnego polecenia. Słów kluczowych nie można używać jako nazw zmiennych, stałych, procedur czy funkcji. Kompilator zgłosi bład także w przypadku próby nadania komponentom lub obiektom nazw takich jak jakieś słowo kluczowe. 4
Słowa kluczowe and array as asm begin case class const constructor destructor dispinterface div do downto else end except exports file finalization finally for function goto if implementation in inherited initialization inline interface is label library mod nil not object of or out packed procedure program property raise record repeat resourcestring set shl shr string then threadvar to try type unit until uses var while with 5
Dyrektywy Słowa kluczowe są integralną częścią języka Pascal i są zastrzeżone, tzn. nie mogą być zdefiniowane przez programistę. Oprócz słów kluczowych w wersji 7.0 Pascala występują dyrektywy języka. Dyrektywą jest każdy z 10. następujących wyrazów: absolute far near public assembler forward private virtual external interrupt W odróżnieniu od słów kluczowych, dyrektywy języka nie są zastrzeżone - podane wyrazy mogą więc być identyfikatorami zdefinowanymi przez programistę, co jednak nie jest zalecane. Pewnym wyjątkiem są dyrektywy private i public, które w obiektach (ale tylko w nich) są słowami zastrzeżonymi. 6
Deklaracja danych Nie zależnie od rodzaju danych obowiązują ścisłe reguły ich deklaracji. W zależności od miejsca deklaracji zmienna może mieć zasięg globalny, lokalny lub istnieć tylko w wybranej procedurze bądź funkcji. Sposób deklaracji Rodzaj danej stała const G=9.81; S= szkola ; zmienna var a:real; t:word; 7
Zmienne są to pewne fragmenty pamięci, którym możemy zmieniać zawartość dowolną liczbę razy. Deklaracja zmiennych następuje po słowie kluczowym var. Potem następuje nazwa zmiennej, a po dwukropku jej typ i na koniec średnik. Zmienne jednego typu można oddzielać przecinkami. Zmiennym można przypisywać wartości. Służy do tego operator przypisania := ("staje się równe"). Deklaracja stałych następuje po słowie kluczowym const. Potem następuje nazwa stałej, a po znaku równości jej wartość i na koniec średnik. Wartości stałych nie można zmieniać (przypisujemy im wartość podczas deklaracji). Zalecane jest nazywanie stałych WIELKIMI LITERAMI. 8
ZMIENNE I STAŁE zmienne: var zmienna1, zmienna2 : integer; zmienna3 : string ; stałe: const Najważniejsze typy zmiennych to: string - łańcuch (łańcuch znaków czyli tekst) char - pojedynczy znak integer - liczba całkowita real - liczba rzeczywista boolean - zmienna logiczna (true - prawda i false - fałsz. ErrorString = Niebezpieczeństwo ; i : integer = 10; 9
OPERATORY przypisania: := ; porównania: = <> < > <= >= ; logiczne: and or not ; arytmetyczne: + - * / div mod ; bitowe: and or not xor shl shr ; zwiększania/zmniejszania: Inc() Dec() ; 10
program operator; var napis: string; z1, z2: char; a, b: integer; c: real; czy: boolean; OPERATORY begin a := 1; b := 2 + 2; {dodawanie liczb - b=4} a := a + 1; {dodawanie liczby do zmiennej i przypisanie jej samej - a=2} z1 := 'a'; z2 := 'b'; napis := z1 + z2; {dodawanie łańcuchów - napis='ab'} writeln(napis); {"ab"} writeln(a); {"2"} writeln(b); {"4"} {a := 4 / 2;} {to byłby błąd - wyniku dzielenia nie można przypisać liczbie całkowitej} a := 4 div 2; c := 4 / 2; czy := (a-b) = (b-a); {bardziej złożone - wykorzystujemy nawiasy} writeln('odejmowanie jest przemienne?'); writeln(czy); {wyświetla odpowiedź, niestety po angielsku: "false"} readln; end. 11
Operatory Operatory używane są do manipulowania danymi. Przeprowadzają one obliczenia i porównania, dokonują przypisań, oraz robią wiele różnych innych rzeczy, których prawie nigdy się nie używa. W Object Pascalu jest dużo operatorów. Niektórych operatorów używamy rzadko, innych natomiast bardzo często. Operatorów and, or i not używa się w dwóch znaczeniach: logicznym i bitowym. Weźmy na przykład poniższy kod: if (Wystartowano = True) and (X > 20) then Z := X and Y; Operator and jest tu użyty w dwóch różnych znaczeniach. Kompilator jednak wie, jak zinterpretować taki zapis. 12
Operatory div mod - dzielenie całkowite (wynik zaokrąglony w dół) i reszta z dzielenia 13
Operatory 14
Operatory 15
Operatory 16
Operatory Ale dozwolone są też postacie : (*komentarz*) //komentarz 17
Konstrukcja i obliczanie wyrażeń Wyrażenia są budowane w oparciu o stałe, zmienne, operatory, nazwy funkcji i zbiorów oraz nawiasy okrągłe. Wyrażenia zapisujemy w jednym wierszu, bez opuszczania znaku mnożenia, z wykorzystaniem nawisów zwykłych. Wartościowanie wyrażenia wyznaczenie wartości wyrażenia, tj. wykonanie operacji na argumentach zgodnie kolejnością określona przez nawiasy zwykłe lub priorytet operatorów. Przykładowe wyrażenia: (a-b)/(c+d); a-c/(d+e); (a+b)/c-d. Reguły obliczania wartości wyrażeń zawierających operatory: - wykonywanie obliczeń w kolejności określonej przez nawiasy grupujące; - w pierwszej kolejności realizacja działań dla operatorów o najwyższym priorytecie; - w przypadku jednakowego priorytetu operatorów wykonywanie działań od lewej strony do prawej. 18
var {definiowane zmienne} program zmienne; napis: string; {łańcuchowa} z: char; {znakowa} a, b: integer; {dwie całkowite} duza, mala: real; {dwie rzeczywiste} czy: boolean; {oraz logiczna} begin napis := 'Witaj świecie!'; z := 'a'; a := 278; b := -556; duza := 5678.0; mala := -0.0012; czy := true; {kod poniżej (7 linijek) to przypisanie zmiennym wartości} writeln('wartość zmiennej "napis" to:'); {Oczywiście drukuje (to znaczy wyświetla) napis "Wartość zmiennej "napis" to:"} writeln(napis); {Drukuje "Witaj świecie!"} writeln(z); {"a"} writeln(a); {"278"} writeln(b); {"-556"} writeln(duza); {" 5.678000000000000E+003"} writeln(mala); {"-1.200000000000000E-003" - wielkość liter nie ma znaczenia} writeln(czy); {"TRUE"} readln; 19 end.
program stale; const {będą definiowane stałe} N=3; ZZ='Zbzikowany Zawiadowca'; var napis: string; a, b: integer; c: real; begin writeln(n); {stałe można drukować} writeln(zz); a := 1; b := n; {można je stosować przy operatorze przypisania} c := a * n; {i przy innych operatorach} napis := zz + ' szaleje'; zz := 'Zielona Zebra {to byłby błąd - nie można przypisywać stałym nowych wartości} writeln(a); {"1"} writeln(b); {"3"} writeln(c); {"3"} writeln(napis); {"Zbzikowany Zawiadowca szaleje"} readln; end. 20
TYPY JĘZYKA OBJECT PASCAL przykładowe typy: typy całkowitoliczbowe: Integer, Shortint, Byte typy zmiennoprzecinkowe: Single, Double, Currency typy logiczne: Boolean, LongBool 3 typy reprezentujące pojedynczy znak: AnsiChar, WideChar i Char; łańcuchy: AnsiString, ShortString, WideString typ Variant (wartości UNASSIGNED i NULL); 21
Typy danych W Object Pascalu, typ danej informuje kompilator o sposobie przechowywania tej danej w pamięci. W Object Pascalu przed użyciem zmiennej trzeba deklarować jej typ 22
var Deklarowanie zmiennych X1 : Integer; X : Integer; Y : Double; Z : Byte;... X1 := -1; X := 1000; Y := 3.14; Z := 27;... Umożliwia to kompilatorowi sprawdzanie typu zmiennej przy każdym przypisaniu. Niewłaściwe użycie zmiennej poskutkuje ostrzeżeniem albo błędem kompilatora. 23
Typy danych używane w Object Pascalu 24
Typy danych używane w Object Pascalu Typ Extended zapewnia najlepszą precyzję, nie jest jednak zalecany, gdy aplikacja ma być uruchamiana na różnych platformach. Typ Comp służy do pamiętania dużych liczb całkowitych, nie jest jednak typem porządkowym (nie można go np. inkrementować), zachowany dla zgodności z wersjami wcześniejszymi, zaleca się używać typu Int64. 25 Typ Currency ma zastosowanie do obliczeń pieniężnych.
Typ Integer ma taki sam zakres wartości, jak typ LongInt. Jest to zaszłość ze środowiska 16-bitowego, gdzie zmienna typu Integer zajmowała dwa bajty pamięci, natomiast zmienna typu LongInt cztery. W 32-bitowym środowisku oba typy danych zajmują w pamięci 4 bajty i mają taki sam zakres wartości. Delphi generuje tylko 32-bitowe programy, więc typy Integer i LongInt są identyczne. Typy Int64 i Compy mają też taki sam zakres wartości. Różnica między nimi polega na różnym traktowaniu ich przez kompilator. Typ Int64 jest typem całkowitym, zaś typ Comp jest typem rzeczywistym i używany jest rzadko. Również typy Real i Double są takie same. W poprzednich wersjach Delphi typ Real zajmował 6 bajtów w pamięci, teraz zajmuje 8. Zmiana ta została podyktowana zapewnieniem zgodności z nowymi procesorami. Typ Real uznawany jest dziś za przestarzały, zaleca 26 się używanie typu Double.
Typy danych Typy Single, Double, Extended i Currency są typami zmiennoprzecinkowymi (liczby z miejscami po przecinku). Pozostałe typy danych są typami całkowitymi. Nie można przypisać zmiennej typu Integer wartości ułamkowej. Na przykład, poniższy kod spowoduje błąd kompilacji: var X : Integer;... X := 3.75; 27
Rzutowanie W poleceniu MessageBox trzeba podawać kilka parametrów. W przypadku drugiego i trzeciego parametru ma być to tekst, który zostanie wyświetlony w okienku. Ten tekst musi być typu PChar. Możesz więc napisać tak: var Tekst, Tytul : PChar; begin Tekst := 'Delphi jest fajne!'; Tytul := 'Nie wiem?'; MessageBox(0, Tekst, Tytul, MB_OK); Tak, będzie dobrze. Bo zmienne Tekst oraz Tytul są typu PChar. Teraz zamiast typu PChar napiszmy String: var Tekst, Tytul : String; begin Tekst := 'Delphi jest fajne!'; Tytul := 'Nie wiem?'; MessageBox(0, Tekst, Tytul, MB_OK); end. To nie przejdzie. Kompilator wyświetli błąd: [Error] Project1.dpr(21): Incompatible types: 'String' and 'PChar'. 28
Kompilator wykazuje że typy PChar i typ String to dwie różne rzeczy!. Częściowo ma racje, ale to da się oszukać. Do tego właśnie służy rzutowanie. Polega to na oszukaniu kompilatora. On "myśli",że jest to typ PChar, a ty stosujesz typ String: var Tekst, Tytul : String; begin Tekst := 'Delphi jest fajne!'; Tytul := 'Nie wiem?'; MessageBox(0, PChar(Tekst), PChar(Tytul), MB_OK); end. Jest to rzutowanie typu String na typ PChar. Kompilacja się powiedzie i wszystko będzie dobrze. Fajnie, nie? Ale takie coś już nie wyjdzie: var Licznik : Integer; begin Licznik := 1; MessageBox(0, PChar(Licznik), '', MB_OK); end. I to jest oczywiste. Przecież typy Integer i PChar zapisane są w odrębnych komórkach pamięci. 29
Funkcje konwersji Konwersja to proces zamiany jednego typu danych w drugi. Najczęściej wykonywana jest przy zwracaniu wyników ( liczby zamieniane są na tekst) Wybrane funkcje konwersji Val(tekst:string,var zmienna,kod błędu:integer);-zamiana tekstu na liczbę Str(liczba,tekst:string); można tez podac dokładność po przecinku Str(t:8{długość w znakach }:3{liczba znaków po przecinku},s); FloatToStr- z liczby rzeczywistej na tekst; StrToFloat- z tekstu na liczbę rzeczywistą IntToStr- z liczby całkowitej na tekst; StrToFloat- z tekstu na liczbę całkowitą 30
Konwersja między typami danych Konwersja z typu String na liczbę: function StrToInt(S:String):Integer funkcja przetwarza liczbę z łańcucha S na typ Integer function StrToFloat(S:String):Extended funkcja przetwarza liczbę z łańcucha S na typ Extended np. Real. function StrToCurr(S:String):Currency - funkcja przetwarza liczbę z łańcucha S na typ Currency (zmiennoprzecinkowy). Konwersja z typu liczbowego na String function IntToStr(I:Integer):String funkcja przetwarza liczbę całkowitą I na łańcuch function FloatToStr(X:Extended):String funkcja przetwarza liczbę rzeczywistą X na łańcuch function CurrToStr(Z:Currency):String funkcja przetwarza liczbę Z z typu Currency na łańcuch 31
Konwersja- proste zadanie Aplikacja, która zamieni wczytany nr z klawiatury na znak z tablicy kodów ASCII (zakres liczbowy od 0 do 255) Przykładowa funkcja wykonująca zadaną konwersję: procedure TForm1.Button1Click(Sender: TObject); var i:byte; kodbledu:integer; begin Val(Edit1.Text,i,kodBledu); if kodbledu<>0 then begin Messagebox(handle,'Podaj liczbę z zakresu 0-255','Komunikat',mb_IconError); exit; end; Label1.Caption:=Char(i); end; 32
konwersja var cena, cena_brutto: Currency; begin Label1.Caption:=Edit1.Text; cena:=strtocurr(edit2.text); cena_brutto:=cena +cena*0.22+cena*0.071; Label2.Caption:=CurrToStr(cena_brutto) end; 33
Tablice Tablice to zbiór zmiennych tego samego typu. Popatrz zamiast deklarować kilka zmiennych tego samego typu: var Zmienna1, Zmienna2, Zmienna3, Zmienna4 : String; Możesz zapisać to w formie tablicy: var Zmienna : array[0..3] of String; Tablice deklaruje się za pomocą słowa kluczowego array. Następnie w nawiasach klamrowych wpisujesz z ilu elementów ma się składać tablica. W tym wypadku z czterech ( 0 to także element tablicy ). Na końcu jakiego typu mają być elementy tablicy. Teraz jeżeli chcesz poszczególnym elementom przypisać jakieś wartości robisz tak: Zmienna[0] := 'Adam'; Zmienna[1] := 'Marta'; Zmienna[2] := 'Zuzia'; Zmienna[3] := 'Bronia'; Nic nadzwyczajnego. Elementy tablicy mogą być wykorzystane jak zwykłe zmienne: ShowMessage(Zmienna[0] + ' ' + Zmienna[1]); 34
TYPY DEFINIOWANE PRZEZ UŻYTKOWNIKA tablica i tablice dynamiczne : type var Tablica1 = array [0..5] of integer; Tab1 : Tablica; Tab2 : array [2..5] of integer; Tab3 : array of string; 35
Tablice Wszystkie wbudowane w Object Pascal typy danych można grupować w tablice. Tablica jest po prostu zestawem wartości. Powiedzmy, że chcesz umieścić w pamięci komputera tablicę, w której chcesz zapisać 5 liczb typu Integer. Deklaracja takiej tablicy wyglądałaby następująco: var MojaTablica : array[0..4] of Integer; Kompilator zaalokuje pamięć dla takiej tablicy. Ponieważ każdy element tablicy zajmuje 4 bajty, cała tablica zajmuje w pamięci 20 bajtów. 36
Tablice Po zadeklarowaniu tablicy można ją wypełnić używając operatora indeksu []: MojaTablica[0] := -200; MojaTablica[1] := -100; MojaTablica[2] := 0; MojaTablica[3] := 100; MojaTablica[4] := 200; Do poszczególnych elementów tablicy odwoływać się można następująco: X := MojaTablica[3] + MojaTablica[4]; {do zmiennej X wpisana zostanie wartość 300} 37
Instrukcja przypisania Instrukcje proste Instrukcja powoduje zastąpienie dotychczasowej wartości podanej zmiennej wartością otrzymaną w wyniku wartościowania wyrażenia. Po lewej stronie operatora przypisania znajduje się zmienna, do której zostanie nałożona wartość wyrażenia zapisanego po prawej stronie. Wyrażeniem tym może być inna zmienna lub stała. Nie wolno używać po lewej stronie przypisania wartości stałej lub wyrażenia. Przy instrukcji przypisania obowiązuje: Zgodność typów w sensie przypisania. 38
Instrukcja skoku (goto) Instrukcje proste Instrukcja powoduję zmianę naturalnego i sekwencyjnego porządku wykonywania instrukcji. Kolejną wykonywaną instrukcją będzie instrukcja poprzedzoną etykietą użytą w instrukcji skoku. Każda etykieta musi być zadeklarowana! 39
Instrukcja złożona Instrukcja polega na sekwencyjnym wykonaniu instrukcji wewnętrznych zawartych w tej instrukcji. begin instrukcja1; instrukcja2; {...} instrukcja n; end. 40
instrukcja If: INSTRUKCJE WARUNKOWE Wielokrotne wykonywanie tych samych czynności instrukcja wyboru case 41
Instrukcja IF ("jeśli") Instrukcja if w języku Object Pascal służy do zapisania rozgałęzienia obliczeń. Składnia: if wyrażenie then instrukcja; albo If wyrażenie then instrukcja1 else instrukcja2; gdzie: wartością wyrażenia jest jedna z dwóch wartości logicznych TRUE lub FALSE: Jeżeli TRUE to wykonywana jest instrukcja występująca po then. Jeżeli FALSE to wykonywana jest instrukcja po else. Instrukcja, instrukcja1 lub instrukcja2 mogą być kolejnymi instrukcjami if (tzn. mogą być zagnieżdżone). 42
var WylosowanaLiczba: Integer; begin Randomize; // uruchamiamy bęben losujący :) WylosowanaLiczba := Random(20); // losuje liczbę z zadanego zakresu if WylosowanaLiczba < 10 then MessageBox(0, 'Wylosowana liczba jest mniejsza niż 10', '{none}', MB_OK); if WylosowanaLiczba > 10 then MessageBox(0, 'Wylosowana liczba jest większa niż 10', '{none}', MB_OK); end. 43
A oto przykład połączenia operatorów z instrukcją if, then: if (Liczba > 100) and (Liczba < 150) then { jeżeli liczba jest większa od 100, ale mniejsza od 150 } if (Liczba <> 100) and not (Liczba = 120) then { jeżeli liczba jest rożna od 100 i nie jest to 120 } if (Liczba < 100) or (Liczba < 150) then { jeżeli liczba jest mniejsza od 100 oraz mniejsza od 150} Jeżeli mamy więcej warunków do spełnienia to należy je wsiąść w nawias. Do czego w takim razie służy else? Można to przetłumaczyć jako: "w przeciwnym wypadku". Tzn., co program ma robić jeżeli warunek nie zostanie spełniony: if Liczba = 100 then { jezeli liczba jest rowna 100 to rób cos tam } MessageBox(0, 'Jest to liczba 100', '', MB_OK) { w przeciwnym wypadku } else MessageBox(0, 'Nie wiem co to za liczba', '', MB_OK); 44
Jeżeli po instrukcji if, then będzie więcej niż jedna komenda to należy wszystko wsiąść dodatkowo w słowa begin i end: if Liczba = 100 then begin { <-- trzeba begin bo beda po tym dwa polecenia! } MessageBox(0, 'Jest to liczba 100', '', MB_OK); { <-- jest średnik!!! } MessageBox(0, 'Zgadłeś! Brawo!', '', MB_OK); { <-- tu jest średnik! } end ; else MessageBox(0, 'Nie wiem co to za liczba', '', MB_OK); 45
Instrukcja CASE (wyboru) Instrukcja case w języku służy do zapisania rozgałęzienia obliczeń. Składnia case selektor of sekwencja_instrukcji_wyboru end. albo case selektor of sekwencja_instrukcji_wyboru else instrukcja end. Stosujemy ją wtedy kiedy mamy dużo warunków if. Wykonanie instrukcji polega na: wyznaczeniu wartości selektora. wykonaniu instrukcji wewnętrznej, która jest poprzedzona stałą równą obliczonej wartości selektora, jeżeli nie ma takiej stałej to wykonywana jest instrukcja po else lub instrukcja pusta. gdzie: selektor - dowolne wyrażenie typu porządkowego (od tego wyrażenia zależy wybór dalszej operacji w instrukcji. sekwencja_instrukcji_wyboru - lista instrukcji, których każda poprzedzona jest stałą. else - stanowi w tej instrukcji zabezpieczenie na wypadek, gdyby wartość selektora nie odpowiadała żadnej instrukcji z ekwencji_instrukcji_wyboru. 46
var Liczba: Integer, stext : String; begin Randomize; Liczba := Random(20); case Liczba of 1: stext := 'Wylosowałeś 1!'; 10: stext := 'Sam środek!'; 19: stext := 'Sam koniec'; end; end. W instrukcji case można wykorzystać instrukcję else: case Liczba of 1: stext := 'Wylosowałeś 1!'; 10: stext := 'Sam środek!'; 19: stext := 'Sam koniec'; else stext := 'Eeee, już nic.'; end; Tak jak w przypadku instrukcji if jeżeli masz dwie linie komend musisz wszystko wziąć pomiędzy blok begin i end: case Liczba of 1: begin { będą dwie linie - trzeba użyć słowa begin } stext := 'Wylosowałeś 1!'; Liczba := 2; end; { koniec całego bloku } {... } end; Instrukcja case ma jeszcze jedną zaletę. Można w niej określić wartość od do : case Liczba of 1..10: stext := 'Wylosowałeś liczbe od 1 do 10!'; 11..20: stext := 'Sam środek!'; 21..40: stext := 'Sam koniec'; end; 47
Instrukcje iteracyjne (Pętle w Delphi) Pętla pozwala na powtórzenie przez program danej operacji określoną ilość razy. Są trzy rodzaje pętli w Delphi (Pascal u): Pętla while Pętla repeat Pętla for 48
Instrukcja for w języku Object Pascal służy do wielokrotnego wykonywania czynności w niej zapisanych. Składnia Instrukcja FOR ("dla") for z:=w1 to w2 do begin ciąg instrukcji do wykonania w każdym przebiegu pętli end albo for z:=w1 downto w2 do begin ciąg instrukcji do wykonania w każdym przebiegu pętli end gdzie: z to zmienna typu porządkowego; w1,w2 to wyrażenia typu porządkowego minimum wykonań instrukcji w pętli to 0 razy maksimum wykonań instrukcji w pętli jest ustalona w momencie rozpoczęcia pętli. 49
Instrukcja FOR ("dla") Procedura najpierw wypełnia liczbami od 0 do 9 kolejne pola tablicy, a następnie odczytuje je w odwrotnej kolejności i wyświetla po kolei w formie komunikatów. 50
Instrukcja WHILE (dopóki) instrukcja while w języku (Object) Pascal służy do wielokrotnego wykonywania grupy instrukcji w niej zapisanych. Składnia while wyrażenie do instrukcja; Wartością wyrażenia jest wartość logiczna: TRUE lub FALSE. Instrukcji używamy wtedy, gdy w wyniku iteracji chcemy doprowadzić do tego aby warunek w wyrażeniu był fałszywy. Jeżeli po słowie do ma wystąpić grupa instrukcji należy użyć konstrukcji: while wyrażenie do begin {grupa instrukcji} end; 51
Instrukcja REPEAT (powtarzaj) Instrukcja repeat w języku Object Pascal służy do wielokrotnego wykonywania grupy instrukcji w niej zapisanych. Składnia repeat ciąg_instrukcji until wyrażenie Wartością wyrażenia jest wartość logiczna TRUE lub FALSE. Instrukcji używamy wtedy, gdy w wyniku iteracji chcemy doprowadzić do tego aby warunek w wyrażeniu był prawdziwy. Minimum wykonań iteracji to 1 raz. 52
53
54
Instrukcja wiążąca WITH Składnia: with lista_zmiennych do instrukcja; Instrukcja ta nie robi nic specjalnego. Po prostu ułatwia programiście pracę. Zamiast pisać: Dane.Imie := 'Pawcio'; Dane.Nazwisko := 'Iksinecki'; Można zastosować instrukcję wiążącą i zmniejszyć ilość wypisanych słów: with Dane do begin Imie := 'Pawcio'; Nazwisko := 'Iksinecki'; end; 55
programy demonstrujące działanie funkcji If...Then if ( strtoint(edit1.text) >0 ) and ( strtoint(edit1.text) <25 ) then begin showmessage('jesteś w pięknym młodym wieku!'); end else begin showmessage('głowa do góry! Twój wiek też jest piękny!'); end; var licznik: integer; begin for licznik:=1 to 10 do showmessage('testujemy działanie pętli For'); end; Każde kolejne powtórzenie pętli powoduje zwiększenie wartości zmiennej licznik o 1. Wartośc tą można odczytywać w czasie działania pętli jednak nie można jej modyfikować (jest to możliwe w językach programowania takich jak np. C lub C++). 56
przykład zastosowania instrukcji case...of: Case strtoint(edit1.text) of 1..18: showmessage('jesteś nieletni! To i tak pięknie!'); 19..25: showmessage('jestęś w pięknym młodym wieku!'); 26..60: showmessage('głowa do góry! Twój wiek też jest piękny!'); 61..120: showmessage('masz już pewnie wnuki! To pięknie!'); else showmessage('nie możesz mieć tylu lat!'); end; 57
Funkcje i procedury- pojęcie podprogramu Podprogram jest to ciąg instrukcji mogący zawierać własne deklaracje zmiennych określony jednym identyfikatorem (nazwą). W programie głównym jedna instrukcja pozwala wykonać podprogram. Podprogram może być wywoływany kilka razy w programie głównym. Ważną właściwością podprogramu są parametry - czyli pewne wartości (lub zmienne) dla których zostaje wykonany ciąg instrukcji w podprogramie. W Pascalu istnieją dwa typy podprogramów: funkcje i procedury. Funkcje różnią się od procedur tym, że można je traktować jako wartość określonego typu (inaczej określa się to żee funkcje zwracają wartość) - oznacza to żee mogą występować w wyrażeniach. Przykładem funkcji są funkcje SIN, COS. Procedury traktowane są jako nowa instrukcja języka - nie mogą być używane w wyrażeniach. Funkcje i procedury mogą mieć lub nie mieć parametrów. Ewentualne parametry przekazuje się w wywołaniu podprogramu w nawiasach okrągłych (np. x:= SIN(2*y)). Uwaga: Funkcja zwraca wynik przez nazwę lub przez słowo kluczowe result:= 58
Procedura Podczas pisania programu zdarza się nam wielokrotnie odwoływac do określonego fragmentu kodu. Aby nie powielać wiele razy tego samego kodu należy zamknąć go w blok zwany procedurą. Procedura jest wydzieloną częścią kodu możliwą do identyfikacji za pomocą unikatowej nazwy. Procedurę wywołujemy wpisując w miejscu gdzie ma być wywołana jej nazwę. Gdy kompilator napotka w programie wywołanie procedury dokonuje zatrzymania realizacji programu i wykonuje skok do tej procedury. Procedury mogą się zapętlać, wewnątrz aktualnie wywołanej procedury może wystąpic wywołanie innej procedury. Procedury mogą posiadać parametry. Znaczy to że podczas wywoływania możemy przekazać procedurze jakąś wartość decydującą o sposobie wykonania kodu zawartego w procedurze. Wewnątrz procedury możemy także deklarować zmienne. Deklarujemy je tak samo jak zmienne globalne instrukcją var. Różnią się one od zmiennech globalnych wyłącznie tym że są widoczne tylko wewnątrz tej procedury i przestają istnieć po jej zakończeniu. 59
Procedura Deklaracja procedury Oto przykładowa procedura: procedure pokaz(ile:integer); var x: integer; begin for x:=1 to ile do showmessage('okienko wyświetlone '+inttostr(x)+' raz'); end; Oprogramowanie przycisku zdarzeniem - (Button): pokaz(3); Po kompilacji program wyświetli nam trzykrotnie okienko informacyjne. Zmieniając wartość parametru możemy osiągnąć dowolną ilość wyświetleń okienka. 60
Procedura Deklaracja procedury powinna znajdować się przed częścią operacyjną programu, czyli przed głównym słowem begin,a po deklaracji zmiennych, z których ona korzysta. Nie jest konieczne umieszczanie po deklaracji zmiennych, ale stosowanie się do tej zasady pozwala na zastosowanie porządku w zapisie programu. Jeżeli chcemy aby procedura była zadeklarowana za miejscem jej pierwszego wywołania, należy użyć słowa kluczowego forward: 61
Wewnątrz procedury można deklarować zmienne lokalne, czyli zmienne wewnętrzne, obowiązujące tylko w tej procedurze, w której zostały zadeklarowane. Zmienne lokalne mogą mieć takie same identyfikatory jak zmienne globalne (zmienne zewnętrzne, obowiązujące w całym programie), wtedy znaczenie zmiennej globalnej zostanie przysłonięte znaczeniem zmiennej lokalnej. Wewnątrz deklaracji można używać zmiennych globalnych (nie przysłaniając ich), pokazane na przykładzie, jednak należy pamiętać o częstych błędach przy drobnej nieuwadze. Wywołanie procedury 62
Podstawowe procedury Procedury przerywające wykonanie instrukcji iteracyjnych BREAK Procedura powoduje natychmiastowe zakończenie wykonywania pętli, wewnątrz której jest wywołana. 63
Podstawowe procedury CONTINUE Procedura powoduje natychmiastowe przejście do kolejnej iteracji pętli, wewnątrz której jest wywołana 64
Procedury powodujące przerwanie wykonywanego programu EXIT Procedura Exit wywołana wewnątrz procedury lub funkcji powoduje jej przerwanie i powrót do miejsca wywołania, a wywołana w części wykonawczej programu powoduje jego zakończenie. HALT Procedura Halt, której wywołanie ma postać: Halt (kod_wyjścia); lub Halt co jest równoważne wywołaniu Halt(0) (0 zakończenie bez błędu, kod_wyjścia jest wyrażeniem typu integer) powoduje przerwanie programu i powrót do systemu. RUNERROR Procedura RunError lub RunError_(kod_błędu) powoduje przerwanie programu i wygenerowanie błędu jego wykonania o podanym kodzie (kod_błędu jest argumentem typu Byte, gdy brak tego argumentu, to przyjmuje się wartość 0). 65
Funkcje Funkcje są bardzo podobne do procedur, posiadają możliwość deklarowania parametrów wywołania oraz zmiennych lokalnych. Czym więc się różnią? Funkcje mają wbudowaną możliwość przekazywania rezultatu swojego działania do głównej pętli programu. W przeciwieństwie do procedury dzieje się to w sposób automatyczny. inaczej: Funkcja jest rodzajem procedury, która po wywołaniu zwraca obliczoną przez siebie wartość pod swoją nazwą. Oto przykładowa funkcja licząca kwadrat danej liczby: Poniższy kod należy wpisać w sekcji implementation: function kwadrat(liczba: integer):integer; Begin kwadrat:= liczba*liczba; end; Następnie przenosimy na formę przycisk (Button). Klikamy na nim dwukrotnie i wpisujemy poniższy kod: showmessage(inttostr( kwadrat(4) ) ); Kod ten spowoduje obliczenie potęgi kwadratowej. W przypadku funkcji jej rezultat zostaje wstawiony dokładnie w miejscu gdzie nastąpiło wywołanie. 66