kuvan 1 ohjelma saadaan File - New... : New, Console Application tai kirjoitetaan halutulla editorilla ja käännetään ja ajetaan komentorivillä

Samankaltaiset tiedostot
Kielioppia: toisin kuin Javassa

Java-kielen perusteet

Alkuarvot ja tyyppimuunnokset (1/5) Alkuarvot ja tyyppimuunnokset (2/5) Alkuarvot ja tyyppimuunnokset (3/5)

Perusteet. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät Pasi Sarolahti

Kuvat: Malliohjelmat:

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

1.3 Lohkorakenne muodostetaan käyttämällä a) puolipistettä b) aaltosulkeita c) BEGIN ja END lausekkeita d) sisennystä

1.3Lohkorakenne muodostetaan käyttämällä a) puolipistettä b) aaltosulkeita c) BEGIN ja END lausekkeita d) sisennystä

17. Javan omat luokat 17.1

20. Javan omat luokat 20.1

Ehto- ja toistolauseet

Sisällys. 20. Javan omat luokat. Java API. Pakkaukset. java\lang

Ohjelmointi 1 C#, kevät 2013, 2. tentti

Perusteet. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät Pasi Sarolahti

Ohjelmointiharjoituksia Arduino-ympäristössä

17. Javan omat luokat 17.1

Java-kielen perusteet

Metodit. Metodien määrittely. Metodin parametrit ja paluuarvo. Metodien suorittaminen eli kutsuminen. Metodien kuormittaminen

Java-kielen perusteita

Muuttujatyypit ovat Boolean, Byte, Integer, Long, Double, Currency, Date, Object, String, Variant (oletus)

RINNAKKAINEN OHJELMOINTI A,

Java-kielen perusteet

Tieto ja sen osoite (3) Jakso 3 Konekielinen ohjelmointi (TTK-91, KOKSI) Osoitinmuuttujat. Tieto ja sen osoite (5)

Java kahdessa tunnissa. Jyry Suvilehto

Tähtitieteen käytännön menetelmiä Kevät 2009 Luento 4: Ohjelmointi, skriptaus ja Python

Olio-ohjelmointi Syntaksikokoelma

Jakso 3 Konekielinen ohjelmointi (TTK-91, KOKSI)

Ohjelmointi 2. Jussi Pohjolainen. TAMK» Tieto- ja viestintäteknologia , Jussi Pohjolainen TAMPEREEN AMMATTIKORKEAKOULU

Ohjelmointi 1 C#, kevät 2013,

Vertailulauseet. Ehtolausekkeet. Vertailulauseet. Vertailulauseet. if-lauseke. if-lauseke. Javan perusteet 2004

Operaattoreiden ylikuormitus. Operaattoreiden kuormitus. Operaattoreiden kuormitus. Operaattoreista. Kuormituksesta

Tähtitieteen käytännön menetelmiä Kevät 2009 Luento 5: Python

Ohjelmoinnin perusteet Y Python

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

Jakso 3 Konekielinen ohjelmointi (TTK-91, KOKSI)

Koottu lause; { ja } -merkkien väliin kirjoitetut lauseet muodostavat lohkon, jonka sisällä lauseet suoritetaan peräkkäin.

Ohjelmoinnin peruskurssien laaja oppimäärä

Rajapinta (interface)

Ohjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti:

Groovy. Niko Jäntti Jesper Haapalinna Group 31

Pythonin alkeet Syksy 2010 Pythonin perusteet: Ohjelmointi, skriptaus ja Python

Javascript 2: Ohjelmointikielen ominaisuudet. Jaana Holvikivi Metropolia

Tietueet. Tietueiden määrittely

9. Periytyminen Javassa 9.1

ITKP102 Ohjelmointi 1 (6 op)

13. Loogiset operaatiot 13.1

ITKP102 Ohjelmointi 1 (6 op)

Kääreluokat (oppikirjan luku 9.4) (Wrapper-classes)

5/20: Algoritmirakenteita III

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

Tutoriaaliläsnäoloista

Ohjelmoinnin perusteet Y Python

Tietorakenteet ja algoritmit

Ohjelmoinnin perusteet Y Python

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. X Poikkeusten käsittelystä

Tietorakenteet. JAVA-OHJELMOINTI Osa 5: Tietorakenteita. Sisällys. Merkkijonot (String) Luokka String. Metodeja (public)

tietueet eri tyyppisiä tietoja saman muuttujan arvoiksi

15. Ohjelmoinnin tekniikkaa 15.1

Funktionimien kuormitus. TIES341 Funktio ohjelmointi 2 Kevät 2006

Luokka Murtoluku uudelleen. Kirjoitetaan luokka Murtoluku uudelleen niin, että murtolukujen sieventäminen on mahdollista.

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?

