pl za neupucene

25
Naredbe se mogu raspodeliti u dve kategorije: 1. opisne ili deklarativne naredbe-definišu značenje pojedinih simboličkih imena. Postoje tačno određena pravila za pisanje deklarativnih naredbi u PL/I. 2. izvršne naredbe-specifiraju postupak rešenja nekog zadatka. Tipična naredba u PL/I sastoji se iz tzv. ključnih reči, simboličkih imena i nekih posebnih znakova. 1. ključne reči-sačinjavaju osnovu rečnika programskog jezika PL/I. One su unapred definisane sa ostalim formalnim odnosno sintaktičkim pravilima. Koriste se pre svega za izražavanje vrste naredbe i opisivanje značenja simboličkih imena. 2. simbolička imena-privremeno dopunjavaju rečnik programskog jezika PL/I za potrebe pisanja programske procedure. Koriste se pre svega za označavanje polja u glavnoj memoriji i datoteka. Za pisanje PL/I programa mogu se primeniti samo određeni znakovi. Postoje dva važeća niza znakova: niz od 60 i niz od 48 znakova (60C i 48C, respektivno). Podrazumeva se niz 60C. 60C 48C opis značenja 60C 48C opis značenja 60C 48C opis značenja = = jednako ) ) desna zagrada A-Z A-Z ENG slova + + plus , , zarez Č Č alfabetski znak - - minus . . tačka Š,Ž nema alfabetski znakovi * * zvezdica- množenje navodnik 0-9 0-9 numerički znakovi / / kosa crta- deljenje % // procenat blank-prazno ( ( leva zagrada : .. dve tačke ; ,. tačka zarez I OR logičko ILI ? nema upitnik ¬ NOT negacija < LT manje nego > GT veće od & AND logičko I _ nema poveznik CAT povezivanje nizova SIMBOLIČKA IMENA Pravilan izbor simboličkog imena 1. simboličko ime je niz znakova dužine od 1 do 31 2. prvi znak u imenu mora biti alfabetski 3. ostatak imena može biti sastavljen od alfabetskih znakova, numeričkih znakova i poveznika. 4. poveznik mora biti između dva druga znaka 5. posebni znakovi (uključujući blank) nisu dozvoljeni U principu je moguće da kao simboličko ime koristimo ključnu reč PL/I rečnika. Npr. ime datoteke može biti READ isto kao i naziv naredbe READ. Ako neka simbolička imena koristimo i van procedure u kojoj su deklarisana nazivamo ih tada “eksterna imena”. U tu grupu izmedju ostalog spadaju uvek imena procedura i imena datoteka. 1. maksimalno dozvoljena dužina eksternog imena je 7 znakova i ono ne sme sadržavati poveznik. 2. ako je dužina deklarisanog eksternog imena duža od 7 znakova kompajler ga automatski skrati tako da formira ime od prva 4 i zadnja 3 znaka u originalnom imenu. Npr. ako je originalno ime ULAZNA_DATOTEKA ono prelazi u ime ULAZEKA. ivan - naziv procedure PROCEDURE - naredba za početak procedure END - naredba za završetak procedure OSNOVNA FORMALNA STRUKTURA ivan: PROCEDURE; ---------------; END;

Upload: ivan-perkovic

Post on 12-Jan-2016

14 views

Category:

Documents


0 download

DESCRIPTION

Skripta iz PLI za IBM mainframe računare, stara knjiga iz sedamdesetih pretvorena u skriptu

TRANSCRIPT

Page 1: PL Za Neupucene

Naredbe se mogu raspodeliti u dve kategorije:

1. opisne ili deklarativne naredbe-definišu značenje pojedinih simboličkih imena. Postoje tačno određena pravila za pisanje deklarativnih naredbi u PL/I.

2. izvršne naredbe-specifiraju postupak rešenja nekog zadatka. Tipična naredba u PL/I sastoji se iz tzv. ključnih reči, simboličkih imena i nekih posebnih znakova.

1. klju čne reči-sačinjavaju osnovu rečnika programskog jezika PL/I. One su unapred definisane sa ostalim formalnim odnosno sintaktičkim pravilima. Koriste se pre svega za izražavanje vrste naredbe i opisivanje značenja simboličkih imena.

2. simbolička imena-privremeno dopunjavaju rečnik programskog jezika PL/I za potrebe pisanja programske procedure. Koriste se pre svega za označavanje polja u glavnoj memoriji i datoteka.

Za pisanje PL/I programa mogu se primeniti samo određeni znakovi. Postoje dva važeća niza znakova: niz od 60 i niz od 48 znakova (60C i 48C, respektivno). Podrazumeva se niz 60C.

60C 48C opis značenja 60C 48C opis značenja 60C 48C opis značenja

= = jednako ) ) desna zagrada A-Z A-Z ENG slova + + plus , , zarez

Č Č alfabetski znak - - minus . . tačka Š,Ž nema alfabetski

znakovi * * zvezdica-

množenje ‘ ‘ navodnik

0-9 0-9 numerički znakovi

/ / kosa crta-deljenje

% // procenat

