wiki:s2012/demot/demo9
Last modified 5 years ago Last modified on 2012-11-09 21:32:41

Demot » Demo 9, 12.11.2012

Muista: Jotta konsolisovelluksen tekeminen olisi helpompaa, ota "parempi" template ConsoleMain Vinkki-sivun ohjeilla.

Vaikeaa, vastaa kurssin välikyselyyn

Tarvitsemme tietoa siitä, mitkä ovat kurssin vaikeudet suhteessa siihen, mitä kurssilla on tehty. Kysely toimii samalla itsearviona. Siksi kurssista on Korpissa välikysely. Täytä kysely ja tee tiedosto vaikeaa.txt johon kerrot mikä oli vaikeaa tällä demokerralla? Palauta yhtenä DemoWWW:n "tehtävänä" ja merkitse 1p jos olet vastannut itse kyselyyn tällä kertaa (mutta et viimekerralla). Muuten laita 0.2 pistettä.

Demojen palauttaminen

Demot palautetaan viimeistään maanantaina klo 13:00 mennessä. Kirjaudu ensin Korppiin ja sitten kurssin NettiDemoWWW:hen https://www.mit.jyu.fi/demowww/ohj1/. Voit palauttaa osan tai kaikki tehtäväsi etukäteenkin ja täydentää vastauksia määräaikaan mennessä. Jos sinulla on samassa .cs-tiedostossa usean tehtävän vastaus, niin voit laittaa tehtävän kohdalle esim. 3-4, tai voit palauttaa saman tiedoston useammalla eri rivillä.

Pahasti pihalla

PP1

Muutkin saavat tehdä tämän ja merkitä 1p arvoiseksi.

Tee ohjelma, jossa a) arvot kokonaislukuja listaan ja b) etsit halutun luvun esiintymien lukumäärän listassa. Aloita tekemällä aliohjelma, joka palauttaa halutun kokoisen listan arvottuja kokonaislukuja eli luo ensin listan, arpoo siihen tietyn määrän kokonaislukuja ja palauttaa lopuksi valmiin listan. Tämän jälkeen tee toinen aliohjelma, jonne viet parametreina käytettävän listan ja etsittävän alkion. Aliohjelma etsii (ja laskee), kuinka monta kertaa etsittävä alkio esiintyy listassa. Aliohjelma palauttaa löydettyjen alkioiden lukumäärän.

Vinkki: M:Dynaamiset tietorakenteet

V1

Tällä kertaa ei tulee uusia Ville-tehtäviä. Jos sinulla on tekemättä silmukka- ja/tai taulukkotehtäviä (tai muita joita et aikaisemmin ymmärtänyt), tee niitä 5 kappaletta. Muista: Villen käyttöohje ja Ville-tehtävien palauttamisohjeet.

VIDEO 1

Muista että voit saada demopisteitä myös indeksoimalla luento/demovideoita, ks: https://trac.cc.jyu.fi/projects/ohj1/wiki/s2012/videohakemisto. Lisää vähintään 3-linkkiä ja kerro tiedostoon video.txt mitkä linkit lisäsit. Tehtävän numeroksi VIDEO1. Jatkossa voi joka demokerralle merkitä vastaavasti yhden VIDEO-tehtävän kolmesta linkistä.

TDD1

Jos tarkistat vähintään kahden funktion toiminnan automaattisella testillä (ComTest), saat merkitä yhden lisäpisteen. Palauta DemoWWW:ssä tekstitiedosto TDD.txt (jonka siis arvostelet yhden pisteen arvoiseksi), missä kerrot minkä tehtävän ja minkä funktion/funktioiden toiminnan testasit. Voit antaa samassa tiedostossa palautetta ja kehitysehdotuksia Comtestin käytöstä. Mikäli ComTest ei toimi yliopiston mikroluokissa, tarkista että ComTest haetaan oikeasta paikasta: Valitse Visual Studiossa Tools -> ComTest -> Options. Esiin tulee ComTest Plugin Options. Tarkista, että Path to ComTest.jar executable kentässä on N:\bin\ComTest.jar ja olet yhdistänyt koneesi N-verkkolevyyn.

Pohjatiedostot varsinaisille tehtäville

  • Tarvitaan tehtävissä 5,6-7,B1-3
  • Hae Jypelin uusin versio.

Ota pohjat versionhallinnasta:

  • siirry Explorerilla (siis ei IE vaan se Tiedostonhallinta-juttu) johonkin tyhjään hakemistoon
  • paina Explorerissa hiiren oikeaa
  • valitse TortoiseSVN/Export... (nimenomaan Export eikä Checkout ettet pilaa pohjaa muilta :-)
  • URL of repository: -kohtaan laita
    https://svn.cc.jyu.fi/srv/svn/ohj1/esimerkit/2012s/demopohjat/demo9
    
  • OK
  • kun tavara haettu, klikkaa demo9.sln
  • solutionissa on monta projektia. Muista aina hiiren oikealla ja Set as StartUp Project valita minkä projektin haluat ajaa (pitää näkyä boldina).

