LEKCJA 3 - TYPY

a ostatniej lekcji zapozna│e╢ siΩ z pojΩciem zmiennej. Jest to pojΩcie bardzo wa┐ne, gdy┐ od niego wychodzi siΩ do struktur danych, bardzo wa┐nych w programowaniu. Zmienne i struktury danych (sk│adaj▒ce siΩ po prostu z wielu zmiennych) maj▒ za zadanie odzwierciedlaµ rzeczywiste obiekty w pamiΩci komputera.

Jak zapewne pamiΩtasz, z pojΩciem zmiennej ╢ci╢le │▒czy siΩ pojΩcie typu. M≤wimy, ┐e zmienna jest pewnego typu. Znaczy to tyle, ┐e mo┐e ona przyjmowaµ warto╢ci dopuszczalne dla tego typu. W przyk│adzie z poprzedniej lekcji takim typem by│ typ "integer". Zmienna tego typu mo┐e przyjmowaµ warto╢ci ca│kowite z pewnego zakresu. Jest to jednak zakres bardzo w▒ski. Poza tym pisanie programu w jΩzyku wysokiego poziomu jakim jest pascal wy│▒cznie z u┐yciem zmiennych ca│kowitych by│oby nonsensem. Jak siΩ zapewne domy╢lasz, istnieje wiele r≤┐nych typ≤w s│u┐▒cych do zapamiΩtywania liczb. Poni┐ej wymieniam te dostΩpne w Turbo Pascalu. Dobrze jest je znaµ, gdy┐ w≤wczas mo┐na p│ynnie i w zale┐no╢ci od potrzeb dobieraµ typy dla poszczeg≤lnych zmiennych w programie.

Typy ca│kowite:
Nazwa typuZakres warto╢ciIlo╢µ bajt≤w
byte0..2551
shortint-128..1271
word0..655352
integer-32768..327672
longint-2147483648..21474836474

Jak widzisz, wyb≤r typ≤w ca│kowitych w Turbo Pascalu jest do╢µ spory. Warto jednak zapamiΩtaµ, ┐e wszystkie za wyj▒tkiem typu "integer" s▒ charakterystyczne dla Turbo Pascala, ale w innych implementacjach pascala mog▒ w og≤le nie wystΩpowaµ! Typ "integer" na 100% wystΩpuje w ka┐dej implementacji pascala, ale zakres przyjmowanych warto╢ci mo┐e mie╢ r≤┐ny!

Przypominam, ┐e w dzia│aniach na liczbach ca│kowitych nie mo┐na u┐ywaµ operatora dzielenia "/". W zastΩpstwie u┐ywa siΩ operatora "div" oraz "mod". Ten drugi jest szczeg≤lnie przydatny przy sprawdzaniu podzielno╢ci jednej liczby przez drug▒ (je╢li a mod b=0 to b jest dzielnikiem liczby a).

Je╢li chodzi o typy rzeczywiste (czyli te, kt≤re mog▒ byµ u│amkami), to uniwersalnym i w zupe│no╢ci wystarczaj▒cym do wiΩkszo╢ci zada± jest typ "real". Na zmiennych rzeczywistych mo┐na wykonywaµ dzielenie operatorem "/", natomiast operatorami "div" i "mod" - nie mo┐na!

Liczby rzeczywiste ze wzglΩdu na czasami ogromn▒ ilo╢µ liczb, bardzo czΩsto (domy╢lnie) wy╢wietla siΩ w postaci wyk│adniczej. Na przyk│ad liczba 1.3423423e23 to inaczej liczba 1.3423423*1023. Taka notacja jest czasami nieprzyjemna dla pocz▒tkuj▒cych, ale z czasem jej zalety staj▒ sie oczywiste.

DostΩpno╢µ innych typ≤w rzeczywistych jest w TP uwarunkowana dostΩpno╢ci▒ koprocesora lub jego ewentualn▒ emulacj▒. Nie bΩdΩ tutaj omawia│ tego zagadnienia.

