From: Olli P Lahti Subject: Arvosteluperusteet TiRa k1t2 Date: Thu, 19 Apr 2001 15:05:03 +0300 (EET DST) Tietorakenteet, 1. välikoe, kevät 2001 Arvosteluperusteet, tehtävä 2. Olli Lahti =============================================================== ESIMERKKIVASTAUS, jonka mukainen toiminnallisuus tuli toteuttaa =============================================================== public class Juna { private Vaunu veturi; private Vaunu viimeinenVaunu; // apuosoitin junan loppuun private int junanPituus; // junan vaunujen lukumäärä private class Vaunu { // Salainen sopimus: vaunu numero 0 onkin veturi; junassa on aina veturi! private Vaunu edellinen; private String vaununNimi; private Vaunu seuraava; private Vaunu(String nimi) { if (nimi == null) nimi = "?????"; this.vaununNimi = nimi; // viitteet edelliseen ja seuraavaan edelleen null } } public Juna(String veturi) { this.veturi = new Vaunu(veturi); // tunnussolmun luonti this.viimeinenVaunu = this.veturi; // pelkkä veturi on viimeinen vaunu this.junanPituus = 0; // ei vielä vaunuja } public void lisääPerään(String vaunu) { // *** Tämän metodin saa toteuttaa myös selaamalla listan alusta loppuun *** // saamme olettaa uuden vaunun luonnin onnistuvan, ts. muisti ei lopu kesken this.viimeinenVaunu.seuraava = new Vaunu(vaunu); this.viimeinenVaunu.seuraava.edellinen = this.viimeinenVaunu; this.viimeinenVaunu = this.viimeinenVaunu.seuraava; this.junanPituus++; } public Juna liitä(Juna toinen) { // pidennetty juna on tämä sama olio eli this if (toinen == null) return this; // ei tehdä mitään if (toinen.veturi.seuraava == null) // ei tehdä mitään, pelkkä veturi return this; this.junanPituus+=toinen.junanPituus; // toiselle junalle tämän junan viimeinen vaunu ikään kuin veturiksi this.viimeinenVaunu.seuraava = toinen.veturi.seuraava; this.viimeinenVaunu.seuraava.edellinen = this.viimeinenVaunu; this.viimeinenVaunu = toinen.viimeinenVaunu; toinen.veturi.seuraava = null; // liitettävän junan veturi jää yksin toinen.viimeinenVaunu = toinen.veturi; // pelkkä veturi on nyt viimeinen vaunu toinen.junanPituus = 0; return this; } public Juna irroitaHäntä(int moneskoVaunu, String veturi) { if (moneskoVaunu > this.junanPituus) return new Juna(veturi); // mitään ei irroteta, tulee vain uusi veturi Vaunu vaunuosoitin = this.veturi; Vaunu viimeinenVaunuApu = this.viimeinenVaunu; for (int i=0; i this.junanPituus) return -1; // juna ei ole näin pitkä Vaunu vaunuosoitin = this.veturi; // aluksi veturissa for (int i=0; i -1) { lkm++; nykypaikka = uusipaikka+1; // jatka etsintää löytyneen seuraajasta } return lkm; } public static void poistaNimisetVaunut(Juna juna, String vaunu) { // HUOM: Yksittäisiin vaunuihin ei voida pitää viitteitä muutoin kuin // itsenäisinä junina vetureineen, sillä Juna-luokan sisäinen // rakenne ei näy luokan ulkopuolelle. // *** (Rekursiivinen poisto loppujunien suhteen kävisi myös; *** // *** tällöin tarvittaisiin useita apuvetureita yhtäaikaa.) *** int nykypaikka = 1; // monennessako vaunussa karsiminen etenee int poistopaikka; while ((poistopaikka = juna.monentenako(vaunu, nykypaikka)) > -1) { Juna loppujuna = juna.irroitaHäntä(poistopaikka+1, "----"); juna.irroitaHäntä(poistopaikka, "pois"); // tämä vaunu irrotetaan roskaksi juna.liitä(loppujuna); // yhdistä loppujuna takaisin kiinni // jatka etsintää samasta liitoskohdasta } } public static void käännäYmpäri(Juna juna) { // *** häntien asettaminen hetkeksi taulukkoon hyväksyttiin myös *** Juna vaunut = juna.irroitaHäntä(1, "0000"); // irrota vaunut alkuperäisestä while (vaunut.pituus() > 0) // siirrä vaunut takaisin lopusta alkaen juna.liitä(vaunut.irroitaHäntä(vaunut.pituus(), "----")); } } - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ========== PISTEYTYS: ========== - luokan Juna rakenne mukaanluettuna (sisä)luokka Vaunu sekä näiden konstruktorit 1 p. - metodi lisääPerään 1/2 p. - metodi liitä 1 p. - metodi irroitaHäntä 1 1/2 p. - metodi monentenako 1/2 p. - metodit pituus ja toString 1/2 p. -------- 5 p. kirjastoluokka Tyokalut - annetun nimisten vaunujen määrä 1/2 p. - annetun nimisten vaunujen poistaminen 1 p. - junan vaunujen järjestys päinvastaiseksi 1/2 p. -------- 2 p. ======== yhteensä 7 p. Vähäisistä koodaus- tai ajatusvirheistä ei vähennetty pisteitä, ellei tällaisia virheitä ollut huomattavan useita.