wiki:s2011/demot/demo9
Last modified 6 years ago Last modified on 2011-11-06 18:21:09

Demot » Demo 9, 7.11.2011

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ä.

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.

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 ole 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/ohj1s11/esimerkit/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

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.

Tehtävä 2

Palataan hetkeksi kurssin alkupuolen laatikkotehtävään. Muuta ohjelmaa siten, että PiirraLaatikko-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 = PiirraLaatikko(this,piste);
  piste = PiirraLaatikko(this,piste);
  piste = PiirraLaatikko(this,piste);
  ... // Zoom yms...
}

Piirrä pääohjelmaan vielä pieni punainen ympyrä, joka on pisteettä (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:

Neliot ylos alkaen (0,0)

Tehtävä 3

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

public override void Begin()
{
    Camera.ZoomToLevel();
    Vector piste = new Vector(0, 0);
    piste = PiirraLaatikko(this,piste);
    piste = PiirraLaatikko(this,piste);
    piste = PiirraLaatikko(this,piste);
    piste -= new Vector(0,LAATIKON_KOKO); 
    piste = PiirraLaatikkoAlas(this,piste);
    piste = PiirraLaatikkoAlas(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.

Neliot ylos ja alas alkaen (0,0)

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

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

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

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ä.

B1-3

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.

G1-2

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