1. Johdanto 1.1. Tehtävä Lausekielinen ohjelmointi II -kurssin ensimmäisessä harjoitustyössä on tehtävänä toteuttaa Java-ohjelma tekstirivin sovittamiseen tekstialueelle. Sovittaminen tapahtuu muodostamalla rivistä sitä katkomalla uusia rivejä, kunnes uusi rivi mahtuu tekstialueelle. Harjoitustyö on ratkaistavissa tähän mennessä opituilla tiedoilla ja ohjelman rakenteen hahmottelun voi aloittaa vaikka saman tien. Tehtävän ratkaisussa ei saa käyttää enemmän ohjelmointia taitavien tuntemia helpompia ohjelmointitekniikoita. Esimerkiksi taulukoiden ja muiden kuin luentokalvoilla esiteltyjen String-luokan operaatioiden käyttö on kielletty. Kiellon rikkominen johtaa saman tien harjoitustyön hylkäämiseen. Kysy siis harjoitustyönohjaajaltasi, mikäli olet epävarma mitä saa tehdä ja mitä ei. Ohjelman saa halutessaan jakaa operaatioiksi. Tärkein syy ohjelmointitekniikoiden rajoittamiseen on harjoitustyön oppimistavoite: ohjausrakenteiden käyttö laajemmassa mittakaavassa. Jos kaikki on sallittua, niin on todennäköistä, että aloitteleva ohjelmoija tutustuu esimerkiksi valmiiksi ohjelmointitaitoisen kurssilaisen tai kaverin avulla myöhemmin esiteltäviin menetelmiin pintapuolisesti. Tällöin on vaarana, että ohjelmoija ei täysin ymmärrä ratkaisunsa toimintaa eikä tule oppineeksi kuinka valinta- ja toistorakenteita käytetään. Rajoitusten seurauksena jo ohjelmointitaitoiset kurssilaiset joutuvat käyttämään työhön hieman enemmän aikaa. Tämä on kuitenkin pienempi paha kuin se, että osa ohjelmointia aloittelevista kurssilaisista ei oppisi kunnolla keskeisimpiä taitoja. Harjoitustyö tehdään itse ja lähinnä omalla ajalla. Kaverien kanssa saa keskustella, mutta suora kopiointi eli plagiointi on kiellettyä. Luonnollisesti myös verkosta löytyneen koodin käyttö katsotaan plagioinniksi. Kurssisivuilla julkaistu koodi on vapaasti käytettävissä. 1.2. Pakollisuus ja korvaavuudet Harjoitustyö on pakollinen. Ainoa poikkeus tähän sääntöön ovat harjoitustyön korvanneet opiskelijat. Harjoitustyön voi korvata: 1. Muiden oppilaitosten opinnoilla. 2. Viime vuonna järjestetyn Lausekielinen ohjelmointi II -kurssin hyväksytyllä ensimmäisellä harjoitustyöllä, jos kurssi jäänyt kesken esimerkiksi ase- tai siviilipalveluksen tapaisesta pakottavasta syystä. Kurssin kotisivuilla on annettu tarkempia tietoja osasuorituksista. 3. Edellisten kohtien tapaisella painavalla syyllä. Ensimmäisen kohdan perusteella on annettu kaikki opintokoordinaattorin (Heli Rikala) kurssin vastuuopettajalle (Jorma Laurikkala) esittämät korvaavuudet. Toisen ja kolmannen kohdan osalta on tärkeintä muistaa, että harjoitustyö korvautuu vain, jos ottaa yhteyttä kurssin vastuuopettajaan. Tähän mennessä tulleet yhteydenotot ja sopimukset on kirjattu ylös eikä uusia yhteydenottoja näiltä osin tarvita. Lausekielinen ohjelmointi II Syksy 2016 Jorma Laurikkala 1 / 7
2. Tekstirivin sovitus Tekstirivin sovitus [1] suorakaiteen muotoiseen tekstialueeseen (line breaking, word wrapping) on tekstinkäsittelyohjelman perustoimintoja. Myös selainohjelmissa sovitetaan rivejä tekstialueisiin. Sovitettaessa rivi muotoillaan jollain menetelmällä peräkkäisiksi uusiksi riveiksi. Uudet rivit tasataan yleensä alueen vasempaan reunaan. Kuvassa 1 on annettu pieniä tekstialueita, joihin on sovitettu rivi "Testing, testing. One, two, three.". Testing, testing. One, two, three. Testing, testing. One, two, three. Testing, testing. One, two, three. (a) (b) (c) Kuva 1: Tekstialue, johon sovitettu teksti on tasattu (a) vasempaan reunaan, (b) molempiin reunoihin ja (c) oikeaan reunaa. Komentoikkunassa itsessään ei ole tekstinkäsittelyohjelman tapaisia tekstialueita. Tässä tehtävässä komentoikkunassa vain ajatellaan olevan suorakaiteen muotoinen alue, johon käyttäjän yhtenä rivinä antama teksti tulee sovittaa. Ensimmäinen alueeseen kuuluva merkki on käyttäjän syötettä seuraavan rivin alussa. Käyttäjä määrää alueen leveyden eli sen rivien pituuden. Alueen on oltava vähintään kolmen merkin levyinen. Alueen korkeutta eli sen rivien lukumäärää ei ole rajoitettu. Alueen rivit tasataan vasempaan reunaan. Rivit täydennetään alueen levyisiksi, jotta jokaisen rivin perään voidaan tulostaa alueen reunaa symboloiva jakomerkki (/). Tekstirivin koostuu osista, jotka on erotettu toisistaan yhdellä välilyönnillä. Osia toisistaan erottavat välilyönnit eivät kuulu osiin tai muodosta omia osiaan. Useimmat osat ovat sanoja, mutta osa voi olla myös sanan ja välimerkin yhdistelmä. Esimerkiksi rivin "Testing, testing. One, two, three." osat ovat "Testing,", "testing.", "One,", "two," ja "three.". Tekstiriviä ei soviteta, jos rivi alkaa välilyönnillä, loppuu välilyöntiin tai jos välilyönti toistuu. Sovitus estetään myös, jos sovitettavan rivin pisin osa ei mahdu alueelle. Esimerkiksi 11 merkin levyiseen alueeseen ei voida sovittaa riviä "Testing,testing. One, two, three.", koska sen ensimmäinen osa "Testing,testing." on 16 merkkiä pitkä. Harjoitustyössä uudet rivit muodostetaan ahneella algoritmilla siten, että kullekin uudelle riville jäävät sille kokonaisina sopivat alkuperäisen rivin osat. Sovittaminen aloitetaan alkuperäisen rivin alusta. Uusia rivejä muodostetaan niin pitkään kuin alkuperäisen rivin jäljellä olevat osat eivät mahdu uudelle riville. Rivin "Testing, testing. One, two, three." sovitus 11 merkin levyiselle alueelle tapahtuu taulukossa 1 esitetyllä tavalla. Taulukko 1: Rivin sovitus 11 merkin levyiselle alueelle. Uudet rivit täydennetään alueen levyisiksi välilyöntejä lisäämällä. Sovitettava rivi Uusi rivi "Testing, testing. One, two, three." "Testing, " "testing. One, two, three." "testing. " "One, two, three." "One, two, " "three." "three. " Lausekielinen ohjelmointi II Syksy 2016 Jorma Laurikkala 2 / 7
Taulukossa 1 annettu sovitus näyttäisi komentoikkunassa seuravalta: Testing, / testing. / One, two, / three. / 3. Ohjelman toiminnot Seuraavassa esitellään ohjelman toiminnallisuutta pienten esimerkkien avulla. Laajempia esimerkkiajoja julkaistaan kurssin kotisivujen Opetus Harjoitustyöt Harjoitustyö 1 -kohdassa. Tietojen lukemiseen näppäimistöltä käytetään In-luokan operaatioita. Myös In-luokka löytyy kurssin sivuilta. Huomaa, että harjoitustyössä syötteiden lukuun ei saa käyttää muita keinoja, jotta töiden automaattinen tarkastus (luku 7) onnistuisi varmemmin. Tehtävän helpottamiseksi oletetaan, että ohjelmalle annetaan aina syöte sitä luettaessa ja että ohjelmalle ei tarjota väärän tyyppisiä syötteitä. Ohjelman ei tarvitse esimerkiksi varautua liukulukutyyppisiin syötteisiin. Kukin syöte kirjoitetaan näppäimistöltä ja annetaan ohjelman käsiteltäväksi Enter-näppäintä painamalla. 3.1. Aloitusrivin tulostaminen Käynnistyessään ohjelma tulostaa näytölle tekstin "Hello! I break lines.". Hello! I break lines. Tämä teksti tulostetaan vain kerran. 3.2. Tekstialueen leveyden lukeminen Heti aloitusriviä seuraavalle riville tulostetaan "Enter area width:". Syötekehotusta seuraavalla rivillä luetaan kokonaisluku, jolla ilmaistaan tekstialueen leveys merkkeinä. Ohjelma ilmoittaa virheestä merkkijonolla "" ja pyytää uutta syötettä, jos syöte on pienempi kuin kolme. Valintaa luetaan kunnes käyttäjän antama luku on oikeellinen. Enter area width: 2 Enter area width: 11 3.3. Tekstirivin lukeminen Ohjelma lukee tekstirivin edellisen syötteen tapaan. Ensin tulostetaan kehote "Enter a line:" omalle rivilleen ja luetaan syöte seuraavalla rivillä. Kehote on omalla rivillään välittömästi käyttäjän aiemmin antaman syötteen jälkeen. Ohjelma tulostaa "" ja pyytää uutta tekstiriviä, jos teksti alkaa välilyönnillä tai loppuu sellaiseen tai jos tekstissä on peräkkäin kaksi tai useampia välilyöntejä. Myös liian pitkä osa aiheuttaa syötteen hylkäyksen: merkkijono luetaan uudelleen, jos sen pisin osa ei mahdu uudelle riville. Lausekielinen ohjelmointi II Syksy 2016 Jorma Laurikkala 3 / 7
Alla ensimmäinen tekstirivi hylätään, koska osa "Testing,testing." ei mahdu 11 merkin levyiselle tekstialueelle. Toinen tekstirivi alkaa välilyönnillä ja hylätään. Kolmas tekstirivi kelpaa, koska siinä on käytetty välilyöntejä hyväksyttävällä tavalla ja rivin pisin osa on kahdeksan merkin mittainen. Enter a line: Testing,testing. One, two, three. Enter a line: Testing, testing. One, two, three. Enter a line: Testing, testing. One, two, three. 3.4. Sovitetun tekstirivin tulostus Tekstirivi sovitetaan alueelle luvussa 2 esitetyllä tavalla, kun syötteet on saatu luettua. Kukin rivi täydennetään tarvittaessa tekstialueen levyiseksi lisäämällä välilyöntejä rivin loppuun. Kukin rivi päätetään tulostamalla jakomerkki ja rivinvaihto. Testing, / testing. / One, two, / three. / 3.5. Ohjelman jatkaminen ja lopetus Rivin sovituksen jälkeen käyttäjältä tiedustellaan omalla rivillään "Continue (y/n)?" ja käyttäjän syöte ('y'- tai 'n'-merkki) luetaan välittömästi seuraavalla rivillä. Pieni y-kirjain palauttaa ohjelman alueen leveyden lukemiseen. y Enter area width: Jos ohjelman esittämään jatkokyselyyn vastataan antamalla syötteenä pieni n- kirjain, niin teksti "See you soon." tulostetaan omalle rivilleen ja ohjelman suoritus lopetetaan. n See you soon. Ohjelma tulostaa omalle rivilleen tekstin "" ja kysyy uudelleen kysymyksen, jos käyttäjä vastaa jatkokysymykseen jollakin muulla merkillä kuin pienellä y- tai n-kirjaimella. Käyttäjän kiusaamista jatketaan kunnes syöte on oikeellinen. k y Lausekielinen ohjelmointi II Syksy 2016 Jorma Laurikkala 4 / 7
4. Koodista Ohjelma kirjoitetaan tuttuun tapaan main-operaation sisään. Koodia ei tarvitse pilkkoa operaatioiksi, koska tämä asia opetetaan myöhemmin. Omia operaatioita voi toki kirjoittaa niin halutessaan Edistyneempiä tekniikoita, joilla ongelma ratkeaa helpommin, ei saa käyttää. Näihin luetaan esimerkiksi taulukot ja muut tietorakenteet. Javan APIluokkien operaatioiden käyttö on pitkälti kiellettyä. Operaatioista sallittuja ovat vain System.out.println ja System.out.print ja luentokalvoilla mainitut String-luokan operaatiot. Kiellon rikkominen johtaa harjoitustyön hylkäämiseen. Kysy harjoitustyönohjaajaltasi, mikäli olet epävarma mitä saa tehdä ja mitä ei. Koodisi lukee myös ohjaaja. Noudata siis hyvää ohjelmointitapaa [2]: Sisennä koodia luettavuuden parantamiseksi, kommentoi riittävästi, nimeä muuttujat järkevästi, käytä vakioita, pidä rivit riittävän lyhyinä sekä käytä välejä lauseiden sisällä ja erota loogiset kokonaisuudet toisistaan väliriveillä. Sisennä koodi välilyönnein, jotta koodisi näkyisi täsmälleen samanlaisena myös ohjaajan editorissa. Älä käytä sisentämiseen tabulaattoria. Erityisen tärkeää on se, että välilyöntejä ja tabulaattorimerkkejä ei käytetä sekaisin, koska tällöin on täysin varmaa etteivät sisennykset näy ajatellulla tavalla opettajan koneella. Syötteet luetaan In-luokan avulla. Älä käytä muita menetelmiä syötteiden lukemiseen. Ohjelman nimen tulee olla LineBreaker, jolloin lähdekoodin tulee olla LineBreaker.java-nimisessä tekstitiedostossa. Älä kirjoita ohjelmaan ikuisia silmukoita tai käytä break-lausetta. 5. Dokumentointi Harjoitustyöstä kirjoitetaan dokumentti, jonka tulee sisältää seuraavat asiat: 1. Kansilehdellä tekijän nimi, opiskelijanumero, sähköpostiosoite, yksikkö ja tutkinto-ohjelma. Sivun keskellä tulisi olla suuremmalla fontilla dokumentin nimi. Kurssin kotisivuilla julkaistaan esimerkinomainen kansilehti. 2. Korkeintaan puolen sivun mittainen kuvaus ohjelman toiminnasta vapaamuotoisena tekstinä. 3. Omia ajatuksia. Esimerkiksi: Oliko työ helppo, sopiva vai vaikea? Jos helppo tai vaikea, niin miksi? Mitä uutta opit? Oliko työstä mitään hyötyä sinulle? Montako tuntia työn tekemiseen meni? Dokumentin leipäteksti kirjoitetaan 12 pisteen fontilla ja yhdellä rivinvälillä. Dokumentin kirjoitus tekstinkäsittelyohjelmalla ja kieliasun tarkistus ohjelman oikolukutoiminnolla on suotavaa. Valmis teksti kannattaa lukea ennen palautusta. Dokumentti on palautettava PDF-muodossa. Muut tiedostomuodot eivät kelpaa. Luvussa 7 ja kurssin verkkosivuilla kerrotaan tarkemmin dokumentin ja koodin palauttamisesta. Lausekielinen ohjelmointi II Syksy 2016 Jorma Laurikkala 5 / 7
6. Ohjaus ja tarkistus Harjoitusryhmien vetäjät vastaavat pääsääntöisesti ryhmäläistensä töiden ohjauksesta ja tarkistuksesta. (Tuntiopettajat tarkistavat kurssin vastuuopettajan ryhmäläisten harjoitustyöt.) Apua saa sähköpostitse sekä harjoitusten yhteydessä. Ohjaajat ovat myös henkilökohtaisesti yliopistolla tavattavissa myöhemmin julkaistavina aikoina. Kurssin vastuuopettaja auttaa harjoitustyöongelmissa myös muitakin kuin oman ryhmänsä opiskelijoita. Pyri kuitenkin ottamaan ongelmatilanteissa yhteys ensin oman harjoitusryhmän vetäjään, koska vastuuopettajalla on toisinaan kiire. Muista myös, että tehtävänantoon ja Javan piirteiden käyttöön liittyvissä epävarmoissa tilanteissa kannattaa aina kysyä ohjaajalta, koska kysyminen on parempi vaihtoehto kuin työn mahdollinen hylkäys. 7. Harjoitustyön palautus Ohjelma ja dokumentti täytyy palauttaa sähköisesti keskiviikkoon 2.11.2016 klo 16.00 mennessä WETO-järjestelmään. Tarkemmat palautusohjeet julkaistaan kurssin verkkosivuilla. Harjoitustöiden toiminnallisuus tarkistetaan WETO-järjestelmällä, joka vertailee automaattisesti mallivastauksen ja opiskelijoiden ratkaisujen tulosteita. Tästä syystä edellä annettuja tulostemäärittelyjä on seurattava merkilleen. Automaattinen vertailu vähentää rutiininomaista testaustyötä, jolloin opettajille jää enemmän aikaa mielekkäämpään työhön eli ohjelman rakenteen ja tyylin tutkimiseen. Opiskelijat hyötyvät tästä perusteellisempien kommenttien muodossa. Lisäaikaa työn tekoon voi saada muutaman päivän vain hyvästä syystä. Lisäajasta on sovittava harjoitusryhmän vetäjän kanssa ajoissa eli viimeistään päivää tai paria ennen palautuksen takarajaa. Ennen palautusta on syytä varmistaa, että dokumentissa on mukana kaikki edellä mainitut kohdat. Lisäksi kannattaa tarkistaa, että ohjelma toimii varmasti oikein viimeisimpien muutosten jälkeen. 8. Harjoitustyön arvostelu Harjoitustyöt arvostellaan asteikolla hyväksytty/hylätty. Harjoitusryhmän vetäjä ilmoittaa työn kohtalosta sähköpostilla, jossa on myös tarkempia kommentteja ohjelman tyylistä (rakenne ja hyvä ohjelmointitapa). Hylkäyksen perusteena voi olla ohjelman virheellinen toiminta, hyvän ohjelmointitavan noudattamatta jättäminen, harjoitustyön teossa kiellettyjen Javan ominaisuuksien käyttö (esimerkiksi taulukko), huono dokumentti tai plagiointi. Plagiointiin liittyy sanktio, joka koskee molempia opiskelijoita. Toiselta opiskelijalta tämän tietämättä kopioidun koodin käyttö johtaa kopioijan koko kurssisuorituksen hylkäämiseen. Hylätty työ on korjattava pääsääntöisesti viikon sisällä hylkäyksestä. Työn voi palauttaa opettajan tarkistettavaksi korkeintaan neljä kertaa ilman pakottavaa syytä lisäpalautuksiin Lausekielinen ohjelmointi II Syksy 2016 Jorma Laurikkala 6 / 7
Lähteet [1] Wikipedia-yhteisö: Line wrap and word wrap, https://en.wikipedia.org/wiki/line_wrap_and_word_wrap (Luettu viimeksi 12.10.2016.) [2] J. Laurikkala: Lausekielinen ohjelmointi -kurssin luentorunko, luku 14, http://www.sis.uta.fi/~laki1/luennot/luento08/ (Luettu viimeksi 12.10.2016.) Lausekielinen ohjelmointi II Syksy 2016 Jorma Laurikkala 7 / 7