pascal osnove

Upload: tomislav-krivanek

Post on 10-Jul-2015

124 views

Category:

Documents


0 download

TRANSCRIPT

logo PASCAL (1)

Osnovna struktura Pascala Tipovi podataka, konstante i varijable Pridru?ivanje i ispis vrijednosti

Ovaj dio predstavlja "Osnove Pascala". Sadr?i opis svih primitivnih tipova podataka, te strukture niza, skupa, polja, sloga i datoteke. Takoder su opisane sve primitivne naredbe, i vecina slo?enih, pa je sadr?aj ovog dijela dovoljan za programiranje vecine problema, posebno "algoritamskih" i "nebrojcanih".

Opcenito se sva poglavlja sastoje od dva dijela: dijela o jeziku (sintaksa i semantika naredbi) i dijela u kojemu su dani primjeri programa koji kroz rje?enje nekog problema ilustriraju pri-mjene naredbi.

Svako poglavlje zavr?ava pitanjima i zadacima za vje?bu. OSNOVNA STRUKTURA PASCALA

Opis Turbo Pascala zapocinjemo definicijom njegove osnovne leksicke sintakticke strukture te semantike.

Leksicka struktura Alfabet Pascala cine sljedeci skupovi znakova:

velika i mala slova engl. alfabeta: A B ... Y Z a b ... y z brojke: 0 1 ... 8 9 posebni znakovi: + - * / = < > ( ) [ ] { } . : ; ' _ , ^ @ $ #

Skupu posebnih znakova pripada i praznina (razmak ili "blank"). U daljnjem tekstu skupove znakova Turbo Pascala oznacavat cemo kao < slovo >, < brojka > i < poseban znak >. Nad alfabetom Pascala definirane su sljedece klase rijeci:

rezervirane rijeci imena standardna imena brojevi nizovi znakova posebni simboli

Rezervirane rijeci, kao ?to im i ime ka?e, imaju unaprijed definirano ili "rezervirano" znacenje. Pojavljuju se kao dijelovi naredbi Pascala i nije ih dopu?teno rabiti u druge svrhe. Evo potpunog skupa rezerviranih rijeci Turbo Pascala napisanih abecednim redom:

AND

ARRAY ASM

BEGIN CASE

CONST DO DOWNTO GOTO INLINE INTERFACE ELSE

CONSTRUCTOR DESTRUCTOR DIV END IF EXPORTS FILE FOR IN NIL

FUNCTION INHERITED NOT OBJECT

IMPLEMENTATION MOD

LABEL LIBRARY OF REPEAT TO TYPE OR

PACKED SET UNIT SHL

PROCEDURE SHR STRING VAR

PROGRAM THEN

RECORD

UNTIL USES

WHILE WITH XOR

Za rezervirane rijeci vrijedi pravilo da moraju biti napisane kompaktno (bez razmaka). Rezervirana rijec, bez obzira da li je napisana velikim ili malim slovima, ili kombinacijom velikih i malih slova, ima isto znacenje. U na?im cemo programima rezervirane rijeci pisati samo velikim slovima (?to je dogovor, a ne pravilo).

Imena su klase rijeci sastavljene od samo jednog slova ili znaka "_", odnosno, to su rijeci duljine do 127 koje pocinju slovom ili znakom "_", a potom slijedi slovo, znak "_" ili brojka. Na primjer, imena su: A, _, w1, Opseg, brzina, s_l, y_22 itd, dok nizovi D-l, X.5, $, 123 i 'Ime' ne mogu biti prihvaceni kao imena. Imena sastavljena od slova ne smiju biti iz skupa rezerviranih rijeci.

Klasa rijeci nazvana standardna imena odnosi se na skup rijeci koje imaju unaprijed definirano znacenje. Oznacuju imena standardnih tipova, konstanti, varijabli, procedura i funkcija. Za razliku od rezerviranih rijeci, smije im se promijeniti znacenje, ali se to ne preporucuje. Standardna imena su, na primjer: absolute, arctan, byte, char, close, cos, eof, exit, exp, false, gotoxy, halt, integer, pi, read, write itd. Postoje dva standardna imena, PRIVATE i PUBLIC, koja se napisana na odredenim mjestima u programu smatraju rezerviranim rijecima. U programima cemo vecinu standardnih imena pisati malim slovima.

Brojevi se u Pascalu dijele na cijele i realne. Cijeli se brojevi pi?u prema pravilu:

NEDOSTAJE SLIKA

Znacenje je predznaka kao u matematici. Sljedeci nizovi znakova predstavljaju cijele brojeve:

256

-1

-666

+1000 9876

-32768 7001

+8787 12345678

$10

-$ABCD

dok nizovi znakova:

--1

+-2

'45'

pet

nula

3.14

5%

12,3

ne mogu biti prihvaceni kao cijeli brojevi. Vidimo da cijeli brojevi predstavljeni u ?esnaesticnom zapisu zapocinju znakom "$".

Realni brojevi mogu biti napisani u normalnom ili eksponencijalnom obliku, prema sljedecim pravilima:

realni__broj : normalni_oblik | eksponencijalni_oblik normalni_oblik: predznak nepredznaceni_broj . nepredznaceni_broj

eksponencijalni__oblik: ||cijeli broj || E eksponent ||normalni__ oblik||