blank-prazno ( ( leva zagrada : .. dve tačke ; ,. tačka zarez I OR logičko ILI ? nema upitnik

¬ NOT negacija < LT manje nego > GT veće od & AND logičko I _ nema poveznik CAT povezivanje nizova

SIMBOLI ČKA IMENA

Pravilan izbor simboličkog imena

1. simboličko ime je niz znakova dužine od 1 do 31 2. prvi znak u imenu mora biti alfabetski 3. ostatak imena može biti sastavljen od alfabetskih znakova, numeričkih znakova i poveznika. 4. poveznik mora biti između dva druga znaka 5. posebni znakovi (uključujući blank) nisu dozvoljeni

U principu je moguće da kao simboličko ime koristimo ključnu reč PL/I rečnika. Npr. ime datoteke može biti READ isto kao i naziv naredbe READ. Ako neka simbolička imena koristimo i van procedure u kojoj su deklarisana nazivamo ih tada “eksterna imena”. U tu grupu izmedju ostalog spadaju uvek imena procedura i imena datoteka.

1. maksimalno dozvoljena dužina eksternog imena je 7 znakova i ono ne sme sadržavati poveznik. 2. ako je dužina deklarisanog eksternog imena duža od 7 znakova kompajler ga automatski skrati

tako da formira ime od prva 4 i zadnja 3 znaka u originalnom imenu. Npr. ako je originalno ime ULAZNA_DATOTEKA ono prelazi u ime ULAZEKA.

ivan - naziv procedure PROCEDURE - naredba za početak procedure END - naredba za završetak procedure

OSNOVNA FORMALNA STRUKTURA ivan: PROCEDURE; ---------------; END;

Page 2: PL Za Neupucene

KONSTANTE

U PL/I jeziku postoje numeričke i tekstualne konstante. Tekstualne konstante se specifiraju u navodnicima.

SEPARATORI I BLANKOVI U PL/I se ne smeju napisati dve susedne reči (ključne, simboličke ili konstante) bez separatora između njih. Kao separatori se tretiraju svi oni znakovi, koji nisu dozvoljeni u simboličkim imenima, uključujući blank. Jedini separatori potrebni u PL/I naredbi su oni koje i onako zahteva sintaksa pojedinih naredbi. Svakom separatoru može se slobodno pridružiti i blank, a tamo gde je dozvoljen jedan blank može ih biti koliko želimo ili trebamo. Ova sloboda omogućava “stiliziranje” izvornog programa za postizanje veće preglednosti.

KOMENTARI Naredbe izvornog programa nisu uvek razumljive bez dodatnih objašnjenja pa ih je zgodno pojasniti komentarom. Komentari nemaju nikakvog učinka na mašinsko izvođenje programa. Format komentara izgleda ovako: /* tekst komentara */ Između /* i */ može stajati bilo kakav tekst. Komentar može stajati tamo gde je dozvoljeno ubaciti blank kao separator.

OSNOVNI OBLICI MEMORISANJA PODATAKA U PL/I PROGRAMU opisna naredba DECLARE (DCL) Ova naredba se primenjuje za definisanje značenja simboličkog imena koje označava neki element u programu (neko polje za memorisanje podataka ili neka datoteka). DECLARE simboli čkoime atributi simboličko ime mora biti blankovima odvojeno od atributa i opisne naredbe. Atributi su opcionalni deo naredbe i to su ključne reči koje određuju format varijable-simboličkog imena. Ako u deklaraciji navedemo više atributa njihov redosled nije bitan, važno je samo da su pravilno separirani. Sa naredbom DECLARE se može odjednom deklarirati i više varijabli. Pri tome razlikujemo dva slučaja:

1. varijable su potpuno različitih formata DECLARE simboličkoime1 atributi1, simboličkoime2 atributi2, simboličkoime3 atributi3,.........;

2. varijable imaju neke zajedničke atribute DECLARE (si1 at1, si2 at2, si3 at3, .........., sin atn) zajedničkiatribui;

ATRIBUTI 1. CHARACTER(broj od 0 do 32767) - simboličko ime je niz karaktera čiji broj može biti između 0 i 32767. Umesto CHARACTER možemo skraćeno pisati CHAR. Ukoliko ne navedemo broj karaktera u zagradi podrazumeva se broj 1. npr. DCL knjiga CHAR(25000) - deklarisali smo varijablu knjiga koja je niz od 25000 karaktera Ponekad je povoljno, ako neki tekst u programu možemo izraziti u vidu konstante. PL/I dozvoljava kodiranje character konstante koja može sadržavati niz znakova. Početak i kraj takvog niza označavaju

Page 3: PL Za Neupucene

navodnici, koji sami ne pripadaju konstanti i ne doprinose dužini konstante. Ako se između navodnika nalaze blankovi onda i oni doprinose dužini konstante. npr. DCL tekst CHAR(17); tekst = ‘sportska prognoza’; Ukoliko zelimo da ponovimo tekst između navodnika (sportska prognoza) tada mozemo pisati ovako: npr. ‘abcabcabcabc’ je ekvivalentno sa (4)’abc’ faktor ponavljanja mora biti specificiran u zagradama neposredno ispred konstante. Navodnik koji je deo konstante mora se duplo specifirati. npr. ‘disko klub “ekv“ novi sad’ Pri tome se dupli navodnici broje kao jedan karakter. Maksimalna dužina character konstante nije definisana jednostavnom brojkom jer zavisi od veličine memorije u kojoj se izvodi kompilacija, ali njena maksimalna dužina nikako nije ispod 512 znakova. DECIMAL FIXED(p,r) ili DEC FIXED(p,r)

p-preciznost (ukupan broj decimalnih mesta), maksimalno 15 r-faktor skale (koliko mesta iza decimalnog zareza) ukoliko se r ne specificira pretpostavlja se da iznosi 0, a ako se ni p ne specificira pretpostavlja se da je (p,r)=(5,0). U preciznost p se nikad ne uračunava mesto za predznak. Ovaj atribut se bavi tzv. pakovanim decimalnim brojevima-svaka decimalna cifra je predstavljena jednim polubajtom (4bita), a sasvim desni polubajt je rezervisan za predznak. Za decimalni zarez kod pakovanog decimalnog formata fizički nema mesta, ali će deklarirana pozicija decimalnog zareza uvek pravilno tretirati. CPU je sposoban da obradi pakovane decimalne brojeve koji nisu duži od 15 mesta. Ako se prilikom pisanja slučajno izostavi atribut DECIMAL kompajler ga automatski predpostavi na osnovu atributa FIXED, obrnuto ne važi. Decimalni brojevi se mogu izražavati i u obliku konstanti. U PL/I jeziku se decimalna konstanta kodira prilično prirodno: proizvoljnom predznaku slede brojke, iza njih stoji proizvoljna decimalna tačka, a njoj slede opet brojke. Brojke naravno moraju biti decimalne, a blankovi se u takvom broju ne smeju pojavljivati. Decimalne konstante se memorišu u pakovanom decimalnom formatu, maksimalna preciznost je 15.

OSNOVE MANIPULACIJE PODATAKA JEDNOSTAVNA NAREDBA IZJEDNAČENJA

opšti oblik: VARIJABLA = IZRAZ; Sa leve strane znaka jednakosti se uvek mora nalaziti varijabla, a sa desne neki izraz. Taj izraz u najjednostavnijem slučaju može biti čak jedna varijabla ili konstanta. Naredba izjednačenja se izvede tako, da se najpre odredi vrednost izraza na desnoj strani pa se posle ta vrednost prenese (kopira) u polje “ciljne” varijable na levoj strani MANIPULACIJA PODATAKA FORMATA CHARACTER

Najosnovniji primer manipulacije podataka formata CHARACTER je prenošenje podataka iz jednog polja glavne memorije u drugo. Za programiranje takvog prenosa primeni se naredba izjednačenja. IZRAZ je u tom slučaju samo jedna varijabla ili konstanta.

Page 4: PL Za Neupucene

npr. DECLARE(ulaz,izlaz)CHAR(80); DECLARE čaša CHAR(4);

izlaz = ulaz; čaša = ‘pivo’;

Ukoliko varijablu čaša izjednačimo sa npr. ‘kokakola’ ona će primiti samo izraz ‘koka’ zbog deklarisane dužine od 4 karaktera. Sa podacima formata CHARACTER može se napisati i izraz koji kao operande primenjuje nizove znakova. Jedini takav izraz koji kao rezultat daje opet niz znakova, je izraz sa kime više kraćih nizova povežemo u duži niz. Takvo povezivanje se naziva CONCATENATION. Dužina rezultirajućeg niza, koji se dobija povezivanjem kraćih nizova, jednaka je sumi dužina pojedinih operanada. Operator, koji se koristi u izrazu za povezivanje nizova, su dve uzastopne vertikalne crte II. npr. DCL lista CHAR(15), datum CHAR(8); lista = ‘cenovnik’ II ‘ pića’; lista = ‘datum: ‘IIdatum; Ovakav tip izraza veoma je pogodan za programiranje raznih naslova redova, zaglavlja i sl. MANIPULACIJA PODATAKA DECIMAL FIXED Za programiranje aritmetičkih operacija primenjuje se naredba izjednačenja u svom tipičnom formatu

VARIJABLA = IZRAZ

IZRAZ se u PL/I programira na nacin, koji je veoma sličan školskom načinu pisanja algebarskih izraza. Tipičan aritmetički izraz u PL/I sastoji se od aritmetičkih varijabli, konstanti i aritmetičkih operatora. Prilikom preslikavanja jedne vrednosti u drugu mesto decimalnog zareza ostaje ne promenjeno. npr DCL broj1 FIXED(7,3); broj2 FIXED(5,2); broj2 = -312,17; broj1 = 4321,123; broj1 = broj2; /* broj1 = -0312.170*/ broj2 = broj1; /* broj2 = 321.12*/ PRECIZNOST U ARITMETIČKIM IZRAZIMA U jeziku PL/I je preciznost neke računske operacije tačno definisana i zavisi isključivo od preciznosti pojedinih operanada u racunskoj operaciji.

Zbog mogućih grešaka određivanja preciznosti od strane kompajlera, preporučljivo je da aritmetički izraz razbijemo na taj način da možemo sami odrediti preciznost svakog međurezultata.

OBRADA ULAZA I IZLAZA

PODACI FORMATA PICTURE Za numeričke podatke, koji se u memoriji smeštaju u alfanumeričkom odnosno nepakovanom decimalnom formatu, je u PL/I predviđenposeban atribut PICTURE. Numerička varijabla formata PICTURE deklarira se tako da se posle atributa PICTURE (skraćenica PIC) između dva apostrofa po određenim formalnim

mat. PL/I značenje mat. PL/I značenje

+ + sabiranje an a**n stepenovanje - - oduzimanje -a -a negativan broj * * množenje , . zarez / / deljenje ( ) ( ) zagrade

atributi operanda FIXED DECIMAL (p1,r1) FIXED DECIMAL (p2,r2) atributi rezultata FIXED DECIMAL (p,r) sabiranje ili oduzimanje

p = 1+MAX(p1-r1, p2-r2)+r r = MAX(r1, r2) *

množenje p = p1 + p2 + 1 r = r1 + r2 * deljenje p = 15 r = 15 – ((p1-r1)+r2) *: p max = 15

Page 5: PL Za Neupucene

pravilima specificira ‘slika’ varijable. Kakva je ‘slika’ nekog podatka zavisi od toga, da li se radi o ulaznom podatku (disketa, terminal) ili o izlaznom podatku (štampač, ispis na ekranu). ULAZNE SPECIFIKACIJE PICTURE JEDNOSTAVNA SPECIFIKACIJA npr. DCL broj_dece_radnika PIC ‘99’ Svaki znak u ‘slici’ specificira jedno mesto u broju, odnosno jedan bajt u memoriji. Važeća sadržina varijable može biti bilo koja vrednost između 0 i 99. Ovakvo polje ne može da sadrži predznak ili decimalnu tačku, nego samo numeričke znakove od 0 do 9, pri čemu vodeća ‘leva’ cifra može biti i blank ali obe cifre ne smeju se popuniti blankovima. Neispravna sadržina u takvoj varijabli pojavljuje se obično zbog grešaka prilikom ukucavanja podataka i ona obavezno dovodi do grešaka kod izvođenja programa. ULAZNI PODACI SA DECIMALNIM MESTIMA Ulazni podaci su često neceli brojevi, sa jednim ili više decimalnih mesta. Kod takvih brojeva se sama decimalna tačka fizički uopšte nigde ne pojavljuje nego se jednostavno nekoliko desnih pozicija tretira kao decimalna mesta. npr. DCL plata PIC ‘99999V99’ ‘Slika’ specificira 7 mesta u broju, jer sadrži 7 devetica. Znak V označuje da se zadnja dva mesta tretiraju kao decimalna. Znak V ne specificira fizičku prisutnost decimalne tačke. Varijabla plata može da prihvati sve vrednosti između 0,00 i 99999,99. Vodeći blankovi su opet dozvoljeni. ULAZNI PODACI SA PREDZNAKOM

a) DCL temperatura PIC ‘-99V9’ - negativni predznak na skroz levom mestu temperatura može sadržati sve vrednosti između –99.9 i +99.9. Ako je vrednost pozitivna skroz levi karakter ulaznog podatka je blank, ako je negativna skroz levi karakter je -.

b) DCL temperatura PIC ‘99V9-’ temperatura može sadržati sve vrednosti između –99.9 i +99.9. Ako je vrednost pozitivna sasvim desni karakter ulaznog podatka je blank, ako je negativna skroz desni karakter je -. c) DCL temperatura PIC ‘99VR’

Znak R predstavlja numeričku poziciju u kojoj je dozvoljeno dodatno ubušenje – za negativne brojeve, a ništa za pozitivne brojeve. Ta pozicija može biti i levo.

ULAZNI NIZ b = blank VREDNOST IZRAŽENA KONSTANTAMA -999 -99.9 b999 99.9 -b18 -1.8 -018 -1.8 bbb0 0.0 1234 neispravno, levi znak mora biti – ili blank b-95 neispravno, - je dozvoljen samo skroz levo -2.5 neispravno, decimalna tačka nije dozvoljena +173 neispravno, + na levoj poziciji nije dozvoljen

ULAZNI NIZ b = blank VREDNOST IZRAŽENA KONSTANTAMA 999- -99.9 999b 99.9 b18- -1.8 018- -1.8 bb0 0.0 1234 neispravno, desni znak mora biti – ili blank -123 neispravno, - je dozvoljen samo skroz desno 2.5- neispravno, decimalna tačka nije dozvoljena +456 neispravno, predznak + nije dozvoljen 12b- neispr., blank ne sme biti na predzadnjem mestu

Page 6: PL Za Neupucene

IZLAZNE SPECIFIKACIJE PICTURE JEDNOSTVNA SPECIFIKACIJA Varijable formata PICTURE su izvanredno prikladno sredstvo za pripremu numeričkih informacija za štampanje. Normalni način korištenja izlazne specifikacije PICTURE jeste, da se takva specifikacija napiše kao sastavni deo deklaracije izlaznog područja za printer ili terminal. U najjednostavnijem slučaju specifikacija slike sadrži znakove 9 i eventualno V za indikaciju decimalnih mesta. Svaki znak 9 u specifikaciji ‘slike’ prouzrokuje štampanje jednog numeričkog znaka. Znak V se ne štampa (u nikakvom obliku). Sa naredbom izjednačenja se u ‘izlaznu’ varijablu može preneti neka numerička vrednost; kod takvog prenosa uvažava se deklarirana pozicija decimalne tačke.

DCL vrednost PIC ‘999’; ubacivanje vrednosti štampani znakovi vrednost = 7; 007 vrednost = 321; 321 vrednost = 5.37; 005 vrednost = 0.345; 000

DCL vrednost PIC ‘999V99’; ubacivanje vrednosti štampani znakovi vrednost = 7; 00700 vrednost = 321; 32100 vrednost = 5.37; 00537 vrednost = 0.345; 00034 Za štampanje numeričkih vrednosti na listu nije sasvim zadovoljavajuće ako se brojevi pojavljuju bez ikakve interpunkcije i sa vodećim nulama. PONIŠTAVANJE NULA Vodeće nule u nekom decimalnom broju su one nule, koje se nalaze na sasvim levim mestima, ispred bilo koje druge brojke. One ne menjaju ništa na vrednosti broja, koriste se samo da bi se polje varijable sasvim popunilo sa numeričkim znakovima. Ako se odštampaju vodeće nule jako loše utiču na preglednost. U PL/I postoje tri jednostavne mogućnosti za poništavanje nule.

