wiki:k2012/demot/demo7
Last modified 6 years ago Last modified on 2012-02-24 11:44:53

Demot » Demo 7, 27.2.2012

» PP » Ville » TDD » Tavalliset » Bonus » Guru

PP

PP tehtävät (Pahasti Pihalla) on tarkoitettu niille, joilla on vaikeuksia aivan perusasioissa. Tarkoitus on että nämä ovat helpompia tehtäviä (mutta yhdessä on monta tehtävää), joiden avulla pakollisen viikottaisen 2 pisteen saaminen on mahdollista. PP tehtävät eivät ole tarkoitettu niille, jotka ovat tehneet säännöllisesti 4 tai enemmän tehtäviä/kerta. Arvioi tehtävät PP1 ja PP2 asteikolla 0..1, eli tekemällä kaikki PP-tehtävät voit saada enintään 2 pistettä.

PP-tehtäviä voivat palauttaa vain ne, ketkä osallistuvat erillisiin PP-ohjaustuokioihin. Ilmoittaudu niihin Korpissa. Jos et ole niihin osallistunut, niin voit skipata tehtävät PP1 ja PP2.

PP1

Voit tehdä kaikki kohdat a-c samaan kooditiedostoon.

(a) Tee ohjelma, joka tulostaa parilliset luvut väliltä 0..100 (sekä nolla että sata kuuluvat väliin).

(b) Tee ohjelma, joka tulostaa parittomat luvut väliltä 0..100 (sekä nolla että sata kuuluvat väliin).

(c) Tee ohjelma, joka tulostaa kaikki luvut väliltä 0..100, ja jos luku on jaollinen 4:llä, luvun perään tulostuu "Jaollinen neljällä!". Tulostus olisi seuraavanlainen (ote).

61
62
63
64 Jaollinen neljällä!
65
66
67
68 Jaollinen neljällä!
69
70

PP2

(a) Tee aliohjelma, joka täyttää parametrina annetun int-taulukon parillisilla luvuilla siten, että ensimmäinen alkio on 2, seuraava 4 jne. Huomaa, ettet välttämättä tiedä taulukon kokoa.

(b) Tee (funktio-)aliohjelma, jolle annetaan parametrina taulukon alkioiden määrä (eli kuinka iso taulukko tehdään), ja palauttaa uuden taulukon joka on täytetty kuten a-kohdassa.

Voit kirjoittaa halutessasi ComTest-testit b-kohtaan. Palautuksena tulevan taulukon voit testata esim näin:

/// String.Join(" ", luvut) === "2 4 6 8";

V1

Tee Ville-tehtävät: 5.9--5.13, 9.8.

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ä funktioiden toiminnan testasit. Voit antaa samassa tiedostossa palautetta ja kehitysehdotuksia Comtestin käytöstä. Tehtävän "numeroksi" anna TDD1.

Vector-luokan taulukoita voit tehdä testiä varten esim:

Vector[] luvut = { new Vector(1, 2), new Vector(3, 4),
                   new Vector(5, 2), new Vector(5, 5) };

Tehtävä 1

M: 15. Taulukot. Esitetään tason pistejoukko (eli lukuparit x, y) 1-ulotteisessa taulukossa niin, että taulukon alkioina on Jypelin Vector-tyyppisiä "olioita". Tällöin i:nnen pisteen koordinaatit olisivat (jos otetaan i:s piste apumuuttujaan p):

Vector p = pisteet[i];
double x = p.X;
double y = p.Y;

Aloita tekemällä uusi Jypeli-peli. Tee nyt vektoritaulukko (vektoritaulukon luomiseen voit katsoa esimerkkiä vaikkapa TDD1-selostuksesta).

Vector[] pisteet= ... 

Tee sitten aliohjelma LuoPisteet, joka piirtää (=lisää) parametrina tuodun pisteet-taulukon koordinaattipisteitä (=vektoreita) vastaavat mustat pikkupallot näytölle (=peliin). Yritä ensin piirtää vaikka vain paikassa (indeksissä) 0 oleva pallo ja kun se onnistuu, niin sulje tuo piirto silmukkaan, joka käy kaikki pisteet taulukon pisteet läpi.

Vinkki: Tee aliohjelma LuoPallo, joka saa parametreina pelin (Game) paikan (Vector), säteen (double) ja värin (Color). Tämän tehtyäsi voit kutsua LuoPallo-aliohjelmaa, jossa toisena parametrina on pisteet-taulukon alkio. Esimerkiksi, paikassa 2 olevan pisteen (vektorin) kohdalle saisit keltaisen pallon:

LuoPallo(this, pisteet[2], r, Color.Yellow);

Voit hyödyntää tuota LuoPallo-aliohjelmaa myös muissa tehtävissä.

Tehtävä 2

(Voit tehdä tämän samaan kooditiedostoon tehtävän 1 kanssa.)

Tee funktio, jolle annetaan 4 double-tyyppistä parametria, jotka ovat x-koordinaattien ja y-koordinaattien maksimi- ja minimiarvot. Näihin arvoihin perustuen funktio arpoo pisteitä vektoritaulukkoon, ja palauttaa tuon taulukon, eli paluuarvon tyyppi on Vector[].

Jypelissä on RandomGen.NextDouble, jota voit käyttää tässä.

Tehtävä 3

