GKO-tentti, mallivastaukset

Muutetut tiedostot

Tehtävä 1, Peruskysymykset

a)
TKirjain-oliot luodaan TSana-luokan metodissa UusiKirjain, jota kutsutaan SetSana-metodista, jota puolestaan kutsutaan testiohjelman Sana painiketta painettaessa
b)
Kirjaimet tuhoutuvat TSana-luokan (perityssä, inherited) destruktorissa, sillä TSana on asetettu kirjainten omistajaksi.
c)
procedure TSana.LisaaSana(s: string);
var i: integer;
begin
  for i := 1 to length(s) do
    LisaaKirjain(s[i]);
end;
d)
property Oikeita: integer read GetOikeita;

...

function TSana.GetOikeita: integer;
Var i: integer;
begin
  Result := 0;

  for i := 0 to Kirjaimia Do
    if Kirjaimet[i].Nakyy then inc(result);
end;
e)
Huonosti, sillä viittauksia kyseiseen olioon on vielä jäljellä. Ohjelma (toivottavasti) kaatuu, kun tuhottua oliota yritetään seuraavan kerran käyttää. Tämä voi tapahtua piankin, sillä kutsuttaessa vapautusta olion omasta tapahtumankäsittelijästä, voidaan sieltä palatessa käyttää olematonta oliota.
f)
tyhja oliota käytetään laittomien (=taulukon ulkopuolisten) indeksien tapauksessa GetKirjaimet-metodin paluuarvona. Poikkeuksiakin voisi käyttää (tai nil:ä, jos on huolellinen)

Tehtävä 2, Komponentin viat ja parantaminen

a)
Sana- ja Kirjain-oliot luodaan vasta Sana- ja Kirjain-painikkeita painettaessa. Kyseisiä olioita voidaan kuitenkin käyttää myös muita painikkeita painettaessa, joten ohjelma kaatuu jos painetaan vaaikka a-painiketta ennen sana-painiketta. Tämä pätee muihinkin yhdistelmiin. Jotta ohjelma ei kaadu. Täytyy painaa ensin sekä sana ja kirjain painikkeita ja vasta sitten ruveta arvaamaan
b)
Asetetaan ohjelman alussa A,I,K,S ja näkyy-painikkeet pois käytöstä ja aktivoidaan ne vasta kun tarvittavat oliot on luotu
c)
Käsittelemällä suoraan TKirjain-luokan Caption-ominaisuutta.
d)
Perimällä TKirjain luokasta TCustomPanel (eikä TPanel). Tällöin Caption ei ole julkinen.
e)
Käytetään propertyä Kirjaimet ja muutetaan yksittäisten Tkirjain-olioiden näyttämiä merkkejä.
f)
Käytetään samaa propertyä kuin edellisessä, mutta vapautetaan palautettu TKirjain-olio Free-metodilla.
g)
Idioottivarmasti ei ollenkaan, sillä vaikka tuo property saataisiinkin korjattua, voidaan vastaava efekti saada aikaan Components-propertyllä. Tietysti tuo property voisi palauttaa pelkkiä kopioita, jolloin alkuperäisiin ei pääsisi (suoraan) käsiksi. Mahdollisesti koko property tuossa muodossaan voitaisiin poistaa ja käyttää pelkkää array-propertyä char-tyypillä.
h)
Heitetään tapahtuma ainoastaan silloin, kun löydetään merkki joka ennestään ei ole näkyvissä. Uusi ehto on siis:
if (UpperCase(sana[i]) = UpperCase(c)) and (Kirjaimet[i].Nakyy = false) then begin
i)
Lisätään uusi attribuutti ja property ja tehtään muutoksia metodiin TSana.LisaaKirjain
FOnKirjainVaarin: TOnKirjain;

...

property OnKirjainVaarin: TOnKirjain read FOnKirjainVaarin write FOnKirjainVaarin;

...

procedure TSana.LisaaKirjain(c: char);
var i, len: integer;
    vaarin: boolean;
begin
  len := Length(sana);
  vaarin := true;

  for i := 1 to len do
    if (UpperCase(sana[i]) = UpperCase(c)) and (Kirjaimet[i].Nakyy = false) then begin
        Kirjaimet[i].Nakyy := true;
        vaarin := false;
        if assigned(OnKirjainOK) then OnKirjainOK(self, c);
    end;

  if vaarin and assigned(FOnKirjainVaarin) then
    OnKirjainVaarin(self, c);
end;
j)
Kyseessä on virtuaalimetodi, joten tämä liittynee jotenkin perimiseen ;) Jos peritään luokasta TSana uusi luokka, voidaan tämä uusi luokka laittaa käyttämään Toisenlaisia (=perittyjä) TKirjain olioita pelkästään ylikirjoittamalla tämä metodi (siis ilman että täytyy kirjoittaa uutta SetSana-metodia.

Tehtävä 3, Hirsipuu ja uudet komponentit

a)
Katso aakkoset.pas. Tässä versiossa TAakkoset käsittelee kaikkien kirjaimiensa painallukset ja heittää tarvittaessa tapahtuman.
b)

En ruvennut asentelemaan komponentteja, joten kaikki omat komponentit luodaan dynaamisesti. Tästä syystä koodia on hivenen enemmän kuin object inspectoria käytettäessä. koodi

Formille luodaan kaksi TAakkoset-komponettia, toinen vokaaleita ja toinen konsonantteja varten. Näiden tapahtumankäsittelijä lähettää m_Sana oliolle viestin LisaaKirjain. m_Sana:n tapahtuma OnKirjainVäärin Aiheuttaa laskurin kasvattamisen. Vastaavasti OnKirjainOK viestin käsittelijä tarkistaa, onko oikeita vastauksia yhtä paljon kuin arvattavia kirjaimia.

c)
Komponmentille THirsipuu tarvittaisiin Value-property ja inc metodi. Nyt ei tarvitaisi muita muutoksia kuin sanojen TLaskuri korvaaminen sanalla THirsipuu

Tehtävä 4, Bonus

Kuulemieni huhujen mukaan kumpikaan ei olisi kaatunut kertaakaan...