A Jaakko J Nurro Mon, 30 Dec 2002 17:58:16 +0200 (EET) Tehtävässä oli kaksi kohtaa, joista a-kohdassa oli tarkoitus toteuttaa luokka Rivitiedosto luokan Merkkitiedosto avulla. Luokasta Merkkitiedosto annettiin vain käyttörajapinta, eikä sitä ollut tarkoitus erikseen toteuttaa. Jos oletti luokkaan jotain muita rajapintoja, tämä oli virhe. Kohdasta a sai maksimissaan 14 pistettä. Kohdassa b oli tarkoitus toteuttaa luokan Rivitiedosto avulla sovellus, joka laskee annetusta tiedostosta rivit. Kohdasta b sai maksimissaan 4 pistettä. Pisteytysperusteet a) Yleisvaikutelma 2p Oliko osattu javaa eli oliko luokalla luokan rakenne, olivatko kentät kiltisti private ja metodit public? Oliko turhia kenttiä? Tästä ei saanut täysiä pisteitä, jos näissä oli jossain häikkää, vaan korkeintaan yhden pisteen jos esim. kentät olivat jotain muuta kuin private tai jos vain metodien tarvitsemia muuttujia oli laitettu olion kentiksi. Tästä sai myös korkeintaan 1 pisteen jos oli ohjelmoinut 'caps lock päällä' eli ei erottanut isoja ja pieniä kirjaimia toisistaan kyllin selvästi. Konstruktori Alustaa olion muuttujat tai muuttujan oikein 2p Jos teki luokasta Rivitiedosto Merkkitiedoston aliluokan, tästä meni pisteitä, koska silloin ei poikkeuskäsittely onnistu (ainakaan javacilla). Yleensä ottaen aliluokaksi tekemällä ei voita yhtään mitään tässä tapauksessa, ja se on jopa ontologisesti kummaa. Poikkeuskäsittely 2p Tästä sai vain yhden pisteen, jos poikkeuskäsittely urputti jotain käyttäjälle, koska moinen on rumaa. Metodi lueRivi Lukee merkit oikein 2p Tämä tarkoittaa sitä, että metodi ei hukkaa merkkejä ja lueMerkki-metodin kutsu menee oikein. Jos metodi hukkaa merkkejä, tästä tuli suoraan 0 pistettä. Poikkeuskäsittely 2p Jos käsitteli poikkeukset tehtävänannossa määritellyllä tavalla, tuli 2 pistettä. Kuitenkin jos taas urputti käyttäjälle, saattoi saada korkeintaan yhden pisteen. Rivi muodostetaan oikein 2p Tästä sai täydet pisteet, jos rivi muodostettiin oikein, ja rivin muodostaminen päättyi oikein. Tässä esiintyi kahdenlaisia ratkaisuja, jotkut katenoivat uusia merkkejä merkkijonoksi, toiset lukivat merkkejä taulukkoon, josta lopuksi tehtiin merkkijono. Jos oletti riville jonkun maksimipituuden, tästä saattoi saada korkeintaan 1 pisteen. Palautusarvo oikein 2p Tästä sai täydet pisteet, jos kaikki returnit palauttivat oikeassa tilanteessa jotain järkevää. Kaikista virheellisistä returneista sai yhden pisteen vähemmän. b) Sovelluksen saattoi tehdä Rivitiedosto -luokan main-metodiksi tai omaan luokkaansa, tällä ei ollut merkitystä. Olio luodaan oikein 2p Tarvitaan Rivitiedosto-olio, josta luetaan rivejä. Rivit lasketaan oikein 1p Tämä oli sen verran helppoa, että virheestä kuin virheestä tuli helposti 0p Yleiset näkökohdat 1p Taas luokan rakenne, caps lock-virhe ja ylimääräiset kentät vaikuttivat tämän pisteytykseen. Jos teki koko tehtävän 3 caps lock päällä, tässä ei ei rangaistu siitä enää. Jos muuttujat määritteli olion kentiksi main-metodin ulkopuolella, mutta ei luonut oliota, jonka kenttiä nämä olisivat olleet, tästä sai 0 pistettä. Samoin, jos koodi ei ollut ajettava sovellus. In English: See an example of one of the correct solutions below. Due to a translation error, part b of the assignment was incomprehensible. If you feel a need for compensation, please contact the course personnel. Esimerkkivastaus (in English): /* a) A class to represent text files that can be read line by line. */ public class LineFile { CharacterFile file; public LineFile (String filename) { try { file = new CharacterFile(filename); } catch (Exception e) { file = null; } } /* Returns a line read from the file. An empty line is returned as an empty line, but because the assignment was not quite clear on this point, other reasonable solutions have been accepted, too. */ public String readLine() { StringBuffer buffer = null; if (file==null) return null; try { /* StringBuffer is like String, except catenation might be faster. It was all right to use String. */ buffer = new StringBuffer(40); char data; while ((data = file.readCharacter())!='\n' && (data !='\u0000')) buffer.append(data); // the same as String + if (data=='\n' || buffer.length()>0) return buffer.toString(); return null; } catch (Exception e){ return null; } } /* b, the application for counting lines. Writing this in a different class was all right. If you don't specify a file as an argument, nothing happens. */ public static void main (String [] args) { if (args.length > 0) { LineFile file = new LineFile (args[0]); int count = 0; while (file.readLine()!=null) count++; System.out.println(count); } } }