(Voit tehdä tämän samaan kooditiedostoon tehtävien 1 ja 2 kanssa.)

M: 15. Taulukot, 16. Silmukat.

Tee funktio LahimmanIndeksi, joka etsii annettua pistettä lähimmän taulukon alkion indeksin.

Tee ensin vektoritaulukko (vektoritaulukon luomiseen voit katsoa esimerkkiä vaikkapa TDD1-selostuksesta). Jos teit tämän jo tehtävässä 1 tai 2 niin ei tarvi tietenkään uudestaan tehdä.

Vector[] pisteet= ... 

Sitten luodaan yksi vektori.

Vector piste = new Vector(5.1, 2.5);

Sitten molemmat parametrina LahimmanIndeksi-funktiolle ja palautuksena tulee kokonaisluku, missä paikassa lähin piste on.

int indeksi = LahimmanIndeksi(pisteet, piste);  
// TDD-esimerkin taulukolla indeksi olisi 2

Vinkkejä: Demossa 6 etsittiin kokonaislukutaulukon lähintä lukua. Sen idea sopii täysin, nyt vaan pitää palauttaa lähimmän indeksi (eli paikka taulukossa) eikä itse lähin vektori. Demo 6:ssa alkion tyyppinä oli int, nyt Vector. Etäisyyden voit laskea joko Demo 6 Etaisyys-funktiolla tai jopa helpommin Jypelin Vector-luokasta löytyvällä funktiolla kahden vektorin (=pisteen) välisen etäisyyden laskemiseksi (etsi dokumentaatiosta ko. funktio). Huomaa että tämä on esimerkki ongelmasta, jota EI voi ratkaista foreach-silmukalla. Miksi?

Tehtävä 4

Tee aliohjelma, joka lisää pienen sinisen pallon siihen kohtaan, mihin klikkasit hiirellä. Hiiren paikan ruudulla saat tätä ohjetta käyttäen.

Tehtävä 5

Tässä tehtävässä voit hyödyntää tekemiäsi tehtäviä 1-4.

Tee Jypeli-peli, missä arvotaan ruudulle 15 kappaletta mustia pikkupalloja. Kun hiirellä klikkaa ruudulle, ilmestyy siihen kohtaan sininen pallo. Samalla lähimmän mustan pallon kohdalle ilmestyy punainen pallo. Sama toistuu kun hiirellä klikataan uudestaan jonnekin muualle, myös punaisen pallon paikka päivittyy.

Tehtävä 6

M: 16. Silmukat. Tee funktio LaskeKirjaimet, joka laskee merkkijonossa olevien annetun kirjaimen esiintymien lukumäärän. Testaa pääohjelmalla (tai ComTestillä), jossa on kutsuja tyyliin (keksi lisää testejä):

int sMaara = LaskeKirjaimet("kissa", 's');
int kMaara = LaskeKirjaimet("kissa", 'k');

B1

M: 15.5 Moniulotteiset taulukot, 16. Silmukat. Tee funktio, joka summaa yhteen kaksi matriisia vastinalkioittain. Funktio siis joutuu ensin luomaan oikeankokoisen tulosmatriisin. Mitä on syytä olettaa parametrimatriiseilta? Dokumentoi kommentteihin oletuksesi. Sitten funktio laskee tulosmatriisiin komponenteittain summan. Esimerkiksi:

public static void Main(String[] args) 
{
  double[,] mat1 = {{1,2,3}, {2,2,2}, {4,2,3}};
  double[,] mat2 = {{9,2,8}, {1,2,5}, {3,19,-3}};
  double[,] mat3 = Summaa(mat1, mat2);
  Console.WriteLine(Demo6.Matriisit.Jonoksi(mat3, " ", "{0,5:0.00}"));
}

tulostaisi

10.00  4.00 11.00
 3.00  4.00  7.00
 7.00 21.00  0.00

(Demo6.Matriisit.Jonoksi -käyttö ei ole pakollista, voit toki tehdä itsekin oman tulostusaliohjelman.)

B2

M: 17. Merkkijonojen pilkkominen ja muokkaaminen Merkkijonojen pilkkominen: Tee funktio ErotaLuvut(String jono), jonka ansiosta seuraava pääohjelma

public static void Main(String[] args) 
{
    double[] luvut = ErotaLuvut("2.23 3 4 5 k      9 ;5");
    Console.WriteLine(Demo6.Matriisit.Jonoksi(luvut, " ", "{0,5:0.00}"));
}

tulostaisi

 2.23  3.00  4.00  5.00  0.00  9.00  5.00

Vinkki: Käytä String.Split-funktiota.

G1

M: 15.5 Moniulotteiset taulukot. Nyt GameOfLife on säännöillä b3s23 (born 3, stay 2 ja 3) eli synnytään 3:lla naapurilla ja pysytään 2:lla tai 3:lla naapurilla. Muuta SeuraavaSukupolvi-aliohjelma sellaiseksi, että sille voidaan viedä jonkinlaisena taulukkona säännöt ja silmukoiden sisään ei tule enää yhtään if-lausetta (viisastelijoille: myös ?-lause on if-lause, samoin switch :-)

G2

Tee pieni tasohyppelypeli, jossa on

  • kerättäviä esineitä
  • väistettäviä, joista menettää hengen / elämäpisteitä
  • useampi kuin yksi kenttä
  • olioilla tekstuurit