Ohjelmointi 1, syksy 2007 -- Demo 4

Tehtävät julkaistaan:
 Tiistain luennolla 2.10.2007
Palautus viimeistään:
 9.10.2007 klo 18
100% tehtävistä tarkoittaa:
 6 kpl tehty

Lupasin välipalaksi kevyemmät demot, joten tässä nämä. 6 kpl on 100% näistä. 8 kpl on 133% eli aika paljon...

Nyt on nähty kertaalleen melkein kaikki perusrakenteet: lauseet, joilla suoritusjärjestys määrätään (poikkeuksien käsittely vielä odottaa edessä päin) sekä useimpien ohjelmointikielten syntaksin tukemat perustietorakenteet taulukoita ja merkkijonoja myöten. Tutustutaan tässä demossa merkkijonoluokkien APIin ja taulukon käyttöön. Käydään uudelleen läpi algoritmirakenteita, toivon mukaan helpommin lähestyttävien tehtävien muodossa kuin demossa 3.

Contents

Kertausko opintojen äiti

Tehtävä 1:

Vastaukseksi tulee tekstitiedosto.

Toisella luennolla näytettiin esimerkkiohjelmia. Analysoi nykyisen Java-ymmärryksesi mukaan kahta niistä (alempana on täsmäkysymyksiä):

Molemmista ohjelmista, kerro seuraavat asiat:

  1. kuinka monta aliohjelmaa sisältyy tarkasteltavaan ohjelmaan
  2. mitä Java-alustan tarjoamia luokkia tarkasteltavaan ohjelmaan on tuotu eli ''importoitu'' käyttöön
  3. mitä @ -merkillä varustettuja kohtia löydät kommenteista (voit copy-pasteta kohdat koodeista vastaukseen...)
  4. mihin uskot että @ -merkkiä käytetään yleensä kommenteissa?

Yleisesti kerro seuraavat asiat:

  1. jos alussa ei olisi import -rivejä, miten ohjelman saisi kuitenkin toimimaan? Anna yksi käytännön esimerkki jommastakummasta esimerkkiohjelmasta.
  2. miksi import -rivit ovat käteviä?

Hyödyllinen asia kaikkien kannalta, jos vastaat tähän:

  1. mitä näissä kahdessa esimerkkiohjelmassa näkemääsi et vielä ymmärrä tässä vaiheessa kurssia?

Vapaaehtoinen lisäpohdinta, joka kannattaa aina tehdä, kun katsoo joko omaa tai kenen tahansa muun koodia:

  1. löydätkö ohjelmista virheitä tai puutteita, joista voi seurata ongelmia? Mitä ne ovat?

    (Voin kertoa, että niitä on, ja aina on.)

Tehtävä 2:

Laajenna viime demossa ollutta merkkiopastusohjelmaa (omaa tai mallivastausta) seuraavilla merkeillä ja selityksillä; samalla muistelet itsekin merkkien merkityksiä, ja opit muokkaamaan aiemmin tehdyn switch-lauseen caseja.

Lisää seuraavat merkit:

Merkit   Selitys
[        "Vasen hakasulje; käytetään taulukoiden syntaksissa"
]        "Oikea hakasulje; käytetään taulukoiden syntaksissa"
%        "Prosenttimerkki; printf-tulostuksessa käytetyn formaatin aloitusmerkki"
*        "Asteriski; kerto-operaattori, joskus myös villikortti 'mikä tahansa'"
^        "Sirkumfleksi; merkityksenä joskus potenssilasku"
&        "Et-merkki ('ampersand'); merkitsee usein biteittäistä AND-operaatiota"
|        "'Tolppamerkki'; merkitsee usein biteittäistä OR-operaatiota"
=        "'yhtäsuuruusmerkki'. Merkitsee Javassa muuttujaan sijoittamista"

Lisää seuraavat merkitykset (Voit tulostaa lisärivin vastaavassa casessa):