Z – u specifikaciji ‘slike’ može se na vodećim mestima umesto znaka 9 specifirati znak Z koji se tada štampa kao blank. Desno od znaka V se poništavanje vodećih nula izvodi samo ako je vrednost varijable čista 0. * - u nekim aplikacijama zamena vodećih nula blankovima nije baš poželjna, to se može učiniti i pomoću tzv. zaštitnih zvezdica. U specifikaciji ‘slike’ može se umesto znaka Z pisati znak * (ali nikako oba u istoj specifikaciji). Y – koristi se kada želimo da poništimo i neke nule koje nisu na vodećim mestima. Znak Y se ne sme u slici pojavljivati levo od znakova Z i *. Y može nastupiti desno od znakova Z ili * na bilo kom mestu gde se normalno piše znak 9. Koristi se veoma kod ispisivanja više brojeva npr. datuma.

PICTURE VREDNOST ŠTAMPANO 99999 100 00100 ZZ999 100 bb100 ZZ999 12345 12345 ZZ999 0 bb000 ZZZZ9 305 bb305 ZZZZZ 100 bb100 ZZZZZ 0 bbbbb ZZZ99 123.45 bb123 ZZZV99 123.45 12345 ZZZV99 12345 34500 ZZZVZZ 0 bbbbb ZZZVZZ 0.05 bbb05

****9 205 **205 ****9 3 ****3 ***99 3 ***03 ***V** 0.01 ***01 ***V** 0 ***** ***V99 317 31700

ZZYYY 207 bb2b7 ZZYYY 10000 10bbb Z9Y9Y9 010775 b1b775 YYYVY9 0.08 bbbb8

Page 7: PL Za Neupucene

INTERPUNKCIJA Za interpunkciju se u specifikaciji ‘slike’ koriste znakovi: zarez ( , ), tačka ( . ), blank ( b ) i kosa crta ( / ). Za razliku od znakova 9, Z i * oni ne ukazuju na poziciju sposobnu za primanje numeričkog znaka. Oni samo određuju gde se štampa interpunkcija i kakva je interpunkcija. Znak za interpunkciju se može ponekad poništiti zajedno sa vodećim nulama. Oni se štampaju samo ako cifra neposredno levo nije

poništena 0. , - zarez se koristi za označavanje mesta na kome se štampa decimalni zarez (npr. 234,45). Zarez nema nikakvog uticaja na poravnanje odnosno na to koliko mesta u odgovarajućoj PICTURE varijabli se uzima kao decimalna mesta. Jedino se znakom V može odrediti poravnanje. I u slučaju da koristimo interpunkciju važi pravilo da desno od znaka V nema poništavanja vodećih nula, ali nema ni poništavanja znakova interpunkcije (izuzetak je opet primer

kada je vrednost varijable čista 0). . – pored zareza se može za interpunkciju primeniti tačka, koja se u specifikaciji slike može ubaciti na proizvoljno mesto. Za tačku važe ista pravila kao i za zarez samo se ovaj put štampa tačka. / - interpunkcija sa kosom crtom vrši se po istim pravilima kao interpunkcija sa zarezom ili tačkom . Na odgovarajućem mestu se u specifikaciji ‘slike’ ubaci znak /, koji se na tom mestu i štampa, ako nije poništen skupa sa vodećim nulama. Glavna primena / je kod formatiziranja datuma DDMMGG. B – ovaj znak u specifikaciji znači bezuslovno štampanje blanka na odgovarajućem mestu. Kod toga nije važno da li se izvodi zamena vodećih nula zvezdicama, B će se

svakako štampati kao blank. NEGATIVNI PREDZNAK ponekad se desi da je potrebno odštampati neku negativnu vrednost. Uobičajeno je da se negativni brojevi označavaju sa znakom minus bilo levo bilo desno od samog broja.

a) fiksni predznak minus se specificira kao dodatni znak sasvim levo ili sasvim desno u ‘slici’ . On se štampa ako je vrednost varijable negativna, a inače se štampa blank. Fiksni predznak na desnoj strani je nekako prikladniji nego na levoj gde se između predznaka i broja eventualno mogu pojaviti blankovi i zvezdice. b) klizni predznak minus je povoljnije rešenje ako želimo da se on štampa levo. Klizni predznak – specificira se u slici tako da ga napišemo kao poseban znak sasvim levo, a sem tog sve znakove Z zamenimo sa znakom -. Sa time se istovremeno postigne poništavanje vodećih nula i štampanje predznaka –

neposredno ispred prve značajne cifre (ako je vrednost štampane PICTURE varijable negativna). kod aplikacija gde je potrebna zaštita sa * to ne dolazi u obzir nego verovatno samo fiksni predznak desno.

PICTURE VREDNOST ŠTAMPANO 999,9 1234 123,4 999V,99 1234 234,00 ZZZ9V,99 34.56 bb34,56 ZZZV,ZZ 0.05 bbb,05 ZZZ,VZZ 0.05 bbb05 ZZZV,ZZ 0 bbbbbb **9V,99 12.5 *12,50 **9,99V9 20315,333 203,153

PICTURE VREDNOST ŠTAMPANO Z.ZZ9V,99 1234.56 1.234,56 Z.ZZ9V,99 43.215 bbb43,21 Z,ZZ9V,99 0 bbbb0,00 Z.ZZZ.ZZ9V,99 1.23 bbbbbbbb1,23 Z.ZZZ.ZZ9V,99 1234567.89 1.234.567,89 *.***.**9V,99 21.21 *******21,21 ZZ.ZZ.ZZ 0 bbbbbbbb Z9,Y9,99 120775 12.b7.75 **,**,** 0 ******** Z9/Y9/99 121175 12/11/75 Z9/Y9/99 030675 3/ 6/75 99b99b99 123456 12b34b56 9bb9bb9 123 1bb2bb3

PICTURE VREDNOST ŠTAMPANI ZNAKOVI -999V,99 -23.35 -023,35 -ZZ9V,99 3.77 bbb3,77 -**9V,99 -12.20 -*12,20 ZZ9V,99- -12.12 b12,12- *.**9V,99- 2.22 ****2,22b *.**9V,99- -2.22 ****2,22- Z.ZZ9V,99- -12.22 bbb12,22-

PICTURE VREDNOST ŠTAMPANI ZNAKOVI --,--9V,99 -12.73 bbb-12,73 --,--9V,99 2.22 bbbbb2,22 --,--9V,99 -0.15 bbbb-0,15 --,--9V,99 -3210.01 -3.210,01 --,--9V,99 -15210.55 15.210,55 premalo mesta

Page 8: PL Za Neupucene

MANIPULACIJA FORMATA PICTURE PICTURE VARIJABLE U ARITMETIČKOM KONTEKSTU Ako je varijabla formata PICTURE upotrebljena u aritmetičkom izrazu ili se naredbom izjednačenja jednostavno prenosi u neku numeričku varijablu, onda će ona svakako biti tretirana kao numerička varijabla. Znak V u specifikaciji ‘slike’ određuje mesto decimalne tačke, a ako takvog znaka nema varijabla se tretira kao ceo broj. Uvažava se i eventualni predznak. Znakovi za interpunkciju se u takvom kontekstu ignorišu. Ako se varijabla formata PICTURE pojavljuje u aritmetičkom izrazu njena se sadržina prilikom izjednačavanja izraza uvek konvertuje u formatu DECIMAL FIXED (p,r). Kod toga je ‘p’ jednak broju numeričkih pozicija u PICTURE varijabli, a ‘r’ je jednak broju numeričkih pozicija desno od znaka V. Konstante su formata DECIMAL FIXED (1). npr. DCL količina PIC ‘9999’; cena PIC ‘99999V99’; DCL vrednost FIXED(11,2); vrednost = količina * cena; npr. DCL broj1 FIXED(7,2); DCL broj2 PIC ‘-999V99’; DCL broj3 PIC ‘ZZZ9’; DCL broj4 FIXED(11,2); broj1 = broj2; /*broj2 prelazi u format decimal fixed i prenosi se u broj1*/

broj1 = broj3 – broj2; /*broj2 i broj3 prelaze u df(5,2) i df(4), respektivno, posle čega se izracunava vrednost izraza i ona se prenosi u broj1*/

broj4 = broj1 * broj3; broj4 = broj2 / 3; PICTURE VARIJABLE U CHARACTER KONTEKSTU Varijabla formata PICTURE se u character kontekstu tretira jednostavno kao niz znakova tipa CHARACTER. PICTURE varijablu je npr. dozvoljeno izjednačavati sa ciljnom CHARACTER varijablom (obrnuto ne važi) ili upotrebiti kao operand u operaciji povezivanja nizova. npr. DCL str PIC ‘ZZ9’, datum PIC ‘Z9/Y9/Y9’; DCL redak CHAR(100); DCL picvar PIC ‘**.**9V,99-‘, chvar CHAR(16); CHVAR = PICVAR; /*posto je chvar duži od picvar ostalo se puni blankovima*/ redak = ‘radovljica’ IIdatum II(50)’’ II’str.’ IIstr;

STRUKTURE

JEDNOSTAVNE STRUKTURE Slogovi podataka u nekoj datoteci su praktično uvek sastavljeni od više elemenata, oni su struktuirani. Naprimer slog u matičnoj datoteci artikala sadrži sledeće podatke: šifra artikla, opis artikla, raspoloživa količina, jedinična cena. Ako bi želeli programirati obradu takvog sloga u PL/I, potrebno je pre svega deklarisati varijablu u koju se može u datom momentu učitati slog iz date datoteke. npr. DCL artikli FILE... DCL slog_artikla CHAR(40); ........................... READ FILE(artikli) INTO(slog_artikla);

Page 9: PL Za Neupucene

Varijabla slog_artikla je tačno toliko velika da u celini prihvati jedan slog. Međutim dalje od čitanja ovog sloga se ne može učiniti jer ne možemo da pristupimo elementima sloga (šifra artikla, opis artikla, raspoloživa količina, jedinična cena). Rešenje predstavlja tzv. struktura, posebna struktura podataka. npr. DCL 1 slog_artikla, 2 šifra_artikla PIC ‘99999999’, 2 opis_artikla CHAR(24), 2 količina FIXED(7), 2 jedin_cena FIXED(7,2); Ovakvom deklaracijom odredimo:

a) Simboličko ime kompletne strukture, ispred koga mora stajati indikator 1, tzv. glavnu strukturu. b) simbolička imena i atribute pojedinih elemenata, ispred kojih stoje indikatori nivoa podele 2. c) raspored elemenata unutar strukture

Pored simboličkog imena glavne strukture su atributi formata nedozvoljeni. Ime glavne strukture ima implicitno određenu dužinu, koja je jednaka sumi dužina pojedinih elemenata. KVALIFIKACIJA IMENA U programskoj proceduri PL/I programa moraju biti obavezno sva simbolička imena potpuno jednoznačna. To znači da svaka ‘elementarna’ varijabla u proceduri mora imati svoje jedinstveno specifično ime. Kod struktura dozvoljena je upotreba istih imena elemenata u dve različite strukture. npr. DCL 1 slog, 2 šifra_artikla PIC ‘99999999’, 2 opis_artikla CHAR(24), 2 količina FIXED(7), 2 cena FIXED(7,2);

