Tehtävä 2 - mallivastaus
Vastaukset
a)
1. Alusta ennätystaulukon elementit 0:ksi.
2. Lue seuraava rivi. Jos tiedosto loppuu, lopeta. Aseta kenttälaskuri 0:ksi.
3. Lue seuraava kenttä erota-funktiolla (erotin |).
Jos kenttiä ei ole, mene kohtaan 2.
4. Jos kenttälaskuri suurempi kuin ennätystaulukon koko, mene kohtaan 2.
Muuten vertaa kentän pituutta taulukon vastaavassa elementissä olevaan
arvoon, lisää tarvittaessa.
5. Kasvata kenttälaskuria, mene kohtaan 2.
b)
/* Otettu Vesan malliratkaisusta */
void cVaihda::tutki_rivi(const string &s)
{
string rivi(s), pala;
int i=0;
while (rivi!="") {
pala=erota(rivi,erotin);
tabs.lisaa(i,pala);
i++;
}
}
Arvosteluperusteet
a) (max. 2p)
- Taulukon alustus: 0.25p
- Taulukon rajatarkistus: 0.25p
- Rivin lukeminen: 0.25p
- Lopun tarkistus (viimeisen |-merkin yli menevän merkkijonon luku): 0.25p
- Kenttien vertailut (looginen toiminnallisuus): 0.5p
- Merkintätavat, algoritmin täsmällisyys: 0.5p
- N:nnen sarakkeen pisimmän kentän pituuden palauttava algoritmi hyväksytään.
- Kaikkien kenttätietojen lukeminen sarake (ei rivi!) kerrallaan hyväksytään (vaikka onkin epätehokasta), mutta tällöin on mainittava, että tiedosto on avattava uudelleen seuraavaan sarakkeeseen siirryttäessä.
- Jos algoritmi tutkii kaikki kentät, mutta ei mainitse rakennetta johon tulokset tallennetaan, vähennetään 1p.
- Jos rivin lopun tarkistusta ei mainita erikseen, mutta käytetään erota-funktiota, pisteitä ei vähennetä (erota-funktio tarkastaa lopun).
b) (max. 4p)
- Syntaksi ja muuttujien käsittely: 1p
- Kenttien erottelu: 1p
- Taulukon käsittely: 2p
- Pienistä syntaksivirheistä (const-muuttujan muuttaminen, toimimaton while-ehto, indeksimuuttujan huolimaton käyttö, virheellinen funktion paluuarvotyyppi, epäselvyys siitä, onko kyseessä funktio vai metodi) vähennetään 0.25p kustakin.
- Väärästä merkkijonon pituuden tarkistamisesta ei ole yleensä sakotettu (strlen-funktions käyttö stringiin). Poikkeuksena sizeof-operaattorin käyttö, koska sen toiminta on loogisesti erilainen kuin string::length()-funktion toiminta. Sizeofin käytöstä on vähennetty 0.25p.
- Erottelussa whilen tai silmukan käyttö antaa 0.5p. Pienistä erotteluvirheistä (väärä tulkinta vain yhdelle kentälle tai väärä käsittely tyhjille kentille) vähennetty 0.25p kustakin.
- Jos taulukko puuttuu kokonaan (todennäköisesti koko tehtävä ymmärretty väärin), vähennetään heti 2p. Jos taulukon sijalla on numeroitu joukko erillisiä muuttujia, vähennetään 1.5p, koska ratkaisu ei ole yleiskäyttöinen.
- Jos taulukon rajatarkistus puuttuu tai taulukolle on asetettu keinotekoinen yläraja (ei MAX_TABS), vähennetään 0.5p
- Jos taulukko esitellään funktion sisällä (ei attribuuttina tai funktion argumenttina) vähennetään 0.75p, koska ennätykset eivät tällöin näy funktion ulkopuolelle.
Yleisiä virheitä
a)
- Taulukon rajoja ei tarkisteta.
- Käsitellään tiedosto sarakepohjaisesti rivi kerrallaan käsittelyn sijaan.
- "Unohdetaan" viimeisen |-merkin jälkeen tuleva kenttä (erityisesti tapaus, jossa vain 1 kenttäinen tiedosto)
- Yleiskäyttöisyyden puute: Kiinteälle kenttämäärälle suunniteltuja algoritmeja.
- Tehtävä ymmärretty väärin: taulukon kaikkien kenttien pituuksien tarkastamisen sijaan tarkastellaan jotain muuta.
b)
- "Ylimääräinen vaiva" taulukon tarkistamisessa ja vertailussa: helpoiten homma menee delegoimalla työ cTabs-luokalle.
- Const-muuttujan sijoitus erota-funktiolle, jonka argumentti ei ole const.
- Taulukon esittely funktion sisällä (ei attribuuttina tai argumenttina).
- Taulukon rajatarkistuksen puute.
- Sizeof-operaattorin käyttö yritettäessä lukea stringin pituutta.
- Yritetään lukea funktiossa koko tiedosto, vaikka tarkoituksena on käsitellä vain yksi rivi.
- Yleiskäyttöisyyden puute: Kiinteälle kenttämäärälle suunniteltu funktio ilman taulukkoa.
- Tehtävä ymmärretty väärin: etsitään esim. yhden rivin pisintä kenttää.