Kesän 2011 Ohjelmoinnin jatkokurssi muodostuu kolmesta tehtäväsarjasta, joissa jokaisessa on 16 tehtävää:
Perustehtävät (11 kpl) ovat suoraviivaisia tehtäviä kurssin tärkeimmistä asioista. Perustehtävät kannattaa tehdä aina kokonaan.
Lisätehtävät (4 kpl) ovat syventäviä tehtäviä, joissa kurssin asioita sovelletaan uudenlaisissa tilanteissa.
Pähkinä (1 kpl) on haastava tehtävä, jonka ratkaiseminen vaatii miettimistä ja oivaltamista.
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.
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:
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
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
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
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
Keksi itse jokin kiinnostava ominaisuus ja tee ohjelma, joka etsii kaikki tällaiset sanat sanalistasta.
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.
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]
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!
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.
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.
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ä?
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
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ä:
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:
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!
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.
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ää.
Laita vielä lopuksi kaksi tietokonetta pelaamaan keskenään. Kuinka pitkiä sanaketjuja ne saavat aikaan keskimäärin?
Tee tätä tehtäväsarjaa varten NetBeans-projekti
SudokunRatkaisija
.
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ä.