Toinen harjoitustyö ASCII-grafiikkaa 2017
Yleistä Tehtävä: tee Javalla ASCII-merkkeinä esitettyä grafiikkaa käsittelevä ASCIIArt17-ohjelma omia operaatioita ja taulukoita käyttäen. Työ tehdään pääosin itse. Ideoita voi vaihtaa koodia ei. Henkilökohtaista ohjausta mikroluokissa. Ohjaajilta voi kysyä sähköpostilla. Palautus WETOon viimeistään torstaina 21.12.2017 klo 12.00. Testaus julkisilla ja salaisilla testeillä. Tarkka tehtävänanto julkaistaan viikonloppuna. Työ esitellään myös maanantain (27.11.) luennoilla. Lausekielinen ohjelmointi II Syksy 2017 Jorma Laurikkala 2
Kuva ASCII-muodossa Ohjelma käsittelee 16-värin harmaasävykuvia. Värit esitetään merkeillä ja jokaiselle merkille on määritelty lukukoodi. Musta esitetään ristikkomerkillä (koodi 0). Valkoinen esitetään välilyönnillä (koodi 15). # @ & $ % * o! ; : ',. 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Kuva on tietokoneen keskusmuistissa kaksiulotteisessa taulukossa ja massamuistilaitteella tekstitiedostossa. Taulukon alkioiden tyypiksi kannattaa valita char. Lausekielinen ohjelmointi II Syksy 2017 Jorma Laurikkala 3
Kuva ASCII-muodossa Kuva on tiedostossaan merkkeinä. Ohessa on annettu 5 4 -kokoisen L- kuvan ja 16 16 -kokoisen treekuvan merkit, jotka on tallennettu file_l.tt- ja file_tree.tt-tiedostoihin. Tiedostojen rivit ovat aina samanmittaisia. Rivi päättyy viimeiseen näkyvään merkkiin vain, jos merkki on rivin viimeinen merkki. Tiedostossa ei ole muuta tietoa. Kuvan koko täytyy päätellä ohjelmassa. Kuvan voi olettaa olevan kunnossa. Kuvassa ei ole esimerkiksi virheellisiä merkkejä. * * # * * #* ### * * ##### o####o * ######## * o######o ########## o########o ############ o##########o ############## o############o ################ ## :::::::::::::::: Lausekielinen ohjelmointi II Syksy 2017 Jorma Laurikkala 4
Ohjelman toiminnot Ohjelma lataa käynnistyessään merkkimuodossa olevan kuvan tekstitiedostosta. Kuvatiedoston nimi annetaan ohjelmalle komentoikkunassa komentoriviparametrina. Esimerkiksi: java ASCIIArt17 file_tree.tt Ohjelmaa käytetään antamalla komentoja, info, rotater, rotatel, recolour, reset tai quit. Ohjelma toimii hieman komentoikkunan tapaan. Oletetaan, että komennot annetaan aina oikein. Lausekielinen ohjelmointi II Syksy 2017 Jorma Laurikkala 5
Aloitus ja -komento Ohjelma tulostaa käynnistyessään nimensä kehystettynä. Otsikon ja jokaisen komennon jälkeen tulostetaan ohjerivi. Komento tulostaa kuvan näytölle merkkimuodossa. Oheisessa esimerkissä kuva on ladattu ohjelman käynnistyessä file_l.tt-tiedostosta. Tiedoston nimi on annettu ohjelmalle komentoriviparamerina. Rivit tulostetaan täysimittaisina, vaikka lopussa olisi vain välilyöntejä (valkoista väriä). Näytölle tulostetut välilyönnit on korostettu ohessa. ----------------------- A S C I I A r t 1 7 ----------------------- Lausekielinen ohjelmointi II Syksy 2017 Jorma Laurikkala 6
Info-komento Komento info tulostaa näytölle kuvan koon ja kunkin merkin esiintymien lukumäärän kuvassa. Kuvan koko annetaan ensin ja tämän jälkeen merkkien lukumäärät edellä annetun taulukon järjestyksessä (musta alussa, valkea lopussa). Merkki ja sen lukumäärä erotetaan toisistaan välilyönnillä. info 5 4 # 0 @ 0 & 0 $ 0 % 0 8 * 0 o 0 0! 0 ; 0 : 0 ' 0, 0. 0 12 Lausekielinen ohjelmointi II Syksy 2017 Jorma Laurikkala 7
Rotater-komento Komento rotater kääntää kuvaan 90 astetta myötäpäivään (oikealle). Kuva on neljän käännöksen jälkeen sisällöltään sama kuin ennen käännöksiä. rotater rotater rotater rotater Lausekielinen ohjelmointi II Syksy 2017 Jorma Laurikkala 8
Rotatel-komento Komento rotatel kääntää kuvaan 90 astetta vastapäivään (vasemmalle). Kuva on neljän käännöksen jälkeen sisällöltään sama kuin ennen käännöksiä. rotatel rotatel rotatel rotatel Lausekielinen ohjelmointi II Syksy 2017 Jorma Laurikkala 9
Recolour-komento Komento recolour muuttaa valitun värin toiseksi. Muutettavan värin ja sen korvaavan värin merkit annetaan komennolle parametreina. Myös tämä komento oletetaan aina oikein annetuksi. Paramereja on aina kaksi, paramerit on erotettu toisistaan ja komennosta yhdellä välilyönnillä ja paramerit ovat yksittäisiä merkkejä. Huomaa, että välilyönti itsessään voi olla parametri, jolloin on oltava tarkkana, jos komento ositetaan String-luokan splitoperaatiota käyttäen. recolour o o o o o oooo recolour. oooo Lausekielinen ohjelmointi II Syksy 2017 Jorma Laurikkala 10
Reset- ja quit-komennot Alkuperäiseen kuvaan voidaan palata reset-komennolla, joka lataa kuvan uudestaan tiedostosta taulukkoon. Ohjelma lopetetaan quitkomennolla. Ennen ohjelman pysähtymistä tulostetaan lyhyet jäähyväiset. oooo reset quit Bye, see you soon. Lausekielinen ohjelmointi II Syksy 2017 Jorma Laurikkala 11
Kuvan käännös Kuvan käännöksen tulos kannattaa sijoittaa uuteen taulukkoon. Vanhan kuvataulukon voi korvata käännöksen jälkeen joko uudella taulukolla tai uuden taulukon sisällön voi kopioida vanhaan taulukkoon. Myötäpäivään tapahtuvan käännön voi ajatella toimivan esimerkiksi siten, että vanhan taulukon ensimmäisen rivin sisältö kopioidaan uuden taulukon viimeisen sarakkeen sisällöksi, toisen rivin sisältö kopioidaan toiseksi viimeisen sarakkeen sisällöksi jne. '' ' ' ' ' ' ' '' ' ' ' ' ' ' '' ' ' ' ' ' ' '' ' ' ' ' ' ' '' '' '' '' '' '' '' '' '' '' ' ' ' ' ' ' ' ' '' ' ' ' ' ' ' ' ' '' ' ' ' ' ' ' ' ' Lausekielinen ohjelmointi II Syksy 2017 Jorma Laurikkala 12
Kuvan käännös Vastapäivään tapahtuvan käännön voi ajatella toimivan esimerkiksi siten, että vanhan taulukon ensimmäisen sarakkeen sisältö kopioidaan uuden taulukon viimeisen rivin sisällöksi, toisen sarakkeen sisältö kopioidaan toiseksi viimeisen rivin sisällöksi jne., kunnes vanhan taulukon viimeisen sarakkeen sisältö on kopioitu uuden taulukon ensimmäisen rivin sisällöksi. '' ' ' ' ' ' ' '' ' ' ' ' ' ' '' ' ' ' ' ' ' '' ' ' ' ' ' ' '' '' '' '' ' ' ' ' ' ' ' ' '' ' ' ' ' ' ' ' ' '' ' ' ' ' ' ' ' ' '' '' '' '' '' '' Lausekielinen ohjelmointi II Syksy 2017 Jorma Laurikkala 13
Koodista Kahdella viimeisellä harjoituskerralla tehdään joitakin harjoitustyöhön liittyviä tehtäviä. Työsi edistyy nopeammin, jos ratkaiset viidennen ja kuudennen harjoituksen tehtäviä ahkerasti. Syötteet luetaan In-luokalla. Arrays-luokan palveluiden tapaiset helpommat taulukkotekniikat on kielletty, koska tavoitteena on oppia käsittelemään taulukoita pohjamutia myöten. String-luokan kaikkia operaatioita saa käyttää. Kysy, jos ole epävarma mitä saa tehdä ja mitä ei. Attribuuttimuuttujia ei saa käyttää, vakiomuotoisten attribuuttien käyttö on sallittua ja jopa toivottavaa. Kirjoita kaikki koodi yhteen tiedostoon, jotta WETO osaa tarkistaa ohjelmasi. Lausekielinen ohjelmointi II Syksy 2017 Jorma Laurikkala 14