eksponent: cijeli__broj gdje je < eksponent > cijeli broj u intervalu od -4932 do 4932. Evo nekoliko primjera realnih brojeva napisanih u normalnom ili eksponencijalnom obliku:

0.0

6.28

1E-6

1.62E-31

-303.00123

5e5

-6E-6

Ako broj u eksponencijalnom obliku opcenito napi?emo kao mEn, znacenje mu je m x 10n.

Nizovi znakova su rijeci koje se pi?u prema sljedecem pravilu:

niz znakova: ' { znak } ' gdje je < znak > bilo koji znak. Evo nekoliko primjera nizova znakova:

'1234321'

'Ovo je niz znakova'

'Koliki je polumjer?'

'***'

'Vrijeme Put Brzina'

Polunavodnik oznacuje pocetak i kraj niza i ne smatra se njegovim dijelom. Ako niz znakova treba sadr?ati polunavodnik, to se posti?e pisanjem dvaju takvih znakova jedan do drugog. Na primjer, niz 'C" est la vie, mon amour!' predstavlja niz "C'est la vie, mon amour!".

Duljina niza znakova jest broj znakova koji ga cine (bez polunavodnika koji oznacuju pocetak i kraj niza). Niz " je prazan niz i ima duljinu 0. Dopu?teno je pisanje nizova znakova maksimalne duljine 124. Niz mora biti napisan u jednom redu.

Posebni simboli (rijeci) su posebni znakovi ili kombinacije od po dva posebna znaka. Posebni znakovi dani su u opisu alfabeta, a posebni simboli sacinjeni od kombinacije posebnih znakova jesu:

:=

=

..

(.

.)

(*

*)

Posebni simboli komponirani od dva znaka moraju se pisati kompaktno, bez razmaka izmedu znakova. Simboli (., .), (* i *) imaju isto znacenje kao uglate i viticaste zagrade. Simboli (. i .) su otvorena i zatvorena uglata, a (* i *) viticata zagrada. LEKSICKA PRAVILA

U tvorbi rijeci vrijede sljedeca pravila:

1) Rijeci se pi?u kompaktno, bez razmaka. Jedino se u nizu znakova razmak smatra dijelom rijeci. 2) Znacenje rijeci koje sadr?e velika slova ostaje nepromijenjeno ako se umjesto velikih slova napi?u ista takva mala slova. Dakako, to ne vrijedi za nizove.

Osnovna sintakticka struktura Osnovna sintakticka struktura Turbo Pascala dana je sljedecim pravilima:

program: zaglavlje_programa:

[ zaglavlje_programa; ] blok. PROGRAM ime_programa

ime_programa:

ime

blok:

[ lista_modula ] { deklaracija | potprogram } niz_naredbi

deklaracija:

deklariranje_labela | | |

|

definiranje_konstanti inicijalizacija_varijabli definiranje_tipova deklariranje_varijabli

potprogram:

[ procedura | funkcijski_potprogram ]

niz_naredbi:

BEGIN

[ labela: ] naredba {; [labela: ] naredba } END

naredba:

primitivna__naredba | slo?ena_naredba

primitivna_naredba:

prazna_naredba |

naredba__za__ispis | naredba_za_dodjeljivanje | naredba__za__unos | naredba_GOTO | HALT | EXIT |

poziv_procedure

slo?ena_naredba: FOR_petlja | WHILE_petlja |

naredba__za_odabir |

REPEAT_petlja | naredba_CASE | niz_naredbi

Uocimo da je poseban slucaj primitivne naredbe, odnosno naredbe, tzv. "prazna naredba" dana sintaksom:

prazna_naredba: --------? Iz osnovne sintakticke strukture, koristeci upravo praznu naredbu na mjestu pojavljivanja naredbe, slijedi da je minimalni program u Turbo Pascalu:

BEGIN END. Ovo je ujedno i na? prvi program napisan u Turbo Pascalu! Treba primijetiti da bi "niz" praznih naredbi dao program koji ima ekvivalentno znacenje:

BEGIN ;;;;;;;;;;;;; END. DODATNA SINTAKTICKA PRAVILA

U svim pravilima pisanja naredbi Pascala pojavljuje se razmak izmedu odredenih klasa rijeci. Medutim, njegovim prikazom pravila bi postala slo?enija i nepreglednija. Zbog toga cemo pravilima pisanja dodati:

1) Izmedu sljedecih parova rijeci mora stajati bar jedan razmak: rezervirana rijec - rezervirana rijec, (standardno) ime ili broj; (standardno) ime - rezervirana rijec ili broj. Kraj retka ima znacenje razmaka. 2) Izmedu ostalih parova rijeci ne mora stajati razmak ili mo?e biti proizvoljan broj razmaka.

Na primjer, program:

PROGRAM A_ 1 ; BEGIN END.

mo?e se napisati i kao

PROGRAM ;

A_1

BEGIN END

U prvome primjeru rezervirana rijec PROGRAM i ime A_l, te rezervirane rijeci BEGIN i END razdvojeni su razmakom. Ime A_l i tocka-zarez, odnosno tocka-zarez i rijec BEGIN napisani su bez razmaka. U drugom su primjeru sve rijeci razdvojene.

Komentari Osim razmaka, izmedu bilo koje dvije rijeci u programu smije se pisati i komentar. Pravilo pisanja komentara dano je sa