Poniewa┐ liczby ca│kowite s▒ podzbiorem liczb rzeczywistych, tak wiΩc przypisanie warto╢ci zmiennej ca│kowitej na zmienn▒ rzeczywist▒ jest poprawne, ale odwrotnie - nie!

Na razie to tyle, je╢li chodzi o typy liczbowe. Teraz zajmiemy siΩ typem znakowym. Ma on w pascalu nazwΩ "char" i zmienna tego typu zajmuje 1 bajt. Zmienna taka po prostu przechowuje jeden znak ASCII. Poni┐ej przedstawiam sposoby przypisania zmiennej typu "char" warto╢ci:

program p1;
var
c: char; 
begin
c:='n';
c:=#65;
c:=chr(65);
end.

Jak widaµ, zmienn▒ znakow▒ mo┐na przedstawiµ jako literk▒ ujΩt▒ w apostrof. Innym sposobem jest napisanie jej numeru w kodzie ASCII poprzedzonego znakiem "#" (krzy┐ykiem). Prawie identyczne w skutkach jest dzia│anie funkcji "chr", kt≤rej podajemy jako argument liczbΩ - numer znaku w kodzie ASCII. Funkcja to rodzaj procedury. R≤┐ni siΩ tym od zwyk│ej procedury, ┐e zwraca warto╢µ pewnego typu (typ ten jest na sta│e zwi▒zany z dan▒ procedur▒). Procedura "chr" zwraca znak ASCII. Na pierwszy rzut oka oba ostatnie sposoby s▒ identyczne. Jest jednak zasadnicza r≤┐nica w ich wykorzystaniu. TΩ drug▒ mo┐liwo╢µ mo┐na wykorzystaµ na przyk│ad w sytuacji, gdy u┐ytkownik programu podaje liczbΩ ca│kowit▒ (typu "byte" - technicznie nie r≤┐ni siΩ on od "char", tylko logicznie). LiczbΩ podan▒ przez u┐ytkownika mo┐na podaµ jako argument funkcji. Aby to lepiej zrozumieµ, przeanalizuj poni┐szy program:

program p2;
var
liczba: byte;
znak: char;
begin
readln(liczba);
znak:=chr(liczba);
writeln('Znak ASCII o podanym przez Ciebie numerze to ',znak);
end.

Programu tego mo┐na u┐yµ do sprawdzenia, jaki znak kryje siΩ pod konkretnym numerem.

Je╢li chcemy, aby u┐ytkownik poda│ znak ASCII, musimy u┐yµ funkcji "readkey". Jest to funkcja bezargumentowa. Program zatrzymuje siΩ po jej napotkaniu i czeka na naci╢niΩcie jakiego╢ klawisza. Po naci╢niΩciu funkcja zwraca warto╢µ znakow▒. Na przyk│ad program:

program p3;
uses crt;
var 
c: char;
begin
c:=readkey;
writeln('Wcisn▒│e╢ klawisz ',c);
end.

czeka na wci╢niΩcie klawisza i wy╢wietla na ekranie odpowiadaj▒cy mu znak, po czym od razu siΩ zako±czy. Zauwa┐y│e╢ zapewne now▒ linijkΩ "uses crt;" w drugim wierszu programu. Na razie nie bΩdΩ wyja╢nia│ dok│adnie jej znaczenia, ale jest ona potrzebna aby u┐yµ funkcji "readkey".

W praktyce jednak czΩ╢ciej od typu znakowego u┐ywa siΩ typu napisowego. Jak m≤wi sama nazwa, s│u┐y on do pamiΩtania napisu. W TP napis taki nie mo┐e byµ d│u┐szy ni┐ 255 znak≤w. Typ ten nazywa siΩ "string". Napisy mo┐na normalnie czytaµ procedur▒ "readln" i wy╢wietlaµ "writeln". CzΩsto chcemy odczytaµ d│ugo╢µ │a±cucha znak≤w (napisu). U┐ywamy do tgo funkcji "length", kt≤rej podajemy jako argument zmienn▒ napisow▒ (lub napis ujΩty w apostrofy). Bardzo przydatna jest tak┐e mo┐liwo╢µ odwo│ywania siΩ do konkretnej litery w napisie. Odbywa siΩ to w ten spos≤b, ┐e po zmiennej napisowej podajemy w nawiasie kwadratowym numer interesuj▒cej nas litery. W ten spos≤b mo┐na zar≤wno zapisaµ lub odczytaµ konkretn▒ literΩ ze zmiennej napisowej. My╢lΩ, ┐e wymienione przeze mnie mo┐liwo╢ci najlepiej zilustrowaµ przyk│adem:

program p4;
var
s: string;
begin
s:='';
s:='Micha│';
writeln(s);
readln(s);
writeln(s);
writeln(s[10]);
s[2]:='e';
s:=s+'mmmmm';
writeln(lenght(s));
end.

Na pocz▒tku napis przyjmuje warto╢µ ''. Takie dwa apostrofy ko│o siebie oznaczaj▒ napis pusty, czyli o d│ugo╢ci 0. NastΩpnie napis przyjmuje warto╢µ 'Micha│'. Oczywi╢cie apostrofy nie wchodz▒ w sk│ad napisu, a jedynie m≤wi▒ komputerowi, gdzie siΩ ko±czy i zaczyna w kodzie ╝r≤d│owym. NastΩpnie napis jest pisany na ekranie odczytywany przy u┐yciu procedury "readln". Po tej procedurze ma on ca│kiem now▒ warto╢µ. Jest wtedy znowu wypisywany. NastΩpnie jest wypisywana dziesi▒ta literka napisu. Potem druga warto╢µ napisu przyjmuje warto╢µ litery 'e'. ostatnia operacja na napisie to doklejenie do jego ko±ca ci▒gu 'mmmmm'. Jest to ciekawe, gdy┐ mo┐na siΩ w tym celu pos│u┐yµ intuicyjnie operatorem "+". Ostatnie zadanie programu to wypisanie d│ugo╢ci napisu pobranej z funkcji "length". Powy┐szy przyk│ad obrazuje zagnie┐dzenie funkcji "length" jako argumentu procedury "writeln". Jest to zupe│nie poprawne i bardzo u┐yteczne (kod staje siΩ kr≤tszy, zwiΩ╝lejszy i │atwiejszy do zrozumienia, ni┐ gdyby╢my u┐yli osobnej zmiennej do pamiΩtania d│ugo╢ci napisu i jej wy╢wietlenia).

Jak ju┐ wcze╢niej wspomnia│em, napis w TP nie mo┐e byµ d│u┐szy ni┐ 255 znak≤w. Czasami jednak chcemy jeszcze bardziej ograniczyµ jego d│ugo╢µ. Na przyk│ad na zapamiΩtanie czyjego╢ imienia nie potrzeba a┐ 255 znak≤w, wystarczy z powodzeniem 15. W≤wczas w deklaracji zmiennej napisowej piszemy nie samo "string" ale "string[15]". Oczywi╢cie 15 to tylko przyk│adowa liczba. Taki spos≤b ograniczania d│ugo╢ci napisu to oszczΩdno╢µ pamiΩci - zabieg bardzo wa┐ny!

Pozna│e╢ w tym odcinku najwa┐niejsze typy danych w Turbo Pascalu. W nastΩpnej lekcji bΩdziesz kontynuowaµ zdobywanie wiedzy na ten temat. Na razie jednak musisz bardzo dobrze zrozumieµ zdobyt▒ wiedzΩ! Jest jej do╢µ sporo, a w nastΩpnej lekcji bΩdzie jeszcze wiΩcej!

ZapamiΩtaj:

  1. najwa┐niejszy typ ca│kowity to "integer", ale inne typy te┐ trzeba bardzo dobrze znaµ
  2. najwa┐niejszy typ rzeczywisty to "real", na razie inne mo┐esz sobie odpu╢ciµ
  3. typ znakowy to "char", zmienna tego typu pamiΩta jeden znak ASCII
  4. typ napisowy to "string", zmienna tego typu przechowuje napis czyli ci▒g znak≤w


Baner reklamowy: