Erinevus lehekülje "Pascal" redaktsioonide vahel
(→Pascali paigaldamine) |
(→Juhtstruktuurid ehk if-else, for ja case konstruktsioonid) |
||
(ei näidata sama kasutaja 58 vahepealset redaktsiooni) | |||
2. rida: | 2. rida: | ||
Pascal on peamiselt programeerimise õppimisele orienteeritud keel, tuntud enda range struktuuri ning hea loetavuse poolest. Pascalis on põhimõtteliselt loodud sellised Ptorgammid nagu Total Commander ja Skype | Pascal on peamiselt programeerimise õppimisele orienteeritud keel, tuntud enda range struktuuri ning hea loetavuse poolest. Pascalis on põhimõtteliselt loodud sellised Ptorgammid nagu Total Commander ja Skype | ||
+ | |||
+ | Kõik selles tekstis edaspidi leiduvad palad on kirjutatud ja testitud FreePascalil va mõned üksikud millede juures tarkvara versioon eraldi märgitud. | ||
+ | |||
+ | http://vallaste.ee/index.htm?Type=UserId&otsing=1623 | ||
===Pascali paigaldamine=== | ===Pascali paigaldamine=== | ||
− | komilaatoreid | + | komilaatoreid on loodud sellele keelele aegade jooksul mitmeid, neist küllap tundumad |
* DOSi klassikaline Turbo Pascal mis hõlmab kompilaatorit ning integreeritud arendus keskonda (IDE) http://et.wikipedia.org/wiki/Turbo_Pascal | * DOSi klassikaline Turbo Pascal mis hõlmab kompilaatorit ning integreeritud arendus keskonda (IDE) http://et.wikipedia.org/wiki/Turbo_Pascal | ||
− | *FreePascal mis üritatud luua ühilduvana nii Delfi kui Turbo Pascaliga http://www.freepascal.org/ http://freepascal.org/docs-html/rtl/ | + | *FreePascal mis üritatud luua ühilduvana nii Delfi kui Turbo Pascaliga, vabavara http://www.freepascal.org/ http://freepascal.org/docs-html/rtl/ |
+ | |||
+ | [[Pilt:Freepascal.png|right|thumb|200px|FreePascal IDE]] | ||
+ | |||
+ | *Lazarus Delphit meenutav paljude erinevate opsüsteemide toega IDE ja RAD http://www.lazarus.freepascal.org/ | ||
+ | |||
+ | [[Pilt:800px-Windows XP.png|right|thumb|200px|Lazarus IDE]] | ||
+ | |||
+ | * http://et.wikipedia.org/wiki/Pascal eestikeelne wikipedia artikkel pascal keelest | ||
* http://en.wikipedia.org/wiki/Object_Pascal | * http://en.wikipedia.org/wiki/Object_Pascal | ||
15. rida: | 27. rida: | ||
* http://www.absoluteastronomy.com/topics/Pascal_%28programming_language%29 | * http://www.absoluteastronomy.com/topics/Pascal_%28programming_language%29 | ||
− | ===Pascali | + | ===Pascali koodifail=== |
− | Pascali | + | Pascali koodifail omab ranget struktuuri. Näiteks muutujaid ei saa väärtustada |
+ | suvalisel hetkel vaid ainult koodi alguses. | ||
+ | |||
+ | Pascali koodifaili struktuur | ||
+ | |||
+ | # program < nimi >; | ||
+ | # uses crt, graph jne ehk mis moodulid külge võetakse | ||
+ | # type < tüübideklaratsioonid >; | ||
+ | # var < muutujate deklaratsioonid >; | ||
+ | # funktsioonid ja protseduurid | ||
+ | # begin < lause 1> < lause n >; end. ehk koodiosa | ||
+ | |||
+ | Pascali kood esineb tekstifaili kujul, nt selline skript kirjutab 'Hello, world' | ||
<source lang=pascal> | <source lang=pascal> | ||
37. rida: | 61. rida: | ||
gotoXY(10,20); | gotoXY(10,20); | ||
− | Kommentaarid kirjutatakse pascalis märkide { } vahele | + | Kommentaarid kirjutatakse pascalis märkide { } vahele, näiteks |
+ | |||
+ | { ekraan 12*15 punkti suur } | ||
Ekraani puhastamieks on käsk | Ekraani puhastamieks on käsk | ||
43. rida: | 69. rida: | ||
clrscr; | clrscr; | ||
− | === | + | ===Juhtstruktuurid ehk if-else, for ja case konstruktsioonid=== |
'''if''' | '''if''' | ||
− | + | Näiteks kui muutuja on väiksem kui number 25 siis teeme mingeid tehteid | |
+ | <source lang=pascal> | ||
if muutuja<25 then | if muutuja<25 then | ||
begin | begin | ||
.... | .... | ||
end; | end; | ||
+ | </source> | ||
− | või | + | või, kui b on võrdne c'ga siis väärtustame b nulliga. |
if b=c then b:=0; | if b=c then b:=0; | ||
+ | Näiteprogramm if käsu kasutamisest | ||
+ | <source lang=pascal> | ||
+ | uses crt; | ||
+ | var a,o:real; | ||
+ | begin | ||
+ | clrscr; | ||
+ | write('sisesta kellaaeg: '); | ||
+ | readln(a); | ||
+ | if (a<6.00) then writeln('Kas sa m2ngid j2lle Heroest?'); | ||
+ | if (a=6) then writeln('Kas sa oled varajane v6i ei ole ikka veel magama saand?'); | ||
+ | if (a<12.00) and (a>6.00) then writeln('Tere hommikust!'); | ||
+ | if (a=12.00) then writeln('Head l6unat!'); | ||
+ | if (a<18.00) and (a>12.00) then writeln('Head p2rastl6unat!'); | ||
+ | if (a=18.00) then writeln('Head seebi vahtimist!'); | ||
+ | if (a<22.00) and (a>18.00) then writeln('Head 6htut'); | ||
+ | if (a=22.00) then writeln('Mine magama!'); | ||
+ | if (a>22.00) then writeln('MIKS SA EI MAGA!!!'); | ||
+ | readln; | ||
+ | end. | ||
+ | </source> | ||
'''For''' | '''For''' | ||
+ | |||
+ | Kümmne sammuline tsükkel kasutades For käsku. | ||
for i:=1 to 10 do write('number',n); | for i:=1 to 10 do write('number',n); | ||
64. rida: | 114. rida: | ||
Näide kursori liigutamisest | Näide kursori liigutamisest | ||
+ | <source lang=pascal> | ||
if keypressed then c:=readkey; {kui klahvi vajutati loeme mis klahv see olla võis} | if keypressed then c:=readkey; {kui klahvi vajutati loeme mis klahv see olla võis} | ||
− | {järgnevad numbrid on DOSi nooleklahvide koodid} | + | {järgnevad numbrid on DOSi klaviatuuri nooleklahvide koodid} |
case c of #75: begin if x[sp]-vahe>XMin then x:=x-vahe; end; { Paremale } | case c of #75: begin if x[sp]-vahe>XMin then x:=x-vahe; end; { Paremale } | ||
#77: begin if x[sp]+vahe<XMax then x:=x+vahe; end; { Vasakule } | #77: begin if x[sp]+vahe<XMax then x:=x+vahe; end; { Vasakule } | ||
72. rida: | 123. rida: | ||
#72: begin if y[sp]-vahe>Ymin then y:=y-vahe; end; { šles } | #72: begin if y[sp]-vahe>Ymin then y:=y-vahe; end; { šles } | ||
end; | end; | ||
+ | </source> | ||
===Andmestruktuurid=== | ===Andmestruktuurid=== | ||
− | ==== | + | ====Muutujad ehk moodsat terminit kasutades sõne==== |
Muutujate defineerimises on Pascal üsna range, nõutav on, et need oleksid defineeritud enne programmi põhiosa algust '''var''' all | Muutujate defineerimises on Pascal üsna range, nõutav on, et need oleksid defineeritud enne programmi põhiosa algust '''var''' all | ||
81. rida: | 133. rida: | ||
näiteks | näiteks | ||
+ | <source lang=pascal> | ||
var | var | ||
− | t2ht: char; | + | t2ht, t2ht1 : char; |
− | s2na : string; | + | s2na, string : string; |
− | arv: integer; | + | arv, number: integer; |
+ | miski: Boolean; | ||
+ | Raadius: Word; | ||
+ | </source> | ||
+ | |||
+ | |||
Väärtuste omistamine toimub programmi põhiosas ehk '''begin''' ja '''end'' vahel | Väärtuste omistamine toimub programmi põhiosas ehk '''begin''' ja '''end'' vahel | ||
133. rida: | 191. rida: | ||
Võimalik on juba programmi luues eeldefineerida VAR all enne programmi algust mingeid muutujaid, nt kujul | Võimalik on juba programmi luues eeldefineerida VAR all enne programmi algust mingeid muutujaid, nt kujul | ||
+ | <source lang=pascal> | ||
const lines=24; | const lines=24; | ||
s: array[0..lines] of string= | s: array[0..lines] of string= | ||
138. rida: | 197. rida: | ||
'a','b','c','d','e','f','k','l','m','n','o','p','r','s','t','u','v', | 'a','b','c','d','e','f','k','l','m','n','o','p','r','s','t','u','v', | ||
'i','j','h','z','x','g','q',''); | 'i','j','h','z','x','g','q',''); | ||
+ | </source> | ||
Millega tekitame 24 märgi pikkuse jada mis sisaldab tähestiku tähti va täpitähed | Millega tekitame 24 märgi pikkuse jada mis sisaldab tähestiku tähti va täpitähed | ||
143. rida: | 203. rida: | ||
Võimalik on samuti enne VAR'i defineerida uusi recordeid näiteks | Võimalik on samuti enne VAR'i defineerida uusi recordeid näiteks | ||
+ | <source lang=pascal> | ||
type | type | ||
a = record | a = record | ||
149. rida: | 210. rida: | ||
sugu : Char; | sugu : Char; | ||
end; | end; | ||
+ | </source> | ||
Kasutades nüüd seda uut loodud recordit näiteks jada loomisel | Kasutades nüüd seda uut loodud recordit näiteks jada loomisel | ||
158. rida: | 220. rida: | ||
inimesed[i].nimi:="Priit"; | inimesed[i].nimi:="Priit"; | ||
− | === | + | ===Matemaatilised tehted=== |
+ | |||
+ | Meil on muutuja a ja b mis sisaldavad mingeid arve ning soovime tulemuse omistada | ||
+ | muutujale c. | ||
+ | |||
+ | Liitmine | ||
+ | c:=a+b; | ||
+ | Lahutamine | ||
+ | c:=a-b; | ||
+ | Korrutamine | ||
+ | c:=a*b; | ||
+ | Jagamine | ||
+ | c:=a/b; | ||
+ | |||
+ | Jadatöötlus käib lisades nurksulgudes positsiooni, nt kasutades mõnd teist muutujat. | ||
j[b]:=j[b]+1 ; | j[b]:=j[b]+1 ; | ||
− | b:=b | + | Arvuti näide mis teeb kõiki tehteid |
+ | |||
+ | <source lang=pascal> | ||
+ | program arvut; | ||
+ | uses crt; | ||
+ | |||
+ | {algväärtustame muutujad mida kasutame} | ||
+ | var a,b:integer; | ||
+ | var c: real; | ||
+ | var mark: char; | ||
+ | |||
+ | {alustame programmiga} | ||
+ | begin | ||
+ | {puhastame ekraani} | ||
+ | clrscr; | ||
+ | {küsime muutuja a, tehte ja märgi b} | ||
+ | readln(a); | ||
+ | readln(mark); | ||
+ | readln(b); | ||
+ | if mark='+' then c:=a+b; | ||
+ | if mark='-' then c:=a-b; | ||
+ | if mark='*' then c:=a*b; | ||
+ | if mark='/' then c:=a/b; | ||
+ | {väljastame tulemi} | ||
+ | write('=',c:1:2); | ||
+ | {ootame klahvivajutust} | ||
+ | readln; | ||
+ | end. | ||
+ | </source> | ||
+ | |||
+ | Mõned keerukamad näited matemaatilisi tehteid tegevatest programmidest | ||
Kolmnurga pindala arvutamine | Kolmnurga pindala arvutamine | ||
− | + | <source lang=pascal> | |
write(' kirjuta kolmnurga alus :'); | write(' kirjuta kolmnurga alus :'); | ||
readln(a); | readln(a); | ||
173. rida: | 279. rida: | ||
if(a>0) and (h>0) then writeln('pindala on :' ,s:2:2); | if(a>0) and (h>0) then writeln('pindala on :' ,s:2:2); | ||
if(a<0) or (h<0) then writeln(' viga algandmetes '); | if(a<0) or (h<0) then writeln(' viga algandmetes '); | ||
+ | </source> | ||
− | = | + | Ringi pindala arvutamine |
+ | <source lang=pascal> | ||
+ | program ringi_pindala; | ||
+ | var P,S: real; | ||
− | + | begin | |
+ | write('Ringi mbermäät: '); | ||
+ | readln(P); | ||
+ | S:=PI*sqr(P/(2*PI)); | ||
+ | writeln('Vastus: ',S:6:2); | ||
+ | readln; | ||
+ | end. | ||
+ | </source> | ||
+ | Programm leiab arvude 1..15 ruudu ja kuubi | ||
+ | <source lang=pascal> | ||
+ | program ruutude_ja_kuupide_tabel; | ||
+ | var i: integer; | ||
+ | begin | ||
+ | for i:=1 to 15 do | ||
+ | writeln(i,'*',i,'=',(i*i):6,' ',i,'*',i,'*',i,'=', (i*i*i):6); | ||
+ | end. | ||
+ | </source> | ||
+ | |||
+ | Leiab kahe koordinaatteljestiku punkti vahelise kauguse | ||
+ | |||
+ | <source lang=pascal> | ||
+ | program punktide_vaheline_kaugus; | ||
+ | var x1,x2,y1,y2: integer; | ||
+ | |||
+ | begin | ||
+ | write('Sisesta x1: '); readln(x1); | ||
+ | write('Sisesta y1: '); readln(x2); | ||
+ | write('Sisesta x2: '); readln(y1); | ||
+ | write('Sisesta y2: '); readln(y2); | ||
+ | |||
+ | writeln('Punktide vaheline kaugus: ',sqrt(sqr(x2-x1)+sqr(y2-y1)):6:2); | ||
+ | readln; | ||
+ | end. | ||
+ | </source> | ||
+ | |||
+ | ===Klassid ehk meetodid=== | ||
+ | |||
+ | Meetodid (klassid) võimaldavad programmi teksti loogiliselt organiseerida, nt eraldada osa korduvaks kasutamiseks. | ||
+ | |||
+ | <source lang=pascal> | ||
procedure ekraanile; | procedure ekraanile; | ||
begin | begin | ||
183. rida: | 332. rida: | ||
writeln("tere"); | writeln("tere"); | ||
end; | end; | ||
+ | </source> | ||
− | Väljakutsumine toimub | + | Väljakutsumine toimub käsuga |
ekraanile; | ekraanile; | ||
190. rida: | 340. rida: | ||
===Konsoolilt sisendi lugemine=== | ===Konsoolilt sisendi lugemine=== | ||
+ | Soovides lugeda konsoolilt kasutaja poolseid sisestusi või klahvivajutusi tuleb toimida selliselt | ||
+ | |||
+ | <source lang=pascal> | ||
write('Sisesta esimene arv: '); | write('Sisesta esimene arv: '); | ||
readln(arv1); | readln(arv1); | ||
+ | </source> | ||
Klahvivajutusi loetakse readkey nimelise funktsiooniga vt näidet allpool | Klahvivajutusi loetakse readkey nimelise funktsiooniga vt näidet allpool | ||
+ | <source lang=pascal> | ||
{ Lihtne näide valikutest } | { Lihtne näide valikutest } | ||
uses crt; | uses crt; | ||
216. rida: | 371. rida: | ||
until (c='q'); | until (c='q'); | ||
end. | end. | ||
+ | </source> | ||
+ | |||
+ | ===Parameetrid käsurealt=== | ||
+ | |||
+ | Käsurealt antud parameetrite jaoks on muutuja paramstr, näiteks esimese parameetri leiab muutujast. | ||
+ | |||
+ | paramstr(1) | ||
+ | |||
+ | Parameetrite olemasolu programmi alguses saab kontrollida järgnevalt: | ||
+ | |||
+ | if (ParamCount<3) then | ||
+ | begin | ||
+ | Writeln('No parameters on command line'); | ||
+ | writeln('Usage: <file1.txt> <file2.txt> <letter>'); | ||
+ | writeln('Usage: input output char'); | ||
+ | halt(1); | ||
+ | end; | ||
===Jadatöötlus=== | ===Jadatöötlus=== | ||
− | + | Mõned jadatöötluse näited | |
+ | |||
+ | Programm väljastab sisestadud jada elemendid mis on väiksemad keskmisest } | ||
+ | <source lang=pascal> | ||
+ | program jada_keskmine; | ||
+ | var jada: array[1..100] of integer; | ||
+ | i,n,s: integer; | ||
+ | |||
+ | procedure loe; | ||
+ | begin | ||
+ | for i:=1 to n do readln(jada[i]); | ||
+ | end; | ||
+ | |||
+ | begin | ||
+ | write('Mitu liiget on jadas: '); readln(n); | ||
+ | |||
+ | writeln('Sisesta jada..'); | ||
+ | loe; | ||
+ | |||
+ | s:=0; | ||
+ | for i:=1 to n do s:=s+jada[i]; | ||
+ | writeln('Väiksemad keskmisest: '); | ||
+ | for i:=1 to n do if jada[i]<(s/n) then writeln(jada[i]); | ||
− | === | + | readln; |
+ | end. | ||
+ | </source> | ||
+ | |||
+ | Proge leiab jada sisestatud arvudest suurima arvu... | ||
+ | <source lang=pascal> | ||
+ | program suurim_jada_liige; | ||
+ | var a: array[1..100] of integer; | ||
+ | i,n,max: integer; | ||
+ | |||
+ | begin | ||
+ | writeln('Sisesta positiivsed jada liikmed, läpetuseks negatiivne arv...'); | ||
+ | repeat { Loeme sisse jada liikmed } | ||
+ | i:=i+1; | ||
+ | readln(a[i]); | ||
+ | until a[i]<0; | ||
+ | |||
+ | n:=i-1; | ||
+ | max:=a[1]; | ||
+ | |||
+ | for i:=1 to n do | ||
+ | if a[i]>max then max:=a[i]; | ||
+ | |||
+ | writeln('Suurim: ',max); | ||
+ | |||
+ | readln; | ||
+ | end. | ||
+ | </source> | ||
+ | |||
+ | ===Stringi ehk muutujate töötlus=== | ||
+ | |||
+ | Kahe muutuja liitmiseks | ||
password:=password+muutuja; | password:=password+muutuja; | ||
− | Värvime | + | Värvime muutujas "tekst" leiduva märgi t2ht (a) roheliseks |
+ | <source lang=pascal> | ||
tekst:='metsaloomad'; | tekst:='metsaloomad'; | ||
t2ht:='a'; | t2ht:='a'; | ||
234. rida: | 460. rida: | ||
{ if tekst[i]=t2ht then textcolor(2);} | { if tekst[i]=t2ht then textcolor(2);} | ||
end; | end; | ||
+ | </source> | ||
− | ''' | + | programm leiab pikima sõna stringis ja väljastab selle koos sõna pikkusega |
+ | |||
+ | <source lang=pascal> | ||
+ | program pikim_sona; | ||
+ | var str: string[100]; | ||
+ | max,i,pikkus,n:word; | ||
+ | ps: string[15]; | ||
+ | s: array[1..20] of string[15]; | ||
+ | sp: array[1..20] of word; | ||
+ | |||
+ | begin | ||
+ | write('String: '); | ||
+ | readln(str); | ||
+ | pikkus:=length(str)+1; | ||
+ | str:=str+' '; | ||
+ | i:=1; | ||
+ | |||
+ | while pikkus>0 do | ||
+ | begin | ||
+ | sp[i]:=pos(' ',str)-1; | ||
+ | s[i]:=copy(str,1,sp[i]); | ||
+ | delete(str,1,sp[i]+1); | ||
+ | pikkus:=pikkus-sp[i]-1; | ||
+ | i:=i+1; | ||
+ | end; | ||
+ | |||
+ | n:=i-1; | ||
+ | max:=sp[1]; | ||
+ | ps:=s[1]; | ||
+ | for i:=1 to n do | ||
+ | if max<sp[i] then | ||
+ | begin | ||
+ | max:=sp[i]; | ||
+ | ps:=s[i]; | ||
+ | end; | ||
+ | |||
+ | writeln ('Pikim säna: ',ps,' ... ',max,' t„hte ...'); | ||
+ | readln; | ||
+ | end. | ||
+ | </source> | ||
+ | |||
+ | ===Random ehk juhusliku arvu funktsioon=== | ||
Enne seda tuleb anna programmi alguses käsk | Enne seda tuleb anna programmi alguses käsk | ||
245. rida: | 513. rida: | ||
random(25) | random(25) | ||
− | Mis tähendab, et funktsioon võtab suvalise numbri vahemikust 0..25 | + | Mis hetkel tähendab, et funktsioon võtab suvalise numbri vahemikust 0..25 |
Näide | Näide | ||
+ | <source lang=pascal> | ||
uses crt; | uses crt; | ||
258. rida: | 527. rida: | ||
randomize; | randomize; | ||
writeln(random(3)); {arvud 0..3} | writeln(random(3)); {arvud 0..3} | ||
+ | {ootame kümme sekundit kasutades käsku delay} | ||
delay(10); | delay(10); | ||
until keypressed; {kuni klahvi vajutatakse} | until keypressed; {kuni klahvi vajutatakse} | ||
end. | end. | ||
+ | </source> | ||
+ | |||
+ | ===Kellaaeg=== | ||
+ | |||
+ | Selle saamiseks on olemas funktsioon GetDate, kasutamine | ||
+ | |||
+ | GetDate(y,m,d,dow); | ||
+ | Writeln('Today is ', days[dow],', ', | ||
+ | m:0, '/', d:0, '/', y:0); | ||
===Värvid=== | ===Värvid=== | ||
274. rida: | 553. rida: | ||
Näiteks | Näiteks | ||
+ | <source lang=pascal> | ||
writeln('ise tegin!, ausalt!'); | writeln('ise tegin!, ausalt!'); | ||
textcolor(lightred+blink); | textcolor(lightred+blink); | ||
textbackground(blue); | textbackground(blue); | ||
− | + | </source> | |
+ | |||
Värve saab lisaks öelda ka koodidega nagu | Värve saab lisaks öelda ka koodidega nagu | ||
310. rida: | 591. rida: | ||
Faili kirjutamine | Faili kirjutamine | ||
+ | <source lang=pascal> | ||
Assign(F, 'fail.txt'); | Assign(F, 'fail.txt'); | ||
Rewrite(F);{kui faili pole tekitame, kui on kirjutame üle} | Rewrite(F);{kui faili pole tekitame, kui on kirjutame üle} | ||
writeln(F, arv1); | writeln(F, arv1); | ||
close(f); | close(f); | ||
+ | </source> | ||
Faili lisamiseks tuleb avada ta käsuga | Faili lisamiseks tuleb avada ta käsuga | ||
319. rida: | 602. rida: | ||
Append(F); | Append(F); | ||
− | Faili | + | Faili töötlemise näide, loeme kokku palju on parameetrina antud falis numbreid, suurtähti, väiketähti ja muid märke. |
+ | |||
+ | <source lang=pascal> | ||
+ | uses crt; | ||
+ | VAR | ||
+ | mark: Char; | ||
+ | Sisend, Valjund: Text; | ||
+ | Numbreid, Suurtahti, Vaiketahti, Teisimarke: Integer; | ||
+ | f: text; | ||
+ | Begin | ||
+ | clrscr; | ||
+ | |||
+ | Numbreid := 0; | ||
+ | Suurtahti := 0; | ||
+ | Vaiketahti := 0; | ||
+ | Teisimarke := 0; | ||
+ | |||
assign(F,paramstr(1)); | assign(F,paramstr(1)); | ||
reset(f); | reset(f); | ||
335. rida: | 634. rida: | ||
END; | END; | ||
end; | end; | ||
+ | |||
close(f); | close(f); | ||
+ | writeln('Numbreid: ',Numbreid); | ||
+ | writeln('Suuri tähti: ',Suurtahti); | ||
+ | writeln('Väikeseid tähti: ',Vaiketahti); | ||
+ | writeln('Teisi märke: ',Teisimarke); | ||
+ | END. | ||
+ | </source> | ||
+ | |||
+ | http://www.ttkool.ut.ee/comp/failid/failid_pas.html | ||
===Tsüklid=== | ===Tsüklid=== | ||
341. rida: | 649. rida: | ||
Näiteks lõputu kordus mis kestab senikaua kuni vajutatakse mõnd klahvi | Näiteks lõputu kordus mis kestab senikaua kuni vajutatakse mõnd klahvi | ||
+ | <source lang=pascal> | ||
begin | begin | ||
repeat | repeat | ||
347. rida: | 656. rida: | ||
until keypressed; | until keypressed; | ||
end. | end. | ||
+ | </source> | ||
− | + | tabeli 100x100 algväärtustamiseks sobib järgnev näide | |
<source lang=pascal> | <source lang=pascal> | ||
361. rida: | 671. rida: | ||
</source> | </source> | ||
− | ===DOSi graafika=== | + | ===Andmebaasid=== |
+ | |||
+ | FreePascal on võimeline kasutama nii mysqli kui postgresqli | ||
+ | |||
+ | lähemalt sellest lingil | ||
+ | http://www.freepascal.org/packages/mysql.html | ||
+ | |||
+ | ===DOSi graafika Turbo Pascalis=== | ||
+ | |||
+ | Tõenöoliselt asi mis tänapäeval enam erilist kasutust ei leia kuid ajaloo huvides tooks siiski ära | ||
kasutamiseks peab olemas olema Egavga.bgi ja Graph.tpu | kasutamiseks peab olemas olema Egavga.bgi ja Graph.tpu | ||
+ | <source lang=pascal> | ||
uses graph; | uses graph; | ||
var | var | ||
378. rida: | 698. rida: | ||
... | ... | ||
end. | end. | ||
+ | </source> | ||
Näide | Näide | ||
+ | <source lang=pascal> | ||
USES Graph; | USES Graph; | ||
{{$l Kaivita} | {{$l Kaivita} | ||
416. rida: | 738. rida: | ||
CloseGraph; | CloseGraph; | ||
END. { Lihtkujundid } | END. { Lihtkujundid } | ||
+ | </source> | ||
− | ===Hiire kasutamine | + | ===Hiire kasutamine DOSis Turbo Pascalis=== |
+ | |||
+ | Samuti lahendus mida tänapäeval enam vaja ei lähe kuid igaks juhuks tähendaks selle tarkuse siiski üles. | ||
Hiire koordinaadid | Hiire koordinaadid | ||
+ | <source lang=pascal> | ||
procedure getcoords(var xx,yy:integer); | procedure getcoords(var xx,yy:integer); | ||
var aa,bb:integer; | var aa,bb:integer; | ||
begin;asm;mov ax,0003h;int 33h;mov aa,cx;mov bb,dx;end;xx:=aa;yy:=bb;end; | begin;asm;mov ax,0003h;int 33h;mov aa,cx;mov bb,dx;end;xx:=aa;yy:=bb;end; | ||
+ | </source> | ||
+ | <source lang=pascal> | ||
Hiire vasak nupp | Hiire vasak nupp | ||
function LeftButton:boolean; | function LeftButton:boolean; | ||
430. rida: | 758. rida: | ||
if getbutton(1)then leftbutton:=true; | if getbutton(1)then leftbutton:=true; | ||
end; | end; | ||
+ | </source> | ||
Hiire parem nupp | Hiire parem nupp | ||
+ | <source lang=pascal> | ||
function RightButton:boolean; | function RightButton:boolean; | ||
begin | begin | ||
437. rida: | 767. rida: | ||
if getbutton(2)then rightbutton:=true; | if getbutton(2)then rightbutton:=true; | ||
end; | end; | ||
+ | </source> | ||
Muide need koordinaadid on graafika omad ,et saada ikka | Muide need koordinaadid on graafika omad ,et saada ikka | ||
dosi texti ekraani 25*80 koordinaate | dosi texti ekraani 25*80 koordinaate | ||
siis tuleb jagada nii X kui Y 8saga | siis tuleb jagada nii X kui Y 8saga | ||
+ | |||
+ | ===Waitretrace=== | ||
+ | |||
+ | Waitretrace ehk kuidas kaotada programmist virvendus | ||
+ | Tegemist on protseduuriga mis leiab sobiva aja järjekordse hunniku andmete saatmiseks | ||
+ | videomällu. Nimelt joonistatakse kuvaris pilt rida-realt, kaadrisagedused vôivad varieeruda. | ||
+ | Kui joonistamisega jôutakse paremale alla nurka, on vaja | ||
+ | üles vasakule tagasi pöörduda, et uuesti nullist alustada | ||
+ | ajavahemikku mis kulub tagasipöördumiseks, nimetatakse vertical retrace'iks | ||
+ | ja selle ajal vôib sooritada videokirjutusoperatsioone, kartmata | ||
+ | tihti probleemiks olevat virvendust (flicker), mis teinekor suurepäraste rakenduste | ||
+ | vaatamist häirib. ôigete portide kasutamise korral on vôimalik | ||
+ | tuvastada retrace'i aeg ja selle kestel kuvakirjutusi sooritada. | ||
+ | |||
+ | Näide waitretrace'i kasutamisest. | ||
+ | |||
+ | waitretrace assembleris | ||
+ | <source lang=pascal> | ||
+ | procedure waitretrace; assembler; | ||
+ | label l1, l2; | ||
+ | asm | ||
+ | mov dx,3DAh | ||
+ | l1: | ||
+ | in al, dx | ||
+ | and al,08h | ||
+ | jnz l1 | ||
+ | l2: | ||
+ | in al,dx | ||
+ | and al,08h | ||
+ | jz l2 | ||
+ | end; | ||
+ | </source> | ||
+ | Ja pascalis | ||
+ | <source lang=pascal> | ||
+ | procedure WaitRetrace; | ||
+ | VAR b : byte; | ||
+ | label l1, l2; | ||
+ | BEGIN | ||
+ | l1: | ||
+ | IF port[$3da] and 8>0 THEN goto l1; | ||
+ | l2: | ||
+ | IF port[$3da] and 8=0 THEN goto l2; | ||
+ | END; | ||
+ | </source> | ||
+ | Jääb lugejate otsustada kumb funktsioon on parem ja mis kasu võib neist tänapäevasel ajal enam veel olla ;) | ||
===Lingid=== | ===Lingid=== | ||
446. rida: | 822. rida: | ||
* http://kodu.neti.ee/~qj223a/pascal/ | * http://kodu.neti.ee/~qj223a/pascal/ | ||
* http://wiki.freepascal.org/Secure_programming | * http://wiki.freepascal.org/Secure_programming | ||
+ | * http://eope.kehtna.edu.ee/pascal/index.htm | ||
+ | * http://www.ttkool.ut.ee/comp/kaug/prog1/prog011.html |
Viimane redaktsioon: 18. jaanuar 2013, kell 15:13
Sisukord
- 1 Sissejuhatus
- 2 Pascali paigaldamine
- 3 Pascali koodifail
- 4 Juhtstruktuurid ehk if-else, for ja case konstruktsioonid
- 5 Andmestruktuurid
- 6 Matemaatilised tehted
- 7 Klassid ehk meetodid
- 8 Konsoolilt sisendi lugemine
- 9 Parameetrid käsurealt
- 10 Jadatöötlus
- 11 Stringi ehk muutujate töötlus
- 12 Random ehk juhusliku arvu funktsioon
- 13 Kellaaeg
- 14 Värvid
- 15 Failidega tegelemine
- 16 Tsüklid
- 17 Andmebaasid
- 18 DOSi graafika Turbo Pascalis
- 19 Hiire kasutamine DOSis Turbo Pascalis
- 20 Waitretrace
- 21 Lingid
Sissejuhatus
Pascal on peamiselt programeerimise õppimisele orienteeritud keel, tuntud enda range struktuuri ning hea loetavuse poolest. Pascalis on põhimõtteliselt loodud sellised Ptorgammid nagu Total Commander ja Skype
Kõik selles tekstis edaspidi leiduvad palad on kirjutatud ja testitud FreePascalil va mõned üksikud millede juures tarkvara versioon eraldi märgitud.
http://vallaste.ee/index.htm?Type=UserId&otsing=1623
Pascali paigaldamine
komilaatoreid on loodud sellele keelele aegade jooksul mitmeid, neist küllap tundumad
- DOSi klassikaline Turbo Pascal mis hõlmab kompilaatorit ning integreeritud arendus keskonda (IDE) http://et.wikipedia.org/wiki/Turbo_Pascal
- FreePascal mis üritatud luua ühilduvana nii Delfi kui Turbo Pascaliga, vabavara http://www.freepascal.org/ http://freepascal.org/docs-html/rtl/
- Lazarus Delphit meenutav paljude erinevate opsüsteemide toega IDE ja RAD http://www.lazarus.freepascal.org/
- http://et.wikipedia.org/wiki/Pascal eestikeelne wikipedia artikkel pascal keelest
Pascali koodifail
Pascali koodifail omab ranget struktuuri. Näiteks muutujaid ei saa väärtustada suvalisel hetkel vaid ainult koodi alguses.
Pascali koodifaili struktuur
- program < nimi >;
- uses crt, graph jne ehk mis moodulid külge võetakse
- type < tüübideklaratsioonid >;
- var < muutujate deklaratsioonid >;
- funktsioonid ja protseduurid
- begin < lause 1> < lause n >; end. ehk koodiosa
Pascali kood esineb tekstifaili kujul, nt selline skript kirjutab 'Hello, world'
program tere;
uses crt;
begin
write('Hello, world');
end.
Pascalis on ekraanile teksti väljastamiseks kaks käsku: write mis lihtsalt teksti ekraanile ning writeln mis teeb peale teksti kirjutamist ka reavahetuse
Iga käsu lõpus peab asetsema märk ;
Soovides kirjutada teatud konsooli punkti märgi saab kasutada enne write või writeln käsku
gotoXY(10,20);
Kommentaarid kirjutatakse pascalis märkide { } vahele, näiteks
{ ekraan 12*15 punkti suur }
Ekraani puhastamieks on käsk
clrscr;
Juhtstruktuurid ehk if-else, for ja case konstruktsioonid
if Näiteks kui muutuja on väiksem kui number 25 siis teeme mingeid tehteid
if muutuja<25 then
begin
....
end;
või, kui b on võrdne c'ga siis väärtustame b nulliga.
if b=c then b:=0;
Näiteprogramm if käsu kasutamisest
uses crt;
var a,o:real;
begin
clrscr;
write('sisesta kellaaeg: ');
readln(a);
if (a<6.00) then writeln('Kas sa m2ngid j2lle Heroest?');
if (a=6) then writeln('Kas sa oled varajane v6i ei ole ikka veel magama saand?');
if (a<12.00) and (a>6.00) then writeln('Tere hommikust!');
if (a=12.00) then writeln('Head l6unat!');
if (a<18.00) and (a>12.00) then writeln('Head p2rastl6unat!');
if (a=18.00) then writeln('Head seebi vahtimist!');
if (a<22.00) and (a>18.00) then writeln('Head 6htut');
if (a=22.00) then writeln('Mine magama!');
if (a>22.00) then writeln('MIKS SA EI MAGA!!!');
readln;
end.
For
Kümmne sammuline tsükkel kasutades For käsku.
for i:=1 to 10 do write('number',n);
case
Näide kursori liigutamisest
if keypressed then c:=readkey; {kui klahvi vajutati loeme mis klahv see olla võis}
{järgnevad numbrid on DOSi klaviatuuri nooleklahvide koodid}
case c of #75: begin if x[sp]-vahe>XMin then x:=x-vahe; end; { Paremale }
#77: begin if x[sp]+vahe<XMax then x:=x+vahe; end; { Vasakule }
#80: begin if y[sp]+vahe<YMax then y:=y+vahe; end; { Alla }
#72: begin if y[sp]-vahe>Ymin then y:=y-vahe; end; { šles }
end;
Andmestruktuurid
Muutujad ehk moodsat terminit kasutades sõne
Muutujate defineerimises on Pascal üsna range, nõutav on, et need oleksid defineeritud enne programmi põhiosa algust var all
näiteks
var
t2ht, t2ht1 : char;
s2na, string : string;
arv, number: integer;
miski: Boolean;
Raadius: Word;
Väärtuste omistamine toimub programmi põhiosas ehk begin' ja end vahel
näiteks
arv:=1;
Väärtuse väljastamine
writeln(arv);
Määrata saab ka eelnevalt stringi pikkuse nt
linn : String[15];
Ehk üle 15 märgi pikkuseid stringe kasutada ei saa
Parameetrina programmile ette antud muutujad saavad nime kujul
paramstr(1)
Massiiv
Massiiv (ingl. k. list) on järjestatud hulk
Massiiv võib olla nii jada kui tabeli kujul, näiteks
jada : array[1..10] of integer;
Moodustab jada nimega jada kus saab hoida numbreid
matrix:array[1..100,1..100] of ingeger;
Moodustab tabeli nimega matrix mis võib sisaldada infot numbrilisel kujul
Väärtuste andmine toimib kujul
matrix[9,9]:=1; matrix[10,9]:=1;
Massiivi elemendi poole pöördumine toimub selliselt
write(matrix[1,2]);
Seejuures võib numbrite asemel kasutada ka muutujaid
Võimalik on juba programmi luues eeldefineerida VAR all enne programmi algust mingeid muutujaid, nt kujul
const lines=24;
s: array[0..lines] of string=
(
'a','b','c','d','e','f','k','l','m','n','o','p','r','s','t','u','v',
'i','j','h','z','x','g','q','');
Millega tekitame 24 märgi pikkuse jada mis sisaldab tähestiku tähti va täpitähed
Võimalik on samuti enne VAR'i defineerida uusi recordeid näiteks
type
a = record
nimi : String[50];
vanus : integer;
sugu : Char;
end;
Kasutades nüüd seda uut loodud recordit näiteks jada loomisel
inimesed : array[1..10] of a;
Saab iga jada pesa hoida korraga kolme tüüpi infot, näiteks
inimesed[i].nimi:="Priit";
Matemaatilised tehted
Meil on muutuja a ja b mis sisaldavad mingeid arve ning soovime tulemuse omistada muutujale c.
Liitmine
c:=a+b;
Lahutamine
c:=a-b;
Korrutamine
c:=a*b;
Jagamine
c:=a/b;
Jadatöötlus käib lisades nurksulgudes positsiooni, nt kasutades mõnd teist muutujat.
j[b]:=j[b]+1 ;
Arvuti näide mis teeb kõiki tehteid
program arvut;
uses crt;
{algväärtustame muutujad mida kasutame}
var a,b:integer;
var c: real;
var mark: char;
{alustame programmiga}
begin
{puhastame ekraani}
clrscr;
{küsime muutuja a, tehte ja märgi b}
readln(a);
readln(mark);
readln(b);
if mark='+' then c:=a+b;
if mark='-' then c:=a-b;
if mark='*' then c:=a*b;
if mark='/' then c:=a/b;
{väljastame tulemi}
write('=',c:1:2);
{ootame klahvivajutust}
readln;
end.
Mõned keerukamad näited matemaatilisi tehteid tegevatest programmidest
Kolmnurga pindala arvutamine
write(' kirjuta kolmnurga alus :');
readln(a);
write(' kirjuta kolmnurga k6rgus;');
readln(h);
s:=a*h/2;
if(a>0) and (h>0) then writeln('pindala on :' ,s:2:2);
if(a<0) or (h<0) then writeln(' viga algandmetes ');
Ringi pindala arvutamine
program ringi_pindala;
var P,S: real;
begin
write('Ringi mbermäät: ');
readln(P);
S:=PI*sqr(P/(2*PI));
writeln('Vastus: ',S:6:2);
readln;
end.
Programm leiab arvude 1..15 ruudu ja kuubi
program ruutude_ja_kuupide_tabel;
var i: integer;
begin
for i:=1 to 15 do
writeln(i,'*',i,'=',(i*i):6,' ',i,'*',i,'*',i,'=', (i*i*i):6);
end.
Leiab kahe koordinaatteljestiku punkti vahelise kauguse
program punktide_vaheline_kaugus;
var x1,x2,y1,y2: integer;
begin
write('Sisesta x1: '); readln(x1);
write('Sisesta y1: '); readln(x2);
write('Sisesta x2: '); readln(y1);
write('Sisesta y2: '); readln(y2);
writeln('Punktide vaheline kaugus: ',sqrt(sqr(x2-x1)+sqr(y2-y1)):6:2);
readln;
end.
Klassid ehk meetodid
Meetodid (klassid) võimaldavad programmi teksti loogiliselt organiseerida, nt eraldada osa korduvaks kasutamiseks.
procedure ekraanile;
begin
gotoXY(1,1);
writeln("tere");
end;
Väljakutsumine toimub käsuga
ekraanile;
Konsoolilt sisendi lugemine
Soovides lugeda konsoolilt kasutaja poolseid sisestusi või klahvivajutusi tuleb toimida selliselt
write('Sisesta esimene arv: ');
readln(arv1);
Klahvivajutusi loetakse readkey nimelise funktsiooniga vt näidet allpool
{ Lihtne näide valikutest }
uses crt;
var c: char;
begin
clrscr;
writeln('1. Esimene');
writeln('2. Teine');
writeln('3. Kolmas');
repeat
c:=readkey;
if (c='1') then
begin
writeln('Esimene');
end;
if (c='2') then writeln('Teine');
if (c='3') then writeln('Kolams');
if (c='m') then writeln('m, nagu MINA');
until (c='q');
end.
Parameetrid käsurealt
Käsurealt antud parameetrite jaoks on muutuja paramstr, näiteks esimese parameetri leiab muutujast.
paramstr(1)
Parameetrite olemasolu programmi alguses saab kontrollida järgnevalt:
if (ParamCount<3) then begin Writeln('No parameters on command line'); writeln('Usage: <file1.txt> <file2.txt> <letter>'); writeln('Usage: input output char'); halt(1); end;
Jadatöötlus
Mõned jadatöötluse näited
Programm väljastab sisestadud jada elemendid mis on väiksemad keskmisest }
program jada_keskmine;
var jada: array[1..100] of integer;
i,n,s: integer;
procedure loe;
begin
for i:=1 to n do readln(jada[i]);
end;
begin
write('Mitu liiget on jadas: '); readln(n);
writeln('Sisesta jada..');
loe;
s:=0;
for i:=1 to n do s:=s+jada[i];
writeln('Väiksemad keskmisest: ');
for i:=1 to n do if jada[i]<(s/n) then writeln(jada[i]);
readln;
end.
Proge leiab jada sisestatud arvudest suurima arvu...
program suurim_jada_liige;
var a: array[1..100] of integer;
i,n,max: integer;
begin
writeln('Sisesta positiivsed jada liikmed, läpetuseks negatiivne arv...');
repeat { Loeme sisse jada liikmed }
i:=i+1;
readln(a[i]);
until a[i]<0;
n:=i-1;
max:=a[1];
for i:=1 to n do
if a[i]>max then max:=a[i];
writeln('Suurim: ',max);
readln;
end.
Stringi ehk muutujate töötlus
Kahe muutuja liitmiseks
password:=password+muutuja;
Värvime muutujas "tekst" leiduva märgi t2ht (a) roheliseks
tekst:='metsaloomad';
t2ht:='a';
for i:=1 to length(tekst) do
begin
if tekst[i]=t2ht then begin K:=k+1; textcolor(lightgreen); end;
{ if tekst[i]=t2ht then textcolor(2);}
end;
programm leiab pikima sõna stringis ja väljastab selle koos sõna pikkusega
program pikim_sona;
var str: string[100];
max,i,pikkus,n:word;
ps: string[15];
s: array[1..20] of string[15];
sp: array[1..20] of word;
begin
write('String: ');
readln(str);
pikkus:=length(str)+1;
str:=str+' ';
i:=1;
while pikkus>0 do
begin
sp[i]:=pos(' ',str)-1;
s[i]:=copy(str,1,sp[i]);
delete(str,1,sp[i]+1);
pikkus:=pikkus-sp[i]-1;
i:=i+1;
end;
n:=i-1;
max:=sp[1];
ps:=s[1];
for i:=1 to n do
if max<sp[i] then
begin
max:=sp[i];
ps:=s[i];
end;
writeln ('Pikim säna: ',ps,' ... ',max,' t„hte ...');
readln;
end.
Random ehk juhusliku arvu funktsioon
Enne seda tuleb anna programmi alguses käsk
randomize;
Ning seejärel võib kasutada erinevatele muutujatele väärtuste omistamisel või ekraanile väljatamisel käsku
random(25)
Mis hetkel tähendab, et funktsioon võtab suvalise numbri vahemikust 0..25
Näide
uses crt;
begin
clrscr; { Ekraan puhtaks }
randomize; { Suva arvude generaator }
repeat
randomize;
writeln(random(3)); {arvud 0..3}
{ootame kümme sekundit kasutades käsku delay}
delay(10);
until keypressed; {kuni klahvi vajutatakse}
end.
Kellaaeg
Selle saamiseks on olemas funktsioon GetDate, kasutamine
GetDate(y,m,d,dow); Writeln('Today is ', days[dow],', ', m:0, '/', d:0, '/', y:0);
Värvid
Teksti värvi saab muuta käsuga
Textcolor(yellow);
Taustavärvi
textbackground(green);
Näiteks
writeln('ise tegin!, ausalt!');
textcolor(lightred+blink);
textbackground(blue);
Värve saab lisaks öelda ka koodidega nagu
textcolor(7);
ja
textbackground(7);
Number sümboliseerib vastavat värvikoodi
Värvide koodid ise on järgnevad
Blue 1 Green 2 Cyan 3 Red 4 Magenta 5 Brown 6 LightGray 7 DarkGray 8 LightBlue 9 LightGreen 10 LightCyan 11 LightRed 12 LightMagenta 13 Yellow 14 White 15
Failidega tegelemine
Faili kirjutamine
Assign(F, 'fail.txt');
Rewrite(F);{kui faili pole tekitame, kui on kirjutame üle}
writeln(F, arv1);
close(f);
Faili lisamiseks tuleb avada ta käsuga
Append(F);
Faili töötlemise näide, loeme kokku palju on parameetrina antud falis numbreid, suurtähti, väiketähti ja muid märke.
uses crt;
VAR
mark: Char;
Sisend, Valjund: Text;
Numbreid, Suurtahti, Vaiketahti, Teisimarke: Integer;
f: text;
Begin
clrscr;
Numbreid := 0;
Suurtahti := 0;
Vaiketahti := 0;
Teisimarke := 0;
assign(F,paramstr(1));
reset(f);
while not Eof(f) Do
begin
Read(f, mark);
CASE Mark OF
'0'..'9':Inc(Numbreid);
'A'..'Z':Inc(Suurtahti);
'a'..'z':Inc(Vaiketahti);
ELSE
Inc(TeisiMarke)
END;
end;
close(f);
writeln('Numbreid: ',Numbreid);
writeln('Suuri tähti: ',Suurtahti);
writeln('Väikeseid tähti: ',Vaiketahti);
writeln('Teisi märke: ',Teisimarke);
END.
http://www.ttkool.ut.ee/comp/failid/failid_pas.html
Tsüklid
Näiteks lõputu kordus mis kestab senikaua kuni vajutatakse mõnd klahvi
begin
repeat
write('1')
delay(100);
until keypressed;
end.
tabeli 100x100 algväärtustamiseks sobib järgnev näide
{hiigelmaarix saab suvalised väärtused}
for x:=1 to 100 do
begin
for y:=1 to 100 do
begin
matrix[x,y]:=0;
end;
end;
Andmebaasid
FreePascal on võimeline kasutama nii mysqli kui postgresqli
lähemalt sellest lingil http://www.freepascal.org/packages/mysql.html
DOSi graafika Turbo Pascalis
Tõenöoliselt asi mis tänapäeval enam erilist kasutust ei leia kuid ajaloo huvides tooks siiski ära
kasutamiseks peab olemas olema Egavga.bgi ja Graph.tpu
uses graph;
var
gd,gm : integer;
procedure graafika;
begin
gd:=Detect; InitGraph(gd,gm,'');
end;
begin
(igasugu käsud mis joonistavad graafilisi objekte)
...
end.
Näide
USES Graph;
{{$l Kaivita}
var
Draiver, Mood: Integer;
procedure KaivitaGraafika;
begin
Draiver:=Detect;
InitGraph(Draiver,Mood,'');
end;
BEGIN
{kehtestame graafikareziimi}
KaivitaGraafika;
{ Joonistame ringjoone }
Circle(80, 100, 40);
OutTextXY(48, 160, 'Ringjoon');
{ joonistame ristküliku }
Rectangle(140, 80, 220, 120);
OutTextXY(146, 160, 'Ristkülik');
{ rohelise mustriga ringjoon }
SetFillStyle(4, Green);
Circle(280, 100, 40);
FloodFill(280, 100, GetColor);
OutTextXY(246, 160, 'Ringjoon');
OutTextXY(230, 175, 'Rohelise mustriga');
{ ümbritseme kujundid ristkülikuga }
Rectangle(2, 20, GetMaxX, GetMaxY DIV 2 + 20);
OutText('Vajuta Enter-ile');
Readln;
CloseGraph;
END. { Lihtkujundid }
Hiire kasutamine DOSis Turbo Pascalis
Samuti lahendus mida tänapäeval enam vaja ei lähe kuid igaks juhuks tähendaks selle tarkuse siiski üles.
Hiire koordinaadid
procedure getcoords(var xx,yy:integer);
var aa,bb:integer;
begin;asm;mov ax,0003h;int 33h;mov aa,cx;mov bb,dx;end;xx:=aa;yy:=bb;end;
Hiire vasak nupp
function LeftButton:boolean;
begin
leftbutton:=false;
if getbutton(1)then leftbutton:=true;
end;
Hiire parem nupp
function RightButton:boolean;
begin
rightbutton:=false;
if getbutton(2)then rightbutton:=true;
end;
Muide need koordinaadid on graafika omad ,et saada ikka dosi texti ekraani 25*80 koordinaate siis tuleb jagada nii X kui Y 8saga
Waitretrace
Waitretrace ehk kuidas kaotada programmist virvendus Tegemist on protseduuriga mis leiab sobiva aja järjekordse hunniku andmete saatmiseks videomällu. Nimelt joonistatakse kuvaris pilt rida-realt, kaadrisagedused vôivad varieeruda. Kui joonistamisega jôutakse paremale alla nurka, on vaja üles vasakule tagasi pöörduda, et uuesti nullist alustada ajavahemikku mis kulub tagasipöördumiseks, nimetatakse vertical retrace'iks ja selle ajal vôib sooritada videokirjutusoperatsioone, kartmata tihti probleemiks olevat virvendust (flicker), mis teinekor suurepäraste rakenduste vaatamist häirib. ôigete portide kasutamise korral on vôimalik tuvastada retrace'i aeg ja selle kestel kuvakirjutusi sooritada.
Näide waitretrace'i kasutamisest.
waitretrace assembleris
procedure waitretrace; assembler;
label l1, l2;
asm
mov dx,3DAh
l1:
in al, dx
and al,08h
jnz l1
l2:
in al,dx
and al,08h
jz l2
end;
Ja pascalis
procedure WaitRetrace;
VAR b : byte;
label l1, l2;
BEGIN
l1:
IF port[$3da] and 8>0 THEN goto l1;
l2:
IF port[$3da] and 8=0 THEN goto l2;
END;
Jääb lugejate otsustada kumb funktsioon on parem ja mis kasu võib neist tänapäevasel ajal enam veel olla ;)