4
a)
Pisteytys
- Jokaisesta oikeasta tietorakennekaaviosta saa maksimissaan 0.5 p.
- Jos attribuuttien arvoja ei ole merkitty tai kaaviosta ei ilmene taulukoiden suhdetta luokkiin (dynaamisesti varatut alkiot/taulukot ovat varsinaisen olion ulkopuolella), pisteitä on vähennetty tilanteen mukan.
Yleisiä virheitä:
- cTaulukko4:n rakenne on ymmärretty väärin. Kyseessä on staattinen osoitintaulukko, ei dynaamisesti varattu taulukko olion ulkopuolella.
b)
Copy constructor ja sijoitusoperaattori pitää kirjoittaa luokille cTaulukko2, cTaulukko3 ja cTaulukko4, koska ne sisältävät osoittimia olion dynaamisesti varaamaan tietoon.
Sijoituksessa ja kopioinnissa osoitinten "päässä" oleva tieto pitää varata ja kopioida erikseen uusiin paikkoihin ja sijoituksessa lisäksi tuhota aiemmin varattu tieto.
Jos copy constructoria ja sijoitusoperaattoria ei tehdä, olioita kopioitaessa niiden osoittimet kopioidaan, mutta kopiot osoittavat samaan muistialueeseen. Jos ensimmäinen olio tuhoutuu,
se tuhoaa myös varatun muistialueen ja toinen osoittaa tyhjään muistiin.
Myös destruktori pitää kirjoittaa luokille cTaulukko2, cTaulukko3 ja cTaulukko4.
Pisteytys
- Oikeista luokista 0.5p
- Oikeista perusteluista 0.5p
Yleisiä virheitä:
- Copy constructorin toimintaperiaatetta ei ole ymmärretty. Copy constructorin tehtävä on huolehtia "osoittimien päähän" jäävien arvojen kopioinnista ja muistinvarauksesta eikä esim. kopioida lkm-attribuuttia.
- Selityksissä esitetty väitteitä ilman kunnollisia perusteluja.
c)
cTaulukko1::cTaulukko1(int iLuvut=5)
{
lkm=0;
}
cTaulukko2::cTaulukko2(int iLuvut=5)
{
lkm=0;
max_koko=0;
alkiot=new int[iLuvut];
if (alkiot) max_koko=iLuvut;
}
cTaulukko3::cTaulukko3(int iLuvut=5)
{
lkm=0;
max_koko=0;
alkiot=new int*[iLuvut];
if (alkiot) max_koko=iLuvut;
}
cTaulukko4::cTaulukko4(int iLuvut=5)
{
lkm=0;
}
Pisteytys
- Kummastakin oikeasta konstruktorista 1p
- Painopiste dynaamisen muistinvarauksen oikeassa suorittamisessa. null-tarkistuksen unohtuminen -0.25p.
Yleisiä virheitä:
- Dynaaminen muistinvaraus unohdettu kokonaan, asetettu vain max_koko ja lkm (!).
- Yritetään asettaa cTaulukko1:ssä tai cTaulukko4:ssä lkm:aa joksikin muuksi kuin 0:ksi.
- null-tarkistus unohdettu.
d)
void cTaulukko1::lisaa(int luku) {
if (lkm>=5) return;
alkiot[lkm]=luku;
lkm++;
}
void cTaulukko2::lisaa(int luku) {
if (lkm>=max_koko) return;
alkiot[lkm]=luku;
lkm++;
}
void cTaulukko3::lisaa(int luku) {
if (lkm>=max_koko) return;
alkiot[lkm]=new int(luku);
lkm++;
}
void cTaulukko4::lisaa(int luku) {
if (lkm>=5) return;
alkiot[lkm]=new int(luku);
lkm++;
}
Pisteytys
- Kummastakin oikeasta lisää-metodista 0.5p
Yleisiä virheitä:
- Dynaaminen muistinvaraus unohdettu osoitintaulukoissa.
- Taulukon rajojen tarkastus unohdettu.
Dynaamisista tietorakenteista kiinnostuneet voivat tutkia hieman täydennettyjä toteutuksia taulukot.h ja taulukot.cpp.