Tyyppejä ja vähän muutakin. TIEA341 Funktio ohjelmointi 1 Syksy 2005

815338A Ohjelmointikielten periaatteet Harjoitus 4 vastaukset

Olion elinikä. Olion luominen. Olion tuhoutuminen. Olion tuhoutuminen. Kissa rontti = null; rontti = new Kissa();

15. Ohjelmoinnin tekniikkaa 15.1

System.out.printf("%d / %d = %.2f%n", ekaluku, tokaluku, osamaara);

Muuttujat ja kontrolli. Ville Sundberg

Ohjelmoinnin perusteet Y Python

A TIETORAKENTEET JA ALGORITMIT

IDL - proseduurit. ATK tähtitieteessä. IDL - proseduurit

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

ATK tähtitieteessä. Osa 3 - IDL proseduurit ja rakenteet. 18. syyskuuta 2014

Laskennallisesti Älykkäät Järjestelmät. Sumean kmeans ja kmeans algoritmien vertailu

Ehto- ja toistolauseet

Sisällys. 9. Periytyminen Javassa. Periytymismekanismi Java-kielessä. Periytymismekanismi Java-kielessä

Ohjelmassa muuttujalla on nimi ja arvo. Kääntäjä ja linkkeri varaavat muistilohkon, jonne muuttujan arvo talletetaan.

C++ rautaisannos. Kolme tapaa sanoa, että tulostukseen käytetään standardikirjaston iostreamosassa määriteltyä, nimiavaruuden std oliota cout:

Ohjelmoinnin perusteet Y Python

1. luento. Ohjelmointi (C) T0004 Syksy luento. 1. luento. 1. luento. 1. luento. kurssin sisältö ja tavoitteet työmuodot.

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Taulukot & Periytyminen

Olio-ohjelmointi Javalla

Tietotyypit ja operaattorit

13. Loogiset operaatiot 13.1

812336A C++ -kielen perusteet,

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

4. Luokan testaus ja käyttö olion kautta 4.1

Ohjelmoinnin perusteet Y Python

1. Esittelyt ja vakiot 1.1 Esittelyt (declarations) Ennen nimen, tunnuksen (identifier) käyttöä se on

P e d a c o d e ohjelmointikoulutus verkossa

Ohjelmointikieli TIE Principles of Programming Languages Syksy 2017 Ryhmä 19

2. Lisää Java-ohjelmoinnin alkeita. Muuttuja ja viittausmuuttuja (1/4) Muuttuja ja viittausmuuttuja (2/4)

7. Näytölle tulostaminen 7.1

Sisällys. 9. Periytyminen Javassa. Periytymismekanismi Java-kielessä. Periytymismekanismi Java-kielessä

05/04/2004. Digitaalisen median tekniikat, k2004 HY/TKTL, javascript_1. Harri Laine 1. JavaScript

Sisällys. 1. Omat operaatiot. Yleistä operaatioista. Yleistä operaatioista

Digitaalisen median tekniikat JavaScript

Luento 3 Konekielinen ohjelmointi (TTK-91, KOKSI)

Digitaalisen median tekniikat JavaScript Harri Laine 1

Listarakenne (ArrayList-luokka)

TIE PRINCIPLES OF PROGRAMMING LANGUAGES Eiffel-ohjelmointikieli

Transkriptio:

Sisällys 1 Object Pascal...2 1.1 Ohjelman rakenne...2 1.2 Käännösyksiköt...3 1.3 Kielen perusrakenteita...4 1.3.1 Muuttujat...4 1.3.2 Tyypit...5 1.3.3 Tyyppikonversiot...5 1.3.4 Vakiot...5 1.3.5 Taulukot...6 1.3.6 Tietueet...6 1.3.7 Lueteltu tyyppi...7 1.3.8 Joukot...7 1.3.9 Osoittimet...8 1.3.10 Dynaamisuus...8 1.3.11 Osoittimien määrittely ja käyttö...8 1.4 Operaattorit...9 1.4.1 Aritmeettiset operaattorit...9 1.4.2 Vertailuoperaattorit...9 1.5 Lauserakenteita...9 1.5.1 Valintalauseet...9 1.5.2 Toistolauseet...10 1.5.3 Keskeytyslauseet...11 1.5.4 With-lause...11 1.6 Aliohjelmat...11 1.6.1 Proseduurit...11 1.6.2 Funktiot...12 1.7 Luokat ja oliot...12 1.8 Poikkeuksien hallinta...13 1.8.1 Poikkeuksien synnyttäminen...13 Liite 1: Standardifunktioita ja -proseduureja...14 Liite 2: Luokkahierarkiaesimerkki...17 1

