i i “Lokar-tipi” — 2010/6/17 — 9:03 — page 1 — #1 i i i i i i List za mlade matematike, fizike, astronome in računalnikarje ISSN 0351-6652 Letnik 17 (1989/1990) Številka 5 Strani 272–277 Matija Lokar: NOVI TIPI V TURBO PASCALU Ključne besede: matematika, računalništvo, turbo pascal, podatkovni tipi. Elektronska verzija: http://www.presek.si/17/1001-Lokar.pdf c© 1990 Društvo matematikov, fizikov in astronomov Slovenije c© 2010 DMFA – založništvo Vse pravice pridržane. Razmnoževanje ali reproduciranje celote ali posameznih delov brez poprejšnjega dovoljenja založnika ni dovo- ljeno. 272 NOVI TIPI V TURBO PASCALU V prejšnji številki smo spoznali. kako uporabljamo okolje Turbo pascala. V tem članku pa si oglejmo Turbo pascal kot jezik. Ima več lastnosti. ki razš irjajo standardni pascal. Spoznali bomo dodatne tipe in delo z njimi. Nove številske tipe lahko zasledimo v verzijah 4 in 5. medtem ko so bili nizi vpeljani že v verziji 3. Oinenimo še. da je najnovejša verzija Turbo pascala . verzija 5.5. prinesla še nekaj novosti prav na to področje . Tako je bil vpeljan nov podatkovni tip object. s pomočjo katerega lahko Turbo pascal uporab- ljamo kot objektno usmerjeni jezik. Vendar o objektnem programiranju kdaj drugič. . 1. Dodatni vgrajeni številski tipi Poleg standardnih tipov real in integer za delo s števili. pozna Turbo pascal še več drugi h tipov. Oglejmo si najprej celoštevil ske tipe. Ime Območje Format shortint -128 ..127 predzna čeni 8-bitni integer - 32768..32767 predznačeni 16-bitni longint - 2147 483648 ..2147483647 predznačeni 32-bitni byte 0 ..255 nepredznačeni 8-bitni word 0..65535 nepredznačeni 16-bitni Vseh pet tipov lahko mirno mešamo med sabo. Rezultat je vedno tist ega najmanjšega tipa. ki vključuje vse uporabljene tipe . Seveda pa moramo paziti pri prirejanju vrednosti spremenljivkam. da ne prekora člmo obse ga. Prednost teh novih celoštevilskih tipov je v tem. da lahko natančneje določimo . s kakšnimi števili želimo delati. Še posebej je koristen tip longint. saj se hitro zgodi. da moramo računati s celimi števili, večjimi od 32767 oz . 65535 . Npr. radi bi izračunali zmnožek vseh naravnih števil do 9. program produkt; var i,p : integer; begin p := 1; for i := 2 to 9 do p : = p * i; writelnC'9 ! = ',p); end . 273 Pro gram nam izračun a , da je produkt - 30336, kar je očitno narobe . Le pa spremenljivko p deklariramo kot l ongint, borno dobili pravilni rezultat 362880 . Omeniti velja še. da je bil tip by te vpeljan že v verziji 3. Turbo pascalu lahko cela števila posredu jemo tud i kot šestnajst iške kon- stante . To storimo tako, da kot prvi znak števila uporabimo $. Tako npr. $Ai pomeni štev ilo 161. $F4 je 244 ipd . Šestnajsflške konstante so lahko med $00000000 in $FFFFFFFF. Poleg standardnega tipa za realna števila pozna Turbo pascal še štiri. Ime real single double extended comp Območje 2.9 x 10 3° . . 1.7 X 103 8 1.5 x 10- 4 5 .. 3.4 x 103 8 5.0 x 10- 3 2 4 . . 1.7 X 103 0 8 3.4 x 10- 403 2 .. 1.1 x 1040 32 _ 2G3 + 1.. 2G3 - 1 Točnih ci fer 11-12 7-8 15-16 19-20 19-20 Zadnji tip comp lahko vseb uje le cela št evila v navedenem obsegu, ki je približno - 9.2 x 1018 . .9.2 x 1018 in ga uporab ljamo , če potrebujemo res ogromna cela štev ila. Medtem ko so nam celoš tevilski t ipi vedno na voljo, dodatnih štirih realnih tipov ne moremo uporabiti. če ne vključimo izračunavanja preko matema tičnega koprocesorja. To najenostavneje storimo v sam em programu , tako da v prvo vrstico datoteke napi šerno { $N+ .E+} . Na ta način bomo v verziji 5 poskrbeli , da se bo naš program lahko izvajal na vseh računaln ikih , t udi t isti h. ki niso oprem ljeni z matemat i č n im koprocesorjem . Z uporabo dodatnih tipov lahko delamo z bistveno večj imi števili. lahko pa tudi povečamo natan čnost račun anja . 2. Nizi Delo z nizi je prava Ahilova peta standardnega pascala . Ker pascal ne pozna standardnega tipa za niz, si moramo pomagati s poljem znakov. To samo po sebi ne bi bilo nič slabega. če bi imeli na voljo ustrezne funkcije za delo s tak o definiran imi tipi . Vendar jih v standardnem pascalu ni. če pr av jih v praksi mnogokrat potrebujemo. Zato so avtorji razli čnih pasc alskih prevajal nikov poskrbeli za ustrezne razširitve . Žal jih je večina prikrojila nekoliko po svoje , tako tudi avtorji Turbo pascala . 274 Turbo pascal pozna poseben tip string. Pr i dekla raciji spremen ljivk navedemo tudi maks imalno dolžino niza. ki mora biti med 1 in 255 . Če le-t a ni navedena . privzamemo maksimalno dolžino 255. t ype vrstica = string [80] ; var dolga_vrsti ca string ; vrsl : vrstica; Nizi so sprem enljivih dolžin. Deklarirana je meksimelne dolžina niza. dolžina . ki je niz tega tipa ne more prese či. Turbo pascal si za vsak niz zapomni njegovo dejansko dolžino . Torej nam ni potrebno uvajati posebnih spremenljivk - računalnik bo vedno vedel. kateri del maksimaln o deklariranega prostora je zavzet. Pri branju spreme nljivk tip a string uporabljamo stave k readln. Narekovajev pri tem ne pišemo. Če pa jih boste napis ali. bod o dcl niza. wr i t e ('Al i naj nadaljujem (da/ne ) ? ') ; readln (odg) ; i i odg = 'ne' then ... Vsi tipi nizov so med seboj enakovredni in jih lahko mešamo. Če tako navedemo . da je na nekem mestu potrebna spremenljivka tipa string [23]. lahko uporablj amo tud i sprem enljivke. deklariran e kot krajši in daljši nizi. Seveda pa bodo predolgi nizi avtom ati čno odr ezani (kraj ši pa ohranijo svojo vsebino. saj jc 23 maksimaln a in ne dejanska dolžina). 2.1. Operacije nad nizi Oglejmo si sed aj . kaj lahko poč nemo z nizi. • Posamezne znake iz niza dobimo kot posam ezne komponcnt c polja . Tako je npr. vr s l [1] prvi. vrsl [10] pa deseti znak niza vr s l . Na t a na čin lahko tudi spremenimo pos amezni znak v nizu npr. vrs l [5] : = 'e' . Pri tem pa lahko upora bljamo le indekse med 1 in trenutn o dolžino niza . Na ta n a čin torej lahko le spreminjamo o bstoječe znake v nizu. ne moremo pa niza pod aljševati. Nize lahko tor ej jemljemo kot polja znakov ali pa kot celoto. • Nize lahko primerjam o po velikosti . Le-ta je d ol očena glede na kodo ASCII istoležnih znakov. Tako je npr. niz ' Pas ca l ' manj ši od niza 'pascal' , ker je v tabeli znakov č r k a P pred črko p . Če istolezucga 275 zn aka ni (en niz je daljši od dru gega) , ima obstoječi znak v e čj o vred - nost. Tako je niz' Da' večji od niza' D'. Znaki se prim erjajo od leve proti desni. Primerjanje se zaključi pri prvem paru neenakih znakov . Tako je 'dinar' manjši od 'dolar', Pri primerjanju lahko uporabl- jamo nasl ednje relacijske operatorje z znanim pomenom : <> < >, <=, >= . • nize lahko stikamo s pomočjo operatorja '+', a ,= 'Turbo '; b .= 'pascal'; c ,= 'Programski jezik' + a + ' '+ b; Če je dobljeni niz predolg , se presežek odreže . 2.2. Procedure in funkcije • function concat(sl, o O" sn) : string; Spajanje nizov s l., o o o, sn. Funkcija je nekaj posebnega, saj ima spre- menljivo število argumentov. Primer: a := concat('Programski ','jezik' , 'pascal') ; • function copy(s: string; i,j : integer) : string; Pr epis podniza. Iz niza s vzamemo j znakov in sicer od i-tega dalje . Če je i večji od dolžin e niza s, dobimo prazen niz . Če je j prevelik . dobimo segment niza s od i-tega znaka do konca . Pr ime r: a : = ' p a s c al'; b := copy(a,5,3); wr i t e l n (b ) ; -- -- - > al • procedure delete(var s :string ; i,j :integer); Bris anje podniza iz niza. Iz niza s odstrani j znakov in sicer od i - tega dalje . Če je i večji od dolžine niza s, ni zbrisan nob en znak . Če je i + j - 1 v ečj e od dolžine niza , je rezultat prvih i - 1 znakov niza s (zbriše se toliko znakov , kot se pač lahko). Prim er : 276 a : = 'pascal' ; delete(a,2 , 4) ; Vlr i t e ln (a ) ; - - - - > PI string[100] ; • procedure insert(sl:string ; var s2:string ; i:int eger) ; Vrivanje niza v niz. V niz s2 na i-to mesto vstavimo niz s1. Primer : a := ' Pr ogr ams k i jezik pascal' ; insert ( 'Turbo' . a , 18); • function length(s : string): integer; Dolžina niza. Vrne dolžino niza s . Če je niz s praz en . je do lžina O. Pri mer : va r a begin a := 'Programski jezi k pascal '; wr i t e l n ( ' do l z i n a ' ;length(a)); • function pos(sl,s2 : Z ačetek podniza v nizu . Če ga ni, vrne O. P rimer: string): integer; Poi š če prvo pojavitev podniza sl v nizu s2 . var s : string ; begin s : = ' 123.5 ' ; { spremeni vodilne presledke v nicle } wh i l e pose' ',s) > O do s j po s t ' • , s ) ] := 'O'; • procedure str(r : real ; var s : string); ali procedure str(r : integer; var s: string) ; Spremeni število v niz. Spr em eni realno ali celo šte vilo v niz. P ri tem spremembo lahko nadzoruj emo kot pri upora bi Vi r i te, z d ol oč a njem širine izpisnega polja in (pri realnih št evilih) z dolo čanj ern števila dec- imalk . Učin ek je enak kot pri ukazu wr i te . le-d a se tuk aj rezult at pa č izpiše v spr emenljivko tipa string. Prim er : str(25 .3232 :10 :2,s) ; Vl r i t e l n ('N i z = ' , s ) ; - ---> Ni z 25.32