DCL 1 redak, 2 šifra_artikla PIC ‘99999999’, 2 prazno CHAR(6), 2 opis_artikla CHAR(30), 2 vrednost PIC ‘ZZZ.ZZZ.ZZZ.ZZ9V,99’

redak.šifra_artikla = slog.šifra_artikla; /*ovako se radi kada imamo isto ime u dve strukture*/ redak.opis_artikla = slog.opis_artikla; vrednost = količina * cena;

PROGRAMIRANJE IZLAZA I ULAZA (RECORD – MOVE)

DEKLARACIJA DATOTEKE Oblik deklaracije datoteke je: DECLARE ime_datoteke atributi; Atributi datoteke Pl/I pmpgućava nekoliko različitih načina programiranja ulaza i izlaza, tj. prenosa podataka iz eksterne memorije u centralnu memoriju i obrnuto. To su: RECORD MOVE, RECORD LOCATE i STREAM. Datoteka predstavlja eksternu kolekciju podataka. podaci u datoteci su organizovani u slogove, slogovi u blokove koji se mogu organizovati na razne načine: sekvencijalno, indeks-sekvencijalno...Tipičan aplikacioni program obrađuje datoteke slog po slog. Datoteka se deklariše na jedan specifičan način, sa nizom atributa koji opisuju obrađivanu datoteku i način na koji se ona obrađuje. Opcijama specificiranim u atributu ENVIRONMENT, će uvek biti ‘pregažene’ ekvivalentne opcije, koje su za istu datoteku navedene sa naredbama Job Controla. Određeni atributi specifiraju se proizvoljnim redosledom iza imena datoteke u odgovarajućoj naredbi DECLARE. Atributi se retko moraju specifirati u celini, jer se neki jednostavno automatski predpostave, a neki su implicirani sa drugim već napisanim.

Page 10: PL Za Neupucene

ATRIBUTI SKRAĆ. IMPLICIRA

FILE označava deklarirano simboličko ime kao ime datoteke STREAM FILE za obradu će biti upotrbljen tzv. stream način RECORD FILE za obradu će biti upotrebljen tzv. record način tj. datoteka

će biti obrađivana slog po slog INPUT FILE ovim atributom se deklariše čista ulazna datoteka, slogovi

se jedino mogu čitati OUTPUT FILE ovim atributom se deklariše čista izlazna datoteka, slogovi

se jedino mogu pisati UPDATE FILE

RECORD deklariše datoteku kod koje je dozvoljeno čitanje i pisanje slogova. Kod sekvencijalnog pristupa se za čitanje koristi naredba READ, a za pisanje REWRITE

SEQUENTIAL SEQL FILE RECORD

pristup slogovima će biti na sekvencijalni način

DIRECT FILE RECORD

pristup slogovima će biti na direktan način. Ovaj način nije moguć kod datoteka sa sekvencijalnom organizacijom

BUFFERED BUF FILE RECORD

koriste se posebna polja u programu tzv. bufferi, u koja se mogu smestiti fizički slogovi; idealno za sekvencijalno obrađivanje.

UNBUFFERED UNBUF FILE RECORD

bufferi se neće koristiti osim kada su neophodno potrebni

ENVIRONMENT ENV FILE specificira osobine datoteke koju treba obraditi. Iza reči ENVIRONMENT se između zagrada može navesti ceo niz opcija (redosled proizvoljan) koje moraju biti međusobno odvojene blankovima i zavise od upotrebljenog oper. sistema (DOS ili OS)

ENVIRONMENT za DOS ENVIRONMENT za OS

MEDIUM (simboli čka_adresa, fizička_jedinica)-specificira simboličku adresu datoteke i vrstu fizičke jedinice na kojoj se datoteka nalazi. Ova opcija je obavezna za svaku deklaraciju datoteke. Simbolička adresa ima oblik SYSxxx, a xxx može biti:

a) ITP sistemska ulazna jedinica (čitač kart.) b) LST sistemska izlazna jedinica (printer) c) PCH sistemska izlazna jedinica (bušač kart.) d) 000-221 za datoteke na bilo kom mediju

fizička jedinica je oznaka mašine npr. printer IBM 1403 ima za fizičku jedinicu broj 1403

U ovom operativnom sistemu nije neophodno sa opcijama atributa ENVIRONMENT u celini specificirati osobine odgovarajuće datoteke. Jedina opcija koja se obavezno specificira je ona, koja opisuje organizaciju datoteke, međutim, u slučaju sekvencijalne organizacije ni to nije obavezno, jer se automatski pretpostavi. To znači da možemo kod primene OS-a specifikaciju atributa ENVIRONMENT eventualno u celini izostaviti.

F – označava da odgovarajuća datoteka sadrži isključivo neblokirane slogove fiksne dužine

F – isto kao za DOS

FB - označava da odgovarajuća datoteka sadrži blokirane slogove fiksne dužine

FB - isto kao za DOS

CONSECUTIVE – označava datoteku sa sekvencijalnom organizacijom slogova. Ovo je podrazumevana opcija za ENVIRONMENT, tj. ako ne specificiramo eksplicitno kakva je organizacija datoteke smatra se CONSECUTIVE.

CONSECUTIVE - isto kao za DOS

RECSIZE (n) – definiše dužinu logičkog sloga koja iznosi ‘n’ bajtova. Varijable u U/I naredbama za odgovarajuću datoteku moraju biti jednake dužine.

RECSIZE (n) - isto kao za DOS

BLKSIZE (n) – potrebna je ako je specificiran format slogova kao FB. Ovom opcijom se navodi dužina celog bloka, koja mora biti mnogokratnik dužine logičkog sloga.

BLKSIZE (n) - isto kao za DOS

BUFFERS (n) – odabira broj buffera za određenu datoteku, koja u tom slučaju treba biti deklarirana kao BUFFERED. Postoje dve mogućnosti: BUFFERS (1) i BUFFERS (2)(podrazumevano).

BUFFERS (n) - isto kao za DOS

CTLASA – kada želimo programirati kontrolu proreda kod štampanja

CTLASA - isto kao za DOS

Page 11: PL Za Neupucene

VRSTA GRUPA

ALTERNATIVNI ATRIBUTI

PRETPOSTAVLJENI ATRIBUTI

Modus STREAM RECORD STREAM Funkcija INPUT OUTPUT

UPDATE INPUT

Bufferi BUFFERED UNBUFFERED

BUFFERED

Pristup SEQUENTIAL DIRECT

SEQUENTIAL

ULAZNO –IZLAZNE NAREDBE

NAREDBA READ Slogovi na spoljasnjim datotekama se učitavaju jedan po jedan, tj. sekvencijalno (slog se učita, obradi, zatim se učita sledeći slog itd...). Naredba READ prouzrokuje prenos jednog logičkog sloga u neku varijablu unutar glavne memorije, tj. programa. Slogovi u sekvencijalnoj datoteci mogu biti neblokirani (logički slog = fizički slog) ili blokirani (fizički slog = n*logički slog). Naredba READ se koristi u svakom slučaju za učitavanje jednog logičkog sloga. READ FILE(ime_datoteke) INTO(ime_varijable); Ključna reč READ mora biti prva reč u naredbi, a opcije FILE i INTO mogu se specificirati u proizvoljnom redosledu. Varijabla u opciji INTO je varijabla u koju se učitava logički slog. Ona može biti proizvoljnog formata pod uslovom da se njena dužina sasvim tačno podudara sa dužinom logičkog sloga(RECSIZE). NAREDBA WRITE Prouzrokuje prenos jednog logičkog sloga iz neke varijable u programa na eksterni medijum. WRITE FILE(ime_datoteke) FROM(ime_varijable); Ključna reč WRITE mora biti prva u naredbi, a redosled FILE i FROM može biti proizvoljan. varijabla u opciji FROM je varijabla iz koje se izpiše logički slog. Ona može biti proizvoljnog formata pod uslovom da se njena dužina sasvim tačno podudara sa dužinom sloga za pripadajuću datoteku (RECSIZE).