\        "Myös merkki- ja merkkijonoliteraaleissa 'eskeippimerkkinä'"
/        "Useissa ohjelmointikielissä jakolaskuoperaattori."
{        "Käytetään mm. Javan taulukkoliteraalissa taulukon alustuksessa."
}        "Käytetään mm. Javan taulukkoliteraalissa taulukon alustuksessa."
&        "Kaksi et-merkkiä ''&&'' tarkoittaa usein loogista AND-operaatiota"
|        "Kaksi tolppamerkkiä ''||'' tarkoittaa usein loogista OR-operaatiota"
|        "Unix-shellissä tolppa 'putkittaa' ohjelman stdoutputin toisen stdinputtiin"
=        "Varsinainen yhtäsuuruusoperaattori on Javassa ''=='' eli kaksi merkkiä."
0        "Nolla kokonaislukuliteraalin alussa aloittaa joko oktaali- tai heksaluvun"
x        "Nolla ja x eli ''0x'' kokonaislukuliteraalin alussa aloittaa heksaluvun"

Jälleen: Pohjaksi aiempi koodi (oma tai mallivastaus) ja sitten laita tekstit copy-pastella netistä löytyvästä tehtäväkokoelmasta kirjoittaen ympärille tarvittava Java-syntaksi.

Merkkijonoja ja taulukoita

Tehtävä 3:

Tee ohjelma Huutaja, joka tutkii käyttäjän antamat komentoriviargumentit, ja toimii seuraavasti:

  • Jos jonakin argumenttina on -version niin ohjelma tulostaa itsestään versiotiedon (saat keksiä muodon itse)
  • Jos jonakin argumenttina on -help niin ohjelma tulostaa itsestään avustuksen, joka kertoo komentorivin muodon.
  • Riippumatta argumenteista, ohjelma huutaa standarditulosteeseen: APIA! ja kaikki ne argumentit, joiden ensimmäinen merkki ei ole viiva '-'

Tehtävä 4:

Tee ohjelma, jonka main()-aliohjelma alustaa kovakoodatut taulukot, joissa on esimerkiksi seuraavat luvut liukulukuina:

Yksi taulukko sisältäisi
    -1  -2  3  4


Toinen taulukko sisältäisi
    7 8 10 10

Toteuta ohjelmaan aliohjelma, joka laskee yhteen kahden taulukon sisällöt alkioittain, niin että se luo uuden taulukon, jossa on summatut alkiot. Toteuta toinen aliohjelma, joka tulostaa taulukon alkiot (ks. muoto esimerkissä alempana).

Oletetaan, että taulukot on molemmat samankokoisia. Aliohjelmia käyttäen tee testiohjelma, joka tulostaa kovakoodatuille taulukoillesi seuraavasti:

Kokeillaan taulukoita.
Alkio 1 (indeksissä 0): 6.00
Alkio 2 (indeksissä 1): 6.00
Alkio 3 (indeksissä 2): 13.00
Alkio 4 (indeksissä 3): 14.00

Tehtävä 5:

Etsi Stringin ja StringBuilderin APIsta keinot seuraavan ohjelman toteuttamiseen, ja tee ohjelma:

Standardi-inputista luetaan merkkijonoja kunnes tulee tyhjä rivi. Jokainen jono muunnetaan isoiksi kirjaimiksi ja liitetään jatkoksi tulosmerkkijonoon siten että väliin tulee tolppamerkki. Tulosmerkkijono kaiutetaan joka kerta tulosteeksi. Esim:

Syötä jono>hep
Tulosjono: HEP
Syötä jono>hei
Tulosjono: HEP|HEI
Syötä jono>miten menee
Tulosjono: HEP|HEI|MITEN MENEE
Syötä jono>
Tulosjono: HEP|HEI|MITEN MENEE
--- tyhjä jono... lopetetaan tähän ---

Tehtävä 6:

