Toinen harjoitustyö ASCII-grafiikkaa
Yleistä Tehtävä: tee Javalla ASCII-merkkeinä esitettyä grafiikkaa käsittelevä ASCIIArt-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 15.12.2016 klo 12.00. Testaus julkisilla ja salaisilla testeillä. Tarkka tehtävänanto ensi viikolla. Työ esitellään myös maanantain (21.11.) luennoilla. Lausekielinen ohjelmointi II Syksy 2016 Jorma Laurikkala 2
Kuva ASCII-muodossa Ohjelma käsittelee 16-värin harmaasävykuvia. Värit esitetään merkeillä ja jokaiselle merkille (värille on määritelty) lukukoodi. Musta esitetään ristikkomerkillä (koodi 0). Valkoinen esitetään välilyönnillä (koodi 15). # @ & $ % x * 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. Taulukoita voi olla yksi (lukukoodit) tai kaksi (merkit ja lukukoodit). Lausekielinen ohjelmointi II Syksy 2016 Jorma Laurikkala 3
Kuva ASCII-muodossa * * # * * #* ### * * ##### o####o * ######## * o######o ########## o########o ############ o##########o ############## o############o ################ ## :::::::::::::::: Paikka (0, 8) on musta. Tämä väri esitetään ristikkomerkillä, jonka lukukoodi on nolla. 6 15 15 15 15 6 15 15 0 15 15 15 15 15 15 6 15 15 15 6 15 15 15 15 0 6 15 15 15 15 15 15 15 15 15 15 15 15 15 0 0 0 15 15 15 6 15 15 15 6 15 15 15 15 0 0 0 0 0 15 15 15 15 15 15 15 15 15 15 7 0 0 0 0 7 15 15 6 15 15 15 15 15 15 0 0 0 0 0 0 0 0 15 15 15 15 15 15 6 15 7 0 0 0 0 0 0 7 15 15 15 15 15 15 15 0 0 0 0 0 0 0 0 0 0 15 15 15 15 15 15 7 0 0 0 0 0 0 0 0 7 15 15 15 15 15 0 0 0 0 0 0 0 0 0 0 0 0 15 15 15 15 7 0 0 0 0 0 0 0 0 0 0 7 15 15 15 0 0 0 0 0 0 0 0 0 0 0 0 0 0 15 15 7 0 0 0 0 0 0 0 0 0 0 0 0 7 15 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 15 15 15 15 15 15 15 0 0 15 15 15 15 15 15 15 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 Lausekielinen ohjelmointi II Syksy 2016 Jorma Laurikkala 4
Kuva ASCII-muodossa Kuva on tiedostossaan merkkeinä. Ohessa ovat 16 16 -kokoisen treekuvan sisältävän file_tree.txt-tiedoston merkit. Tiedostossa ei ole merkkien lisäksi muuta tietoa. Kuvan koko täytyy päätellä ohjelmassa. Kuvan voi olettaa aina olevan kunnossa ja riittävän suuri suodatettavaksi. Huomaa, että kuvan korkeus ja leveys voivat olla erisuuret. * * # * * #* ### * * ##### o####o * ######## * o######o ########## o########o ############ o##########o ############## o############o ################ ## :::::::::::::::: Lausekielinen ohjelmointi II Syksy 2016 Jorma Laurikkala 5
Ohjelman toiminnot Ohjelma lataa käynnistyessään merkkimuodossa olevan kuvan tekstitiedostosta. Kuvatiedoston nimi annetaan ohjelmalle komentoikkunassa komentoriviparametrina. Esimerkiksi: java ASCIIArt file_tree.txt Ohjelmaa käytetään antamalla jokin komennoista printa, printi, info, filter, reset ja quit. Ohjelma toimii hieman komentoikkunan tapaan. Oletetaan, että komennot annetaan aina oikein. Lausekielinen ohjelmointi II Syksy 2016 Jorma Laurikkala 6
Aloitus ja printa-komento Ohjelma tulostaa käynnistyessään nimensä kehystettynä. Otsikon ja jokaisen komennon jälkeen tulostetaan ohjerivi. Komento printa tulostaa kuvan näytölle merkkimuodossa. Kuva on ladattu ohjelman käynnistyessä file_tree.txttiedostosta. Tiedoston nimi on annettu ohjelmalle komentoriviparamerina. Rivit tulostetaan täysimittaisina, vaikka lopussa olisi vain välilyöntejä (valkoista väriä). ------------------- A S C I I A r t ------------------- printa * * # * * #* ### * * ##### o####o * ######## * o######o ########## o########o ############ o##########o ############## o############o ################ ## :::::::::::::::: Lausekielinen ohjelmointi II Syksy 2016 Jorma Laurikkala 7
Printi-komento Komento printi tulostaa kuvan näytölle lukumuodossa. Merkin paikassa on sen lukukoodi. Numerot erotetaan toisistaan välilyönnillä. Yksinumeroisen luvun eteen tulostetaan ylimääräinen välilyönti. Rivien alussa tai lopussa ei ole välilyöntejä. printi 6 15 15 15 15 6 15 15 0 15 15 15 15 15 15 6 15 15 15 6 15 15 15 15 0 6 15 15 15 15 15 15 15 15 15 15 15 15 15 0 0 0 15 15 15 6 15 15 15 6 15 15 15 15 0 0 0 0 0 15 15 15 15 15 15 15 15 15 15 7 0 0 0 0 7 15 15 6 15 15 15 15 15 15 0 0 0 0 0 0 0 0 15 15 15 15 15 15 6 15 7 0 0 0 0 0 0 7 15 15 15 15 15 15 15 0 0 0 0 0 0 0 0 0 0 15 15 15 15 15 15 7 0 0 0 0 0 0 0 0 7 15 15 15 15 15 0 0 0 0 0 0 0 0 0 0 0 0 15 15 15 15 7 0 0 0 0 0 0 0 0 0 0 7 15 15 15 0 0 0 0 0 0 0 0 0 0 0 0 0 0 15 15 7 0 0 0 0 0 0 0 0 0 0 0 0 7 15 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 15 15 15 15 15 15 15 0 0 15 15 15 15 15 15 15 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 Lausekielinen ohjelmointi II Syksy 2016 Jorma Laurikkala 8
Info-komento Komento info tulostaa näytölle kuvan koon ja kunkin merkin lukumäärät. 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 16 x 16 # 112 @ 0 & 0 $ 0 % 0 x 0 * 9 o 10 0! 0 ; 0 : 16 ' 0, 0. 0 109 Lausekielinen ohjelmointi II Syksy 2016 Jorma Laurikkala 9
Filter-komento Käsittelee kuvan n n - kokoisella mediaanisuotimella. N on valinnainen parametri. N on aina pariton ja suurempi tai yhtä suuri kuin kolme ja sellainen, että suodin mahtuu kuvaan. Jos parametria n ei anneta, on suotimen koko 3 3. Ohessa komento voisi kuulua esimerkiksi myös: filter 5, jolloin suodin olisi 5 5 - kokoinen. filter printi 6 15 15 15 15 6 15 15 0 15 15 15 15 15 15 6 15 15 15 15 15 15 15 15 0 6 15 15 15 15 15 15 15 15 15 15 15 15 15 0 0 0 15 15 15 15 15 15 15 15 15 15 15 15 0 0 0 0 7 15 15 15 15 15 15 15 15 15 15 0 0 0 0 0 0 15 15 15 15 15 15 15 15 15 7 0 0 0 0 0 0 7 15 15 15 15 15 15 15 7 0 0 0 0 0 0 0 0 15 15 15 15 15 15 15 7 0 0 0 0 0 0 0 0 7 15 15 15 15 15 15 0 0 0 0 0 0 0 0 0 0 15 15 15 15 15 7 0 0 0 0 0 0 0 0 0 0 7 15 15 15 15 0 0 0 0 0 0 0 0 0 0 0 0 15 15 15 7 0 0 0 0 0 0 0 0 0 0 0 0 7 15 15 0 0 0 0 0 0 0 0 0 0 0 0 0 0 15 0 7 0 0 0 0 0 0 0 0 0 0 0 0 7 0 15 11 11 11 11 11 11 0 0 11 11 11 11 11 11 15 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 Lausekielinen ohjelmointi II Syksy 2016 Jorma Laurikkala 10
Filter-, reset- ja quit-komennot Suodin poistaa melua, mutta hävittää samalla myös informaatiota. 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. printa * * # * #* ### ####o ###### o######o o######## o########o ########## o##########o ############ o############o ############## #o############o# ::::::##:::::: :::::::::::::::: Lausekielinen ohjelmointi II Syksy 2016 Jorma Laurikkala 11
Filter-, reset- ja quit-komennot reset printa * * # * * #* ### * * ##### o####o * ######## * o######o ########## o########o ############ o##########o ############## o############o ################ ## :::::::::::::::: quit Bye, see you soon. Lausekielinen ohjelmointi II Syksy 2016 Jorma Laurikkala 12
Mediaanisuodin Muodostaa vanhasta kuvasta uuden kuljettamalla suodinikkunaa kuvan päällä. Usein edetään rivi kerrallaan. Ikkunan keskikohta asetetaan käsiteltävän luvun päälle. Reunat ongelmallisia, koska osa ikkunasta menee kuvan ulkopuolelle. Tässä työssä suodin sijoitetaan aina siten, että suodin on kuvan sisällä. Tämän seurauksena yhden tai useamman merkin levyinen reuna jää käsittelemättä. Suodin lajittelee alueellaan olevat lukuarvot ja palauttaa keskimmäisen arvon eli mediaanin. Tässä työssä mediaani aina keskimmäisin arvo, koska ikkunan koko on pariton. Mediaaniarvo sijoitetaan uudessa kuvassa samaan paikkaan kuin vanhan kuvan käsiteltävä luku. Tarvitaan aputaulukko, koska kaikki uudet luvut lasketaan vanhoista luvuista. Lausekielinen ohjelmointi II Syksy 2016 Jorma Laurikkala 13
Mediaanisuodin 15 15 15 6 15 15 6 15 15 15 15 15 15 15 15 15 15 15 15 0 15 15 15 7 0 Käsitellään tree-kuvan kohdassa (1, 3) oleva arvo (punainen) 3 3 -kokoisella suotimella (sininen tausta). Ikkunan arvot lajiteltuna: 6, 15, 15, 15, 15, 15, 15, 15, 15. Uuden kuvan paikaan (1, 3) sijoitetaan mediaani (viides luku), joka on 15. Mediaanisuodin poistaa yksityiskohtia. Tämä on sovelluksesta riippuen hyödyllistä tai haitallista. Huomaa, että reunalla oleva yksityiskohdat säilyvät, koska suodinta ei voi asettaa reunamerkkien päälle. Lausekielinen ohjelmointi II Syksy 2016 Jorma Laurikkala 14
Mediaanisuodin 15 15 0 15 15 15 15 0 6 15 15 0 0 0 15 0 0 0 0 0 0 0 0 0 7 Käsitellään tree-kuvan kohdan (1, 7) arvo 3 3 kokoisella suotimella. Ikkunan arvot lajiteltuna: 0, 0, 0, 0, 15, 15, 15, 15, 15. Uuden kuvan paikaan (1, 7) sijoitetaan mediaani, joka on 15. 15 15 0 15 15 15 15 0 6 15 15 0 0 0 15 0 0 0 0 0 0 0 0 0 7 Käsitellään seuraavaksi kohdan (1, 8) arvo. Ikkunan arvot lajiteltuna: 0, 0, 0, 0, 0, 6, 15, 15, 15. Uuden kuvan paikaan (1, 8) sijoitetaan mediaani, joka on 0. Lausekielinen ohjelmointi II Syksy 2016 Jorma Laurikkala 15
Mediaanisuodin 15 15 0 15 15 15 15 0 6 15 15 0 0 0 15 0 0 0 0 0 0 0 0 0 7 Käsitellään vielä kohdan (1, 9) arvo. Ikkunan arvot lajiteltuna: 0, 0, 0, 0, 6, 15, 15, 15, 15. Uuden kuvaan paikaan (1, 9) sijoitetaan mediaani, joka on 6. Kolmesta edellisestä esimerkistä nähtiin, että on hyvin mahdollista, että arvo on sama vanhassa ja uudessa kuvassa ja että yksityiskohtien säilyminen on mahdollista erikoistilanteissa. Lausekielinen ohjelmointi II Syksy 2016 Jorma Laurikkala 16
Koodista Syötteet luetaan In-luokalla. Mediaanin laskemisessa tarvittava lajittelu on toteutettava itse. Myöhemmin annetaan valintalajittelu algoritmi, jota voi halutessaan käyttää. Monimutkaisemman algoritmin toteutus on täysin tekijänsä vastuulla. Arrays-luokan palveluiden tapaiset helpommat tekniikat on kielletty, koska tavoitteena on oppia käsittelemään taulukoita. 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 2016 Jorma Laurikkala 17