DCL lista FILE RECORD OUTPUT DCL traka FILE RECORD INPUT ENV(F RECSIZE(55) MEDIUM(SYSLST,1403)); ENV(FB RECSIZE(80) BLKSIZE(400)

MEDIUM(SYS011, 2400); DCL redak CHAR(55); DCL slog CHAR(80); DCL 1 izlaz, DCL 1 slog1, 2 brart PIC ‘999999’, 2 a1 PIC ‘9’, 2 prazno CHAR(5), 2 a2 PIC ‘99V9’, 2 naziv CHAR(35), 2 a3 CHAR(5), 2 količina PIC ‘ZZ.ZZ9V,ZZ’; 2 a4 PIC ‘999999’, 2 a5 CHAR(65);

WRITE FILE(lista) FROM(redak); READ FILE(traka) INTO(slog); /* ILI */ /* ILI */

WRITE FILE(lista) FROM(izlaz); READ FILE(traka) INTO(slog1); /* ILI */ /* ILI */

WRITE FROM(redak) FILE(redak); READ INTO(slog) FILE(traka); NAREDBA REWRITE Koristi se za podatke smeštene na disku, izmenjeni podatak se smešta na svoje originalno mesto. Naredbi REWRITE mora da prethodi naredba READ za istu datoteku. REWRITE FILE(ime_datoteke) FROM(ime_datoteke);

ATRIBUTI IMPLICIRA UPDATE RECORD SEQUENTIAL RECORD DIRECT RECORD BUFFERED RECORD SEQUENTIAL UNBUFFERED RECORD SEQUENTIAL

Page 12: PL Za Neupucene

OTVARANJE I ZATVARANJE DATOTEKA NAREDBA OPEN Da bi se pomoću datoteke, koja je deklarisana u PL/I programu mogle obrađivati datoteke na eksternim memorijama potrebno je najpre otvoriti obe datoteke i internu i eksternu. Kada se u PL/I neka datoteka otvori ona se u stvari poveže sa odgovarajućom eksternom datotekom. Takvo otvaranje je potrebno za INPUT, OUTPUT i UPDATE datoteke i programira se posebnom naredbom OPEN. OPEN FILE(ime_datoteke), FILE(ime_datoteke).........; Nakon uspešno izvedene naredbe OPEN je odgovarajuća datoteka u vezi sa eksternim medijem. Kod sekvencijalnih datoteka je kod otvaranja izvršeno i pozicioniranje na početak datoteke (prvi logički slog). NAREDBA CLOSE Eksterna datoteka se ovom naredbom ‘oslobodi’, veza sa datotekom se prekida i data set je raspoloživ za neku drugu obradu. CLOSE FILE(ime_datoteke), FILE(ime_datoteke).............; Neka datoteka može se posle zatvaranja u istom programu ponovo otvoriti, što je ponekad korisno. Za ovu svrhu se koristi prošireni oblik naredbe OPEN koji je primenjiv za datoteke sa atributom UNBUFFERED: OPEN FILE(ime_datoteke) atribut; U naredbi OPEN mogu se specificirati atributi funkcija INPUT i OUTPUT, ako taj u deklaraciji datoteke nije naveden. npr. DCL traka RECORD UNBUFFERED ENV MEDIUM(SYS015,2400) FB RECSIZE(100) BLKSIZE(1000); OPEN FILE(traka) OUTPUT; -datoteka traka će posle otvaranja imati sledeće atribute: deklarirani RECORD, ENVIRONMENT, UNBUFFERED; dodani atribut OUTPUT; implicirani atribut FILE; pretpostavljeni atribut SEQUENTIAL Ako želimo da se u nekom programu kreirana datoteka i pročita potrebno je datoteku najpre otvoriti kao OUTPUT, ispisati sve slogove, datoteku zatvoriti, datoteku ponovo otvoriti ali kao INPUT, čitati slogove i na kraju datoteku ponovo zatvoriti. npr. DCL datot FILE RECORD UNBUFFERED ENV (MEDIUM(SYS012,3330) F RECSIZE(700)); OPEN FILE(datot) OUTPUT; /* WRITE operacija*/ CLOSE FILE(datot); OPEN FILE(datot) INPUT; /* READ operacija*/ CLOSE FILE(datot); -kod svakog otvaranja izvrši se pozicioniranje na početak datoteke, tako da se i pisanje i čitanje izvodi od prvog sloga.

KONTROLNI ZNAKOVI ASA ZNAK ZNAČENJE b pomak za jedan red pre štampanja 0 pomak za dva reda pre štampanja - pomak za tri reda pre štampanja + štampanje bez pomaka 1 skok na kanal 1 pre štampanja 2 skok na kanal 2 pre štampanja 3 skok na kanal 3 pre štampanja 4 skok na kanal 4 pre štampanja 5 skok na kanal 5 pre štampanja 6 skok na kanal 6 pre štampanja 7 skok na kanal 7 pre štampanja 8 skok na kanal 8 pre štampanja 9 skok na kanal 9 pre štampanja A skok na kanal 10 pre štampanja B skok na kanal 11 pre štampanja C skok na kanal 12 pre štampanja

Page 13: PL Za Neupucene

OTKRIVANJE KRAJA DATOTEKE

EOF slog – end of file slog – slog koji se piše iz zadnjeg ‘pravog’ sloga datoteke i označava kraj datoteke. Naredba ON ENDFILE ON ENDFILE(ime_datoteke) akcija; tumačenje: na kraju datoteke ime_datoteke izvrši akciju akcija (najčešće naredba izjednačenja). Kod svakog izvođenja naredbe READ ispita se automatski da li je učitani slog pravi slog podataka ili možda EOF slog. Ako je EOF slog tada komandu preuzima naredba ON ENDFILE. Ova naredba se najčešće stavlja neposredno ispred ili iza naredbe OPEN tj. kontrola mora jednom da prođe kroz naredbu ON ENDFILE pre nego što se izvede prva naredba READ za istu datoteku. KONTROLA PROREDA NA PRINTERU Za ovu svrhu se koristi kontrolni znak ASA. Pre svega treba pravilno deklarirati datoteku – unutar liste opcija za ENVIRONMENT mora stojati i opcija CTLASA . DCL lista FILE RECORD OUTPUT ENV(F RECSIZE(51) MEDIUM(SYSLST,1403 CTLASA); Deklarirati treba i varijablu iz koje se sa naredbom WRITE ispisuje jedan redak. Prvi bajt te varijable se neće štampati nego se u njemu pomoću odgovarajućeg kontrolnog znaka specificira odgovarajući prored. DCL lis RECORD OUTPUT ENV(F RECSIZE (6) MEDIUM (SYSLST,1403) CTLASA); DCL RED CHAR (6); RED = ‘1XXXXX’; WRITE FILE(LIS) FROM(RED); RED = ‘-YYYYY’; WRITE FILE(LIS) FROM(RED); RED = ‘bZZZZZ’; WRITE FILE(LIS) FROM(RED); Takav način programiranja primeni se praktično u svakom programu u kome se pojavljuje štampana lista. Bez kontrolnog znaka moguće je štampati samo sa proredom 1 pre štampanja, bez prekidanja (i preko više stranica, ako ima dovoljno podataka).

OSNOVNE LOGIČKE STRUKTURE

SEKVENCA Sekvenca naredbi je osnovna logička struktura u praktično svakom programu za elektronski računar, ali naravno ne i jedina. Izvršne naredbe se izvode tačno po redosledu po kom su napisane. OSNOVNI OBLIK ITERACIJE Ako u PL/I treba izraziti zahtev za višestrukim izvođenjem neke određene sekvence tada specificiramo tzv. iterativnu DO grupu. Početak iterativne grupe izvršnih naredbi specificira se posebnom iterativnom naredbom DO koja se može pisati u nekoliko različitih formata. Kraj iterativne grupe izvršnih naredbi označava se naredbom END. Koliko puta se izvodi iterativna grupa naredbi to zavisi od opcija specificiranih u DO naredbi. Jako primenjiv oblik naredbe DO je sledeći: DO WHILE (izraz); sekvenca naredbi; END;

rezultat: XXXXX ...........................1. redak ...........................3. redak ...........................4. redak YYYYY............................5. redak ZZZZZ .............................6. redak

Page 14: PL Za Neupucene

‘Izraz’ u opciji WHILE specificira uslov koji mora biti ispunjen da bi se izvela sekvenca naredbi. Dok god je taj uslov ispunjen ponavlja se sekvenca naredbi, a čim uslov nije ispunjen DO grupa se napušta i prelazi se na izvršenje prve naredbe iza odgovarajuće naredbe END.

RELACIJSKI IZRAZI

UPOREĐIVANJE Izraz koji se pojavljuje u opciji WHILE je tzv. relacijski izraz. Ta vrsta izraza se koristi i za programiranje programske selekcije sa IF naredbom. U najjednostavnijem slučaju se u relacijskom izrazu upoređuju dva operanda. Za izražavanje usporedbe koriste se relacijski operatori. Operandi u relacijskim izrazima mogu biti proizvoljnog formata. Normalno je da upoređujemo operande jednakog formata. Ukoliko to nije ispunjeno pre samog upoređivanja se automatski izvede odgovarajuća konverzija.

a) operandi formata CHARACTER: kraći niz se desno dopunjuje blankovima. Rezultat upoređivanja je jednako ili nejednako. Ako promenljiva sadrži samo blankove tada je ona jednaka sa ‘b’.

b) numerički operandi: ako je barem jedan operand numerički tada se svi pretvaraju u numerički format

Često se dešava da se operand formata PICTURE upoređuje sa operandom formata DECIMAL FIXED. U tom slučaju se izvrši konverzija iz PICTURE formata u format DECIMAL FIXED kod čega se preciznost određuje sa specifikacijom ‘slike’. Kod upoređivanja numeričkih operanda uvažava se naravno i predznak i deklarirana pozicija decimalne tačke. Smisleni su svi relacijski operatori. Negativni broj je uvek manji od pozitivnog bez obzira na apsolutnu vrednost. Operandi u relacijskim izrazima mogu biti izraženi kao konstante ili kao varijable. USLOVI SA LOGIČKIM OPERATORIMA Ponekad se uslov ne može izraziti u vidu jednostavne komparacije, jer je u stvari sastavljen iz više poduslova. Za izražavanje složenih uslova možemo koristiti i tzv. logičke operatore. Po prioritetu operatora prvo se izvode računski operatori (**, prefiksi +,-,¬), zatim (*, /), zatim (+, -), zatim (), zatim operatori upoređivanja, zatim &, zatim . Hijerarhija operatora dolazi do izražaja pre svega u primerima kada upoređujemo numeričke operatore koji nisu jednostavne varijable ili konstante, nego aritmetički izrazi. Naravno upotreba zagrada je dozvoljena.

SELEKCIJA

JEDNOSTAVNA IF NAREDBA IF uslov THEN klauzula_then; ELSE klauzula_else; Klauzula_then i klauzula_else mogu se programirati u dva različita oblika.

1) Jednostavna izvršna naredba: klauzula mora biti jedna jedina naredba IF A = B THEN C = C + 1; ELSE D = D + 1; --- nikako se ne mogu programirati više uzastopnih naredbi u klauzulama već samo jedna.

operator 60C značenje operator 48C = jednako = < manje od LT > veće od GT <= manje ili jednako LE >= veće ili jednako GE ¬= nije jednako NE ¬< nije manje od NL ¬> nije veće od NG

logički operator 60C

značenje logički operator 48C

& i AND ili OR ¬ ne NOT

Page 15: PL Za Neupucene

2) Jednostavna DO grupa naredbi Kada se klauzula_then ili klauzula_else ne mogu izraziti sa jednom izvršnom naredbom nego sa više njih, onda se takva grupa naredbi mora posebno označiti. Početak grupe označava naredba DO; a završetak označava naredba END;.

IF (uslov) THEN DO; ------------- ------------- END; ELSE DO; -------------

-------------- END;

Dozvoljeno je da DO grupa sadrži DO grupu (do dubine 49) ili čak više njih. Kod jednostavne IF naredbe logička struktura uvek ima jedan početak i jedan završetak. KOMPLEKSNA IF NAREDBA Vrlo često programske odluke i nisu tako jednostavne da bi se mogle programirati jednostavnom IF naredbom.

IF X > Y THEN DO; IF X = Z THEN DO; IF Z < P THEN X = 5; ELSE X = 6; END; ELSE; END; ELSE X = 4; Z = X;

IF X > Y THEN IF X = Z THEN IF Z < P THEN X = 5; ELSE X = 6; ELSE; ELSE X = 4; Z = X;

ITERACIJA

ITERATIVNA DO GRUPA Jedan od temelja logike svakog programa je sigurno iteracija. U svakom programskom jeziku moraju postojati adekvatni načini za izražavanje zahteva po ponavljanju ili ‘iteraciji’. Iteracija se u PL/I uvek izražava pomoću iterativne DO grupe naredbi čiji je osnovni oblik: DO WHILE (uslov); naredba_1; naredba_2; naredba_n; END; Uslov za ponavljanje DO grupe može se izraziti i na nekoliko drugih načina, a ne samo opcijom WHILE. Zaviseći od vrste problema koga rešavamo iterativnim pristupom upotrebićemo najadekvatniji format iterativne DO naredbe.

a) DO varijabla = izraz_1 TO izraz_2; -----------------------------------; END; DO index = 1 TO 150; DO vrednost = I+10 TO 2*J;

Page 16: PL Za Neupucene

‘uradi grupu za svaku vrednost ‘varijable’ od vrednosti definisane sa ‘izraz_1’ do vrednosti definisane sa ‘izraz_2’. takvu varijablu koja nastupa u DO naredbi nazivamo i ‘indeksna varijabla’. U praksi je indeksna varijabla uvek formata DECIMAL FIXED ili BINARY FIXED. ‘izraz_1’ i ‘izraz_2’ moraju biti elementarni izrazi koji kao rezultat daju ceo broj, koji se može konvertovati u format indeksne varijable. Do grupa se izvodi samo u slučaju ako je izraz_2 ¬< izraz_1. b) DO varijabla = izraz_1 TO izraz_2 by izraz_3; -----------------------------------; END; Na ovaj način možemo odrediti korak. Korak može biti negativan i pozitivan. Kod negativnog koraka DO grupa se izvodi samo ako izraz_2 ¬> izraz_1 i to sve dok vrednost indeksne varijable ne postane manja od vrednosti izraz_2. c) DO varijabla = izraz_1 TO izraz_2 by izraz_3 WHILE (uslov); -----------------------------------; END; Ovde postoje dva uslova za izvođenje DO grupe koji stoje u međusobnom ‘i’ odnosu. Prvi uslov je da se indeksna varijabla kreće u definisanom intervalu, a drugi uslov je definisan sa opcijom WHILE. Čim jedan od oba uslova nije ispunjen iteracija se prekida.

Opšte osobine oblika iterativne DO grupe:

1) iterativna grupa ima jedan početak i jedan završetak 2) DO naredbom se uvek definiše uslov pod kojim se iteracije izvode. Uslovi se testiraju pre svakog

izvođenja DO grupe. Čim uslovi nisu ispunjeni, kontrola se predaje prvoj naredbi iza END naredbe koja označava kraj grupe.

VIŠESTRUKE ITERACIJE DO WHILE (uslov_1); ---naredbe_1---; DO WHILE (uslov_2); ---naredbe_2---; DO WHILE (uslov_3); ---naredbe_3---; END; END; END; DO WHILE grupa funkcioniše na svim nivoima na jednak način:

1) pre nego što se grupa aktivira izvrše se pripremne operacije. Uvek je pre aktiviranja grupe pročitan i prvi slog iz grupe jer se inače ne bi znalo da je u celini završena prethodna grupa. Iz prvog sloga se zapamti šifra započete grupe i to u nekom pomoćnom polju.

2) kada se grupa završi (jer više nisu ispunjeni svi uslovi specificirani sa opcijom WHILE) kontrola pređe na prvu naredbu iza END naredbe završene grupe.

SKUPOVI, BINARNI PODACI

OBRADA SKUPOVA

JEDNODIMENZIONALNI SKUP – NIZ Skup je kolekcija elemenata sa identičnim atributima. Moguće je deklarisati skup identičnih nizova (CHARACTER), skup identičnih numeričkih varijabli ili čak skup identičnih struktura. Skup mora biti deklarisan eksplicitno. Sa deklaracijom se najpre specificira zajedničko ime, iza toga u zagradama koliko

Page 17: PL Za Neupucene

elemenata je sadržano u skupu, a na kraju atribute, koji važe za svaki elemenat skupa. Podatak o broju elemenata u skupu zove se i ‘dimenzija’ skupa. npr. DCL tab(100) CHAR(5); DCL tarife(50) FIXED(7, 2); DCL tabela_kodova(15) PIC ‘9’; DCL 1 tabela(200), 2 šifra CHAR(5), 2 iznos FIXED(9,2); Elementi skupa se adresiraju pomoću zajedničkog imena skupa i indeksa. Indeks može biti izražen konstantom, varijablom ili čak izrazom, bitno je da se kod evaluacije indeksa dobija ceo broj. Ako se kod evaluacije indeksa na dobija ceo broj, onda se frakcioni deo odseče, odnosno ignoriše. Ako se dimenzija specificira sa jednim brojem onda je taj broj gornja granica dimenzije, a donja granica je broj 1. Indeks može logički biti bilo koji ceo broj između i uključujući donju i gornju granicu. Ponekad je zgodno, ako donja granica nije 1. PL/I dozvoljava da se eksplicitno navede i donja granica dimenzija. npr. DCL starost(5 : 75) FIXED(3); Specificirane vrednosti za granice se mogu kretati od –32768 do +32767. Gornja granica naravno mora biti veća od donje granice. Dimenzija se izračunava kao: dimenzija = gornja_granica – donja_granica + 1 VIŠEDIMENZIONALNI SKUP Pl/I dozvoljava deklaraciju i obradu višedimenzionalnih skupova. Maksimalno dozvoljeni broj dimenzija je 15. Ako se deklariše višedimenzionalni skup onda se granice za pojedine elemente navode razdvojene sa zarezima, ali opet u zajedničkom paru zagrada iza simboličkog imena skupa. npr. DCL prodaja(7,4) FIXED(11,2); /* dvodimenzionalni skup */ DCL prostor(10,10,10) FIXED(2); /* trodimenzionalni skup */ Elemenat višedimenzionalnog skupa isto se adresira sa imenom skupa, a pored imena skupa se mora specificirati toliko indeksa koliko dimenzija ima skup. primer: deklarisati tabelu u kojoj se za četiri firme memoriše mesečni saldo od 1971 do 1975 god. npr. DCL dohodak (4,1971 : 1975,12);

1. dimenzija: 4-1+1= 4 firme 2. dimenzija: 1975-1971 = 5 godina 3. dimenzija: 12-1+1 = 12 meseci

Ukupan broj elemenata u skupu se izračunava kao proizvod svih dimenzija. Indeksi dimenzija mogu biti i varijable. SKUP STRUKTURA PL/I dozvoljava raznovrsne kombinacije struktura i skupova (skup se može pojaviti kao elemenat strukture, a može biti i struktura elemenat skupa). DCL 1 cenovnik(40), 2 naziv CHAR(20), 2 cena FIXED(5,2); adresiranje: cenovnik(k)

DCL 1 prodaja(10,12), 2 crnobeli FIXED(3), 2 kolor FIXED(3); adresiranje:kolor(7,11), prodaja(7,11). kolor, prodaja. kolor(7,11)

Page 18: PL Za Neupucene

PRETRAŽIVANJE SKUPA Kod nekih skupova postoji direktna korespondencija između pozicije nekog elementa i njegove sadržine. dok kod nekih to nije slučaj. Tada se pretraživanje obavlja pomoću pomoćnih promenljivih čiji se sadržaj upoređuje sa sadržajem svakog pretraživanog elementa. DCL 1 cene(1000), 2 šifrart PIC ’99999’, 2 cenart FIXED(7,2); DCL šifra PIC ‘99999’, cena FIXED(7,2); DCL nađeno FIXED(1) /* 0 ili 1 */ nađeno = 0; DO I = 1 to N WHILE(nađeno = 0)

IF šifra = šifrart(I) THEN DO; nađeno = 1; cena = cenart(I); END; ELSE; END;

SORTIRANJE Ako skup sadrži mnogo elemenata, zbog boljeg pretraživanja, poželjno je da je skup sortiran po argumentu. Ovo je još potrebnije ako skup hoćemo da štampamo u sortiranom redosledu. DCL 1 cene(1000), 2 šifart PIC ‘99999’, 2 cenart FIXED(7,2); DCL 1 pomoćna_struktura, 2 š PIC ‘99999’, 2 c FIXED(7,2); DO I = 1 TO N-1; DO J = I+1 TO N; IF šifart(I)>šifart(J)

THEN DO; /*zamena elemenata*/ pomoćna_struktura = cene(I); cene(I) = cene(J); cene(J) = pomoćna_struktura; END; ELSE; END; END;

Ovakav postupak sortiranja nije najbrži, ali je jednostavan. NAREDBA IZJEDNAČENJA ZA SKUPOVE Ponekad je potrebno da se sa svim elementima skupa izvrši ista operacija. U ovu svrhu se najčešće koristi naredba izjednačenja za skup. Ona ima dva osnovna oblika:

a) ime_skupa = elementarni_izraz; b) ime_skupa = izraz_sa_skupovima; Izraz_sa_skupovima je izraz u kome je bar jedan operand ime nekog skupa. npr. DCL tab(3,10) FIXED(5,2); DCL tab(-1:1,10) FIXED(5,2); DCL taby(100) BIN FIXED(15); DCL tabz(100) FIXED(7); DCL (X,Y) FIXED(3); tab = 0; /*svi elementi skupa tab postaju 0*/ tab = (3*X) – Y; /*svi elementi skupa tab poprimaju vrednost izraza (3*X) – Y */ tab = tab * 2; /*svi elementi skupa tab se množe sa 2*/ taby = tabz; /*izjednačavaju se dva skupa istih dimenzija, donjih i gornjih granica, uz konverziju*/ tabx = tab; /*ovo nije dozvoljeno, nisu iste granice*/

Page 19: PL Za Neupucene

INICIJALIZACIJA

INICIJALIZACIJA ELMENT, VARIJABLI Sa deklaracijom je varijabli određeno mesto i format, ali ne i početna sadržina. Nekim varijablam u programu ponekad treba definisati pored formata još i početnu vrednost. PL/I dozvoljava upotrebu specijalnog atributa za inicijalizaciju varijabli ili kolekcija varijabli. INITIAL ( konstanta) ili INIT (konstanta) Konstanta treba biti specificirana po pravilima koja važe za pojedine tipove podataka. Inicijalna vrednost niza formata CHARACTER specificira se između navodnika. Inicijalna vrednost numeričkih varijabli se obično se specificira kao decimalna konstanta, bez obzira na tačan format varijable. DCL naslovi CHAR(15) INIT(‘lista kandidata’); DCL brojač FIXED(5) INIT(0); DCL ind_eof FIXED(1) INIT(0); DCL strana PIC ’Z9’ INIT(1);

DCL iznos FIXED(11,2) INIT(0); DCL crta CHAR(50) INIT((50)’*’); DCL tekst INIT(‘A’) CHAR(30); /*prvi bajt postaje A, ostalo su blankovi*/

INICIJALIZACIJA SKUPA NUMERIČKIH VARIJABLA Atribut INITIAL može se specificirati i u deklaraciji skupa, ali se u tom slučaju mora navesti inicijalna vrednost za svaki element skupa posebno. Elementi skupa se inicijalizuju po onom redosledu po kom su poređani u glavnoj memoriji, a to je tako da sasvim desni indeks varira najbrže. DCL tab1(5) FIXED(1) INIT(1,2,3,4); DCL tab2(3,2) FIXED(1) INIT(1,2,3,4,5,6); DCL tab3(2,3) FIXED(1) INIT(4,3,2,1);

DCL tab4(2,2) FIXED(1) INIT(6,5,4,3,2,1); DCL tab5(2,3) FIXED(7,2) INIT((100)0); DCL tab6(2,3) FIXED(7,2) INIT(0);

