www.mamboteam.com
Project1.pl Advertisement
Start arrow Artykuły arrow Kurs Delphi arrow Rozdział II - Zmienne i ich typy
piątek, 12 marzec 2010
 
 
Menu główne
Start
Artykuły
FAQ
Download
Kontakt
Ciekawe linki
Forum
Mapa serwisu
Logowanie





Zapomniałeś hasła?
Nie masz konta? Załóż sobie
Rozdział II - Zmienne i ich typy Drukuj E-mail
Oceny: / 0
KiepskiBardzo dobry 
Napisał: Berl   
sobota, 18 luty 2006
W języku Object Pascal deklarowanie zmiennych jest wymagane przed blokiem begin..end, w sekcji var. Brak jest udogodnienia znanego z C++, dotyczącego deklarowania zmiennych w dowolnym miejscu kodu. Poprawia to jednak czytelność napisanego kodu, eliminując potrzebę przeszukiwania znacznych fragmentów kodu, gdy szukamy informacji jakiego zmienna jest typu. Nazwy zmiennych w Object Pascalu są niewrażliwe na wielkość liter, możemy nazwać zmienną z użyciem samych małych liter, a wywoływać ją za pomocą samych dużych. Nazwy : ToJeStNaZwAZmIeNnEj oraz ToJestNazwaZmiennej są tożsame.




Deklaracje zmiennych można ( i trzeba ) skracać w taki sposób, że zmienne jednego typu należy umieszczać po sobie, oddzielone przecinkiem, a następnie po dwukropku umieścić nazwę typu. Czyli deklaracja zmiennych postaci :
 
var
     zmienna1 : byte;
     zmienna2 : byte;
jest tożsama z taką deklaracją zmiennych :
 
var
     zmienna1, zmienna2 : byte;
Nadawanie wartości zmiennym może odbywać się w dwojaki sposób. Można nadawać wartość zmiennym w treści programu, w bloku begin...end;. Nadawanie wartości zmiennym odbywa się za pomocą operatora przypisania := :
 
    zmienna1 := 5;
    zmienna2 := 10;
Można też nadawania wartości zmiennym już podczas ich deklarowania, za pomocą operatora = :
 
var
     zmienna1 : byte = 5;
     zmienna2 : byte = 10;
Sposób ten jest jednak dostępny tylko dla zmiennych globalnych, natomiast nie można go używać dla zmiennych lokalnych, czyli zmiennych deklarowanych w procedurach oraz funkcjach. Gdy zmiennej nie zostanie przypisana żadna wartość podczas deklaracji, przyjmuje ona wartość zerową, czyli dla zmiennych liczbowych będzie to 0, łańcuchy znaków mają długość 0, natomiast wskaźniki przyjmują wartość nil. W Object Pascalu wyróżniamy pięć podstawowych grup typów zmiennych : 1. Zmienne całkowitoliczbowe Istnieją następujące typy zmiennych całkowitoliczbowych :
Nazwa typu Zakres  
Integer –2147483648 do 2147483647
Cardinal 0 do 4294967295
Shortint –128 do 127
Smallint –32768 do 32767
Longint –2147483648 do 2147483647
Int64 –2^63 do 2^63–1
Byte 0 do 255
Word 0 do 65535
Longword 0 do 4294967295
Jak widać, typ Int64 posiada bardzo szeroki zakres przyjmowanych wartości. Należy jednak pamiętać, że aby na przykład dodać zmienną typu Int64 do zmiennej typu Integer, należy wykonać rzutowanie tej pierwszej na typ Int64. Taka konstrukcja nie zwróci prawidłowego wyniku :
 
var
     I: Integer;
     J: Int64;
begin
     I := High(Integer);
     J := I + 1;
     showmessage(inttostr(J));
end;
Natomiast taka konstrukcja już zwróci poprawny wynik :
 
var
     I: Integer;
     J: Int64;