Kokeile ajaa eri ohjelmia. Palapelissä hiiren klikkaus siirtää palaa ja Kuva-ohjelmassa tulee erilaisia kuvia.

Seuraava ongelma on tullut ainakin XP-koneiden kanssa, mulla itselläni ei esim. Win7:lla: Mikäli Palapeli-projekti valittaa ajettaessa, ettei löydä kuvaa, klikkaa Solution Explorerissa ko. projektia hiiren oikealla -> Project Dependencies ja laita ruksi projektin kohdalle. Vastaavasti Kuva-projektia ajettaessa ruksin voi joutua ottamaan pois. Ongelman voinee kiertää niinkin, että tekee molempiin projekteihin oman Content-hakemiston ja kopioi niihin saman sisällön.

Tehtävä 1. Taulukon nousevat

M: 15. Taulukot. Tee aliohjelma, jolle annetaan parametrina kokonaislukutaulukko ja se palauttaa kokonaisluvun. Aliohjelma palauttaa pisimmän taulukosta löytyvän aidosti nousevan osajonon pituuden. Esimerkiksi jos taulukon alkiot ovat 2,3,4,1,2,0,1,2,5,5,7, niin palautetaan 4 (eli 0,1,2,5 muodostavat 4 lukua pitkän aidosti nousevan osajonon). Aloita tekemällä pieni pääohjelma, jolla voit testata aliohjelmaa ja voit miettiä aliohjelman kutsumuodon.

Vinkki: Jos algoritmi ei ole kristallin kirkas, harjoittele Taulukonharjoittelu-ohjelmalla.

Tehtävä 2. Portaat ylös

Palataan hetkeksi kurssin alkupuolen laatikkotehtävään. Muuta ohjelmaa siten, että PiirraNelio-aliohjelmalle viedään Vector-olio kahden reaaliluvun sijaan. Tämä vektori toimii piirrettävän laatikon vasemman alakulman merkkinä. Aliohjelma piirtää laatikon ja palauttaa sitten piirtämänsä laatikon oikean yläkulman koordinaatin. Nyt seuraavan laatikon piirtäminen on yksinkertaista koska se voidaan aloittaa edellisen kutsun palauttamasta paikasta. Pääohjelma näyttäisi tältä.

public override void Begin() {
  Vector piste = new Vector(0, 0);
  piste = PiirraNelio(this,piste);
  piste = PiirraNelio(this,piste);
  piste = PiirraNelio(this,piste);
  ... // Zoom yms...
}

Piirrä pääohjelmaan vielä pieni punainen ympyrä, joka on pisteessä (0,0). Ympyrän saat muiden päälle varmasti kun lisäät sen eri tasolle

Add(pallo,1); // Huomaa ,1 jotta tulee tasolle 1. Add(pallo) tasolle 0

Kuva siitä, miltä toimiva ohjelma näyttää ruudulla:

portaat ylös

Tehtävä 3. Portaat ylös ja alas

Jatka edellistä tehtävää siten, että jos pääohjelmaa muutetaan seuraavasti:

public override void Begin()
{
    Camera.ZoomToLevel();
    Vector piste = new Vector(0, 0);
    piste = PiirraNelio(this,piste);
    piste = PiirraNelio(this,piste);
    piste = PiirraNelio(this,piste);
    piste -= new Vector(0,LAATIKON_KOKO); 
    piste = PiirraNelioAlas(this,piste);
    piste = PiirraNelioAlas(this,piste);
}

niin ohjelma piirtää viisi laatikkoa, joista keskimmäinen on korkeimmalla. PiirraLaatikkoAlas saa parametrinaan uuden laatikon vasemman ylänurkan koordinaatin ja palauttaa piirtämänsä laatikon oikean alanurkan koordinaatin.

Portaat ylös ja alas

HUOM! Määrittele LAATIKON_KOKO luokan vakioksi, eli const double LAATIKON_KOKO = ....

Muokkaa vielä niin, pääohjelmasta voidaan kutsua PiirraPortaat-aliohjelmaa, joka piirtää annetun määrän laatikoita ylöspäin ja sitten annetun määrän alaspäin. Sama kuva saataisiin siis kutsulla:

        public override void Begin()
        {
            Level.BackgroundColor = Color.Black;
            Vector piste = new Vector(0, 0);
            PiirraPortaat(this, piste, 3, 2);
            Camera.ZoomToAllObjects(100);
        }

Tehtävä 4. Pisimmän sanan poistaminen