Ako se specificira manje inicijalnih vrednosti nego što je elemenata u skupu onda se neki elementi ne inicijalizuju. Ako se u listu stavi previše inicijalnih vrednosti onda se suvišne ignorišu. Ako želimo da se svi elementi skupa inicijalizuju istom konstantom možemo specificirati tzv. iteracijski faktor (tab5). Iteracijski faktor se mora pisati u svom paru zagrada. Iteracijski faktor se može primenjivati i u slučaju ako samo nekoliko elemenata skupa inicijalizujemo sa jednom konstantom, a nekoliko možda sa nekom drugom konstantom. DCL skup(2,2,2) FIXED(3) INIT((4)*,(4)0); DCL tab(5,5) FIXED INIT((5)1, (5)2, (5)3, (10)0); Ako neke elmente ne želimo inicijalizovati ili ne znamo sa čime inicijalizovati onda umesto konstante upotrebimo znak * (prva 4 elementa trodimenzionalnog skupa skup se ne inicijalizuju). Malo oprezniji moramo biti ako koristimo iteracijski faktor kod inicijaliziranja skupa CHARACTER varijabli. To je zbog toga što kod CHARACTER formata postoji mogućnost izražavanja faktora ponavljanja nekog znaka ili kombinacije znakova. Zbog toga se traži da kod upotrebe iteracijskog faktora za nizove obavezno specificiramo i faktor ponavljanja (čak i kada je njegova vrednost 1). DCL niz1 CHAR(5) INIT((5)’*’); DCL nizniz(5) CHAR(3) INIT((5)’A’);

DCL tabniz(5) CHAR(3) INIT((5)(3)’A’); DCL znakovi(100) CHAR(1) INIT((50)(1)’+’, (50)(1)’-‘);

niz1 nije skup, a inicijalizira se sa 5 *, (5) je faktor ponavljanja. nizniz je skup od pet elemenata. Inicijalizira se samo prvi od njih i to sa tri znaka A, (5) je faktor ponavljanja. tabniz je skup od 5 elemenata i svaki od njih se inicijalizuje sa (3)’A’, (5) je iteracijski faktor, a (3) faktor ponavljanja. Prvih 50 elemenata skupa znakovi inicijalizuje se sa ‘+’, a sledećih 50 elemenata sa ‘-‘. U oba slučaja (50) je iteracijski faktor, a (1) faktor ponavljanja.

Page 20: PL Za Neupucene

PODACI FORMATA BINARY FIXED

BINARY FIXED VARIJABLE Varijable za memorisanje binarnih podataka sa fiksnim zarezom se u PL/I deklarišu kao: BINARY FIXED (p,q) ili BIN FIXED (p,q) p – preciznost(ukupan broj binarnih mesta), q – faktor skale( broj binarnih mesta za frakcioni deo. Minimalna preciznost je 1, a maksimalna 31. Za 1<=p<=15 varijabla zauzima polureč, a za 15<p<=31 celu reč. U praksi je ‘q’ najčešće 0, a ta vrednost se automatski uzima kao faktor skale ako ‘q’ sasvim izostavimo. Ako se p i q ne specificiraju pretpostavlja se (15,0). BINARY FIXED KONSTANTE Brojevi formata BINARY FIXED se mogu izražavati i u vidu konstanti koja se piše kao: neobavezni predznak6, binarne cifre 0 ili 1, neobavezna binarna tačka, obavezni znak B na kraju konstante.

KONSTANTA PRECIZNOST BROJ BAJTOVA DECIMALNA VREDNOST 1B 1 2 1 -101B 3 2 -5 +11.101B 5 2 3 5/8 -1101.1B 5 2 -13 ½

Preciznost je implicirana sa brojem binarnih cifara u konstanti. U praksi se binarne konstante ne koriste mnogo jer je opasnost pogrešnog izražavanja neke vrednosti velika. NEDEKLARISANE ILI NEPOTPUNO DEKLARISANE VARIJABLE PL/I dozvoljava i korišćenje nepotpuno deklarisanih ili ček potpuno nedeklarisanih varijabli. Ako deklaracija neke varijable ne sadrži sve potrebne atribute onda PL/I uzima ‘default’ vrednosti za te atribute. Pri tome se uvažavaju sledeća pravila: 1. Ako je deklarisana baza i skala, a fali preciznost varijable uzimaju se sledeće preciznosti:

BAZA SKALA PRECIZNOST PRVO SLOVO IMENA DEFAULT ATRIBUTI

BINARY FIXED (15,0) I, J, K, M, N BIN FIXED(15,0) DECIMAL FIXED (5,0) ostala slova DECIMAL FLOAT(6) BINARY FLOAT (21) DECIMAL FLOAT (5)

2. Ako je deklarisana samo baza, a fali skala uzima se uvek skala FLOAT 3. Ako je deklarisana skala, a fali baza uzima se uvek baza DECIMAL 4. Ako je varijabla deklarisana sasvim bez atributa ili uopšte nije deklarisana, onda se ‘default’ atributi određuju na osnovu prvog slova u imenu varijable. ARITMETIČKI IZRAZI SA BINARY FIXED PODACIMA Sve osnovne aritmetičke operacije mogu se programirati i sa podacima formata BINARY FIXED. Redosled izvođenja operacija određuje se na isti način kao kod izraza sa decimalnim podacima. Čak se i preciznost međurezultata određuje na isti način, samo kod deljenja treba uvažavati da je maksimalna preciznost binarnih brojeva sa fiksnim zarezom 31.

atributi operanda FIXED BINARY(p1,q1) FIXED BINARY (p2,q2) atributi rezultata FIXED BINARY (p,q) sabiranje ili oduzimanje

p = 1+MAX(p1-q1, p2-q2) + q q = MAX(q1, q2) *

množenje p = p1 + p2 + 1 q = q1 + q2 * deljenje p = 31 q = 31 – ((p1-q1)+q2) *: p max = 31

Page 21: PL Za Neupucene

KONVERZIJE NUMERI ČKIH PODATAKA

KONVERZIJE U ARITMETIČKOM IZRAZU U PL/I dozvoljeno je kodirati aritmetičke izraze sa operandima mešovitih formata. Pre izvođenja takvih izraza operandi se automatski konvertuju u jedinstven format. Tačna pravila za konverziju glase ovako:

a) ako se baze operanada razlikuju tada se operandi sa bazom DECIMAL pretvaraju u BINARY

b) ako se skale operanada razlikuju onda se operandi sa skalom FIXED pretvaraju u FLOAT Preciznost se kod konverzije određuje po pravilima koja su prilično jednostavna:

a) kod pretvaranja iz PICTURE u DECIMAL FIXED se preciznost ne menja b) kod pretvaranja iz DECIMAL FIXED u BINARY FIXED se preciznost odredi sa sledećim

izrazima: p2 = 3.32 * p1 q2 = 3.32 * q1 kod toga se p2 i q2 zaokružuju na prvu višu sledeću vrednost

KONVERZIJA KOD IZJEDNAČENJA Naredba izjednačenja ima sledeći format: VARIJABLA = IZRAZ; Ako se posle izračunavanja izraza dobije rezultat koji nije po formatu jednak primajućoj varijabli potrebna je konverzija. Kod takve konverzije primajuća varijabla nikako ne utiče na preciznost. Preciznost zavisi isključivo od preciznosti konačnog rezultata izračunatog izraza. Preciznost kod konverzije se definiše kao:

a) konverzija iz BIN FIXED(p1,q1) u DECIMAL FIXED (p,q) p = p1/3.32 q = q1/3.32 zaokruženo na prvi veći ceo broj isto važi i ako je ciljni format PICTURE jer je i to decimalni format sa fiksnim zarezom

b) konverzija iz DECIMAL FIXED(p1,q1) u BIN FIXED(p,q) p = p1*3.32 q = q1*3.32 zaokruženo na prvi veći ceo broj rezultat izračunavanja nekog izraza nikada nije formata PICTURE

PRENOS KONTROLE SA NAREDBOM CALL

PL/I podržava podelu programa u ‘blokove’ posebnim formalnim sredstvima kojima se definišu i povezuju programski blokovi. Programski blok u PL/I programu uvek počinje ili sa PROCEDURE ili sa BEGIN naredbom, a završava se naredbom END. Procedure mogu biti interne(ugnježdene u nekom drugom prog. bloku) i eksterne(neugnježdene). Glavna procedura ide sa prefiksom G:

NAREDBA CALL TOK KONTROLE I USLOVI IZVOĐENJA Programska procedura može se aktivirati samo na jedan način: kontrolu joj treba dati eksplicitno, a to se programira posebnom naredbom CALL. CALL ime_procedure; Kada se izvede naredba CALL kontrola se neposredno preda pozvanoj proceduri. Sekvencijalno se procedura nikad ne aktivira nego se jednostavno preskače. Za uspešno izvođenja naredbe CALL moraju biti ispunjena dva uslova:

1) pozvana procedura u momentu izvođenja naredbe CALL ne sme biti aktivna 2) ime pozvane procedure mora biti ‘vidljivo’ sa mesta poziva tj. ne sme se pozvana procedura

nalaziti unutar neke druge procedure

Page 22: PL Za Neupucene

KOMUNICIRANJE MEĐU PROGRAMSKIM BLOKOVIMA Procedure međusobno komuniciraju preko varijabla, koje su poznate i adresibilne u raznim procedurama. Varijable deklarisane u glavnoj proceduri vidljive su iz svih ugnježdenih procedura zbog čega je najbolje sve deklaracije varijabli staviti u glavnu proceduru.

BUILTIN FUNKCIJE

Primenljivost PL/I povećana je tzv ‘builtin’ ili ugrađenim funkcijama. To su standardne rutine kojima se rešavaju zadaci koji se kod programiranja često pojavljuju i to u nekom karakterističnom obliku. Npr: dobijanje datuma, sumiranje elemenata skupa, vađenje kvadratnog korena, računanje logaritma, određivanje apsolutne vrednosti nekog broja, zaokruživanje nekog broja... Svaka builtin funkcija ima svoje ime. Iza imena funkcije se specificiraju tzv. argumenti(nezavisne varijable razdvojene zarezima). Kod nekih funkcija argument nije potreban ali je tada obavezna deklaracija sa atributom BUILTIN. Ako se za neku funkciju specifiraju argumenti, onda se iz konteksta vidi da se radi o funkciji i deklaracija takve funkcije nije potrebna. rb. način pozivanja rezultat 1. CHAR(X) vrednost x izražena kao niz 2. HIGH(X) niz charactera dužine x od kojih svaki ima heksa decimalnu vrednost FF 3. INDEX(X,Y) binarni broj koji izražava relativnu poziciju podniza Y u nizu X. Y i X mogu

biti konstante ili varijable. Ako Y nije podniz od X tada je rezultat funkcije INDEX 0. Rezultat ove funkcije je uvek formata BIN FIXED(15)

