/** * Helsingin yliopisto, Tietojenkäsittelytieteen laitos * * Johdatus ohjelmointiin, syksy 1998 * 2. välikoe, tehtävä 4. mallivastaus * * @author Marko Ullgren */ public class Korvaa { /** * Ohjelma muokkaa syöttötiedostosta tulostiedoston siten, että jokainen korvattava merkki korvataan * korvaavalla merkkijonolla. Lopuksi ohjelma kertoo käyttäjälle, monestiko korvattiin. */ public static void main(String[] args) { Syottotiedosto syotto; Tulostiedosto tulos; char korvattava; String korvaava; String rivi; int korvauslaskuri = 0; System.out.println("Anna syöttötiedoston nimi"); syotto = new Syottotiedosto( Lue.rivi() ); System.out.println("Anna tulostiedoston nimi"); tulos = new Tulostiedosto( Lue.rivi() ); System.out.println("Anna korvattava merkki"); korvattava = Lue.merkki(); System.out.println("Anna korvaava merkkijono"); korvaava = Lue.rivi(); // luetaan syöttötiedostosta rivejä, kunnes tiedosto loppuu while( ( rivi = syotto.lueRivi() ) != null ) { // muutetaan rivi taulukoksi, voitaisiin myös käyttää // charAt()- pohjaista ratkaisua char[] riviTaulukkona = rivi.toCharArray(); String uusiRivi = ""; // käydään luettu rivi läpi for( int i = 0; i < riviTaulukkona.length; i++ ) // jos löydetään korvatttava merkki... if ( riviTaulukkona[i] == korvattava ) { //...korvataan se korvaavalla merkkijonolla ja // kasvatetaan laskuria... uusiRivi += korvaava; korvauslaskuri++; } //...muussa tapauksessa kopioidaan merkki sellaisenaan. else uusiRivi += riviTaulukkona[i]; tulos.kirjoitaRivi( uusiRivi ); } System.out.println("korvattiin "+korvauslaskuri+ " kertaa."); } } Arvostelusta: Tehtävän arvostelussa kiinnitettiin huomiota erityisesti annettujen Syottotiedosto- ja Tulostiedosto-luokkien käyttöön. Näiden oikeasta käytöstä sai puolet jaossa olleista kahdeksasta pisteestä. Loput neljä pistettä sai, jos korvausalgoritmi ja luokkarakenne olivat toimivia ja syntaktisesti oikeita. Yleisimpiä virheitä olivat laskurin puuttuminen, NullPointerExceptioniin päättyvä korvausalgoritmi, uusiRivi - muuttujan "tyhjennyksen" puuttuminen sekä erilaiset substring - algoritmiratkaisut, jotka jäävät ikuiseen silmukkaan esimerkiksi korvattaessa merkki a merkkijonolla ab. Näistä virheistä vähennettiin yhdestä kahteen pistettä kustakin. Pienistä kirjoitus- ja kielivirheistä ei sakotettu, vakavammista virheistä vähennettiin yhdestä kahteen pistettä. Tehtävä oli osattu melko hyvin, suurin osa pisteistä osui välille 6-8.