NEDOSTAJE SLIKA

Vidimo da se pod komentarom podrazumijeva niz znakova omeden viticastim zagradama ili umjesto njih specijalnim simbolima "(*" i "*)", bez ogranicenja duljine (smije biti napisan, na primjer, u nekoliko redaka). Primjeri komentara:

{} {Ovo je komentar} (*I ovo je komentar*) {------} (* A={a,b,c} *) U osnovnoj leksickoj strukturi receno je da simboli "(*" i "*)" imaju znacenje viticastih zagrada. Medutim, dano pravilo obuhvaca kontekstni aspekt pisanja komentara prema kojem komentar koji zapocinje otvorenom viticastom zagradom zavr?ava prvom zatvorenom viticastom zagradom, odnosno, komentar koji zapocinje posebnim simbolom "(*" zavr?ava posebnim simbolom "*)". Na primjer, pogre?no je napisano

{ A = {1, 2, 3, 4} } jer ce zatvorena viticasta zagrada iza broja 4 biti prihvacena kao kraj komentara, a sljedeca viticasta zagrada ne mo?e biti prihvacena kao dio bilo koje naredbe Pascala. Komentar ima znacenje prazne naredbe, ?to znaci da ce biti ignoriran u kompilaciji. Slu?i za dodatni opis programa (dokumentaciju programa). Mi cemo ga koristiti i u opisu semantike naredbi. Na primjer, program A_l mo?emo preurediti u program:

PROGRAM A _2; {Deklaracija varijabli} BEGIN {Pocetak programa} {Naredbe} END.

Lista modula Od verzije 4.0 Turbo Pascala uvedeni su moduli ("units") u definiciju jezika. Moduli su posebni programi (biblioteke programa), standardni ili definirani od strane korisnika. Navode se na pocetku programa prema pravilu:

USES ime_modula {, ime_modula } ;

Direktive kompilatoru Komentar koji pocinje znakom "$" i odredenim nizom drugih znakova predstavlja direktivu kompilatoru ili direktivu, kako cemo je dalje zvati. Sadr?aj takvog komentara odreduje izvjesne akcije koje ce biti izvr?ene u toku prevodenja ili izvr?avanja programa. Krivo napisana direktiva tretira se kao "obicni" komentar. Eventualno napisani niz znakova iza direktive prihvaca se kao komentar. Pregled svih direktiva dan je u prilogu knjige.

Pravila pisanja programa Program napisan u Turbo Pascalu sastoji se od jednog ili vi?e redaka. Svaki redak mo?e sadr?avati dio naredbe, naredbu ili vi?e naredbi, ali maksimalne duljine 126 znakova. Jedna naredba mo?e biti napisana u nekoliko redaka. Jedino se treba pridr?avati pravila da simboli naredbe moraju biti napisani kompaktno. Pisanje simbola naredbi mo?e otpoceti u bilo kojoj koloni retka, pa to treba koristiti da bi se postigla bolja citljivost programa. GLOBALNA SEMANTIKA

Pod semantikom programa podrazumijevat cemo kompoziciju znacenja naredbi od kojih je program sastavljen. Ako osnovnu sintakticku strukturu Pascala prika?emo kao

PROGRAM ime_programa; deklaracije_i_definicije; potprogrami; BEGIN

naredba; ...; naredba END.

gdje su velikim slovima napisani elementi jezika (rezervirane rijeci), a malim slovima pojedine sintakticke kategorije, globalna semantika programa napisanog u Pascalu glasi: 1) Zaglavlje programa oznacuje pocetak kompilacijske cjeline.

2) Dio programa izmedu zaglavlja programa i zaglavlja potprograma (ako ga ima) predstavlja informacije kompilatoru.

3) Potprogrami i naredbe su "izvr?ivi" dio programa.

4) Izvr?avanje programa zapocinje nizom naredbi glavnog programa (prvom naredbom iza rijeci BEGIN u glavnom programu).

Pisanje naredbi za deklariranje i definiranje ima za cilj odvajanje informacija neophodnih za potpuno prevodenje od ostalih naredbi programa. Ponekad cemo za te naredbe upotrebljavati termin "neizvr?ive naredbe".

Programi A_1 i A_2 imaju znacenje "ostavi stvari kakve jesu". Drugim rijecima, izvr?enjem tih programa ne bi se ni?ta dogodilo, jer ne sadr?e nijednu neizvr?ivu niti izvr?ivu naredbu.

Karakteristika je Turbo Pascala da isti program mo?e imati dva razlicita znacenja! Na to utjece izbor odredenih direktiva kojima se, na primjer, mo?e izbjeci provjera kodomene medurezultata s ciljem br?eg izvr?enja programa. U tom slucaju ne bi bila dojavljena pogre?ka ako je rezultat izvan kodomene, ?to bi dovelo do pogre?nih (neocekivanih) rezultata.

Na kraju ovog poglavlja evo jednog kompletnog programa napisanog u Turbo Pascalu. To je program za rastavljanje prirodnog broja na faktore:

(* 1 *) PROGRAM Faktori;

{Rastavljanje broja na faktore }

USES Crt; TYPE Prir_br = 2 .. Maxint; VAR N : Prir_br; {Broj koji treba rastaviti na faktore } F : Prir_br;

