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
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). Kuva on tietokoneen keskusmuistissa kaksiulotteisessa taulukossa ja massamuistilaitteella tekstitiedostossa. Taulukoita voi olla yksi (lukukoodit) tai kaksi (merkit ja lukukoodit). # @ & $ % x * o | ! ; : ' , . 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Lausekielinen ohjelmointi II | Syksy 2016 | Jorma Laurikkala
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
Kuva ASCII-muodossa Kuva on tiedostossaan merkkeinä. Ohessa ovat 16 16 -kokoisen tree-kuvan 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
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
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.txt-tiedostosta. 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/printi/info/filter [n]/reset/quit? printa * * # * * #* ### * * ##### o####o * ######## * o######o ########## o########o ############ o##########o ############## o############o ################ ## :::::::::::::::: Lausekielinen ohjelmointi II | Syksy 2016 | Jorma Laurikkala
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ä. printa/printi/info/filter [n]/reset/quit? 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
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ä. printa/printi/info/filter [n]/reset/quit? 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
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. printa/printi/info/filter [n]/reset/quit? 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
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 quit-komennolla. Ennen ohjelman pysähtymistä tulostetaan lyhyet jäähyväiset. printa/printi/info/filter [n]/reset/quit? printa * * # * #* ### ####o ###### o######o o######## o########o ########## o##########o ############ o############o ############## #o############o# ::::::##:::::: :::::::::::::::: Lausekielinen ohjelmointi II | Syksy 2016 | Jorma Laurikkala
Filter-, reset- ja quit-komennot printa/printi/info/filter [n]/reset/quit? reset printa * * # * * #* ### * * ##### o####o * ######## * o######o ########## o########o ############ o##########o ############## o############o ################ ## :::::::::::::::: quit Bye, see you soon. Lausekielinen ohjelmointi II | Syksy 2016 | Jorma Laurikkala
Mediaanisuodin Muodostaa vanhasta kuvasta uuden kuljettamalla suodin-ikkunaa 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
Mediaanisuodin 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. 15 6 7 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. Lausekielinen ohjelmointi II | Syksy 2016 | Jorma Laurikkala
Mediaanisuodin Käsitellään seuraavaksi kohdan (1, 8) arvo. 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. 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. 15 6 7 15 6 7 Lausekielinen ohjelmointi II | Syksy 2016 | Jorma Laurikkala
Mediaanisuodin 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. 15 6 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. Lausekielinen ohjelmointi II | Syksy 2016 | Jorma Laurikkala
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