Moni tämän harjoituksen tehtävistä liittyy joko suoraan tai epäsuorasti kurssin toiseen harjoitustyöhön. Harjoitustyö edistyy sitä paremmin, mitä enemmän tehtäviä ratkaiset. Mikäli tehtävissä on jotain epäselvää, laita sähköpostia vastuuopettajalle (jorma.laurikkala@uta.fi). Muista lisätä static-määre operaatioidesi otsikoihin, jotta ohjelmasi kääntyvät. Muista noudattaa hyvän ohjelmointitavan perusteita (Lausekielinen ohjelmointi I -kurssin luentomateriaalin 14. luku) ja uusia hyviä tapoja, joihin kuuluu operaation otsikkoon liittyvä yleisluonteinen kommentti operaation tarkoituksesta sekä operaation mahdollisesti saamista ja palauttamista tiedoista. WETOon (https://wetodev.sis.uta.fi/weto5/) palautetaan vain ratkaisun lähdekoodi eli java-päätteinen tiedosto. In-luokkaa (katso alla) ei tarvitse eikä tule palauttaa. Lisätietoja ratkaisujen palautuksesta ja tarkistuksesta on annettu kurssisivujen Harjoitukset -kohdassa. Ensi viikolla pidettävissä mikroharjoituksissa saa apua ongelmakohtiin. Keskiviikon klo 12 14 - ryhmässä avustetaan hieman enemmän kuin muissa ryhmissä. Palauksen takarajaa on jatkettu. Palauta vastauksesi WETO-järjestelmään viimeistään ensi viikon sunnuntaina 3.12. klo 23.55. Syötteiden lukemiseen tarvittava In-luokka löytyy kurssin kotisivuilta Koodit-kohdasta. Java-kääntäjä ja -tulkki löytyvät yliopiston mikroluokkien koneilta. Nämä ohjelmat voi asentaa myös omalle koneelle. Lisätietoja osoitteesta: http://www.uta.fi/sis/tie/laki1/ohjelmointivalineita/java_jdk.html. Ota yhteyttä kurssin vastuuopettajaan, jos Java ei suostu asentumaan koneellesi. 1. Osoitteessa http://www.sis.uta.fi/~laki2/harjoitukset/harjoitus05/ on annettu Charactersohjelma, joka on toteutettu erittäin huonosti, koska parametreihin ja paluuarvoihin perustuva tiedonvälitys on korvattu attribuuteilla. Attribuutit on tarkoitettu käsitettä mallintavan luokan keskeisimpien tietojen säilömiseen olio-ohjelmoinnissa. Pelkästään tiedonvälitykseen käytettynä attribuuteista on lähinnä haittaa, koska modulaarisuusperiaatetta rikkovat ohjelmat ovat vaikeaselkoisia. Huomaa, että tällä kurssilla ei saa käyttää attribuutteja elleivät ne ole vakiomuotoisia (final-määreellä määriteltyjä). Poista attribuutit ja kirjoita ohjelmasta versio, jossa tiedot välitetään operaatioiden välillä parametreja ja paluuarvoja käyttäen. Älä poista tai lisää operaatioita. Korjatun ohjelman pitää toimia ulkoisesti tulosteita vertaillen samalla tavalla kuin alkuperäinen ohjelma. Esimerkki ohjelman toiminnasta, kun syöte on '': Hello! I eamine characters. Character '': - is not a number, - is a lowercase letter, - is not an uppercase letter and - is a letter. Esimerkki ohjelman toiminnasta, kun syöte on '1': Hello! I eamine characters. 1 Character '1': - is a number, - is not a lowercase letter, - is not an uppercase letter and - is not a letter. Lausekielinen ohjelmointi II Syksy 2017 Jorma Laurikkala 1 / 6
2. Kirjoita Javalla Indenter-ohjelma, joka tulostaa komentoriviparametreina saamansa merkkijonot riveittäin siten, että ne on sisennetty välilyönneillä. Sisennyksen syvyys määritellään viimeisenä komentoriviparametrina. Ohjelma tulostaa merkkijonot vain, jos komentoriviparametreja on vähintään kaksi, sisennyksen syvyys voidaan muuntaa kokonaisluvuksi ja sisennyksen syvyys on positiivinen ( 0). Muissa tapauksissa tulostetaan virheilmoitus. Voit kirjoittaa kaiken koodisi main-operaatioon. Muunna sisennyksen koko merkkijonosta kokonaisluvuksi Integer-luokan parseintoperaatiolla, joka heittää NumberFormatEception-poikkeuksen. Käsittele mahdollinen poikkeus try-catch-lauseella. Esimerkki: try {... // Yritetään muuntaa viimeinen komentoriviparametri luvuksi. int syvyys = Integer.parseInt(args[args.length - 1]);... } catch (NumberFormatEception e) {... } Yllä tarkoittaa esimerkistä pois jätettyjä osuuksia. mukaisesti. Huomaa, että rivien loppuun ei tulosteta välilyöntejä ja että kaikki tulostettavat rivit päätetään rivinvaihtoon. Rivien alkuun tulostetaan poikkeuksellisesti välilyöntejä. see you later kun ohjelma ajetaan komennolla: java Indenter see you later 7 kun ohjelma ajetaan komennolla: java Indenter this is a test Lausekielinen ohjelmointi II Syksy 2017 Jorma Laurikkala 2 / 6
3. Kirjoita Javalla Array2DFiller-ohjelma, jolla on char[][]-tyyppinen operaatio, jossa luodaan kaksiulotteinen char-tyyppisen alkioiden taulukko ja täytetään se käyttäjän antamilla merkeillä. Yksittäisen rivin merkit luetaan merkkijonona. Voit olettaa, että merkkijono on aina taulukon rivin pituinen. Taulukon rivien ja sarakkeiden lukumäärä välitetään operaatiolle int-tyyppisinä parametreina. Operaatiolla ei ole muita parametreja. Operaatio palauttaa viitteen käyttäjän antamat merkit sisältävään taulukkoon, jos molemmat parametrit ovat nollaa suurempia. Paluuarvo on muussa tapauksessa null. Kopioi 4. harjoituksen 7. tehtävän tulostusoperaatio joko omasta tai malliratkaisusta oman operaation seuraksi tämän tehtävän ohjelmaan. Lue taulukon rivien ja sarakkeiden lukumäärät käyttäjältä main-operaatiossa ja kutsu operaatiotasi antamalla käyttäjän syötteet operaatiosi parametriksi. Sijoita operaation palauttama arvo muuttujaan. Anna paluuarvon sisältämä muuttuja tulostusoperaation parametriksi main-operaatiossa, jos muuttujan arvo ei ole null. Tulosta muussa tapauksessa virheilmoitus. Esimerkki ohjelman toiminnasta, kun syötteet ovat 1, 1 ja "". Operaation osa vuorovaikutuksesta on korostettu: Hello! I am an array filler. 1 1 Esimerkki ohjelman toiminnasta, kun syötteet ovat 2, 3, "abc" ja "def". Operaation osa vuorovaikutuksesta on korostettu: Hello! I am an array filler. 2 3 abc Please, enter row 2: def abc def Esimerkki ohjelman toiminnasta, kun syötteet ovat 0 ja 5: Hello! I am an array filler. 0 5 Lausekielinen ohjelmointi II Syksy 2017 Jorma Laurikkala 3 / 6
4. Kirjoita Javalla boolean-tyyppisen operaatio, joka saa parametrina kaksiulotteisen chartyyppisen alkioiden muodostaman taulukon sekä kaksi merkkiä ja korvaa kaikki ensimmäisen merkin esiintymät toisella merkillä. Muita parametreja ei ole. Paluuarvo on true tai false sen mukaan onko taulukkoparametrille varattu muistia vai ei. Huomaa, että oma operaatiosi ei lue tai tulosta mitään; vuorovaikutus käyttäjän kanssa tapahtuu muualla. Lue taulukon rivien ja sarakkeiden lukumäärät käyttäjältä main-operaatiossa ja täytä taulukko 3. tehtävän operaatiolla. Sijoita täyttöoperaation palauttama arvo muuttujaan. Tulosta virheilmoitus, jos taulukon täyttö epäonnistui. Jatka muussa tapauksessa siten, että a) luet käyttäjältä korvattavan ja korvaavan merkin, b) kutsut omaa operaatiotasi antamalla täyttöoperaation paluuarvon sisältämän muuttujan ja merkit oman operaatiosi parametreiksi ja c) tulostat muutetun taulukon näytölle 4. harjoituksen 7. tehtävän operaatiolla. Ohjelman nimi on CharacterReplacer. Tämä tehtävä tarkistetaan automaattisesti toiminnallisuuden osalta ja lisäksi opettajan toimesta hyvän ohjelmointitavan osalta. Näin esimerkiksi huono sisennys tai puutteellinen kommentointi voi tuottaa nollan, vaikka ohjelma läpäisee WETOn testit. Muista noudattaa hyvän ohjelmointitavan perusteita (Lausekielinen ohjelmointi I -kurssin luentomateriaalin 14. luku) ja uusia hyviä tapoja, joihin kuuluu operaation otsikkoon liittyvä yleisluonteinen kommentti operaation tarkoituksesta sekä operaation mahdollisesti saamista ja palauttamista tiedoista. Esimerkki ohjelman toiminnasta, kun syötteet ovat 2, 3, "o", "oo", '' ja '.': Hello! I am a character replacer. 2 3 o Please, enter row 2: oo Please, enter the first character: Please, enter the second character:..o. o.o Esimerkki ohjelman toiminnasta, kun syötteet ovat 0 ja 5: Hello! I am a character replacer. 0 5 Lausekielinen ohjelmointi II Syksy 2017 Jorma Laurikkala 4 / 6
5. Tee Javalla int[]-tyyppinen operaatio, joka laskee montako esiintymää kullakin yksiulotteisessa taulukossa olevalla merkillä (char) on kaksiulotteisessa merkkien (char) taulukossa. Operaatio luo ja palauttaa yksiulotteisen taulukon, joka sisältää laskettavien merkkien lukumäärät (int) samassa järjestyksessä kuin merkit ovat parametrina saadussa yksiulotteisessa merkkien taulukossa. Paluuarvo on null, jos jommallekummalle taulukolle tai molemmille taulukoille ei ole varattu muistia. Jos laskettavat merkit sisältävän taulukon sisältö on esimerkiksi { '', 'o' } ja kaksiulotteisessa taulukossa on yksi -merkin esiintymä ja kolme o-merkin esiintymää, operaatio palauttaa taulukon, jonka sisältö on { 1, 3 }. Lue taulukon rivien ja sarakkeiden lukumäärät käyttäjältä CharacterCounter-ohjelman main-operaatiossa ja täytä taulukko 3. tehtävän operaatiolla. Sijoita täyttöoperaation palauttama arvo muuttujaan. Tulosta virheilmoitus, jos taulukon täyttö epäonnistui. Jatka muussa tapauksessa siten, että a) luet laskettavat merkit käyttäjältä merkkijonona, b) muunnat merkkijonon yksiulotteiseksi merkkien taulukoksi (käytä joko 4. harjoituksen 3. tehtävän operaatiota tai String-luokan tochararray-operaatiota), c) kutsut operaatiotasi antamalla kaksi- ja yksiulotteiset merkkien taulukot operaation parametreiksi, d) sijoitat operaation palauttaman arvon muuttujaan ja e) tulostat muuttujaan liittyvän taulukon luvut näytölle (katso 4. harjoituksen 6. tehtävä). Esimerkki ohjelman toiminnasta, kun syötteet ovat 2, 3, "o", "o.o" ja "o": Hello! I am a character counter. 2 3 :o Please, enter row 2: oo. Please, enter characters to be counted: o { 1 3 } Esimerkki ohjelman toiminnasta, kun syötteet ovat 0 ja 5: Hello! I am a character counter. 0 5 Lausekielinen ohjelmointi II Syksy 2017 Jorma Laurikkala 5 / 6
6. Kirjoita Javalla int-tyyppinen operaatio, joka laskee kuinka monta riviä tekstitiedostossa on. Tiedoston nimi (String) annetaan operaatiolle parametrina. Operaation paluuarvo on negatiivinen, jos operaatiossa tapahtuu poikkeus. Huomaa, että oma operaatiosi ei lue tai tulosta mitään; vuorovaikutus käyttäjän kanssa tapahtuu muualla. Välitä tiedoston nimi LineCounter-ohjelmalle komentoriviparametrina. Kutsu operaatiotasi main-operaatiossa antamalla komentoriviparametri operaatiosi parametriarvoksi, jos komentoriviparametreja on yksi kappale. Sijoita operaatiosi palauttama arvo muuttujaan. Kerro tämän muuttujan arvon avulla main-operaatiossa laskennan tulos. Ohjelma tulostaa saman virheilmoituksen, kun komentoriviparametreja on väärä määrä tai omassa operaatiossa tapahtuu virhe. Hello! I count lines. There are 203 lines. kun hakemistossa on In.java-tiedosto ja ohjelma ajetaan komennolla: java LineCounter In.java Hello! I count lines. I could not count. kun ohjelmalle annetaan väärä määrä komentoriviparametreja: java LineCounter Hello! I count lines. I could not count. kun hakemistossa ei ole tiedostoa -files.tt ja ohjelma ajetaan komennolla: java LineCounter -files.tt Lausekielinen ohjelmointi II Syksy 2017 Jorma Laurikkala 6 / 6