(* 2 *) PROCEDURE Upis; BEGIN Writeln ('RASTAVLJANJE BROJA NA FAKTORE'); Writeln; Write ('Zadajte cijeli broj veci od 1 '); Readln(N); WHILE N -2147483648

Funkcija "ord" ima definiciju razlicitu od one koja je dana ranije. Ako je n cjelobrojna vrijednost, tada je:

ord (n) = n

Sintakticka kateogirija "cjelobrojni tip" definirana je sa:

cjelobrojni_tip: SHORTINT | BYTE | INTEGER | WORD | LONGINT

Ova standardna imena oznacuju podskupove cijelih brojeva iz domena danih u sljedecoj tablici:

Ime tipa

Domena

shortint byte integer word longint

-128 do 127 0 do 255 -32768 do 32767 0 do 65535 -2147483648 do 2147483647

Evo nekoliko primjera izracunavanja ordinalnih funkcija nad vrijednostima cjelobrojnog tipa:

pred (0) = -1 succ (32) = 33

ord (-111) = -111 integer (-111) = -111

byte (120) = 120 word (60000) = 60000

REALNI TIP

Realni tip podskup je skupa realnih brojeva. Zapravo, bolje je reci podskup skupa realnih vrijednosti na danom intervalu, jer svaki proizvoljno mali interval realnih brojeva sadr?i beskonacno vrijednosti, dok isti takav interval na kompjuteru zbog ogranicenja zapisa brojeva sadr?i konacan skup realnih vrijednosti.

Vrijednosti realnog tipa su realni brojevi koji se pi?u u normalnom ili eksponencijalnom obliku, prema vec danim pravilima u osnovnoj leksickoj strukturi Pascala. Realni brojevi su:

0.0

-221.33

2E4

3.1415926

+6.001

0.0001

dok sljedeci nizovi znakova ne mogu biti prihvaceni kao realni brojevi:

0.

.01

12,6

999

123456789

Logicna posljedica definicije realnih brojeva jest da nad vrijednostima tog tipa nisu definirane funkcije "succ", "pred" i "ord" (realni tip nije ordinalni).

Sintakticka kategorija < realni tip > definirana je kao realni tip: REAL | SINGLE | DOUBLE | EXTENDED | COMP

Dakle, kao i u slucaju cjelobrojnog tipa, ima nekoliko realnih tipova s razlicitom domenom (precizno?cu) vrijednosti, ?to je prikazano u sljedecoj tablici:

Tipa real single double

Domena

Broj znamenki

2.9x10-39 do 1.7xl038 11-12 1.5 x IO45 do 3.4 x 1038 5.0xl0"324 do 1.7xl0308 7-8 15-16 19-20

extended 3.4xl0-4932 do l.lxlO4932 comp -263 + 1 do 263 - 1 19-20

Standardno ime "real" ("rial" ? realni) oznacuje samo jedan podskup realnih vrijednosti, s precizno?cu koja najce?ce zadovoljava potrebe.

ZNAKOVNI TIP

Znak jest jedinstvena, nedjeljiva cjelina, kao ?to su na primjer slova, znamenke, +, -, *, /, (, ), itd. Drugim rijecima, to je ono ?to je oznaceno na tastaturi (ukljucujuci i razmak ili "blank") i ?to se interpretira kao znak na ekranu ili drugom izlaznom mediju.

Vrijednosti su znakovnoga tipa znakovi iz konacnog, uredenog skupa ASCII znakova. Pi?u se prema pravilu:

znakovna_vrijednost: 'znak'l #broj | ^oznaka | ,,,, oznaka: slovo |@| [|\|] I ^ I __

gdje je < broj > cijeli broj tipa byte. Vidimo da znakovne vrijednosti mogu biti napisane i izmedu polunavodnika, odnosno, to su nizovi duljine 1. Izuze?tak je u pisanju znakovna vrijednost koja oznacuje polunavodnik i dana je kao posebna mogucnost u pravilu. Bez obzira ?to su napisana dva poluna?vodnika, vrijednost je jednaka jednom polunavodniku.

Primjeri znakovnih vrijednosti:

'A' ^M

'*'

'?'

'5'

''

'='

'/'

'c'

