/****************************************************************** Java-ohjelmointi S-2007 Kurssikuulustelu, tehtävä 3 arvosteluperusteet laatinut Jaakko Sorri 3.1. 2008 ******************************************************************* Tehtävän pisteytettiin kolmessa osassa, joista kustakin oli mahdollista saada maksimissaan 5-6 pistettä. Seuraavassa on kerrotaan arvosteluperusteet kohdittain ja luetellaan joitakin yleisimpiä virheitä. Tehtävänannossa pyydettiin erikseen varautumaan erilaisiin virheisiin ja niihin myös piti varautua tai pisteet alkoivat putoilemaan. Seuraavat virhetilanteet tuli ottaa huomioon: komentoriviparametrin puuttuminen, tiedoston puuttuminen, toistuvat käännökset ja pariton rivien määrä lähdetiedostossa (kaikkille sanoille ei löydy käännöstä). KOMENTORIVIPARAMETRIN KÄYTTÖ (5p): Tästä osiosta sai täydet pisteet, jos osasi käyttää komentoriviparametria oikein, muisti tarkistaa, että parametri oli ylipäänsä annettu (ettei ohjelma kaadu null-viitteeseen) ja luoda File-olion. * parametrin olemassa olon tarkistus unohtunut -2p * komentoriviparametriä ei käytetä lainkaan, vaan tiedoston nimi pyydetään suoraan käyttäjältä -2p (yhdessä edellisen kanssa -4p) * File-olion luonnissa ongelmia -1p TIEDOSTON LUKEMINEN (6p): Osiossa oli olennaista varautua tiedoston lukemisessa mahdollisesti eteen tuleviin poikkeuksiin ja tiedoston puuttumiseen. Molempiin voi varautua tyylikkäästi try-catch -lauseella, jonka catch-osassa annetaan käyttäjälle ymmärrettävä selitys tapahtuneesta virhetilanteesta. Tehtävänannon vihje varautua erilaisiin virhetilanteisiin piti ottaa tosissaan, joten täysiin pisteisiin vaadittiin, että käyttäjälle tulee selväksi, onko häneltä jäänyt komentoriviparametri kokonaan pois, vai onko ongelma annetussa tiedostonimessä. Mikäli poikkeukset hoiteli yksinkertaisesti julistamalla koko main-metodi "heittämään" poikkeuksia, piti tiedoston olemassa olo tarkistaa erikseen File-olion exists()-metodilla. * Scanner-oliolle annetaan parametrina String-olio Filen sijaan -3p * poikkeukseen varautuminen puuttuu kokonaan -3p * throws -lause löytyy, mutta tiedoston olemassa oloa ei tarkisteta -2p * muut tiedoston lukuun liittyvät virheet tilanteen mukaan OHJELMAN YLEINEN TOIMINTA (6p): Täman osion pisteisiin kuului kaikki, mikä ei mahtunut edellisiin kategorioihin. Osion virheet liittyivät pääasiassa syntaksiin ja ohjelman toimintalogiikkaan. HashMap-oliota ei ollut pakko käyttää ja tehtävästä selvisikin muuten hyvin taulukoilla, mutta toistuvien sanojen järjestys aiheutti monelle ongelmia. Tehtävänanto nimenomaisesti käski huomioimaan viimeiseksi esiintyneen käännöksen, ei ensimmäistä. * kysely (=käännöspalvelu) puuttuu kokonaan (!) -4p * luokka- ja olio-kaluston sekoaminen -3p * ohjelma kaatuu, jos tiedostossa on pariton määrä rivejä -2p * toistuvasta sanasta otetaan huomioon ensimmäinen käännös (tai kaikki käännökset) -2p * "pienet" loogiset virheet ja "isot" syntaksivirheet -1p * huolimattomuus ym. pikkuvirheet -1/2p ESIMERKKIRATKAISU: ------------------ import java.io.*; import java.util.*; public class Tulkki { public static void main(String[] args) { String sana = ""; String kaannos; HashMap sanakirja; Scanner lukija = new Scanner(System.in); if(args.length < 1){ System.out.println("Sanakirjan sisältävä tiedosto pitää antaa komentoriviparametrina." + "\nEt antanut tiedoston nimeä, ohjelman suoritus päättyy."); return; //komentoriviparametri puuttuu -> lopetetaan } //luodaan sanakirja sanakirja = new HashMap(); try{ Scanner tiedostonLukija = new Scanner(new File(args[0])); while(tiedostonLukija.hasNextLine()){ sana = tiedostonLukija.nextLine(); if(tiedostonLukija.hasNextLine()){ kaannos = tiedostonLukija.nextLine(); //jos käännöstä ei löydy, ei sanaa laiteta sanakirjaan lainkaan sanakirja.put(sana, kaannos); //vanha samaan sanaan liittyvä käännös ylikirjoitetaan } } tiedostonLukija.close(); }catch(Exception e){ System.out.println("Tiedoston \"" + args[0] + "\" avaaminen ei onnistu!"); return; //tiedostoa ei löytynyt -> lopetetaan } //käännöspalvelu System.out.println("Tervetuloa käännöspalveluun!"); System.out.println("Anna minulle sana, niin minä kerron sen käännöksen."); while(true){ System.out.println("Anna käännettävä sana (tyhjä rivi lopettaa)"); sana = lukija.nextLine(); if(sana.equals("")) break; kaannos = sanakirja.get(sana); if(kaannos == null) System.out.println("Käännöstä ei löydy."); else System.out.println(kaannos); } System.out.println("Ohjelman suoritus päättyy."); } }