Olemme pykäilleet Celsius-Fahrenheit-muunnosohjelmaa. Muuta ohjelma sellaiseksi, että käyttäjältä kysytään konsolin kautta Celsius-astemääriä, jotka muunnetaan Fahrenheit-asteiksi. Ohjelman tulee myös jokaisen kerran jälkeen kysyä käyttäjältä, haluaako tämä lopettaa vai jatkaa vielä muunnosten tekemistä. Ota lopetus/jatko -vastaus merkkijonona (Scannerin nextLine()), ja muista että merkkijonoja ei voi verrata yhtäsuuruusoperaattorilla, koska se testaa olioyksilöiden samuutta eikä niiden sisältöjen samankaltaisuutta.

Bonussektori

Bonussektorin tekemällä voi saada demoprosentiksi yli 100% (tällä kertaa jopa 133%)!

Tehtävä 7:

Tämä on Bonus-kysymys, koska se edellyttää enemmän tekemistä (tai vähintään ajattelemista) aiemman tehtävän pohjalta. Ajattelu yleensä johtaa pitkällä tähtäimellä lyhyempiin ja selkeämpiin koodeihin...

Celsius-Fahrenheit -tehtävässä piti käyttäjältä kysyä merkkijonona, haluaako tämä lopettaa. Esim:

Haluatko lopettaa (k/e)>k
Ok, ohjelma loppuu tähän... kiitos, kun käytit järjestelmäämme.

Pyöräytäpäs kysymisestä yleisköyttöinen dialogialiohjelma, jolla voi antaa minkä tahansa kehotteen, vaikkapa:

Mikä lintu koet olevasi (varis/naakka/lokki)>

Käyttäjältä kysytään niin pitkään kunnes joku vaihtoehdoista on sama. Esim:

Mikä lintu koet olevasi (varis/naakka/lokki)>harakka
Ups. 'harakka' ei ole vaihtoehtojen joukossa!
Mikä lintu koet olevasi (varis/naakka/lokki)>vairs
Ups. 'vairs' ei ole vaihtoehtojen joukossa!
Mikä lintu koet olevasi (varis/naakka/lokki)>varis
ok.

Aliohjelman tulee palauttaa kokonaisluku, joka vastaa käyttäjän kirjoittaman vaihtoehdon indeksiä; yllä esim. varis==0, naakka==1, lokki==2.

Pärjäät tähän asti nähdyillä tietorakenteilla: Merkkijonoilla ja taulukoilla. Pärjäät tähän asti nähdyillä algoritmisilla kontrollirakenteilla myös: erilaiset toistot ja ehtorakenne.

Tehtävän ideana on johdatella huomaamaan lisää perusteluja aliohjelman hyödyllisyyteen: Samaa dialogialiohjelmaa voi käyttää missä tahansa ohjelmassa, kun se on kerran kirjoitettu. Jos tämä on "selkäytimessä", yhden ohjelman tekeminen johtaa tilanteeseen, jossa seuraava samankaltainen on nopeampi saada valmiiksi.

:Tehtävä 8:

Johda itse matemaattisesti, tai etsi valmis vastaus netistä: Miten muunnetaan toisin päin eli Fahrenheit-asteista Celsiuksiksi.

Tee aiempaa vastaava mutta eriniminen aliohjelma, joka tekee F-C -muunnoksen. Sitten toteuta molemminpäinen muunnosohjelma käyttäen tehtävien 6 ja 7 pohjakoodia. Käyttöesim:

Kummasta asteikosta muunnos toiseen tehdään (c/f)>f
Anna lämpötila Fahrenheit -asteina>7,8
Lämpötila on Celsiuksina ... [tulostuisi vastaus; mulla ei oo tätä ohjelmaa vielä]
Haluatko lopettaa (k/e)>e
Kummasta asteikosta muunnos toiseen tehdään (c/f)>c
Anna lämpötila Celsius -asteina>
...