1 Object Pascal helposti luettava nopeasti kääntyvä rakenteinen ohjelmointikieli, joka sisältää olio-ominaisuudet ja pohjalla Pascal-kieli käytetään mm. Delphi-sovelluskehittimessä Javasta Pascaliin - isot ja pienet kirjaimet samanarvoisia - sijoitusoperaattori :=, yhtäsuuruuden vertailu =, erisuuruuden vertailu <>, ei-operaattori not - lohkomääritys end parilla (vrt. Javan { } ) - merkkijonovakiot määritellään yksinkertaisten lainausmerkkien sisällä esim. 'tekstiä' - koodin kommentointi : { }, //, (* *) 1.1 Ohjelman rakenne ohjelma koostuu Delphissä - projektitiedostosta - lomakkeista (form), joissa käytetään VCL-kirjastokomponentteja - käännösyksiköistä (unit) { Konsolisovellus Delphillä} program Tapaus; {$APPTYPE CONSOLE} var MJono : string; // tästä alkaa pääohjelma Mjono := 'Mahtava maailma!'; WriteLn(Mjono); end. Kuva1: Konsolisovellus kuvan 1 ohjelma saadaan File - New... : New, Console Application tai kirjoitetaan halutulla editorilla ja käännetään ja ajetaan komentorivillä dcc32 tapaus tapaus ohjelma alkaa varatulla sanalla program {$APPTYPE CONSOLE} kertoo kääntäjälle, että ohjelma on komentoriviltä ajettava 2

seuraavaksi tulee var-lohko, joka alkaa varatulla sanalla var - lohkossa määritellään ohjelmassa käytettävät muuttujat, muotoa: var muuttuja1, muuttuja2, muuttuja3 : tyyppi1; muuttuja4, muuttuja5 : tyyppi2; seuraavana alkaa pääohjelma, joka alkaa varatulla sanalla lauseet erotetaan puolipisteellä. Siis Writeln-rivin lopussa oleva puolipiste ei ole pakollinen... ohjelma loppuu varattuun sanaan end ja sitä seuraavaan pisteeseen. Delphin projektissa, josta tehdään kokonainen 'tuote' (sovellus, komponentti, dll-kirjasto), on oltava aina projektitiedosto program helloprj; uses Forms, hello in 'hello.pas' {Form1}; {$R *.RES} Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; end. Kuva 1: Projektin pääohjelma uses-lauseessa luetellaan ne käännösyksiköt, joiden palveluita (ominaisuuksia) ohjelma käyttää. Lauseella saadaan siis käyttöön haluttujen käännösyksiköiden palvelut. ohjelman rungossa alustetaan ohjelma, luodaan ikkunat ja käynnistetään sovellus 1.2 Käännösyksiköt jokaista lomaketta kohti on aina yksi käännösyksikkö, jossa on esim. lomakkeen tapahtumankäsittelijät voidaan myös tehdä käännösyksiköitä, jotka eivät liity mihinkään lomakkeeseen - ohjelmalogiikka tulisi sijoittaa tällaisiin käännösyksiköihin käännösyksikön osat: unit Yksi; interface uses { interface-osan käyttämät käännösyksiköt } { Interface-osa } implementation uses { implementation-osan käyttämät käännösyksiköt, joita ei nimetty interface-osan uses-kohdassa } 3

{ Implementation-osa } initialization { Initialization-osa, ei pakollinen } finalization { Finalization-osa, ei pakollinen } end. unit-otsikko kertoo käännösyksikön nimen - oltava sama kuin mille nimelle tiedosto tallennetaan (poislukien tiedostopääte) HUOM! käännösyksikön ja projektitiedoston nimi eivät saa olla samat, vaikka niillä on eri tiedostopääte interface-lohkossa esitellään vakiot, muuttujat, tyypit, proseduurit ja funktiot, jotka halutaan tarjota muiden käännösyksiköiden käyttöön - uses-osassa kerrotaan mitä käännösyksiköitä interface-osan määrittelyt käyttävät implementation-lohkossa sijaitsevat interface-lohkossa esiteltyjen proseduurien ja funktioiden toteutukset (ohjelmakoodi) lisäksi määritellään käännösyksikön omassa yksityisessä käytössä olevat vakiot, muuttujat, tyypit, proseduurit ja funktiot initialization-lohko ei ole pakollinen; lohkon koodi suoritetaan ohjelman käynnistyessä ja siellä voidaan suorittaa käännösyksikön muuttujien alustukset finalization-lohko ei ole pakollinen; lohkon koodi suoritetaan ohjelman suorituksen loppuessa käännösyksikön lopussa on aina oltava end. 1.3 Kielen perusrakenteita 1.3.1 Muuttujat perustietotyypit Integer Char Boolean Real String kokonaislukutyyppi, eri versioita esim. Shortint ja Longint merkkityyppi, voi sisältää yhden merkin totuusarvo, voi sis. True tai False reaalilukutyyppi, eri versioita merkkijonotyyppi, eri versioita muuttujien määrittelyt joko interface- tai implementation -osaan tai aliohjelman paikalliset muuttujat otsikon ja :n väliin omaan var-lohkoon paikalliset muuttujat (aliohjelman sisäinen tai luokan jäsenmuuttuja) pitää alustaa ennen käyttöä (arvo määrittelemätön muuttujan esittelyn jälkeen) esim. var Form1 : TForm1; Kluku1, Kluku2 : Integer; Merkki : Char; Kluku1 := 1; Kluku1 := Kluku1 +1; // ok // ei ok, arvo satunnainen!! Kluku1 := Kluku2; 4

