Pascal

Allikas: Kuutõrvaja

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

FreePascal IDE
Lazarus IDE

Pascali koodifail

Pascali koodifail omab ranget struktuuri. Näiteks muutujaid ei saa väärtustada suvalisel hetkel vaid ainult koodi alguses.

Pascali koodifaili struktuur

  1. program < nimi >;
  2. uses crt, graph jne ehk mis moodulid külge võetakse
  3. type < tüübideklaratsioonid >;
  4. var < muutujate deklaratsioonid >;
  5. funktsioonid ja protseduurid
  6. 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 ;)

Lingid