Takaisin kurssin pääsivulle

Tehtävät, osa 2

Kesän 2011 Ohjelmoinnin jatkokurssi muodostuu kolmesta tehtäväsarjasta, joissa jokaisessa on 16 tehtävää:

Palautus

Tehtävät palautetaan esittelemällä niitä ohjaajalle ohjelmointipajassa. Osan 2 tehtävien viimeinen palautuspäivä on keskiviikko 15.6., mutta tehtäviä voi mielellään palauttaa aiemminkin.

Sanatutkimus

Tee tätä tehtäväsarjaa varten NetBeans-projekti Sanatutkimus.

Tässä tehtäväsarjassa tutkitaan hieman, millaisia sanoja suomen kielessä on. Tehtävissä käytetään tiedostoa sanalista.txt, jossa on Kotimaisten kielten tutkimuskeskuksen julkaisema nykysuomen sanalista.

Lue materiaalista luku 4 ja tee seuraavat tehtävät:

17. Missä äx?

Tee ohjelma, joka tulostaa kaikki sanalistan sanat, joissa on x-kirjain.

Ohjelman tulostuksen tulisi olla seuraava:

bordeaux
bordeauxviini
dixieland
(rivejä välissä)
texmexruoka
thorax
xerokopio

18. Pitkät sanat

Tee ohjelma, joka tulostaa kaikki sanat, joiden pituus on yli 25 kirjainta.

Ohjelman tulostuksen tulisi olla seuraava:

kaksitoistasäveljärjestelmä
kaupunkisuunnitteluvirasto
kirjallisuushistoriallinen
(rivejä välissä)
vastavallankumouksellisuus
ylioppilastutkintolautakunta
ylioppilastutkintotodistus

19. Eri kirjaimet

Tee ohjelma, joka tulostaa kaikki sanat, joissa jokainen kirjain esiintyy vain kerran ja joiden pituus on yli 10 kirjainta.

Ohjelman tulostuksen tulisi olla seuraava:

arvohenkilö
aurinkoöljy
elämyspohja
(rivejä välissä)
öljysoratie
öljyvahinko
öljyväkirehu

20. Peräkkäiset vokaalit

Tee ohjelma, joka tulostaa kaikki sanat, joissa on peräkkäin neljä vokaalia tai enemmän.

Ohjelman tulostuksen tulisi olla seuraava:

ansioäiti
bioeettinen
buuaus
(rivejä välissä)
voyeuristi
yöaika
yöaikainen

21. Oma ominaisuus

Keksi itse jokin kiinnostava ominaisuus ja tee ohjelma, joka etsii kaikki tällaiset sanat sanalistasta.

Käyttäjänhallinta

Tee tätä tehtäväsarjaa varten NetBeans-projekti Kayttajanhallinta.

Tässä tehtäväsarjassa teemme ohjelman, joka tallentaa tiedostoon ohjelman käyttäjien nimet.

22. Nimet listaan

Tee ohjelma, joka lukee tiedostossa nimet.txt olevat nimet ArrayList-rakenteeseen. Sitten ohjelma tulostaa listan sisällön.

Tiedoston nimet.txt sisältö voisi olla seuraava:

Aapeli
Maija
Uolevi

Nyt ohjelman tulostuksen tulisi olla seuraava:

[Aapeli, Maija, Uolevi]

23. Uusi käyttäjä

Laajenna ohjelmaa niin, että se kysyy käyttäjän nimeä. Jos nimeä ei ole tiedostossa, ohjelma lisää nimen tiedostoon. Ohjelma myös tulostaa eri tekstin riippuen siitä, onko käyttäjä vanha vai uusi.

Oletetaan taas, että tiedostossa ovat seuraavat nimet:

Aapeli
Maija
Uolevi

Nyt ohjelman ensimmäinen suorituskerta näyttää seuraavalta:

Anna nimesi: Hillevi
Hei, uusi käyttäjä!

Tämän seurauksena tiedoston sisällöksi tulee seuraava:

Aapeli
Maija
Uolevi
Hillevi