1.3.2 Tyypit määritellään type-lohkossa Delphin kaikki valmiit tyyppinimet (ei-perustietotyypit) alkavat T-kirjaimella (tapaa voi käyttää myös omissa tyyppimäärityksissä) type TPaivat = (Maanantai, Tiistai, Keskiviikko, Torstai, Perjantai, Lauantain, Sunnuntai); TArkipaivat = Maanantai..Perjantai; 1.3.3 Tyyppikonversiot esim. tekstikomponentin teksti tarvitaan muuttaa kokonaisluvuksi i := StrToInt(Edit1.Text); paljon valmiita funktioita, yleisesti tyypinmuunnos (type cast) tyyppi(muuttuja) mikäli mahdollista toteuttaa (ei suositella numeerisille tyypeille), oliomuuttujilla myös as-operaattori esim. (Sender as TButton).Caption := '&Ok'; useimmin tarvittavia muunnosfunktioita (kts. myös liite 1) CurrToStr valuutta merkkijono DateTimeToStr DateTime merkkijono DateToStr -"- FloatToStr Float merkkijono IntToStr kokonaisluku merkkijono StrToCurr merkkijono valuutta StrToDate merkkijono DateTime StrToDateTime -"- StrToFloat merkkijono Float StrToInt merkkijono kokonaisluku StrToTime merkkijono DateTime TimeToStr DateTime merkkijono Int liukuluku kokonaisluku Round liukuluku kokonaisluku (pyöristys) Chr kokonaisluku (ASCII-koodi) Char 1.3.4 Vakiot määritellään const-lohkossa - kannattaa sijoittaa var-lohkon edelle const MinimiArvo = 0; MaksimiArvo = 10; Pii = 3.14159265359; 5

1.3.5 Taulukot yksi- tai useampiulotteinen käytetyt indeksit voidaan valita määrittelyssä (indeksien tarkistukseen voi käyttää low- ja highfunktioita) var taulu1 : array [1..100] of real; taulu2 : array [1..5,1..5,1..5] of integer; taulu3 : array [1..10,1..10] of string; näihin voitaisiin viitata taulu1[5] := 10; taulu2[1,2,5] := 1; taulu3[1,5] := 'Tietoa'; staattisten taulukoiden lisäksi on mahdollista tehdä myös dynaamisia taulukoita (dynamic arrays) esim. var A : array of string; SetLength(A, 1); A[0] := 'teksti'; aliohjelmien parametreissa voidaan jättää tarvittaessa indeksit määrittelemättä (open array parameters) esim. procedure Clear(var A: array of Real); var I: Integer; for I := 0 to High(A) do A[I] := 0; 1.3.6 Tietueet tietuetyypin määrittelyllä voidaan luoda rakenteinen tyyppi, jonka arvoja voidaan käsitellä kokonaisina (esim. parametrin välityksessä), vrt. oliot type tietuetyyppinimi = record kenttä : tyyppi;... kenttä : tyyppi; tietuetyyppinimi on uuden tyypin nimi kenttä on kentän nimi tyyppi on kentän tyyppi tietueen kenttiin viitataan pistenotaatiolla tietuemuuttuja.kenttä 6

esim. program tietueohj; type Henkilotiedot = record Nimi : string; Osoite : string; Ika : Integer; var Tietue : Henkilotiedot; Tietue.Nimi := 'Matti'; Tietue.Ika := 55; end. 1.3.7 Lueteltu tyyppi merkinnällä type tyyppinimi = (arvo1,..., arvon) voidaan määritellä lueteltuja tyyppejä (enumerated types) esim. type TKorttiMaa = (hertta, ruutu, risti, pata ); määrittelee tyypin TKorttiMaa, jonka mahdollisia arvoja ovat hertta, ruutu, risti, pata. Arvoilla on listan mukainen edeltäjä/seuraaja-järjestys (voidaan käyttää funktioita ord, pred, succ, high, low). TKorttiMaa-tyyppiä voidaan käyttää esim. var maa: TKorttiMaa; maa := ruutu; maa := succ(maa); if (maa = risti) then 1.3.8 Joukot case maa of hertta: ruutu: risti: pata: voidaan määritellä joukkoja (sets) vain tietyltä numeroituvalta lukualueelta (esim. kokonaisluku, merkki, lueteltu tyyppi) joukko-operaatiot käytössä (lisäys, unioni, leikkaus, kuuluu joukkoon jne. (set operators) ) esim. type joukko = set of 1..255; var j : joukko;... 7

