----------------------------------------------------------------------------- Java-ohjelmointi, 22.06.2000 tehtävän 4 arvosteluperusteet Olli Lahti ----------------------------------------------------------------------------- Tehtävässä pyydettiin laatimaan ohjelma tiedoston kopioimiseen siten, että syötteenä annettava merkki muuttuu toiseksi syötteen mukaiseksi merkiksi. Lähde- ja kohdetiedostojen nimet saadaan toisaalta komentoriviparametreina. Apuna tuli käyttää luokkia Syottotiedosto ja Tulostiedosto, jotka tarjoavat (ainakin) tehtävänannossa kuvatut palvelut. Näitä luokkia ei siis pitänyt eikä saanut toteuttaa itse. Ratkaisuksi riitti esittää luokkaan KorvaaMerkki sijoitettu main-metodi, joka suorittaa kaiken tarvittavan. Arvostelu perustuu oheiseen esimerkkiratkaisuohjelmaan, jonka eri osista sai enimmillään 14 pistettä seuraavasti: * yleisrakenne (staattinen main-metodi paikallisine muuttujineen; itse luokkaan ei tarvita lainkaan kenttiä) 2 p. * komentoriviparametrien tarkistus (args.length) sekä ohjelman suorituksen päättäminen ellei kahta parametria 1 p. * tiedostojen avaus eli Syottotiedosto- ja Tulostiedosto- olioiden luonti komentoriviparametrien mukaisesti (args[0/1]) 3 p. - ellei käytetty komentoriviparametreja, 1 p. vähemmän * korvattavan ja korvaavan merkin kysyminen käyttäjältä ja lukeminen näppäimistöltä Lue.merkki() -kutsulla 1 p. * ensimmäisestä tiedostosta lukeminen String-muuttujaan ( mjono = syotto.lueRivi(); ) ja lukemisen toistaminen, kunnes lueRivi-kutsu palauttaa arvon null 3 p. - jokainen lueRivi-kutsu lukee aina seuraavan rivin; yhtä ja samaa riviä ei voi lukea useampaan kertaan * luetun merkkijonon muokkaaminen korvatuksi versioksi 2 p. - myös String-luokan valmiin metodin replace virheetön käyttäminen hyväksyttiin * korvatun merkkijonon (String) kirjoittaminen toiseen tiedostoon: tulos.kirjoitaRivi(...) 2 p. Melko monessa vastauksessa sovellettiin väärin lohkon näkyvyyssääntöjä. Seuraava esimerkki on siis virheellinen: do { ... tyyppi mja = ... ... } while (mja ...); Muuttujasta mja ei tiedetä mitään toistettavan lohkon ulkopuolella, ei edes while-ehdossa! --> 1 1/2 miinuspistettä ----------------------------------------------------------------------------- /* Java-ohjelmointi, koe 22.6.2000, tehtävän 4 esimerkkiratkaisu - Olli Lahti * KorvaaMerkki -- ohjelma tiedoston kopiointiin annetuin merkinkorvauksin */ public class KorvaaMerkki { public static void main(String[] args) { if (args.length != 2) { System.out.println("komentoriviparametrit: lähdetiedosto kohdetiedosto"); return; // Poistu pääohjelmasta, // myös System.exit(0); kävisi. } Syottotiedosto syotto = new Syottotiedosto(args[0]); Tulostiedosto tulos = new Tulostiedosto(args[1]); // Ohjelman suoritus jatkuu, jos ja vain jos virheitä ei sattunut. System.out.print("Anna korvattava merkki: "); char vanhamerkki = Lue.merkki(); System.out.print("Anna merkin '" + vanhamerkki + "' korvaava merkki: "); char uusimerkki = Lue.merkki(); String rivimjono; char[] rivitaulu; while ( ( rivimjono = syotto.lueRivi() ) != null ) { rivitaulu = rivimjono.toCharArray(); for (int i=0; i