Ohjelman toisella suorituskerralla käy näin:

Anna nimesi: Hillevi
Tervetuloa takaisin!

24. Käyttäjien tiedot

Laajenna ohjelmaa niin, että se tallentaa jokaisen käyttäjän koko nimen ja iän tiedostoon [nimi].txt, jossa [nimi] on käyttäjän nimi.

Esimerkiksi tiedosto Aapeli.txt voisi näyttää seuraavalta:

Aapeli Koodinen
31

Nyt ohjelman ensimmäinen suorituskerta näyttää seuraavalta:

Anna nimesi: Hillevi
Hei, uusi käyttäjä!
Mikä on koko nimesi? Hillevi Javanen
Kuinka vanha olet? 77
Kiitos tiedoista!

Tiedostoon Hillevi.txt ilmestyy seuraavaa:

Hillevi Javanen
77

Tältä näyttää ohjelman toinen suorituskerta:

Anna nimesi: Hillevi
Tervetuloa takaisin!
Nimesi on Hillevi Javanen ja olet 77 vuotta vanha.

Piin likiarvo

Tee tätä tehtäväsarjaa varten NetBeans-projekti PiinLikiarvo.

Javan tarjoama piin likiarvo (Math.PI) ei ole kovin tarkka:

3.141592653589793

Tiedostossa pii.txt on paljon tarkempi likiarvo, miljoona ensimmäistä desimaalia.

25. Haku piistä

Tee ohjelma, joka kysyy käyttäjältä numerosarjan ja kertoo, missä kohdassa piitä kyseinen numerosarja esiintyy ensimmäisen kerran.

Ohjelmasi tulisi toimia seuraavasti:

Anna numerosarja: 141
Aloituskohta: 3

Numerosarja 141 esiintyy tosiaan heti piin alussa kolmannesta merkistä alkaen.

Muita esimerkkejä:

Anna numerosarja: 1234
Aloituskohta: 13809
Anna numerosarja: 12345
Aloituskohta: 49704
Anna numerosarja: 123456
Ei löydy 1000000 desimaalin joukosta!

Mitä kaikkea muuta löydät piistä?

26. Piin osan tulostus

Tee ohjelma, joka kysyy käyttäjältä aloituskohdan ja lopetuskohdan. Sitten ohjelma tulostaa piin numerot tältä väliltä. Toteuta ohjelma niin, että se tulostaa rivinvaihdon aina 50 numeron välein.

Ohjelmasi tulisi toimia seuraavasti:

Aloituskohta: 1
Lopetuskohta: 120
3.141592653589793238462643383279502884197169399375
10582097494459230781640628620899862803482534211706
79821480865132823066
Aloituskohta: 123
Lopetuskohta: 456
09384460955058223172535940812848111745028410270193
85211055596446229489549303819644288109756659334461
28475648233786783165271201909145648566923460348610
45432664821339360726024914127372458700660631558817
48815209209628292540917153643678925903600113305305
48820466521384146951941511609433057270365759591953
0921861173819326117931051185480744

27. Numeroiden jakauma

Yksi kiinnostava piihin liittyvä kysymys on, miten tasaisesti siinä esiintyy eri numeroita. Tee ohjelma, joka laskee ja tulostaa jokaisen numeron 0–9 esiintymiskerrat piin 1000000 ensimmäisen desimaalin joukossa.

Ohjelmasi tulostuksen tulisi olla muodoltaan seuraava:

numero 0 esiintyy X kertaa
numero 1 esiintyy X kertaa
numero 2 esiintyy X kertaa
(jne.)

Lisätehtävät alkavat tästä:

Sanaketju

Tee tätä tehtäväsarjaa varten NetBeans-projekti Sanaketju.

Sanaketju-pelissä pelaajat sanovat vuorotellen suomen kielen sanoja. Seuraavan sanan täytyy erota edellisestä niin, että yksi kirjain on muutettu, lisätty tai poistettu. Peli päättyy, kun jompikumpi pelaaja ei keksi enää ketjuun sopivaa sanaa, jota ei olisi vielä mainittu.

