Date post: | 04-Jun-2015 |
Category: |
Documents |
Upload: | pieter-beckers |
View: | 218 times |
Download: | 3 times |
November 2001 Eiffel sessie 1 p. 1
OBJECTGERICHT PROGRAMMEREN
Elk object behoort tot een klasse
REKENING
rek01
rek02
PRODUCT
prod01
prod02
prod03
November 2001 Eiffel sessie 1 p. 2
class TELLER
creation maken
feature waarde : INTEGER
feature maken is …feature verhogen is …feature verlagen is …feature terugzetten is …
end -- class TELLER
klassetekst
naam van de klasse
hoe wordt een object gecreëerd?
attributen : wat onthouden? (statisch)
diensten : wat doen? (dynamisch)
November 2001 Eiffel sessie 1 p. 3
Attributen (variabelen)
feature nummer : INTEGER bedrag : REAL
resultaat : DOUBLE letter : CHARACTER aanwezig : BOOLEAN naam : STRING
student1 : STUDENTaantal : INTEGER is 8
voorgedefineerde klassen
constante
November 2001 Eiffel sessie 1 p. 4
Diensten (procedures)
feature naam is do
instructies end -- naam
feature naam (parameter : CLASS) is do
instructies end -- naam
November 2001 Eiffel sessie 1 p. 5
feature naam (parameter : CLASS1) : CLASS2 is do
…Result := instructie
end -- naam
Functie
!! Result is van de klasse CLASS2
November 2001 Eiffel sessie 1 p. 6
Instructies: invoer/uitvoer
• io.readint, io.readreal, io.readchar, io.readline
• io.putint( ), io.putreal( ), io.putchar( ), io.putstring( ),io.putdouble( )
!! tussen haakjes staat object of waarde van
het type integer, real, character of string
vb. io.putint(45) io.putreal(bedrag)
• io.lastint, io.lastreal, io.lastcharacter, io.laststring
November 2001 Eiffel sessie 1 p. 7
• io.new_line
vb. io.putstring(“Geef je naam : ”)io.readlineio.new_lineio.putstring(io.laststring)
November 2001 Eiffel sessie 1 p. 8
Instructies : verwerking
• toewijzingsopdracht :=
vb. nummer := 3 nummer1 := nummer2
• bewerkingen : afhankelijk van het type (klasse) van de variabele
rekenkundige bewerkingen :
integer : +, -, *, //, \\ real : +, -, *, /, ^ boolean : and, or, xor, not
vb. nummer := nummer * 8
November 2001 Eiffel sessie 1 p. 9
vergelijkingsoperatoren :
=, <, >, <=, >=, /=
vb. aanwezig := teller /= 0
Vergelijk met := voor toewijzing
November 2001 Eiffel sessie 1 p. 10
Oefening :
Stel een klassetekst op voor REKENING. Een rekeningmoet kunnen worden geopend, waarbij ze een nummer krijgt toegewezen. Het saldo moet bij het openen uiteraard gelijk zijn aan nul. Van de rekening moet geld kunnen worden afgehaald ener moet geld kunnen worden op gestort. Bij het afsluiten van de rekening wordt het saldo weer op nul gezet.
November 2001 Eiffel sessie 1 p. 11
class REKENINGcreation openfeature …feature open (nr_in : INTEGER) is do
… end -- openfeature …
end -- class REKENING
waarde wordt bij het aanroepen van de procedure doorgegeven
November 2001 Eiffel sessie 1 p. 12
class REKENINGcreation openfeature nummer : INTEGER saldo : REAL feature open (nr_in : INTEGER) is do nummer := nr_in end -- openfeature afhalen (bedrag : REAL) is do saldo := saldo - bedrag end -- afhalenfeature storten (bedrag : REAL) is do saldo := saldo + bedrag end -- stortenfeature afsluiten is do saldo := 0 end -- afsluitenend -- class REKENING
class BANKcreation openfeature rek1, rek2 : REKENINGfeature open is do create rek1.open(11111) create rek2.open(22222) rek1.storten(10000) rek2.storten(5000) rek1.afhalen(4000) toon_saldo(rek1) toon_saldo(rek2) end -- openfeature toon_saldo (rek_in : REKENING) is do io.putstring(“het saldo van rekening ”) io.putint(rek_in.nummer) io.putstring(“ bedraagt ”) io.putreal(rek_in.saldo) end -- toon_saldoend -- class BANK
-- Uitvoerlogica -- in een aparte dienst
--Objecten van REKENING creëren
--Diensten van deze objecten aanspreken
November 2001 Eiffel sessie 1 p. 13
Expansieklassen en -objecten(enkelvoudige klassen)
- gebruiker moet geen klassetekst schrijven- automatische creatie met default- waarde- inhoud van expansie-object kan door elk ander object gewijzigd worden zonder te “vragen”
- expansie-object bevat een waarde; elke copie dmv toewijzing resulteert in een fysische copie
- INTEGER, REAL, DOUBLE, BOOLEAN, CHARACTER
Referentieklassen en -objecten(samengestelde klassen)
- gebruiker moet zelf klassetekst schrijven (uitz. STRING)- creatie moet expliciet gebeuren
- inhoud van expansie-object kan niet rechtstreeks door ander object gewijzigd worden; het andere object moet beroep doen op de diensten van het referentie-object- expansie-object bevat een ‘referentie’ (pointer); een copie dmv toewijzing bevat enkel de referentie naar eenzelfde fysische plaats
- STRING, alle zelf ontworpen klassen
November 2001 Eiffel sessie 1 p. 14
expansieklasse referentieklasse
declaratie en creatie van objecten
i, j : INTEGER
i :
j :
0
0
rek1 : REKENING
voidrek1 :
create rek1.open(11111)
nummer
saldo
11111
0.0rek1 :
November 2001 Eiffel sessie 1 p. 15
expansieklasse referentieklasse
toewijzing
i, j : INTEGER
i := 10 j := i
i :
j :
0
0
i :
j :
10
10
rek1, rek2 : REKENINGcreate rek1.open(11111)create rek2.open(22222)
rek1 :
rek2 :
nummer
saldo
11111
0.0
nummer
saldo
22222
0.0
rek2 := rek1
November 2001 Eiffel sessie 1 p. 16
Kloneren (clone)
rek2 := clone(rek1)
rek1 :
rek2 :
nummer
saldo
11111
0.0
nummer
saldo
11111
0.0
! geen voorafgaande create nodig
rek2 := rek1
November 2001 Eiffel sessie 1 p. 17
rek1 :
rek2 :
nummer
saldo
11111
0.0
nummer
saldo
datum dag
maand
jaar
03
04
2000
datum dag
maand
jaar
deep_clone
rek2 := clone(rek1) rek2 := deep_clone(rek1)
11111
0.003
04
2000
November 2001 Eiffel sessie 1 p. 18
Vergelijken van objecten
rek1 = rek2 rek1.is_equal(rek2) rek1.is_deep_equal(rek2)equal(rek1,rek2) deep_equal(rek1,rek2)
rek1 :
rek2 :
nummer
saldo
11111
0.0
nummer
saldo
11111
0.0
datum dag
maand
jaar
03
04
2000
datum dag
maand
jaar
03
04
2000
FALSE FALSE TRUE
November 2001 Eiffel sessie 1 p. 19
Oefening 4 p. 12
1. Schrijf een klassetekst voor de klasse PRODUCT. Producten hebben een productnummer (geheel getal), en een voorraad(geheel getal). Bij de creatie van een product moet het nummeren de beginvoorraad worden aangegeven. Als een product wordtbesteld, stijgt de voorraad; als een product wordt geleverd, daaltde voorraad.
2. Schrijf de instructies om prod01 (met productnr 110 en beginvoorraad 500 stuks) te maken, en prod02 (met productnr 215en beginvoorraad 1500 stuks). Bestel vervolgens 200 stuks van product 1 en lever 500 stuks van product 2. Toon van beide producten de nieuwe voorraad.
November 2001 Eiffel sessie 1 p. 20
class PRODUCT
creation make
feature prodnr : INTEGERvoorraad : INTEGER
feature make (nr_in, vr_in : INTEGER) isdo
prodnr := nr_invoorraad := vr_in
end -- make
feature bestellen (hoeveelheid : INTEGER) isdo
voorraad := voorraad + hoeveelheidend -- bestellen
feature leveren (hoeveelheid : INTEGER) isdo
voorraad := voorraad - hoeveelheidend -- leveren
end -- class PRODUCT
November 2001 Eiffel sessie 1 p. 21
class PRODUCTBEHEER
creation make
feature prod01, prod02 : PRODUCT
feature make isdo
create prod01.make(110, 500)create prod02.make(215, 1500)prod01.bestellen(200)prod02.leveren(500)io.putstring("Van produkt 110 bedraagt de voorraad ")io.putint(prod01.voorraad)io.putstring(" stuks.")io.new_lineio.putstring("Van produkt 215 bedraagt de voorraad ")io.putint(prod02.voorraad)io.putstring(" stuks.")
end -- make
end -- class PRODUCTBEHEER
November 2001 Eiffel sessie 1 p. 22
Oefening 4 p. 46
1. Maak een systeempje aan voor het beheer van een boerderij met 3 varkens. Een varken krijgt bij aanschaf een naam, een gewicht en een leeftijd toegekend. Wanneer een varken gevoederd wordt, neemt zijn gewicht toe met 1/10de van de hoeveelheid voer. Elke maand wordt de leeftijd van het varken (in maanden uitgedrukt) aangepast. Een varkenkan bovendien een willekeurig geluid produceren (toon op het scherm). Schrijf de tekst voor de klasse VARKEN.
2. In de coördinatorklasse worden eerst 3 varkens gecreëerd. Het beheervan de boerderij houdt in dat we varkens voederen, en de leeftijd ervan aanpassen. De klasse moet toelaten een bepaald geluid te kiezen en dit door een varken te laten produceren. Tenslotte wordt ook de gemiddelde leeftijd en het gemiddelde gewicht van de varkens getoond.
November 2001 Eiffel sessie 1 p. 23
Class VARKENcreation aanschaf
feature naam : STRINGleeftijd : INTEGERgewicht : REAL
feature aanschaf (naam_in : STRING; lt_in : INTEGER; gew_in : REAL) isdo naam := clone(naam_in)
leeftijd := lt_ingewicht := gew_in
end -- aanschaf
1/2
November 2001 Eiffel sessie 1 p. 24
feature jarig isdo
leeftijd := leeftijd + 1end -- jarig
feature voederen (kilo : REAL) isdo
gewicht := gewicht + kilo/10end -- voederen
feature zing (lawaai : STRING) isdo
io.new_lineio.putstring(lawaai)io.putstring(" -- ")io.putstring(lawaai)io.putstring(" !!")io.new_line
end -- zing
end -- class VARKEN
2/2
November 2001 Eiffel sessie 1 p. 25
Class BOERDERIJ 1/3
creation ________
feature _____, _____, _____ : ______geluid : _____
feature ______ isdo
io.putstring("Welkom op de boerderij !")io.new_linecreate __________________________________create __________________________________create __________________________________beheertoon_gegevens
end -- _______
November 2001 Eiffel sessie 1 p. 26
Class BOERDERIJ
creation maken
feature vark1, vark2, vark3 : VARKENgeluid : STRING
feature maken isdo
io.putstring("Welkom op de boerderij !")io.new_linecreate vark1.aanschaf("Babe",0,5.2)create vark2.aanschaf("Pigglet",2,15)create vark3.aanschaf("Miss Piggy",10,80)beheertoon_gegevens
end -- maken
1/4
November 2001 Eiffel sessie 1 p. 27
feature beheer is 2/3do
vark1.jarig --varken 1 is jarigkies_geluid _________________ --varken 1 maakt gekozen geluid_________________ --varken 2 krijgt 2 kg voer_________________ --varken 3 krijgt 10 kg voer
end -- beheer
feature kies_geluid isdo
io.new_lineio.putstring(_____________________)io.readlinegeluid := ______________________
end -- kies_geluid
November 2001 Eiffel sessie 1 p. 28
feature beheer isdo
vark1.jarigkies_geluidvark1.zing(geluid)vark2.voederen(2)vark3.voederen(10)
end -- beheer
feature kies_geluid isdo
io.new_lineio.putstring("Wat zegt het varken ? ")io.readlinegeluid := clone(io.laststring)
end -- kies_geluid
2/4
November 2001 Eiffel sessie 1 p. 29
feature toon_gegevens is 3/3do
io.new_lineio.putstring("De varkens zijn gemiddeld ")io.putreal(________)io.putstring(" maanden oud.")io.new_lineio.putstring("De varkens wegen gemiddeld ")io.putreal(________)io.putstring(" kilo.")io.readline
end -- toon_gegevens
feature gem_lt : REAL isdo
________ := ____________________________________________end -- gem_lt
feature gem_gew : REAL isdo ________ := ____________________________________________end -- gem_gew
end -- class BOERDERIJ
November 2001 Eiffel sessie 1 p. 30
feature toon_gegevens isdo
io.new_lineio.putstring("De varkens zijn gemiddeld ")io.putreal(gem_lt)io.putstring(" maanden oud.")io.new_lineio.putstring("De varkens wegen gemiddeld ")io.putreal(gem_gew)io.putstring(" kilo.")io.readline
end -- toon_gegevens
feature gem_lt : REAL isdo
Result := (vark1.leeftijd + vark2.leeftijd + vark3.leeftijd)/3
end -- gem_lt
3/4
November 2001 Eiffel sessie 1 p. 31
feature gem_gew : REAL is
do
Result := (vark1.gewicht + vark2.gewicht + vark3.gewicht)/3
end -- gem_gew
end -- class BOERDERIJ
4/4