4. LENGTH(X) binarni broj koji izražava dužinu niza X 5. LOW(X) niz charactera dužine x od kojih svaki ima vrednost 00 6. STRING(X) character niz koji se dobija lančanjem svih elemenata strukture X. Ova

funkcija se može primeniti i kao pseudovarijabla. 7. SUBSTR(X,Y,Z) podniz niza X koji počinje na relativnoj poziciji Y(startna pozicija podniza u

odnosu na početak kompletnog niza) i ima dužinu Z. X može biti konstanta ili varijabla, Z i Y mogu biti konstante, varijable ili aritmetički izrazi koji ya reyultat imaju ceo broj. Z nije obavezno navesti; tada se smatra podniz do kraja niza

8. ABS(X) apsolutna vrednost broja X 9. ADD(X,Y,p,q) sume brojeva X i Y izražene sa preciznošću p i q 10. BINARY(X,p,q) broj X izražen u formatu BINARY FIXED(p,q) 11. CEIL(X) najmanji celi broj koji je veći od ili jednak broju X koji može biti konstanta,

varijabla ili aritmetički izraz. 12. DIVIDE(X,Y,p,q) količnik X/Y izražen sa preciznošću (p,q) 13. FLOOR(X) najveći celi broj manji od ili jednak broju X 14. MAX(X1,X2....,Xn) najveći od brojeva X1,X2....,Xn 15. MIN(X1,X2....,Xn) najmanji od brojeva X1,X2....,Xn 16. MOD(X,Y) ostatak deljenja X/Y, ako je X<Y MOD=X 17. MULTIPLY(X,Y,p,q) proizvod X*Y izražen sa preciznošću (p,q) 18. ROUND(X,Y) Broj X zaokružen na poziciji Y. X je broj sa fiksnim zarezom koji može biti

izražen konstantom, varijablom ili elementarnim aritmetičkim izrazom 19. SIGN(X) binarni broj koji označava predznak broja X (1,0,-1) 20. DIM(X,n) binarni broj koji izražava n-tu dimenziju skupa X 21. HBOUND(X,n) binarni broj koji izražava gornju granicu n-te dimenzije skupa X 22. LBOUND(X,n) binarni broj koji izražava donju granicu n-te dimenzije skupa X 23. PROD(X) produkt svih elemenata skupa X izračunan sa aritmetikom kliznog zareza 24. SUM(X) suma svih elemenata skupa X izračunana sa aritmetikom fiksnog zareza. X

može biti proizvoljne dimenzije. 25. ADDR(X) pointerska vrednost koja pokazuje na varijablu X. X može biti elementarna

varijabla, struktura, skup, elemenat skupa. Funkcija ADDR vraća pointersku vrednost koja predstavlja adresu specificiranog argumenta.

Page 23: PL Za Neupucene

Ulazna datoteka

1. slog 2. slog 3. slog 4. slog 5. slog 6. slog

1. blok 2.blok

1. slog2. slog3. slog4. slog5. slog 6. slog5. slog

1. READ 4. READ

PROGRAM

1. READ 2. READ 3. READ

BUFERULAZNE

DATOTEKE

VarijablaULAZ

VarijablaIZLAZ

BUFERIZLAZNE

DATOTEKE

1. WRITE 3. WRITE5. WRITE

6. WRITE 11. WRITE

1. blokIzlazna datoteka

26. DATE u obliku CHARACTER(6) kao ggmmdd. Ova funkcija se mora deklarisati sa atributom BUILTIN tj. DCL DATE BUILTIN

27. SQRT(X) daje kvadratni koren od X. X može biti aritmetička konstanta, varijabla ili aritmetički elementarni izraz. Ako X nije u formatu kliznog zareza vrši se automatska konverzija u taj format.

PROGRAMIRANJE ULAZA I IZLAZA

(RECORD-LOCATE MODUS)

IZVOĐENJE ULAZNO-IZLAZNIH OPERACIJA U RECORD-MOVE MODUSU P: PROC OPTIONS(MAIN); DCL intrak RECORD INPUT ENV FB RECSIZE(2000) BLKSIZE(6000); DCL iztrak RECORD OUTPUT ENV FB RECSIZE(1600) BLKSIZE(8000); DCL ulaz CHAR(2000); DCL izlaz CHAR(1600); DCL eof BIN FIXED(1) INIT(0B); ON ENDFILE(intrak) eof=1b; OPEN FILE(intrak), FILE(iztrak); READ FILE(intrak) INTO(ulaz); DO WHILE(eof=0B); izlaz=ulaz, WRITE FILE(iztrak) FROM(izlaz); READ FILE(intrak) INTO(ulaz); END; CLOSE FILE(intrak), FILE(iztrak); END P; Zbog ovih stalnih prenosa između buffera i varijabli za memorisanje logičkih slogova ovaj se način programiranja ulaza i izlaza zove RECORD-MOVE način. U/I operacije se mogu programirati i tako da se u bufferu ‘’lociraju’’ pojedini logički slogovi, a kad su jednom locirani mogu se i obraditi-RECORD LOCATE način obrade. Prednost ovakve obrade je u tome da se kod velikih logičkih slogova uštedi prilično glavne memorije, jer varijable za memorisanje logičkog sloga više nisu potrebne.

intrak

iztrak

Page 24: PL Za Neupucene

VARIJABLE KLASE BASED I VARIJABLA POINTER U PL/I mogu se deklarisati varijable sasvim specijalne klase tzv. BASED varijable. One se od običnih varijabli razlikuju po tome da se njihova adresa u glavnoj memoriji određuje tek za vreme izvođenja programa sa nekom od programskih naredbi. Adresa BASED varijable se čuva u posebnoj pomoćnoj varijabli tzv. ‘’lokatorskoj’’ varijabli-POINTER varijabli. npr. DCL ulaz CHAR(2000) BASED(P); DCL tab(200) FIXED(7,2) BASED(P2);

DCL 1 slog BASED(P1), 2 D1 CHAR(1000), 2 D2 FIXED(15,2), 2 D3 CHAR(20);

P je lokatorska varijabla tipa POINTER (skrać. PTR). Takve lokatorske varijable se deklarišu na sledeći način: DCL P POINTER; DCL Q PTR; DCL (P1, P2) PTR; Pointerska varijabla može da sadrži samo jednu vrstu informacija: neku adresu u glavnoj memoriji. Sa deklaracijom pointerska varijabla ne dobija nikakvu definiranu sadržinu, ona prema tome još ne pokazuje na neku određenu adresu u glavnoj memoriji. Postoji nekoliko mogućnosti da se u pointersku varijablu napuni neka konkretna adresa. ULAZNO-IZLAZNE NAREDBE U/I naredbe za RECORD-LOCATE način stavljaju u pointer adresu ’’sledećeg’’ logičkog sloga u bufferu odgovarajuće datoteke, a naravno obezbeđuju u pravim momentima i fizički prenos blokova između buffera i pripadajuće datoteke. Naredbe za RECORD-LOCATE način mogu se primeniti samo za sekvencijalni pristup do slogova u nekoj datoteci. deklaracije datoteka u LOCATE i MOVE modusima se ne razlikuju. Isto važi i za naredbe OPEN i CLOSE. Naredba READ READ FILE(ime_datoteke) SET(pointer); Preduslov za primenu jeste datoteka deklarisana kao INPUT ili UPDATE. Kada se izvede takva naredba za čitanje u specificirani pointer se napuni adresa aledećeg logičkog sloga u bufferu specificirane datoteke. Ako u bufferu više nema logičkih slogova (obrađeni su svi), onda se u buffer napuni sledeći blok iz ulazne datoteke, a u pointer se ubaci adresa početka buffera-adressa prvog sloga u bufferu. U samoj naredbi READ se ne spominje varijabla koja bazira na pointeru, nego samo pointer. Dozvoljeno je da se na istom pointeru bazira više varijabla što omogućava da kod obrade logičkog sloga primenimo različite opise tog sloga. Naredba LOCATE Pisanje logičkog sloga programira se sa naredbom sledećeg formata: LOCATE based_varijabla FILE(ime_datoteke); Preduslov za primenu je datoteke deklarisana kao OUTPUT. Kada se izvede naredba LOCATE u pointer na kome bazira specificirana based_varijabla se ubaci adresa sledećeg sloga u bufferu specificirane izlazne datoteke. Dužina based_varijable mora biti jednaka deklarisanoj RECSIZE. Ako u bufferu nema više mesta za lociranje sledećeg logičkog sloga ispiše se sadržina buffera kao jedan blok u izlazni data set, a pointer se vrati na početak buffera. Based_varijabla specificirana u naredbi LOCATE može se naravno adresirati tek nakon izvođenja naredbe LOCATE, kada je u pripadajući pointer već ubačena konkretna adresa. Fizički

Page 25: PL Za Neupucene

ispis bloka se izvrši uvek kada naredba LOCATE pokušava u bufferu locirati mesto za novi slog, a mesta više nema. Zadnji blok se ispiše u datoteku sa naredbom CLOSE.

P: PROC OPTIONS(MAIN); DCL intrak RECORD INPUT ENV(FB RECSIZE(2000) BLKSIZE(6000)...........; DCL iztrak RECORD OUTPUT ENV(FB RECSIZE(1600) BLKSIZE(8000)...........; DCL (P, Q) PTR; DCL ulaz CHAR(2000) BASED(P); DCL izlaz CHAR(1600) BASED(Q); DCL eof BIN FIXED(1) INIT(0B); ON ENDFILE(intrak) eof=1B; OPEN FILE(intrak), FILE(iztrak); READ FILE(intrak) SET(P); DO WHILE(eof=0B); LOCATE izlaz FILE(iztrak); izlaz=ulaz; READ FILE(intrak) SET(P); END; CLOSE FILE(intrak), FILE(iztrak); END P;

Naredba REWRITE Za ažuriranje slogova u nekoj datoteci na disku može se primeniti i posebna naredba REWRITE koja ima u RECORD-LOCATE modusu sledeći format: REWRITE FILE (ime_datoteke); Preduslov za primenu ove naredbe jeste datoteka, deklarisana kao UPDATE. Ovoj naredbi mora da prethodi naredba: READ FILE(ime_datoteke) SET(pointer); za istu datoteku. Posle izvršene naredbe za čitanje slog se ažurira direktno u bufferu i izmenjeni slog se vrati na svoje staro mesto na disku sa naredbom REWRITE.

1. slog 2. slog 3. slog 4. slog5. slog 6. slog

ULAZNA DATOTEKA

1. blok 2. blok

P P P

QQ Q

1. READ 2. READ 3. READ

1. LOCATE2. LOCATE

5. LOCATE

BUFFERDATOTEKE

INTRAK

BUFFERDATOTEKE

IZTRAK

IZLAZNA DATOTEKA

6. LOCATE

PROGRAM1. READ 4. READ