M: 22. Dynaamiset tietorakenteet. Tee pääohjelmassa jollakin yksinkertaisella tavalla lista sanoja. Tee aliohjelma, joka etsii listan pisimmän sanan. Pääohjelma tulostaa pisimmän sanan ja poistaa sitten listasta KAIKKI tämän sanan esiintymät. (Ei ole tarkoitus käyttää RemoveAll-metodia)

Tehtävä 5. Värien vaihtaminen

Kuvan värien muuntelu: Lue ohje: https://trac.cc.jyu.fi/projects/npo/wiki/Kuvankasittely. Katso esimerkistä: Kuva.cs miten piirretään kuvia. Ota kuvaksi vaikka: vesa.jpg. Tutustu huolella aliohjelmiin Harmaasavy, HarmaasavyTaulukolla ja Punaiseksi. Tee näitä matkien aliohjelma PoistaPunainen, jolle viedään parametrina Image-kuva ja raja-arvo jota enemmän kuvassa pitää olla punaisen osuutta jotta vastaava piste muutetaan harmaasävyksi. Kutsu pääohjelmasta (Begin) aliohjelmaa niin, että muutetaan harmaasävyksi kaikki ne pisteet, joissa punaista väriä on enemmän kuin 150. Huom! Suoraan pelkkää punaisen määrää vertaamalla ei oikeasti kaikki punainen katoa, mutta se riittää tähän tehtävään. Saa keksiä myös paremman ehdon jos haluaa :-)

Tehtävä 6-7. Palapeli

Täydennä Palapeli.cs-tiedostosta aliohjelmat: LuoKuvat ja LisaaPalatRuutuun toimiviksi niin, että saat toimivan palapeli-ohjelman. Kokeile lisätä Contenttiin jokin muukin kuva ja kokeile toimintaa sillä.

Vinkki: Ota kynää ja paperia ja mieti miten isomman kuvan palaset menevät listaan, jossa ne ovat peräkkäin. Kirjoita esim. 3x4 tapauksessa kaikkien palasten "indeksit". Piirrä paperille myös kunkin kuvanpalan keskipisteen koordinaatti ja sen arvo alkupaikan suhteen palan leveyden ja korkeuden avulla lausuttuna.

B1-3. Konvoluutio

Konvoluutio: Konvoluutio on kahden matriisin vastinalkioiden tulon summa. Liu'uttamalla painomatriisia kuvan päällä ja laskemalla aina vastaavasta kohdasta konvoluutio, voidaan kuvalle tehdä useita yleisesti tarpeen olevia muunnoksia kuten reunaviivojen korostusta, terävöintiä tai pehmennystä. Esimerkillä

http://users.jyu.fi/~vesal/kurssit/ohj1/bitmap/konvo/konvoluutio.html

voit kokeilla miten mikäkin matriisi vaikuttaa. Samalla voit kokeilla mitä vaikuttaa kuvien summaaminen tietyillä painoilla. Mallipohjassa Kuva.cs on vastaava ohjelma jossa on valmiina keskiarvosuodin 3x3 matriisilla. Sinun pitäisi täydentää keskeneräinen Muunna-aliohjelma valmiiksi.

B4. Taulukon sotkeminen

M: Satunnaisluvut. Etsi algoritmi kokonaislukutaulukon sekoittamiseksi ja toteuta algoritmi. Eli tee aliohjelma, joka ottaa vastaan int-taulukon ja sekoittaa TÄMÄN taulukon. Testaa algoritmiasi Console-sovellukset taulukolla, johon on esimerkiksi alustettu järjestyksessä luvut 1, 2, 3, ..., 52. Palauta toimiva ohjelmakooditiedosto, jossa on hyvin kommentoituna, mitä algoritmissa tehdään. Huom: Tässä ei ole tarkoitus "keksiä" omaa algoritmia, vaan käyttää ideaa jostakin valmiista algoritmista sekoittamiseen. Hyvä algoritmi on esim: Fisher-Yates shuffle. Tästä on toteutus Jypelin RandomGen -luokan Shuffle-aliohjelmassa. Voit matkia esimerkiksi tätä. Jos matkit tätä, niin vaihda T:n tilalle int ja listan tilalle int-taulukko. Aliohjelman alkuun pitää lisätä nyt Random rand = new Random(); jotta rand-olio on olemassa, Jypelin esimerkissä se on olemassa koska se on RandomGen-luokan attribuutti.

G1-2. Lukujen esiintymät

Tee ohjelma, joka saa jostakin taulukon (tai käyttää vakiotaulukkoa), jossa on kokonaislukuja. Taulukossa sama luku voi esiintyä useasti. Kirjoita aliohjelma, joka saa tuon taulukon parametrinaan ja palauttaa taulukon, jossa on taulukon alkiot kukin vain yhden kerran järjestettynä niiden esiintymiskertojen määrän mukaan nousevaan järjestykseen. taulukosta {1, 2, 3, 34, 34, 2, 1, 34, 1, 1, 1} palautetaan {3, 2, 34, 1} .

Attachments