''''

'*'

'#'

#65

Uredenje znakovnih vrijednosti odredeno je ASCII kodovima. Na primjer, vrijedi:

'A' < 'B' < ... < 'Y' < 'Z' < ... < 'a' < 'b' < ... < 'y' < 'z' '0' < '1' < ... < '8' < '9'

Drugim rijecima, ako su c1 i c2 dva znaka, vrijedi

c1 < c2 ako i samo ako je

ord (c1) < ord (c2) gdje vrijednost funkcije "ord" za znakovnu vrijednost kao argument odgovara ASCII kodovima znakova c1 i c2.

Ako je znak napisan u obliku #< broj >, broj je istodobno njegov ASCII kod. ASCII kodovi znakova napisanih u obliku ^< oznaka > dani su u tablici ASCII kodova.

Znakovni tip, kao standardni tip podataka u Pascalu, ima unaprijed odredeno (standardno) ime "char" (od rijeci "character" - znak). Ime znakovnog tipa istodobno je ime funkcije koja za dani broj vraca znak kojem je to redni broj. Evo nekoliko primjera izracunavanja funkcije "char":

char (65) = 'A' char (32) = ' '

char (112) = 'p'

INTERNI TIP

Uporabili smo rijec "interni" da bismo istakli mogucnost definiranja nestandardnoga ili "internoga" tipa podataka. Prema danim klasifikacijama interni tip je istodobno ordinalni i enumeracijski. Ova druga klasifikacija istice nacin definiranja internog tipa - nabrajanjem, prema pravilu:

interni tip: ( ime_podatka {, ime_podatka } )

ime podatka: ime

Kontekstni aspekt definiranja internog tipa jest da navedena imena moraju biti razlicita i ne smiju se pojaviti u prethodnim definicijama. Evo nekoliko primjera definicija internih tipova podataka:

(Crvena, Plava, Zelena) (Pon, Ut, Sr, Cet, Pet)

(Sub, Ned)

(AUD, ATS, CAD, FRF, DEM, ITL, JPY, NLG, SEK, CHF, GBP, USD, BEF)

Prvi predstavlja skup podataka boja, drugi podatke koji predstavljaju simbolicka imena radnih dana u tjednu, treci simbolicka imena neradnih dana u tjednu i cetvrti oznake valuta. Ako se definiciju internoga tipa opcenito napi?e kao

(w1, w2, ..., wn)

onda nabrajanje komponenata (podataka) tipa u definiciji uvodi linearno uredenje tipa, pa vrijedi

vvi < wj 1 < i < j < n

Na primjer, za podatke tipa "boja" iz prethodnog primjera vrijedi:

Crvena < Plava < Zelena

Imena navedena kao podaci internog tipa istodobno predstavljaju i "vrijednosti" internog tipa. Nad podacima internog tipa nisu definirane operacije. S obzirom da je interni tip istodobno i ordinalni, nad njegovim vrijednostima definirane su ordinalne funkcije "ord", "pred" i "succ".

Na primjer, nad podacima tipa "radni_dan" vrijedi:

succ (Pon) = Ut

succ (Sr) = Cet pred (Pet) = Cet

pred (Ut) = Pon

ord (Pon) = 0

ord (Pet) = 4

dok, na primjer, succ (Pet) i pred (Pon) nisu definirani.

LOGICKI TIP

Logicki tip podataka po jednoj klasifikaciji pripada standardnim, a po drugoj ordinalnim, odnosno enumeracijskim tipovima podataka. Definicija logickog tipa kao enumeracijskog ima oblik (False, True). Dakle, False i True su jedine logicke vrijednosti koje oznacuju dvije mogucnosti: "neistinu" (False) i "istinu" (True). U BNF zapisu mo?e se definirati:

logicka vrijednost: FALSE | TRUE Uredenje logickih vrijednosti proizlazi iz definicije, pa je

False < True Vrijednosti funkcija succ, pred i ord za podatke logickog tipa definirane su kao:

succ (False) = True,

pred (True) = False,

ord (False) = 0 ord (True) = 1

Rekli smo da je logicki tip standardan, ?to znaci da je unaprijed definiran. Umjesto njegove eksplicitne definicije u programu dovoljno je koristiti njegovo ime, standardno ime "boolean", pa je definicija sintakticke kategorije < logicki tip > dana sa:

logicki tip: BOOLEAN Dakle, ime logickoga tipa ujedno ima znacenje identifikatora logickih vrijed-nosti. Istodobno je "boolean" ime inverzne funkcije od "ord". Definirana je kao:

boolean (0) = False,

boolean (1) = True

NAREDBA ZA DEFINIRANJE TIPOVA

Tip podataka u programu se uvodi definicijom tipa (pogledajte osnovnu sintakticku strukturu), koja odreduje skup vrijednosti (tip) i pridru?uje mu ime. Definicija ima sljedeci oblik:

definiranje__tipa: TYPE ime_tipa = tip;

{ime_tipa = tip;}

ime_tipa: ime gdje je < tip > definiran kao ranije uz dodatak alternative:

tip: ime_tipa U pravilu pisanja naredbe za definiranje tipa pojavljuje se i < ime tipa >. To znaci da se izborom novog imena mo?e definirati tip ekvivalentan vec definiranom tipu (primitivnom ili strukturiranom). Drugim rijecima, novo ime tipa ekvivalentno je prethodno definiranom. Na primjer, naredbom

TYPE cijeli_brojevi = integer; definiran je tip "cijeli_brojevi" ekvivalentan cjelobrojnom tipu "integer".

Naredba za definiranje tipa nije izvr?iva naredba Pascala. Njome se izabranim tipovima pridru?uje simbolicko ime. Koristit ce se najce?ce za pridru?ivanje imena podacima nekog internog tipa, poddomenskog tipa ili strukture podataka.

Evo jednog primjera pisanja naredbe za definiranje tipova:

TYPE boja = (Crvena, Plava, Zelena); neradni_dan = (Sub, Ned);

radni_dan = (Pon, Ut, Sr, Cet, Pet);

valuta

= (AUD, ATS, CAD, FRF, DEM, ITL, JPY, NLG, SEK, CHF, GBP, USD, BEF);

Ovom naredbom definirano je nekoliko internih tipova podataka: "boja" je ime internog tipa koji sadr?i "vrijednosti" Crvena, Plava i Zelena; "radni_dan" je ime internog tipa kojeg cini skup simbolickih imena radnih dana u tjednu; "neradni_dan" je ime skupa podataka ? simbolickih imena neradnih dana u tjednu i "valuta" oznake valuta. Ako je interni tip definiran naredbom za definiranje tipa, ime tipa istodobno je i ime funkcije inverzne funkciji "ord", koja za dani redni broj vraca podatak s tim rednim brojem.

Nad tipom "radni_dan" definirana je i funkcija s tim imenom. Evo nekoliko primjera izracunavanja te funkcije:

radni_dan (2) = Sr

radni_dan (0) = Pon

radni_dan (4) = Pet

Funkcija "radni_dan" nije definirana za argumente (cijele brojeve) vece od 4. NAREDBA ZA DEFINIRANJE KONSTANTI

U dijelu za definiranje konstanti uvode se imena kao sinonimi za vrijednosti bilo kojeg primitivnog tipa i nekih struktura podataka. Opcenito pravilo pisanja je:

definiranje_konstante: CONST ime_konstante = konstanta;

{ ime__konstante = konstanta; }

ime_konstante: ime a u posebnom slucaju, za definiranje konstanti primitivnog tipa, sintakticka kategorija < konstanta > definirana je kao

konstanta: izraz_s_konstantama

izraz_s_konstantama: izraz Izraz s konstantama je izraz odgovarajuceg tipa koji na mjestu operanda sadr?i podatak ili prije toga definiranu konstantu. Potpuno pravilo pisanja izraza dano je u posebnom poglavlju. Ovdje dajemo samo njegov najjednostavniji oblik, samo jedan operand, koji mo?e biti:

vrijednosti| ime_konstante| predznak ime_brojcane_konstante

vrijednost: brojcana_vrijednost | znakovna_vrijednost | logicka_vrijednost

brojcana_vrijednost: cijeli_broj | realni_broj -= Na vrh =PRIDRU?IVANJE I ISPIS VRIJEDNOSTI

U prethodnom smo poglavlju opisali tipove podataka te naredbe za definiranje tipova i konstanti i deklariranje varijabli. Te tri naredbe nisu izvr?ive, tj. slu?e za dodatne informacije prevoditelju Pascala, pa jo? uvijek ne mo?emo pisati programe koji "ne?to rade". Deklaracijom varijabli izabranim je imenima pridru?eno svojstvo da predstavljaju varijable odredenog tipa, s nedefiniranom vrijedno?cu. Vrijednost im se mora pridruziti posebnim naredbama: za inicijalizaciju, dodjeljivanje i unos, koje uvodimo u ovom poglavlju. Programiranje ne bi imalo smisla kad ne bi postojao ispis vrijednosti ("rezultata") pa na kraju poglavlja uvodimo i naredbu za ispis. NAREDBA ZA INICIJALIZACIJU

Treba odmah napomenuti da sintaksa naredbe za inicijalizaciju u T. Pascalu nije ba? sretno izabrana. Naime, naredba za inicijalizaciju pocinje rijecju CONST, kao i naredba za definiranje konstanti, odnosno, dopu?tena je inicijalizacija i definiranje konstanti u istoj naredbi, ?to uvodi posebnu zabunu. Evo globalne sintakse naredbe za inicijalizaciju:

naredba za inicijalizaciju

CONST ime_varijable : tip = konstanta ; {ime_varijable : tip = konstanta ;}

Ako naredbu za inicijalizaciju opcenito napi?emo kao

CONST v: t = k; njeno globalno znacenje jest: deklariranje varijable v tipa t i pridru?ivanje joj pocetne vrijednosti k. Zadana inicijalna vrijednost (pogledajte u naredbi za definiranje konstanti kako je definirana sintakticka kategorija < konstanta >) mora biti u domeni definiranog tipa varijable. To se provjerava tijekom kom-pilacije i dojavljuje sintakticka pogre?ka u slucaju poku?aja inicijalizacije s vrijedno?cu izvan domene.

Dakle, naredba za inicijalizaciju objedinjuje dvije stvari: deklariranje varijable i pridru?ivanje inicijalne vrijednosti. Kontekstni aspekt uporabe te naredbe jest da se ime varijable ne smije pojaviti u drugim naredbama za definiranje i deklariranje.

Va?no je upamtiti da varijabla deklarirana i inicijalizirana naredbom za inicijalizaciju ima svojstvo varijable (dopu?tena joj je promjena vrijednosti unutar programa!), bez obzira ?to se u njenom pravilu pisanja pojavljuje rijec CONST. Na primjer, naredbom:

CONST V0 : real = 23.05; Y0 : real = 1.359; C = 10; D : 1..100 = C; B Yes Kraj : '0'..'9' : Boolean : Boolean = '0'; Z : char = ' '; = True; = False;

Operacija : (ZB, 0D, MN, DI) = ZB;

deklarirano je i inicijalizirano nekoliko primitivnih varijabli svih tipova.

NAREDBA ZA DODJELJIVANJE

Dosad smo opisivali sintaksu i semantiku deklarativnih naredbi Pascala. Naredba za dodjeljivanje (pridru?ivanje) prva je naredba Pascala koja prema osnovnoj sintaktickoj strukturi pripada primitivnim, odnosno izvr?ivim naredbama. Poznata je u svim jezicima za programiranje i najce?ce se upotrebljava u programima. Razmotrimo najprije opcenito pravilo pisanja naredbe za dodjeljivanje i definirajmo globalnu semantiku:

naredba za dodjeljivanje: varijabla := izraz U ovom opcenitom razmatranju uvedimo najjednostavnije oblike naredbe za dodjeljivanje koji se odnose na pridru?ivanje vrijednosti primitivnih tipova podataka:

ime_primitivne_varijable := konstanta | ime_primitivne_varijable Dakle, na lijevoj je strani ime primitivne varijable, na desnoj najjednostavniji oblik izraza bilo kojega tipa: konstanta ili ime primitivne varijable. Kontekstni aspekt pisanja naredbe za dodjeljivanje prema ovom pravilu jest da varijabla navedena na lijevoj strani i varijabla ili konstanta, na desnoj strani, moraju biti istog tipa. Izuzetak je realni tip. Ako je varijabla s navedenim imenom realnoga tipa, konstanta ili varijabla na desnoj strani mo?e biti realnog ili cjelobrojnoga tipa. Na primjer, ako su A i B dvije cjelobrojne varijable, evo nekoliko primjera pravilno napisanih naredbi za dodjeljivanje:

A := -1; B := A; A := Maxint; B := 111; U sljedecim naredbama prekr?eno je kontekstno pravilo da tip varijable i vrijednost moraju biti isti:

A := 1.1; {Vrijednost 1.1 je realna} A := 'a'; {'a' je znakovna vrijednost} B := True; {True je logicka vrijednost}

Ako naredbu za dodjeljivanje napi?emo kao

v := i gdje je v varijabla, a i izraz, semantika se moze prikazati s

v bn J (na kraju je pritisnuta tipka Enter). Dalje je semantika naredbe za unos ekvivalentna nizu naredbi za dodjeljivanje:

v1 := b1 ; v2 := b2; ... vn := bn Vrijednosti moraju biti odgovarajuceg tipa: cjelobrojne ako se pridru?uju cjelobrojnoj varijabli, cjelobrojne ili realne ako se pridru?uju realnoj varijabli (?to proizlazi i iz semantike naredbi za dodjeljivanje). Na primjer, ako su R i H realne varijable, izvr?enjem naredbe

Readln (R, H) bit ce prekinuto daljnje izvr?avanje programa i cekat ce se na unos vrijednosti za R i H. Na primjer:

12.5 145 J Poslije pritiskanja tipke Enter varijabli R bit ce pridru?ena vrijednost 12.5, a varijabli H (realna) vrijednost 145.0. Kursor ce se premjestiti u prvi stupac sljedeceg reda i program ce se nastaviti izvr?avati naredbom koja neposredno slijedi naredbu za unos.

Unos znakovnih vrijednosti Ako naredba za unos sadr?i samo znakovne varijable, ?to opcenito mo?emo napisati kao:

READ (zi, z2, .., zN) ili

READLN (zi, z2, ..., zN) njezinim izvr?enjem cekat ce se na unos N znakova koji ce potom redom biti pridru?eni navedenim varijablama. Znakom se smatra bilo koji znak tastature, pa su to u posebnom slucaju razmak i znak polunavoda.

Unos znakovnih i brojcanih vrijednosti Naposljetku, definirajmo semantiku naredbe za unos koja sadr?i znakovne i numericke varijable. Razmotrit cemo dva slucaja:

1) Prva varijabla u naredbi za unos je znakovna, ostale su brojcane:

READ (z, n1, n2, ..., nN) Prvi znak otipkanog niza znakova bit ce pridru?en varijabli z, a ostali simboli (brojevi), razdvojeni bar jednom prazninom, brojcanim varijab-lama n1 do nN. Prvi broj ne mora biti odvojen razmakom od prvog znaka. 2) Naredba za unos sadr?i znakovne i brojcane varijable:

READ (v1 v2, .., vN) gdje je vi znakovna ili brojcana varijabla. Ako je vj brojcana, a vj+1 znakovna varijabla, poslije otipkavanja broja koji ce biti pridru?en varijabli vj mora biti jedna praznina (da bi se mogao ekstrahirati broj iz ulaznog niza) koja ce biti pridru?ena varijabli vj+1. Da bi se va-rijabli vj+1 pridru?io ?eljeni znak, koji je najce?ce razlicit od praznine, mora biti napisan iza praznine. Ali, to znaci da ce biti pridru?en va-rijabli vj+2, pa varijabla vj+2 mora biti znakovna varijabla. Dakle, sva-kom unosu znakovne vrijednosti kojoj prethodi brojcana odgovarat ce dvije znakovne varijable. Najbolje je napisati istu varijablu dva puta, jednu do druge.

Ako su I i J cjelobrojne varijable, a C znakovna varijabla, izvr?enjem naredbe

Read (I, C, C, J) unosom niza

321 + 22 varijabli 1 bio bi pridruzen broj 321, varijabli C znak "+" i varijabli J broj 22. Isti ucinak postigao bi se da je bilo napisano

321 +22 < dok bi za

321+22 ili 321 + 22 bila dojavljena pogre?ka u fazi izvr?avanja programa, jer u prvom slucaju nema praznine iza broja 321, a u drugom ce varijabli C biti pridru?ena vrijednost " " i potom treba slijediti broj, a znak "+" to nije. ISPIS VRIJEDNOSTI

Opisali smo tipove podataka, definiranje konstanti, deklariranje varijabli i pridru?ivanje vrijednosti varijablama odredenoga tipa. Medutim, sve su te naredbe radile nad podacima unutar radne memorije kompjutera, tj. podaci nisu bili "vidljivi", dostupni korisniku programa. Tek uporabom naredbe za ispis, koju ovdje uvodimo, rezultati izvr?avanja programa postaju dostupni. Prije toga uvodimo dvije standardne procedure koje su u vezi s ispisom na ekran: brisanje sadr?aja ekrana i smje?tanje kursura.

Brisanje ekrana Brisanje sadr?aja ekrana posti?e se naredbom CLRSCR koja se pi?e prema jednostavnom pravilu:

brisanje ekrana: CLRSCR "Clrscr" je ime standardne procedure koja se nalazi u standardnom modulu s imenom "Crt", pa program u listi modula mora sadrzati to ime. U suprotnom bila bi dojavljena pogre?ka.

Izvr?enjem naredbe CLRSCR bri?e se prethodni sadr?aj ekrana i postavlja kursor u prvi stupac prvoga reda ekrana (gornji lijevi kut). Samo to i "zna" sljedeci program:

PROGRAM Brisi_Ekran; USES Crt; BEGIN

Clrscr END

Smje?tanje kursora Smje?tanje kursora bilo koju lokaciju ekrana posti?e se primjenom naredbe GOTOXY (standardne procedure) koja se pi?e prema pravilu:

naredba GotoXY: GOTOXY (stupac, red) stupac: red:

cjelobrojni_izraz cjelobrojni_izraz

I procedura "GotoXY" je dio standardnog modula "Crt". Ako je napi?emo u obliku:

GotoXY (s, r) gdje je s stupac, r red, izvr?enjem naredbe GotoXY bit ce izracunati cjelobrojni izrazi koji odreduju stupac i red, potom kursor smje?ten u r-tom redu stupca s. Prethodni sadr?aj ekrana nece biti promijenjen. Na primjer, izvr?enjem naredbe

GotoXY (40, 12) bit ce postavljen kursor u dvanaesti red, cetrdeseti stupac ekrana.

Turbo Pascal ima i dvije globalne varijable s imenima WhereX i WhereY koje sadr?e tekuce vrijednosti stupca (WhereX) i reda (WhereY) polo?aja kursora. Ako se poslije naredbe GOTOXY iz prethodnog primjera napi?e

GotoXY (WhereX, WhereY-2) izvr?enjem te naredbe kursor ce biti smje?ten u desetom redu (12-2), cetrdesetom stupcu (polo?aj stupca nije promijenjen).

Da biste lak?e upamtili znacenje procedure GotoXY i globalnih varijabli WhereX i WhereY dovoljno je znati da je ishodi?e ekrana u gornjem lijevom kutu, os-x su stupci, a os-y redovi.

Naredba za ispis Mogu se ispisati vrijednosti samo standardnih tipova podataka, tj. svi tipovi podataka osim internog. Ovdje ce biti rijeci o ispisu na dva medija: ekran i papir. Opcenita struktura naredbe za ispis dana je sljedecim pravilom:

naredba za ispis: WRITE WRITELN [ ( [ LST, ] ispis {, ispis} ) ]

gdje je < ispis > sintakticka kategorija koja se opcenito sastoji od niza izraza odredenog tipa i formata ispisa.

Globalna semantika naredbe za ispis jest: izracunavanje i ispis vrijednosti niza izraza, "formatirano" ili u "slobodnom formatu". Ispisivat ce se na ekran ako je izostavljeno standardno ime "LST", ako nije, na papir. Ako se ispisuje na papir, program mora sadr?avati standardni modul "Printer" u svojoj listi modula.

Naredba za ispis mo?e poceti s "Write" ili "Writeln". Znacenje je: ako naredba pocinje s "Write", poslije ispisa vrijednosti navedenih izraza kursor ce ostati iza posljednjega ispisanog podatka, a ako

pocinje s "Writeln", kursor ce poslije ispisa vrijednosti biti premje?ten na pocetak novog reda. U oba slucaja ispis pocinje od trenutacne pozicije kursora, koja opcenito ne mora biti na pocetku retka. Ovim pravilima treba dodati da je ispis na ekranu ogranicen na 80 znakova (broj stupaca ekrana) pa ce se automatski prelaziti u novi red ako kursor u tekucem ispisu prema?i osamdeseti stupac.

Znacenje naredbe za ispis napisane bez izraza jest: ostavljanje kursora na tekucoj poziciji, ako je napisano samo "Write"; premjestanje kursora na pocetak novog reda, ako je napisano "Writeln".

Naredba za ispis koja pocinje s "Write" i sadrzi vise od jednog izraza, sto se opcenito moze napisati kao

Write (iz1, iz2, ..., izN) ekvivalentna je nizu naredbi:

Write (iza); Write (iz2); ...; Write (izN) a naredba

Writeln (izl, iz2, ..., izN) ekvivalentna je nizu naredbi:

Write (izi); Write (iz2); ...; Write (izN); Writeln Iz znacenja naredbe za ispis zakljucuje se da ona ne mijenja vrijednosti varijabli programa. To isticemo zbog pocetnika koji cesto znacenje naredbe za ispis poistovjecuju sa znacenjem naredbe za dodjeljivanje.