wiki:ohj2k10vk1
Last modified 5 years ago Last modified on 2013-01-04 10:55:56

Ohjelmointi 2, välikoe kevät 2010

Tehtävä 1

mallivastaus

Pisteet jaettiin seuraavasti.

*Ohjelman toiminta oikein ja selkeä pöytätesti (muuttujien arvot ja tulostukset oikein). 4p

Vääristä muuttujien arvoista ja tulostuksista tuli sitten vähennyksiä. Isosta virheestä 1p ja pienestä 0,5p. Virheitä ei kuitenkaan vyörytetty alaspäin, eli jos virhe tuli alkupäästä ja tästä johtuen koko toiminnan loppu toiminnallisuus oli väärin, niin virheestä ei rokotettu enää lopussa. Ohjelman tuli kuitenkin näissäkin tapauksessa toimia tietenkin oman pöytätestitaulukon mukaan oikein.

Isovirhe oli pääsääntöisesti sellainen, joka vaikutti ohjelman toimintaa radikaalista. Pienivirhe oli pääsääntöisesti virhe, joka ei juurikaan vaikuta ohjelman toimintaa, mutta on kuitenkin selvästi väärin. Yhden huolimattomuusvirheen sallin per vastaus. Huolimattomuusvirhe oli esimerkiksi tulostuksen merkkaaminen vahingossa yhden rivin ylemmäs tai alemmas jne.

Aliohjelmien lokaalit muuttujat piti merkata joko pääohjelmam aliohjelmakutsurivillä tai sitten aliohjelmanesittelyrivillä. Eli joko:

saruman.teeLoitsu(gandalf, 4);

tai:

public void teeLoitsu(Velho velho, int voimakkuus) {

Tehtävänannossa luki, että merkitse vain ne rivit joissa joku muuttujan arvo muuttuu tai olio muuttuu roskaksi. Tästä huolimatta moni oli merkannut muitakin rivejä ja monelta tila loppuikin kesken. Muiden rivien merkkaamisesta ei pisteitä rokotettu. Tehtävänannon mukaanhan ei olisi tarvinnut merkata tulostusrivejäkään. Toki nämä oli hyvä merkata, mutta niiden puuttumisesta ei tietenkään rokotettu , koska tehtävänannossa ei niitä käsketty merkkaamaan.

*Roskaksi muuttamiset. 1p

Tehtävässä oli kaksi oliota N1 ja N2. N1 muuttui roskaksi rivillä 46 ja N2 rivillä 53 (eli mainin lopussa). Jos oli osannut merkata toisen oikein sai 0,5 pistettä. Jos molemmat sai 1 pisteen. Jotkut olivat merkanneet alkeistietotyyppisiäkin muuttujia roskaksi. Nämä eivät kuitenkaan muutu roskaksi samaan tapaan kuin oliot. En kuitenkaan vähentänyt tästä pisteitä.

Sillä oliko merkannut oliot muuttumaan roskaksi jo rivillä 46 ja 53 vai vasta niiden jälkeen ei ollut merkitystä. Merkkaamisten piti kuitenkin olla yhtenevät keskenään. Eli joko molemmat rivillä 46 ja 53 tai sitten molemmat noiden rivien jälkeen.

Olio muuttuu siis roskaksi kun siihen ei viittaa enää yksikään muuttuja. N2 ei siis muuutu roskaksi rivillä 51, jossa asetetaan muuttujaan saruman null-viite, koska olioon viittaa vielä muuttujat gandalf ja merlin.

*Muuttujien "olemassaolon" väritykset 1p

Jos väritykset oli suurinpirtein oikein sai 0,5 pistettä. Väritykset riippuvat tietenkin jonkin verran siitä, mitä rivejä olet merkannut, joten suoraan mallivastauksesta ei oikeaa väritystä voi katsoa.

Muut vähennykset

Jos ei ollut muistanu merkitä ylhäälle * merkiksi, että muuttuja on viite tuli 0,5 pistettä miinusta.

Tehtävä 3

Tehtävä 4

Tehtävä 5

Tehtävä 6

Mallivastaukset

// KOHTA 1: Täydennä tarvittava ohjelmakoodi.
shampoo = new Tuote("Shampoo", 2.90);
saippua = new Tuote("Saippua", 1.79);
pulveri = new Tuote("Pyykkipulveri", 4.50);
kuitti1 = new Kuitti();
kuitti2 = new Kuitti();
kuitti2.lisaa(saippua, 1);
kuitti2.lisaa(shampoo, 1);
// KOHTA 2: Täydennä tarvittava ohjelmakoodi.
for (int i = 0; i < lkm; i++) {
	if (tuoterivit[i].omistatko(tuote)) {
		return tuoterivit[i];
	}
}
return null;
// KOHTA 3: Kirjoita JavaDoc-kommentti.
/**
 * Lisää tuotetta kuitille tietyn määrän. Jos tuote on lisätty kuitille jo
 * aikaisemmin, kasvatetaan tuotteen määrää kuitilla.
 * @param tuote lisättävä tuote
 * @param maara lisättävä määrä
 */
// KOHTA 4: Täydennä tarvittava ohjelmakoodi.
Tuoterivi tuoterivi = etsiTuoterivi(tuote);
if (tuoterivi == null) {
	tuoterivi = new Tuoterivi(tuote, maara);
	lisaa(tuoterivi);
} else {
	tuoterivi.lisaaMaaraa(maara);
}
// KOHTA 5: Täydennä tarvittava ohjelmakoodi.
return this.tuote.oletko(tuote);
// KOHTA 6: Lisää tarvittava metodi (1 kpl). Muista myös JavaDoc-kommentti!
/**
 * Kertoo, onko tuotteen nimi sama kuin toisella tuotteella.
 * @param tuote tuote, johon verrataan
 * @return true, jos tuotteen nimi on sama, muuten false
 */
public boolean oletko(Tuote tuote) {
	return tuote.nimi.equals(this.nimi);
}

Arvosteluperusteet

Jokaisesta tehtävän kohdasta sai maksimissaan yhden pisteen.

Kohta 1. Yleisimmät virheet: kaikkia olioita ei luotu tai tuotteita ei lisätty kuitille. Virheistä vähennettiin 0,25 pistettä. Jos lisäksi oli kutsuttu tarpeettomasti metodeja, vähennettiin lisäksi 0,25 pistettä.

Kohta 2. Silmukka 0,5 pistettä, if-lause oikein 0,25 pistettä ja palautus oikein 0,25 pistettä. Yleisin virhe: silmukan lopetusehto i < tuoterivit.length, josta vähennettiin 0,25 pistettä. Lisäksi moni oli käyttänyt iteraattoria, vaikka sitä ei luokassa ollut määritelty (-0,5 pistettä).

Kohta 3. Kohdassa arvioitiin kommentin syntaksi (0,5 pistettä) ja kommentin vastaavuus kohdassa neljä olevaan koodiin (0,5 pistettä).

Kohta 4. Olemassa olevan tuoterivin etsintä ja määrän kasvatus (0,5 pistettä) ja tarvittaessa luonti (0,5 pistettä). Pienistä virheistä vähennettiin 0,25 pistettä. Yleisin virhe: olemassa olevaa tuoteriviä ei etsitty (-0,5 pistettä).

Kohta 5 ja 6. Kohdat arvioitiin kokonaisuutena niin, että yhteispistemäärä on 2. Kohtiin hyväksyttiin kaikki toimivat vastaukset, jotka tuottavat tehtävänannon mukaisen kuvan, vaikka Tuote-olion vertailu toiseen Tuote-olioon olisikin selkeintä antaa Tuote-olion tehtäväksi. Pienistä virheistä vähennettiin 0,25 pistettä.