- 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.)
- 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?
- Toteuta seuraavat ohjelmat "komentorivikomentoina" - virheistä annetaan selkeät
ilmoitukset, mutta ohjelmat eivät kysele mitään. Tiedostojen nimet
annetaan komentoriviparametreina.
- 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
- 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
- Testaa ohjelmat erilaisin tilantein. Myös virheiden käsittely
on testattava.
- Toteuta luokka SananSeuraajat, tietorakenne, johon voidaan
tallettaa pareja (sana, sanaluettelo). Luokka tarjoaa
ainakin palvelut:
- public SananSeuraajat() konstruoi tyhjän SananSeuraajat-olion.
- public void lisääSanalleSeuraaja(String sana, String seuraaja)
lisää sanalle seuraajan. Jos sanaa (ensimmäinen parametri)
ei jo ole tietorakenteessa, se lisätään ja sen ensimmäiseksi
seuraajaksi tulee parametrina annettu seuraaja. Jos sana jo
löytyi, sen seuraajaksi lisätään seuraaja, ellei
jälkimmäinen parametri jo kuulu sanan seuraajien listaan.
- public ArrayList<String> mitkäSeuraavatSanaa(String sana)
palauttaa arvonaan ArrayList<String>-olion, joka sisältää sanan
seuraajat. Ellei sanaa löydy, metodi palauttaa arvon null.
- public String toString() palauttaa arvonaan koko tietorakenteen
merkkijonona. Tässä voit tyytyä käyttämään toteutusrakenteen
omaa toString()-metodia. SananSeuraajat-luokan toString() on
tarkoitettu vain testauksen avuksi.
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]}
- 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):
- Kantelettaren alun teksti ilman välimerkkejä:
KanSa.txt
(Kantelettaren alun teksti sellaisenaan:
Kanteletarta.txt)
- Juhani Ahon "Rautatie" ilman välimerkkejä:
TR.txt
(Lähteenä on käytetty
Project Gutenbergin
"sähköistä kirjaa", EBookia:
"Rautatie", joka sisältää teoksen
täydellisen tekstin
lisäksi tietoja tekstin käyttöoikeudesta ja projektin luonteesta.)
- Shakespearen 10 ensimmäistä sonettia ilman välimerkkejä
SH.txt
(sonetit alkuperäisessä asussa
Shakespeare_1_10.txt)
- Mark Twainin romaani "The Adventures of Huckleberry Finn"
HF.txt
(Lähteenä on käytetty
Project Gutenbergin
"sähköistä kirjaa", EBookia:
"The
Adventures of Huckleberry Finn", joka sisältää teoksen
täydellisen tekstin
lisäksi tietoja tekstin käyttöoikeudesta ja projektin luonteesta.)
- 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ä!