========================================================================= 58128-1 Johdatus ohjelmointiin: 2. välikoe 18.12.1997 ========================================================================= 1. (Kirsi Lagus) ======================================================================== alkeistyyppi - viittaustyyppi alkeistyypit (primitive types): kokonaislukutyypit (byte, short, int, long, char), liukulukutyypit (float, double), totuusarvotyyppi. Käsitellään arvoina (muuttujassa arvo). viittaustyypit (reference type): luokkatyypit (omat ja valmiit), interface-tyypit, taulukkotyypit Käsitellään viiteen kautta (muuttujassa viite olioon). Kahden pisteen saamiseksi tuli kertoa myös jotain seuraavista: -Kun kahden alkeistyyppisen muuttujan samuutta vertaillaan, verrataan arvoja. Viittaustyyppisillä muuttujilla verrataan sitä, viittaavatko muttujat samaan olioon. -parametrivälitys: Kaikki parametrit ovat arvoparametreja. Viittaustyyppinen parametri on viitteen arvo => metodissa tehdyt muutokset vaikuttavat alunperin parametrina saatuun olioon (sama olio..) Käännösyksikkö - pakkaus (suora lainaus Arton luentomateriaalista. Luku 4.5) Ohjelmiston tuotannossa yksi keskeinen ongelma on ohjelman osien, erilaisten ohjelmatiedostojen hallinta: missä mikin osa sijaitsee, miten osat löydetään. Javassa ohjelmatiedostot eli class-tiedostot kerätään ns. pakkauksiin (package). Itse pakkaukset voidaan järjestää puumaiseen tiedostorakenteeseen. Pakkaus ei sinänsä liity olio-ohjelmointiin. Se on käytännön ohjelmistotuotannon väline! Yhteen pakkaukseen on tapana kerätä luokkia (ja rajapintaluokkia), jotka tavalla tai toisella liittyvät toisiinsa. Jos luokkia on paljon, pakkaukset voidaan jäsennellä alipakkauksiksi, jne. Myös Java-kielen valmiit välineet on toteutettu pakkauksina: Esimerkiksi pakkaus java muodostuu alipakkauksista java.lang, java.util, java.io, ... Pakkaus muodostaa "nimiavaruuden", jonka nimien näkyvyys pakkauksen ulkopuolelle voidaan sallia tai kieltää. (Myös pakkauksen sisällä nimien näkyvyys luokkien välillä on säädeltävissä, kts. 4.6) Käännösyksikkö (compilation unit) on tiedosto, joka voi sisältää (tässä järjestyksessä!): - package-määreen, joka ilmoittaa mihin pakkaukseen tiedostossa olevat luokat (ja rajapintaluokat) on tarkoitus sijoittaa - import-määreitä, jotka ilmoittavat pakkaukset, jotka annetaan käännösyksikön luokkien (ja rajapintaluokkien) käyttöön. - luokkien (ja rajapintaluokkien) määrittelyitä Jos tiedoston alussa ei ole package-määrettä, class-tiedostot asetetaan ns. nimettömään pakkaukseen. Se on Java-toteutuksissa yleensä "nykyhakemisto", so. hakemisto, jossa class-tiedosto sijaitsee. Huom: Käännösyksikössä voi olla vain yksi luokka, jolle on määritelty näkyvyydeksi public! Jokaisesta käännösyksikön sisältämästä Java-kielisestä class-määrittelystä tehdään erillinen Bytecode-kielinen class-tiedosto. Paketteihin kerätään nimenomaan näitä class-tiedostoja. olion luonti - luokan lataaminen (suora lainaus Arton luentomateriaalista. Luku 4.2) Kun suoritetettava ohjelma viittaa ensimmäisen kerran johonkin luokkaan, tuo luokka ladataan (load) muistiin. Tällöin luokan staattinen kalusto asetetaan alkutilaan: luokkamuuttujat saavat alkuarvonsa, mahdolliset staattiset alustuslohkot (kts. alla) suoritetaan. Aina kun suoritettava ohjelma luo olion eli luokan ilmentymän new-operaatiolla, tuon olion oma kalusto asetetaan alkutilaan: ilmentymän muuttujat saavat alkuarvonsa ja jokin konstruktori suoritetaan (nimenomaan tässä järjestyksessä!). Korjausperiaatteista: Jokaisesta kohdasta oli mahdollista saada 2 pistettä. Arvostelu oli aika tiukka (keskiarvo oli n. 3,5 p). Epämääräisistä soperruksista ei pisteitä tippunut, vaan asia tuli ilmaista selkeästi ja ymmärrettävästi. Käännösyksikkö - pakkaus -kohdasta saattoi kaksi pistettä saada vähemmälläkin kuin mitä ylläolevassa vastauksessa on, kunhan vastauksesta muuten kävi selvästi ilmi asian ymmärtäminen. ========================================================================= 2. (Jyrki Haajanen) ======================================================================== (Kts. luentomateriaali! Jyrki lupasi pikapuolin arvosteluperusteensa.) ========================================================================= 3. (Matti Pauna) ======================================================================== public class Ali extends Esim { // peitetään kenttä d antamalla sille jokin uusi määritelmä static private double d; // korvataan metodi metC kirjoittamalla uusi metodi, jolla // on täsmälleen sama otsikko kuin yliluokassakin static String metC(char c) { return ""+c; } // metodi metB periytyy automaattisesti, ei tarvitse tehdä mitään // kuormitetaan metodi metA kirjoittamalla uusi metodi, // jolla on erilaiset parametrit kuin yliluokassa void metA(boolean uusirivi) { if (uusirivi) System.out.println(iT.length); else System.out.print(iT.length); } // esimerkkejä yliluokan metodien käytöstä public void koe() { int i; // käytetään perittyä metB:tä i = metB(3); // käytetään kuormitettua metA:ta metA(); metA(false); // tämän luokan metodi // käytetään korvattua metC:tä super.metC('a'); metC('b'); // tämän luokan metodi } } // class Ali Mahdollisimman helppo tapa käyttää yliluokan ominaisuuksia luokassa Ali on: - peitettyä kenttää d ei voi käyttää ollenkaan, koska se on määritelty privateksi yliluokassa - korvattua metodia metC voi käyttää kirjoittamalla joko super.metC(c) tai Esim.metC(c) - perittyä metodia metB voi käyttää kirjoittamalla suoraan metB(i) - kuormitettua metodia metA voi myös käyttää kirjoittamalla metA(). Valinta metodien välillä riippuu annetuista parametreista. Arvosteluperusteet: Luokasta Ali saa 3 pistettä seuraavasti: d:n peittäminen = 1/2 metB:n periminen = 1/2 metA:n kuormittaminen = 1 metC:n korvaaminen = 1 Selitysosuudesta saa 2 pistettä siten, että kunkin kohdan oikeasta selityksestä saa 1/2 pistettä. ========================================================================= 4. (Janne Markkanen) ======================================================================== Tehtävän arvostelussa kiinnitettiin huomiota kolmeen seikkaan: 1. Metodien (ja lohkojen) sisäisten muuttujien näkyvyyssääntöihin. 2. Näkyvyyden säätelyn määreisiin (public, protected, private ja oletusmääre). 3. Nimen etsimiseen metodista. Jokainen kohta arvosteltiin korkeintaan kahden pisteen arvoiseksi, kuitenkin niin, että tehtävän maksimissaan tehtävästä sai viisi pistettä. Siis täysien pisteiden saamiseksi sallittiin yksi virhe tehtävässä. Yhden pisteen kustakin kohdasta sai jos vastaus oli noin puoliksi oikein (esimerkiksi näkyvyydensäätelymääreet listattuna, vaikka ominaisuudet eivät olleetkaan aivan oikein). Oikea vastaus tehtävään löytyy kurssimateriaalin luvusta 4.6 näkyvyyden säätely. ========================================================================= 5. (Asko Saura) ======================================================================== Johdatus ohjelmointiin Asko Saura s97 2. välikoe 21.1.1998 Tehtävä 5 Arvosteluperusteet (max. pisteet 5) -Miinuksia: (lähtökohta 5 p) -1½ konstruktori väärinymmärretty puuttuva ohjelman osa, kuvattu pseudokoodina tai muuten -1 väärä SyoTdston käyttö ei esitellä muuttujia pikkuvirhe algoritmissa käsitevirhe: metodi käsitevirhe: ohjelma väärä sisennys (törkeä) -½ kielioppivirhe väärä Exceptionin käyttö C:n komentoriviparametrit virhe Lue-luokan käytössä staattinen viittaus ilmentymämuuttujaan +Plussia: (lähtökohta 0 p) +1 algoritmin oikea idea (esim. pseudokoodina) +½ oikea Lue-luokan käyttö oikea SyoTdsto-luokan käyttö osa algoritmista järkevä Malliratkaisu. public class Koe { public static void main(String[] args) { System.out.print("Syötä tiedoston nimi : "); System.out.flush(); String tiedNimi = Lue.rivi(); SyoTdsto tdsto = new SyoTdsto(tiedNimi); System.out.print("Syötä korvattava merkki : "); System.out.flush(); char vanhaMerkki = Lue.merkki(); System.out.print("Syötä korvaava merkki : "); System.out.flush(); char uusiMerkki = Lue.merkki(); String rivi = tdsto.lue(); // luetaan eka rivi talteen while ( rivi != null ) { char[] taulu = rivi.toCharArray(); for(int i = 0; i < taulu.length; i++) { if (taulu[i] == vanhaMerkki) taulu[i] = uusiMerkki; } System.out.print(taulu); rivi = tdsto.lue(); } } } ========================================================================= =========================================================================