Helsingin yliopisto / Tietojenkäsittelytieteen laitos / Ohjelmoinnin jatkokurssi
Copyright © 2009 Arto Wikla. Tämän oppimateriaalin käyttö on sallittu vain yksityishenkilöille opiskelutarkoituksissa. Materiaalin käyttö muihin tarkoituksiin, kuten kaupallisilla tai muilla kursseilla, on kielletty.

6. harjoitukset 7.11.12.2009

Aiheita: tiedostoja, poikkeuksia, geneeristen tietorakenteiden käyttöä

  1. Luentomateriaalin luvun 5.1 kohdassa "Virheiden käsittelyä", http://www.cs.helsinki.fi/u/wikla/Ohjelmointi/Sisalto/5/PoiLuk.html#9, on pohdiskeltu erilaisia tapoja hoidella virhetilanteita erityisesti olioita konstruoitaessa.

    Täydennä, toteuta ja suorita tietokoneella luentomateriaalin yksinkertaisia ohjelmaesimerkkejä siten, että ne havainnollistavat OmaOlio-luokan määrittelyä ja käyttöä siten, että konstruoinnin epäonnistuminen virheellisten parametrien takia hoidetaan a) erityisellä onkoKunnossa-tyyppisellä aksessorilla, b) staattisella luontimetodilla, c) tarkistettuja (checked) poikkeuksia heittäen, d) tarkistamattomia (unchecked) poikkeuksia heittäen. Pohdi millaisiin tilanteisiin eri tavat soveltuvat. (Tähän havainnollistus- ja pohdintatehtävään ei tule esimerkkiratkaisua.)

  2. Laadi ohjelma EtsiSanoja merkkijonon etsimiseen tekstitiedostosta. Ohjelmalle annetaan ensin tekstitiedoston nimi komentoriviparametrina. Etsittäviä merkkijonoja ohjelma kysyy käyttäjältä. Komentoriviparametrin ja tiedoston puuttumisesta on annettava virheilmoitus. Ohjelma tulostaa kuvaruudulle rivinumeroin ne tiedoston rivit, joihin sisältyy haettava merkkijono. Ohjelman suoritus päättyy kun kysytään tyhjää merkkijonoa.

    Jos esimerkiksi Juhanin Ahon romaanista Rautatie (tiedosto Rautatie.txt) etsitään sanoja, tulos voi näyttää seuraavalta:

    Mitä merkkijonoa etsitään tiedostosta Rautatie.txt?
    veturi
    551: veturin, joka vaunuja vetää, sen panee kanssa höyry liikkeelle. Siipien
    3215: --Etumaiset on suuremmat ... veturin pyörät ... toiset pienemmät,
    Mitä merkkijonoa etsitään tiedostosta Rautatie.txt?
    kännykkä
    Mitä merkkijonoa etsitään tiedostosta Rautatie.txt?
    koira
    838: --Kyllä oli, koira vieköön, liikaa kehumista! Jos oikein pistokkaalla
    841: niin kyllä, koira vieköön, jälelle jäisi raskas rumilas, vaikka kuinka
    Mitä merkkijonoa etsitään tiedostosta Rautatie.txt?
    
    

  3. Toteuta seuraavat ohjelmat "komentorivikomentoina" - virheistä annetaan selkeät ilmoitukset, mutta ohjelmat eivät kysele mitään. Tiedostojen nimet annetaan komentoriviparametreina.

    1. Ohjelma JaaKahdeksi jakaa yhden tekstitiedoston kahdeksi siten, että parittomat rivit menevät yhteen tiedostoon, parilliset toiseen. Ohjelma käynnistetän komennolla:
      java JaaKahdeksi jaettavaTiedosto.txt parittomatRivit.txt parillisetRivit.txt
      
    2. Ohjelma YhdistaKahdesta yhdistää kaksi tekstitiedostoa yhdeksi siten, että joka toinen rivi otetaan toisesta, joka toinen toisesta. Jos jompi kumpi syöttötiedosto loppuu ennen toista, pidemmän rivit kopioidaan sellaisenaan yhdistettyyn tiedostoon. Ohjelma käynnistetän komennolla:
      java YhdistaKahdesta  eka.txt toka.txt yhdistettyTiedosto.txt
      
    3. Testaa ohjelmat erilaisin tilantein. Myös virheiden käsittely on testattava.

  4. Toteuta luokka SananSeuraajat, tietorakenne, johon voidaan tallettaa pareja (sana, sanaluettelo). Luokka tarjoaa ainakin palvelut:

    Kirjoita luokkaan myös yksinkertainen pääohjelmametodi, joka havainnollistaa luokan ilmentymien luomista ja käyttämistä.

    Vihjeitä: Seuraajaluettelotietorakenteen toteutuksessa kannattaa käyttää sellaista HashMap-oliota, joka esittää assosiaatioita String-merkkijonon ja siihen liittyvän ArrayList<String>-olion välillä. Luentomateriaalin pikku esimerkistä voi saada ideoita ja uskonvarmuutta rakenteiden sisältämien rakenteiden toteuttamiseen:

    import java.util.*;
    
    public class HAEsimerkki {
    
      public static void main(String[] args) {
    
        HashMap<String, ArrayList<String>> seuraajat =
            new HashMap<String,ArrayList<String>>();
    
        ArrayList<String> sanoja = new ArrayList<String>();
    
        sanoja.add("kissa");
        sanoja.add("hiiri");
        sanoja.add("hevonen");
    
        seuraajat.put("eläimiä", sanoja);
    
        ArrayList<String> lukuja = new ArrayList<String>();
        lukuja.add("134");
        lukuja.add("-23");
        lukuja.add("9871");
    
        seuraajat.put("lukuja", lukuja);
    
        System.out.println(seuraajat);
      }
    }
    
    Esimerkkiohjelma tulostaa toString()-metodin valinnan polymorfismin ansiosta:
    {lukuja=[134, -23, 9871], eläimiä=[kissa, hiiri, hevonen]}
    

  5. Laadi edellisen tehtävän luokkaa SananSeuraajat hyväksi käyttäen ohjelma, joka selvittää annetussa tekstitiedostossa kaikkien sanojen välittömät seuraajasanat. "Sanoiksi" lasketaan tässä tehtävässä kaikki Scanner-luokan next()-metodin antamat String-oliot.

    Ohjelma kysyy ensin tiedoston nimen ja tarjoaa sitten palvelun yksittäisen sanan seuraajien selvittämiseen. Testitarkoituksia varten myös koko seuraajaluettelo on syytä tulostaa.

    Testiaineistoa ohjelman kokeiluun (kannattanee käyttää versioita, joista välimerkit on poistettu):

  6. Vastaa kurssikyselyyn osoitteessa http://ilmo.cs.helsinki.fi/kurssit/servlet/Valinta. Muista myös lähettää lomake! Lähetysnäppäin on lomakkeen lopussa. Tähän kysymykseen vastataan yksilönä ja anonyymisti. Tehtävä myös rastitetaan opiskelijoittain, ei opintopiireittäin. Ja rastin saa kirjoittaa, jos on todella vastannut kyselyyn! Opiskelijaan luotetaan tässä-(kin) asiassa! Koetta koskeviin kysymyksiin ei tietenkään voi vastata, mutta kysely tehdään kuitenkin jo nyt, jotta saadaan varmistettua hyvä vastausprosentti. Vastauksilla ihan oikeasti on merkitystä laitoksen opetusta kehitettäessä!


Takaisin harjoitussivulle.