begin
     I := High(Integer);
     J := int64(I) + 1;
     showmessage(inttostr(I) + #13 + #10 + inttostr(J));
end;
2. Zmienne zmiennoprzecinkowe W Object Pascalu dostępne są następujące typy zmiennoprzecinkowe :
Nazwa typu Zakres  
Real48 2.9 x 10^–39 do 1.7 x 10^38
Single 1.5 x 10^–45 do 3.4 x 10^38
Double 5.0 x 10^–324 do 1.7 x 10^308
Extended 3.6 x 10^–4951 do 1.1 x 10^4932
Comp –2^63+1 do 2^63 –1
Real 5.0 x 10^–324 do 1.7 x 10^308
Currency –922337203685477.5808 do 922337203685477.5807
Typ Currency służy do przechowywania zmiennych, które muszą być bardzo dokładne, dotyczy to głównie kwot pieniężnych. Jego wewnętrzną reprezenatcją jest liczba o 10000 większa niż liczba w rzeczywistości reprezentowana. Specjaliści mówią, że jest to jedyny w Object Pascalu typ rzeczywisty stałoprzecinkowy. 3. Łańcuchy znaków Wyróżniamy trzy podstawowe typy, dotyczące łańcuchów znaków : a. ShortString Jest to łańcuch znaków, nie przekraczający 255 znaków. Deklarując zmienną w ten sposób :
var
     zmienna1 : string;
przy dyrektywie kompilatora {$H-}, zmienna1 przyjmuje typ ShortString. b. AnsiString Jest to typ łańcuchowy o ilości znaków do ~2^31. Jest to podstawowy typ łańcuchowy w Object Pascalu. Deklarując zmienną w ten sposób :
 
var
     zmienna1 : string;
przy dyrektywie kompilatora {$H+} ( jest to ustawienie domyślne ), zmienna1 będzie typu AnsiString. c. WideString Jest to typ łańcuchowy, obsługujący znaki kodowane w standardzie Unicode, o maksymalnej ilości znaków do ~2^30. 4. Typ znakowy Zmienna typu znakowego to zmienna, która przechowuje tylko i wyłacznie jeden znak. W Object Pascalu istnieją trzy typy reprezentyjące znak : a. AnsiChar - jest to jednobajtowy znak ANSI; b. WideChar - jest ot dwubajtowy znak ze zbioru znaków Unicode; c. Char - Jest to typ taki sam, jak AnsiChar, lecz Borland zastrzegł sobie prawo do zmiany go w przyszłych wersjach Delphi na tożsamy z WideChar. 5. Wskaźniki Wskaźnik jest to zmienna, która przechowuje adres w pamięci innej zmiennej. W Object Pascalu istnieje wiele typów wskaźnikowych, podczynając od typów wewnątrzjęzykowych, takich jak : PAnsiString, PString, PByteArray, PCurrency, PExtended, POleVariant, PShortString, PTextBuf, PVarRec, PVariant, PWideString, PWordArray, po typy definiowane przez programistę, do których zaliczamy wskaźniki typowane oraz amorficzne. Wkaźniki typowane definiujemy poprzez operator ^ w połączeniu z typem podstawowym, na który wskazuje wskaźnik. Przykład :
 
type
     PInt : ^Integer;
     PByte : ^Byte;
var
     I : PInt;
Możemy też definiować wskaźniki na rekordy :
 
type
     TRec = record
         Id : integer;
         Imie : string;
     end;
     PRec = ^TRec;
var
     Rec : PRec;
Odwołanie do rekordu przez tak stworzony wskaźnik wygląda w następujący sposób :
begin
     //Najpierw musimy utworzyć dynamiczny rekord typu TRec. Zmienna Rec będzie zawierać wskazanie na niego
     New(Rec);
     //do poszczególnych pól rekordu odwołujemy się za pomocą operatora ^
     Rec^.Id := 1;
     Rec^.Imie := 'Marcin';
     //po użyciu wskaźnika musimy zwolnić zajmowaną pamięć
     Dispose(Rec);
end;
6. Typ wariantowy Typ Variant służy do przechowywania dowolnej wartości, oraz zmiany jej typu w zależności od potrzeb programu. Przykład :
 
var
     zmienna1 : variant;
begin
     zmienna1 := 'To jest zmienna typu Variant';
     showmessage(zmienna1);
     zmienna1 := 120;
     showmessage(inttostr(zmienna1));
     zmienna1 := 3.14;
     showmessage(FormatFloat('#.##', zmienna1));
     zmienna1 := true;
     if zmienna1 then showmessage('Zmienna1 przyjmuje wartosc true');
end;
Zmienne typu Variant wymagają jednak więcej pamięci, a operacje na nich więcej mocy obliczeniowej procesora, niż zmienne przyjmujące wartości konkretnego typu. Dlatego też, o ile to możliwe ( a jest to niemożliwe w niektórych przypadkach, na przykład w przypadku mechanizmu OLE ), należy stosować typy podstawowe. 7. Typ logiczny Zmienna typu logicznego może przyjmować jedną z dwóch wartości : true lub false. Deklarujemy ją w następujący sposób :
 
var
     zmienna1 : boolean;
8. Typy zdefiniowane przez użytkownika

Do typów definiowanych przez użytkownika, oprócz niektórych wskaźników, zaliczamy : a. Zbiory Najprostszym typem, możliwym do zdefiniowania przez programistę, jest zbiór. Definiujemy go za pomocą klauzuli set of :
type
     TZbiorChar = set of Char;
Taka definicja definiuje zbiór znaków. Innym przykładem może być zbiór, zawierający nasze własne dane, na przykład :
type
     TMiesiace = (Styczeń, Luty, Marzec, Kwiecień, Maj, Czerwiec, Lipiec, Sierpień, Wrzesień, Październik, Listopad, Grudzień );
     TZbiorMiesiecy = set of TMiesiace;
Możemy też definiować zbiory, oparte na typie okrojonym. Możemy w nich zamieszczać np tylko wybrane liczby lub znaki, pod warunkiem, że liczba elementów zbioru nie przekroczy 255, zaś numery porządkowe jego elementów nie mogą wykraczać poza przedział od 0 do 255. Zbiór oparty na typie okrojonym definiujemy w następujący sposób :
type
     Cyfry = set of 0 .. 9;
     Litery = 'a'..'z';
Wartości stałe, które oznaczają zbiory, zapisuje się w nawiasach kwadratowych, np :
type
     TMiesiace = (Styczen, Luty, Marzec, Kwiecien, Maj, Czerwiec, Lipiec, Sierpien, Wrzesien, Pazdziernik, Listopad, Grudzien );
     TZbiorMiesiecy = set of TMiesiace;
var
     Wakacyjne, Szkolne : TZbiorMiesiecy;
begin
     Wakacyjne := [Lipiec, Sierpien];
     Szkolne := [Styczen, Luty, Marzec, Kwiecien, Maj, Czerwiec, Wrzesien, Pazdziernik, Listopad, Grudzien ];
end;
b. Rekordy Rekord stanowi zbiór kilku zmiennych różnych lub tych samych typów. Rekord definiujemy w następujący sposób :
 
type
     TRekord = record
         Id : integer;
         Imie : string;
     end;
Odwoływanie się do pól zmiennej typu rekordowego odbywa się poprzez wywołanie nazwy zmiennej, po niej kropki, a po kropce nazwy pola rekordu :
 
var
     Rec = TRekord;
begin
     Rec.Id := 1;
     Rec.Imie := 'Marcin';
end;
Jeśli rekord zawiera dużo pól, to możemy uniknąć ciągłego wpisywania nazwy zmiennej, stosując instrukcję with :
 
var
     Rec = TRekord;
begin
     with Rec do begin
         Id := 1;
         Imie := 'Marcin';
     end;
end;
Ciekawym zagadnieniem dotyczącym rekordów, są rekordy wariantowe. Posiadają one część zmienną. Definiuje się je tak samo jak zwykłe rekordy, jednak wewnątrz nich uzywa się instrukcji warunkowej case :
 
type
     TRekord = record
         Id : integer;
         Int : Integer;
         Case Integer of
         0 : (Imie : string[255]);
         1 : (Wiek : byte);
     end;
c. Obiekty Obiekty są podobne do rekordów, mogą jednak posiadać procedury i funkcje, zwane metodami. Definicja obiektu wygląda następująco :
 
type
     TKlasa = class
         Pole1 : integer;
         procedure Metoda1;
         function Metoda2 : integer;
     end;
Oczywiście potem musimy zdefiniować metody, wchodzące w skład klasy :
 
procedure TKlasa.Metoda1;
begin
end;
function TKlasa.Metoda2 : integer;
begin
     Result := 1;
end;
Jako że obiekty stanowią trzon Object Pascal, zostanie im poświęcony osobny rozdział. d. Tablice Tablice stanowią ciąg zmiennych tego samego typu. Elementem tablicy może być dowolny typ, wliczając to także typy zdefiniowane przez programistę, w tym również tablice. Tablice definiujemy w sposób następujący :
type
     TTablica = array[0..9] of integer;
var
     Tablica : TTablica;
Tablica taka stanowi zbiór 10 liczb typu integer. W rzeczywistości programiści skracają deklarację zmiennej stanowiącej tablicę do postaci :
 
var
     Tablica : array[0..9] of integer;
Taka konstrukcja również jest prawidłowa. Oczywiście nic nie stoi na przeszkodzie, aby numery elementów tablicy były inne niż podane w powyższej deklaracji, na przykład :
var
     Tablica : array[5..14] of integer;
Taka tablica również stanowi zbiór 10 liczb typu Integer, lecz pierwszy element tablicy nie ma indeksu 0, lecz 5. Oddzielnym typem tablic są tablice dynamiczne, definiowane w sposób następujący :
 
var
     Tablica : array of integer;
Takie tablice przyjąć mogą długość ograniczoną jedynie pamięcią komputera. Zmianę długości takiej tablicy dokonujemy przez polecenie SetLength :
begin
     SetLength(Tablica, 10);
end;
W ten sposób uzyskaliśmy tablicę dynamiczną dziesięcioelementową, indeksowaną od 0 (tablice dynamiczne zawsze są indeksowane od 0 ). Odwoływanie się do elementów tablic dokonujemy przez wywołanie nazwy zmiennej, stanowiącej tablicę, oraz oznaczenia w nawiasie kwadratowym indeksu elementu, do którego chcemy się odwołać :
 
begin
     SetLength(Tablica, 10);
     Tablica[0] := 1;
     Tablica[1] := 123;
     Tablica[5] := 324;
end;
Dolną oraz górną wartośc graniczną indeksów tablicy zwracają funkcje Low oraz High. Jeśli chcemy odwołać się do pierwszego lub ostatniego elementu tablicy, możemy to wykonać w ten sposób :
 
begin
     SetLength(Tablica, 10);
     Tablica[Low(Tablica)] := 1;//pierwszy element tablicy
     Tablica[High(Tablica)] := 123;  //ostatni element tablicy
end;
Czasami zdarza się, że potrzebujemy tablic wielowymiarowych. Tablice takie definiujemy w ten sposób :
 
var
     tabl1 : array[0..2, 0..5] of integer; //tablica statyczna dwywymiarowa
     tabl2 : array of array of integer;    //tablica dynamiczna dwuwymiarowa
Odwołując się do elementu takiej tablicy, w nawiasie kwadratowym podajemy po przecinku numery indeksów w poszczególnych wymiarach tablicy.
Komentarze

Aby dodać komentarz zaloguj się. Jeśli nie masz konta, załóż je sobie.
Tylko zarejestrowani użytkownicy mogą pisać komentarze.

 
wstecz   dalej »
LINKUJ PRO
Gościmy
Odwiedza nas 9 gości
Licznik odwiedzin
87182
 
Góra Góra