Seuraavassa on yksi esimerkki pelin kulusta:

Tässä tehtäväsarjassa toteutetaan peliin tietokonevastustaja suomen kielen sanalistan avulla.

Lue materiaalista luku 6 ja tee seuraavat tehtävät:

28. Peräkkäiset sanat

Tee koodi, joka tarkistaa, ovatko kaksi sanaa peräkkäin sanaketjussa eli onko niiden erona yksi kirjaimen muutos, lisäys tai poisto.

Ohjelmasi tulisi toimia seuraavasti:

1. merkkijono: alku
2. merkkijono: akku
OK
1. merkkijono: lastu
2. merkkijono: latu
OK
1. merkkijono: alku
2. merkkijono: tasku
Ei kelpaa!

29. Pelin runko

Tee pelistä kahden ihmispelaajan versio, jossa tietokone tarkistaa, että sanat ovat suomen kielen sanoja, ne ovat peräkkäin sanaketjussa ja sama sana ei esiinny monta kertaa.

30. Tietokonepelaaja

Korvaa toinen pelaaja tietokonepelaajalla, joka osaa valita sopivan sanan sanalistasta. Jos mahdollisia sanoja on useita, tietokone voi valita minkä tahansa niistä tai tehdä jotain kehittyneempää.

31. Kaksi konepelaajaa

Laita vielä lopuksi kaksi tietokonetta pelaamaan keskenään. Kuinka pitkiä sanaketjuja ne saavat aikaan keskimäärin?

Pähkinä

Tee tätä tehtäväsarjaa varten NetBeans-projekti SudokunRatkaisija.

32. Sudokun ratkaisija

Tee ohjelma, jolle annetaan sudokuruudukko, jossa puuttuvien lukujen tilalla on kysymysmerkki. Sitten ohjelma tulostaa ruudukon uudestaan niin, että kysymysmerkit on korvattu oikeilla luvuilla.

Ohjelman toiminnan tulisi näyttää tältä:

Anna sudoku:
8?64??12?
?9???1476
?4??????3
?5??1?2??
2?83?57?1
??4?9??8?
6??????1?
4851???3?
?17??35?2
Ratkaisu:
836457129
592831476
741962853
359718264
268345791
174296385
623574918
485129637
917683542

Suoraviivainen (ja riittävän tehokas) tapa toteuttaa ohjelma on käydä läpi kaikki järkevät mahdollisuudet sijoittaa lukuja kysymysmerkkien kohdalle.

Esimerkiksi jos ohjelma käy ruudukkoa läpi ylhäältä alas ja vasemmalta oikealle, ensimmäisen kysymysmerkin kohdalla tilanne on seuraava:

Niinpä ohjelma haarautuu tutkimaan vaihtoehtoja, joissa kysymysmerkin kohdalle tuleva luku on 3 tai 7:

             8?64??12?
             ?9???1476
             ?4??????3
             ?5??1?2??
             2?83?57?1
             ??4?9??8?
             6??????1?
             4851???3?
             ?17??35?2
            /         \
           /           \                 
          /             \             
         /               \            
8364??12?                 8764??12?
?9???1476                 ?9???1476
?4??????3                 ?4??????3
?5??1?2??                 ?5??1?2??
2?83?57?1                 2?83?57?1
??4?9??8?                 ??4?9??8?
6??????1?                 6??????1?
4851???3?                 4851???3?
?17??35?2                 ?17??35?2

Vastaava haarautuminen tapahtuu kaikissa kohdissa, joissa on kysymysmerkki. Haarautumisen toteuttamiseen soveltuu erittäin hyvin rekursiivinen metodi. Jos ohjelma onnistuu korvaamaan jossain haarassa kaikki kysymysmerkit luvuilla synnyttämättä ristiriitoja ruudukkoon, sudokun ratkaisu on valmis.

Kaksiulotteinen taulukko on myös hyödyllinen tässä tehtävässä.

Takaisin kurssin pääsivulle