j := [2, 4, 20]; tai esim. if Input in ['k', 'K', 'e', 'E'] then... if Input in j then... 1.3.9 Osoittimet 1.3.10 Dynaamisuus esim. linkitetty lista lista koostuu solmuista, joista jokaisesta osoitin (linkki) seuraavaan tarvitaan osoitin listan alkuun, nimetään se tässä Alku:ksi Alku 1.3.11 Osoittimien määrittely ja käyttö kukin osoitin osoittaa aina tietyn tyyppisiä kohteita keskitytään tässä tietuetyyppisiin kohteisiin osoittaviin osoittimiin osoittimen tyyppi määritellään type-lohkossa - ensin määritellään osoitintyyppi: ^osoitettava-tyyppi - sitten määritellään osoitettava tietuetyyppi osoitinmuuttuja arvo nil tarkoittaa, ettei osoitin osoita mihinkään kohteeseen unit UOsoitin; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(tform) Button1 : TButton; procedure Button1Click(Sender : TObject); private { private declarations } public { public declarations } Osoitin = ^Solmu; Solmu = record Nimi : string; Seuraava : Osoitin; var Form1 : TForm1; 8

Alku, P, Apu : Osoitin; implementation {$R *.DFM} procedure TForm1.Button1Click(Sender TObject); New(Alku); P := Alku; Alku^.Seuraava := nil; Alku^.Nimi := 'Matti'; New(Apu); Apu^.Seuraava := nil; P^.Seuraava := Apu; Apu^.Nimi := 'Antero'; end. New:lla varattu tila pitää vapauttaa dispose:lla, kun varattua tilaa ei enää tarvita - varattua tilaa ei automaattisesti vapauteta, vaan tarpeettomaksi jäänyt tila haaskaa muistia dispose(p); { P on osoitintyyppiä ja osoittaa varattuun tilaan } 1.4 Operaattorit toisin kuin esim. Javassa, C:ssä ja C++:ssa, Pascalissa sijoitus(operaattori) on := 1.4.1 Aritmeettiset operaattorit + - * / div (kokonaislukujakolasku) mod (jakojäännös) 1.4.2 Vertailuoperaattorit = <> < > <= >= in (kuuluu joukkoon, esim. vastaus in ['k', 'K'] 1.4.3 Loogiset operaattorit and or not toimivat myös bittioperaattoreina 1.5 Lauserakenteita 1.5.1 Valintalauseet if ja case if ehtolause then lause else lause; else-osa ei ole pakollinen 9

HUOM! jos else-osa on, ei then-osan lause:en perässä saa olla puolipistettä! if Kluku1<=MaksimiArvo and Kluku1>=MinimiArvo then Edit1.Text := 'Tosi'; Kluku1 := 0; end else Edit1.Text := 'Epätosi'; Huom! Ei puolipistettä end:n perässä!!! case-lauseella voidaan valita useasta vaihtoehdosta case lauseke of arvovaihtoehto: lause; else lause; end lausekkeen on oltava ordinaali (lueteltu tyyppi, kokonaisluku, merkki) else-osa ei pakollinen esim. case Kluku1 of 0 : Edit1.Text:='Nolla'; 1 : Edit1.Text:='Yksi'; 2,3 : Edit1.Text:='Kaksi tai kolme'; 4..6 : Edit1.Text:='Neljästä kuuteen'; else Edit1.Text := 'Yli kolmen.'; { case-lauseen päättävä end!} 1.5.2 Toistolauseet repeat until, while ja for repeat lause until ehtolause while ehto do lause for indeksi:=alaraja to yläraja do lause esim. Vastaus := 1; i := 1; repeat Vastaus := i*vastaus; i := i + 1; until i>10; Vastaus := 1; i := 1; while i<=10 do 10

Vastaus := i*vastaus; i := i + 1; Vastaus := 1; for i:=1 to 10 do Vastaus := i*vastaus; 1.5.3 Keskeytyslauseet Exit (keskeyttää proseduurin ja function suorituksen) Break (keskeyttää for-, while- ja repeat lauseet) Continue (keskeyttää for-, while- ja repeat lauseiden toistokierroksen) Halt (keskeyttää koko ohjelman suorituksen, graafisissa VCL-sovelluksissa normaali lopetus esim. Application.Terminate-kutsulla ) 1.5.4 With-lause With.. Do -lausetta voidaan käyttää lyhentämään pitkiä viittausketjuja, esim. var Tietue : Henkilotiedot; with Tietue do Nimi := 'Matti'; Ika := 55; end. 1.6 Aliohjelmat kahdenlaisia - funktiot palauttavat arvon - proseduurit eivät aliohjelmat kuten esim. muuttujat pitää olla esitelty ennen käyttöä (joko esittely tai koko toteutus), joten aliohjelmien kirjoitusjärjestyksellä on joissakin tapauksessa väliä 1.6.1 Proseduurit procedure kertomap(var kert : Integer, const k : Integer = 1;); var i : Integer; kert := 1; for i:=2 to k do kert := i*kert; otsikon ja rungon välissä voidaan määritellä tyyppejä, vakioita ja muuttujia 11

var-sana parametrin nimen edessä mahdollistaa parametrina annetun muuttujan arvon muuttamisen (ns. muuttujaparametri), listan lopussa olevilla parametreilla voi olla myös oletusarvo, jota käytetään, jos kutsussa ei välitetä parametria const-sanalla voidaan parametri määritellä vakioksi aliohjelman sisällä, jolloin kääntäjä estää muuttujan arvon muuttamisen aliohjelman sisällä proseduurista voidaan poistua kesken suorituksen käyttämällä standardiproseduuria exit proseduurin kutsu esim. var krt : Integer;... kertomap(strtoint(edit1.text),krt); Edit1.Text := IntToStr(krt); 1.6.2 Funktiot function kertoma(k : Integer) : Integer; var kert, i : Integer; kert := 1; for i:=2 to k do kert := i*kert; kertoma := kert; // result := kert; arvo palautetaan sijoittamalla se funktion nimeen tai result-muuttujaan (valmiiksi määritelty), sijoitus ei lopeta funktion suorittamista kuten esim. Javan return-kutsu funktion kutsu esim. Edit1.Text := IntToStr(kertoma(StrToInt(Edit1.Text))) 1.7 Luokat ja oliot luokka määritellään type-lohkossa käyttäen class-esittelyä (Kts. liite 2) näkyvyys joko public, protected tai private, (published komponenttien ominaisuuksilla) class-esittelyssä voidaan antaa yliluokka, kaikkien luokkien yliluokka on TObject kaikki luokista luodut oliot ovat dynaamisia (käytännössä osoittimia), eli ne pitää itse luoda ennen käyttöä (=kutsua muodostinta (constructor)) ja poistaa käytön jälkeen (kutsua hajotinta, (destructor)) self- osoitin Delphissä vastaa Javan this-osoitinta aliluokissa mahdollisesti ylikirjoitettavat metodit määritellään varatun sanan virtual avulla ja metodin ylikirjoitus tehdään varatun sanan override avulla yliluokan metodia kutsutaan varatun sanan inherited avulla Delphin versiosta 4 alkaen metodien ylikuormitus mahdollista overload-määreellä yliluokan muodostimet periytyvät automaattisesti, mutta kannattaa ehkä aina kirjoittaa yksi Create - niminen parametritön muodostin, koska tällainen on kantaluokassa (TObject) ja käyttäjä voi vanhasta tottumuksesta luoda olion esiintymän käyttäen tätä muodostinta myös hajottimet periytyvät, eli sitä ei tarvitse kirjoittaa joka luokkaan uudelleen. 12

vaikka hajottimia voi kirjoittaa useita eri nimisiä, kannattaa ehkä kirjoittaa aina vain Destroy - niminen hajotin, koska valmiit oliot tuhotaan Free - metodilla, joka taas kutsuu Destroy:ta (TObject- luokassa) dynaamisuuden takia joudutaan aina kutsumaan itse eksplisiittisesti olion esiintymän luomiseksi jotakin muodostinta ja lopuksi olion hävittämiseksi jotakin hajotinta, käytännössä varminta käyttää Free-metodia. As- ja Is-operaattoreita käytetään luokkien ja olioiden yhteydessä tyypinmuunnoksiin ja olion tyypin (luokan) testaamiseen 1.8 Poikkeuksien hallinta try.. finally ja try.. except try.. finally suorittaa try-osan ja riippumatta kuinka sen suoritus päättyy, suoritetaan finallyosan koodi aina sen jälkeen try.. except suorittaa try-osan ja poikkeuksen sattuessa se käsitellään oikeassa poikkeuksenkäsittelijässä except-osassa tai jos sopivaa ei löydy, jossain kauempana kutsuketjussa esim. { pseudoa } try Avaa tiedosto Lue ensimmäinen tietue Muuta tietueen arvoja Talleta tietue finally Sulje tiedosto procedure TForm1.Button1Click(Sender : TObject); var i : Integer; try i := StrToInt(Edit1.Text); except on E:exception do ShowMessage('Virhe: ' +E.message); 1.8.1 Poikkeuksien synnyttäminen esim. raise EMathError.Create('Synnytetty poikkeus'); 13

Liite 1: Standardifunktioita ja -proseduureja Procedure or function Description Abort Ends the process without reporting an error. Addr Returns a pointer to a specified object. AllocMem Allocates a memory block and initializes each byte to zero. ArcTan Calculates the arctangent of the given number. Assert Tests whether a boolean expression is True. Assigned Tests for a nil (unassigned) pointer or procedural variable. Beep Generates a standard beep using the computer speaker. Break Causes control to exit a for, while, or repeat statement. ByteToCharIndex Returns the position of the character containing a specified byte in a string. Chr Returns the character for a specified ASCII value. Close Terminates the association between a file variable and an external file. CompareMem Performs a binary comparison of two memory images. CompareStr Compares strings case sensitively. CompareText Compares strings by ordinal value and is not case sensitive. Continue Returns control to the next iteration of for, while, or repeat statements. Copy Returns a substring of a string or a segment of a dynamic array. Cos Calculates the cosine of an angle. CurrToStr Converts a currency variable to a string. Date Returns the current date. DateTimeToStr Converts a variable of type TDateTime to a string. DateToStr Converts a variable of type TDateTime to a string. Dec Decrements an ordinal variable. Dispose Releases memory allocated for a dynamic variable. ExceptAddr Returns the address at which the current exception was raised. Exit Exits from the current procedure. Exp Calculates the exponential of X. FillChar Fills contiguous bytes with a specified value. Finalize Uninitializes a dynamically allocated variable. FloatToStr Converts a floating point value to a string. FloatToStrF Converts a floating point value to a string, using specified format. FmtLoadStr Returns formatted output using a resourced format string. FmtStr Assembles a formatted string from a series of arrays. Format Assembles a string from a format string and a series of arrays. FormatDateTime Formats a date-and-time value. FormatFloat Formats a floating point value. FreeMem Disposes of a dynamic variable. GetMem Creates a dynamic variable and a pointer to the address of the block. GetParentForm Returns the form or property page that contains a specified control. Halt Initiates abnormal termination of a program. Hi Returns the high-order byte of an expression as an unsigned value. High Returns the highest value in the range of a type, array, or string. Inc Increments an ordinal variable. 14

Initialize Insert Int IntToStr Length Lo Low LowerCase MaxIntValue MaxValue MinIntValue MinValue New Now Ord Pos Pred Ptr Random ReallocMem Round SetLength SetString ShowException ShowMessage ShowMessageFmt Sin SizeOd Sqr Sqrt Str StrToCurr StrToDate StrToDateTime StrToFloat StrToInt StrToTime StrUpper Succ Sum Time TimeToStr Trunc UniqueString UpCase UpperCase VarArrayCreate Initializes a dynamically allocated variable. Inserts a substring at a specified point in a string. Returns the integer part of a real number. Converts an integer to a string. Returns the length of a string or array. Returns the low-order byte of an expression as an unsigned value. Returns the lowest value in the range of a type, array, or string. Converts an ASCII string to lowercase. Returns the largest signed value in an integer array. Returns the largest signed value in an array. Returns the smallest signed value in an integer array. Returns smallest signed value in an array. Creates a new dynamic variable and references it with a specified pointer. Returns the current date and time. Returns the ordinal value of an ordinal-type expression. Returns the index of the first character of a specified substring in a string. Returns the predecessor of an ordinal value. Converts a specified address to a pointer. Generates random numbers within a specified range. Reallocates a dynamic variable. Returns the value of a real rounded to the nearest whole number. Sets the dynamic length of a string variable or array. Sets the contents and length of the given string. Displays an exception message with its address. Displays a message box with an unformatted string and an OK button. Displays a message box with a formatted string and an OK button. Returns the sine of an angle in radians. Returns the number of bytes occupied by a variable or type. Returns the square of a number. Returns the square root of a number. Formats a string and returns it to a variable. Converts a string to a currency value. Converts a string to a date format (TDateTime). Converts a string to a TDateTime. Converts a string to a floating-point value. Converts a string to an integer. Converts a string to a time format (TDateTime). Returns a string in upper case. Returns the successor of an ordinal value. Returns the sum of the elements from an array. Returns the current time. Converts a variable of type TDateTime to a string. Truncates a real number to an integer. Makes a string unique. Converts a character to uppercase. Returns a string in uppercase. Creates a variant array. 15

VarArrayCreate VarArrayDimCount VarARrayHighBound VarArrayLock VarArrayLowBound VarArrayOf VarArrayRedim VarArrayRef VarArrayUnlock VarAsType VarCast VarClear CarCopy VarToStr VarType Returns number of dimensions of a variant array. Returns number of dimensions of a variant array. Returns high bound for a dimension in a variant array. Locks a variant array and returns a pointer to the data. Returns the low bound of a dimension in a variant array. Creates and fills a one-dimensional variant array. Resizes a variant array. Returns a reference to the passed variant array. Unlocks a variant array. Converts a variant to specified type. Converts a variant to a specified type, storing the result in a variable. Clears a variant. Copies a variant. Converts variant to string. Returns type code of specified variant. 16

Liite 2: Luokkahierarkiaesimerkki program Luokkia; { Konsolisovellus } {$APPTYPE CONSOLE } { Esimerkki ehdollisesta kaantamisesta: } {$DEFINE RTTI } uses SysUtils; {Format-funktiota varten} {-------------------------------------------} type cagraafinenolio = class protected x,y:integer; nakyy:boolean; procedure paikka(nx,ny:integer); public constructor Create; constructor Create2(ix,iy:integer); // overload, jos ylikuormitus destructor Destroy; override; procedure piirra; virtual; abstract; function nakyvissa:boolean; procedure sammuta; procedure sytyta; procedure siirra(nx,ny:integer); procedure tulosta(s:string); virtual; procedure cagraafinenolio.paikka( nx,ny:integer); x := nx; y := ny; constructor cagraafinenolio.create2( ix,iy:integer); inherited Create; paikka(ix,iy); nakyy := False; constructor cagraafinenolio.create; Create2(0,0); destructor cagraafinenolio.destroy; sammuta; inherited Destroy; function cagraafinenolio.nakyvissa:boolean; Result := nakyy; procedure cagraafinenolio.siirra( nx,ny:integer); if ( not nakyvissa ) then paikka(nx,ny); exit; 17

sammuta; paikka(nx,ny); sytyta; procedure cagraafinenolio.tulosta(s:string); {$IFDEF RTTI} write(format('%-10s: ',[ClassName])); {$ENDIF} write(format('%-10s (%02d,%02d)',[s,x,y])); procedure cagraafinenolio.sammuta; if ( not nakyvissa ) then exit; write('sammutettu: '); nakyy := False; piirra; procedure cagraafinenolio.sytyta; if ( nakyvissa ) then exit; write('sytytetty: '); nakyy := True; piirra; {-------------------------------------------} type casateellinenolio = class(cagraafinenolio) protected r:integer; procedure koko(nr:integer); public constructor Create3(ix,iy,ir:integer); constructor Create2(ix,iy:integer); constructor Create; procedure tulosta(s:string); override; procedure muuta_koko(nr:integer); procedure casateellinenolio.koko(nr:integer); r := nr; constructor casateellinenolio.create3( ix,iy,ir:integer); inherited Create2(ix,iy); koko(ir); constructor casateellinenolio.create2( ix,iy:integer); Create3(ix,iy,1); constructor casateellinenolio.create; inherited Create; koko(1); procedure casateellinenolio.tulosta(s:string); 18

inherited tulosta(s); write(' r=',r); procedure casateellinenolio.muuta_koko( nr:integer); if ( not nakyvissa ) then koko(nr); exit; sammuta; koko(nr); sytyta; {-------------------------------------------} type cpiste = class(cagraafinenolio) public procedure piirra; override; procedure cpiste.piirra; tulosta('piste'); writeln; {-------------------------------------------} type cympyra = class(casateellinenolio) public procedure piirra; override; procedure cympyra.piirra; tulosta('ympyra'); writeln; {Pääohjelma alkaa ---------------------------------} var p : cagraafinenolio; kuvat : array[0..9] of cagraafinenolio; p1,p2 : cpiste; y1 : cympyra; i : integer; p1 := cpiste.create; p2 := cpiste.create2(10,20); y1 := cympyra.create3(1,1,2); p1.sytyta; p2.sytyta; p1.siirra(7,8); y1.sytyta; y1.muuta_koko(5); (* Esimerkki polymorfismista *) p := cympyra.create3(9,9,9); p.sytyta; p.siirra(8,8); { p.muuta_koko(4); ei laillinen } {$IFDEF RTTI } if ( p is casateellinenolio ) then {$ENDIF} (p as casateellinenolio).muuta_koko(4); p.free; (* Esimerkki polymorfismista *) kuvat[0] := cympyra.create3(10,10,100); kuvat[1] := cpiste.create2(11,11); kuvat[2] := cympyra.create3(12,12,102); kuvat[3] := NIL; 19

i:=0; while ( kuvat[i] <> NIL ) do kuvat[i].sytyta; inc(i); i:=0; while ( kuvat[i] <> NIL ) do kuvat[i].free; inc(i); y1.free; p2.free; p1.free; end. {pääohjelma loppuu } Kuva 2: Esimerkin luokkahierarkia 20