Harjoitustehtävät 9
Osaamistavoitteet
Tämän harjoituksen päätteeksi
- osaat soveltaa taulukoita ja silmukoita yhdessä paremmin
- osaat toteuttaa sisäkkäisiä silmukoita vaativia funktioita
- osaat kirjoittaa listoja (
List<T>) käyttäviä yksinkertaisia funktioita
T0. Palaute tästä osasta (0,5 p.)
Auta meitä parantamaan tätä kurssia antamalla palautetta tästä kurssin osiosta.
Huom: Vastaa tähän vasta, kun olet valmis tämän harjoitustehtäväkerran tehtävien kanssa
Vastaa alla oleviin kohtiin tämän kurssin osasa käsiteltyjen materiaalien ja tehtävien (luennot, esimerkit, kurssimoniste, harjoitustehtävät) perusteella.
Saat 0,25 pistettä vastaamalla kaikkiin alla oleviin väittämiin.
Kirjoita arvio tällä viikolla käyttämästäsi työmäärästä. Laske työmäärään mukaan kaikki tällä viikolla käyttämäsi aika: lähiopetukseen osallistuminen, oppimateriaalin lukeminen, harjoitustehtävien tekeminen, luentovideon katsominen, tehtävien purkutilaisuuteen osallistuminen ja niin edelleen.
Kertaustehtävät
Voit halutessasi palautella mieleen asioita tekemällä kertaustehtäviä.
T1*. Aidosti kasvava osajono (1 p.)
Lue ensin monisteesta: 15. Taulukot.
Jos haluat tehdä tehtävän Riderissa: Komentorivitehtävien tekeminen Riderissa.
Aidosti kasvava osajono on sellainen osa taulukosta, jossa jokainen peräkkäinen alkio on suurempi kuin sitä edeltävä alkio. Esimerkiksi taulukon 3, 3, 4, 1 eräs osajono 3, 3 ei ole aidosti kasvava, koska peräkkäiset alkiot ovat yhtä suuria. Sen sijaan osajono 3, 4 on aidosti kasvava, koska 4 on suurempi kuin 3. Tämän esimerkin taulukon pisin aidosti kasvava osajono on 3, 4, jonka pituus on 2. Huomaa, että funktio palauttaa nimenomaan jonon pituuden, eli yhden kokonaisluvun.
Tässä sana "aidosti" tarkoittaa siis sitä, että seuraavan alkion tulee olla nimen omaan suurempi kuin edellinen, eli yhtä suuria alkioita ei sallita.
Toteuta funktio PisinKasvavaOsajono, joka palauttaa kokonaislukutaulukon pisimmän aidosti kasvavan osajonon pituuden.
Esimerkkejä:
- Taulukon [1, 1, 2, 2, 2, -1, 0, 1, 5, 5, -1] pisin aidosti kasvava osajono on [-1, 0, 1, 5]. Sen pituus on 4, joten funktio palauttaa arvon 4.
- Taulukon [2, 3, 4, 1, 2, 0, 1, 2, 5, 5, 7] pisin aidosti kasvava osajono on [0, 1, 2, 5], joten funktio palauttaa arvon 4.
- Taulukon [-1, -1, -1] pisimmän aidosti kasvavan osajonon pituus on 1 (osajono jossa on vain alkio [-1]).
Tässä tehtävässä on erittäin suositeltavaa käyttää automaattisia testejä ratkaisun toiminnan varmistamiseksi.
Huomaa, että ratkaisussasi et saa olettaa että parametrina tuleva taulukko on aina juuri kyseinen yllä oleva taulukko; ratkaisusi tulee toimia kaikenlaisilla taulukoilla.
Palautus: Palautuslaatikkoon palautetaan pelkkä funktio ja testit, ei class- eikä Main-koodia. Pääohjelma on jo TIM-versiossa valmiiksi mukana.
Arviointi: Koodin ajamisesta Aja -painikkeella ja ohjelman oikeasta tulosteesta 0,6 p; onnistuneesti ajetuista testeista Aja omat testit -painikkeella 0,4 p.
Vinkki 1: Voit ensiksi harjoitella samankaltaisen tehtävän tekemistä ohjatusti täältä: Tehtävän T1 harjoittelutehtävä.
Vinkki 2: Jos algoritmi ei ole harjoittelun jälkeen kristallin kirkas, harjoittele Taunolla ja/tai kynällä ja paperilla. Alla on valmis Tauno, jolla voit harjoitella.
Vinkki 3: Halutaan siis etsiä alkuperäisestä jonosta t pisin osajono, missä kaikki alkiot toteuttavat ehdon t[i-1] < t[i].
Tässä vielä toinen esimerkki ko. tehtävään:
Lukujonon
3, 5, 4, 4, 0, 1, 4, 6, 2
pisin aidosti kasvava osajono on
0, 1, 4, 6
ja tämä kyseinen osajono siis "alkaa" alkuperäisen jonon viidennestä alkiosta (luku 0) ja päättyy alkuperäisen jonon kahdeksanteen alkioon (luku 6).
En oikein ymmärrä miksi omalla kohdalla en saa tuota 0.6 pistettä. Kaikki tarkistukset mitä osaan tehdä, näyttää että kaikki on kunnossa. Varmistuksena kysyin tekoälyltäkin ja ei nähnyt ongelmaa. Onko mahdollista saada palautetta?
Kokeile, miten algoritmi toimii jonolla [2, 3, 4, 1, 2, 0, 1, 2, 5, 5, 7]. Mikä on pisin aidosti kasvava osajono tässä? Mikä on sen pituus? Nyt ainakin ohjelma antaa väärän tuloksen tuolle jonolle. Laita viestiä ohj1-opet@tim.jyu.fi jos et keksi :) -DZ
Vaikka tehtävän voi varmasti ratkaista sisäkkäisillä for-silmukoilla, se hankaloittaa tekemistä huomattavasti. Suosittelen käyttämään ihan "yhdenkertaista" silmukkaa. -AJL
—Itse en saa tarkastusta toimimaan vaikkakin mielestäni kaikki on oikein. Mikäköhän tässä oikein mättää?
Sinulla on <pre name="testi">, mutta "testi" sijaan pitää olla "test" -DZ
Mikähän testeissä on pielessä? Kokeilin moneen kertaan ja kysyin ChatGPT:ltä myös.
0,4 pistettä tulee omista testeistä. Testin tällä kurssilla pitää kirjoittaa käyttäen ComTest-syntaksia -DZ
—T2*. Shakkilauta (1 p.)
Lue ensin monisteesta: 13. Ehtolauseet, 16. Toistorakenteet.
Jos haluat tehdä tehtävän Riderissa: Jypeli-tehtävien tekeminen Riderissa.
Tee silmukoita käyttämällä 8x8-kokoinen shakkilauta. Vasemmassa alareunassa olevan ruudun tulee olla valkoinen.
Tuloksen pitäisi näyttää alla olevan kuvan mukaiselta:

Palautus: Palautuslaatikkoon palautetaan peliluokan sisältö, eli Begin- ja muut aliohjelmat. Peliluokka on TIM-versiossa valmiiksi mukana (ks. Näytä koko koodi -linkki palautuslaatikossa).
Arviointi: Käytä Set custom points -toimintoa TIMissa. Tee itsearvio pistemäärästäsi ja syötä omat pisteesi väliltä 0-1. Jos teit tehtävän mielestäsi täysin oikein, 1 piste, puoliksi oikein 0,5 pistettä jne.
Mielestäni sain tehtävän logiikan täysin oikein, mutta ilmeisesti kuva vääntyy hassusti fysiikkaobjektien vuoksi?
Voit käyttää ihan GameObject-olioita, jotka eivät tottele fysiikkaa ja pysyvät paikalla. Muuten toimii samoin kuin PhysicsObject, mutta kirjoitat GameObject -DZ
T3. Taulukon lukuparit ja summat (1 p.)
Lue ensin monisteesta: 16. Toistorakenteet, 15. Taulukot.
Jos haluat tehdä tehtävän Riderissa: Komentorivitehtävien tekeminen Riderissa.
Tee ohjelma, joka tulostaa taulukon kaikki mahdolliset lukuparit ja niiden summat. Esimerkiksi jos taulukko olisi:
niin tulostuksen pitäisi näyttää tältä:
2 ja 3, summa on: 5
2 ja 9, summa on: 11
2 ja -5, summa on: -3
3 ja 2, summa on: 5
3 ja 9, summa on: 12
3 ja -5, summa on: -2
9 ja 2, summa on: 11
9 ja 3, summa on: 12
9 ja -5, summa on: 4
-5 ja 2, summa on: -3
-5 ja 3, summa on: -2
-5 ja 9, summa on: 4
Voit tehdä koko ohjelman Main-pääohjelman sisään. Aliohjelmia ei tarvita.
Lukuparit saa tulostaa kahteen kertaan järjestystä vaihtaen; esimerkiksi yllä muiden muassa "2 ja 3" (taulukon paikat 0 ja 1) sekä "3 ja 2" (taulukon paikat 1 ja 0) ovat sama lukupari mutta vain järjestys vaihtuu. Luku ei voi kuitenkaan olla pari itsensä kanssa. Tulostuksia ei saa tehdä "manuaalisesti", vaan ohjelman pitää toimia myös siinä tilanteessa, että taulukkoa muutetaan.
Palautus: Palautuslaatikkoon palautetaan koko ohjelma, mukaan lukien luokka ja pääohjelma.
Arviointi: Käytä Set custom points -toimintoa TIMissa. Tee itsearvio pistemäärästäsi ja syötä omat pisteesi väliltä 0-1. Jos teit tehtävän mielestäsi täysin oikein, 1 piste, puoliksi oikein 0,5 pistettä jne.
T4. Onko summaa? (1 p.)
Lue ensin monisteesta: 16. Toistorakenteet, 15. Taulukot.
Jos haluat tehdä tehtävän Riderissa: Komentorivitehtävien tekeminen Riderissa.
Tee funktio nimeltä OnkoSummaa, joka ottaa kaksi parametria: int-taulukon ja int-luvun. Funktio palauttaa bool-arvon sen perusteella, löytyykö annetusta taulukosta lukupari, jonka summa on parametrina annettu int-luku.
Esimerkiksi kutsu
palauttaisi false, sillä taulukosta ei löydy kahta lukua jotka summautuisivat lukuun 8. Sen sijaan kutsu
palauttaisi true, sillä 4 + 4 = 8.
Palautus: Palautuslaatikkoon palautetaan pelkkä funktio ja testit, ei class- eikä Main-koodia. Pääohjelma on jo TIM-versiossa valmiiksi mukana.
Arviointi: Koodin ajamisesta Aja -painikkeella 0,4 p; ohjelman oikeasta tulosteesta 0,5 p; onnistuneesti ajetuista testeista Aja omat testit -painikkeella 0,1 p.
Lisätehtävä (+ 1 p.): Oletetaan että saatu aineisto on suuruusjärjestyksessä. Käytä Array.Sort-metodia järjestääksesi kokonaislukutaulukko. Ota alla oleva mallikoodi Rideriin ja kokeile, kuinka kauan funktiosi ajo kestää 100 000 alkiolle. Jos saat ajan alle 50 millisekuntiin, voit merkitä itsellesi tästä toisen pisteen.
Huom: koska mukana on satunnaisuutta, niin riittää, että "tavallisesti" ajo menee tuohon alle 50 millisekuntiin. Ei haittaa jos joissain yksittäisissä tapauksissa menisikin hieman kauemmin, kunhan tulokset eivät ole tuhansien millisekuntien luokkaa kuten raakaan voimaan perustuvissa algoritmeissa. Toimiva ratkaisu läpäisee myös Mainin alussa olevan pienimuotoisen toiminnallisuustestin.
using System;
using System.Collections.Generic;
using System.Diagnostics;
public class Summa
{
public static void Main()
{
int[] testi = new int[] {1,2,2,3,5};
bool testiLapi = !OnkoSummaa(testi,1) && !OnkoSummaa(testi,2) &&
OnkoSummaa(testi,4) && OnkoSummaa(testi,6);
Console.WriteLine(testiLapi ? "Testit läpäisty." :
"Testit epäonnistuivat, virheellinen toteutus!");
const int MONTAKO = 100000;
int[] luvut = LuoSatunnainenTaulukko(MONTAKO, 0, MONTAKO / 2);
Array.Sort(luvut);
Stopwatch sw = Stopwatch.StartNew();
bool loytyykoPari = OnkoSummaa(luvut, MONTAKO / 2);
sw.Stop();
double ms = sw.Elapsed.TotalMilliseconds;
Console.WriteLine("Kesti: " + ms + " millisekuntia.");
}
private static int[] LuoSatunnainenTaulukko(int pituus, int min, int max)
{
Random r = new Random();
int[] luvut = new int[pituus];
for (int i = 0; i < luvut.Length; i++)
luvut[i] = r.Next(min, max);
return luvut;
}
}Mikäli tulkitsin T4 lisätehtävän ajastuts koodin oikein niin lisätehtävä ei tule antamaan true koskaan sillä taulukkoon laitetaan vain lukuja 0-50000 ja summaksi halutaan 100 000. Ainoa tapaus milloin parit löytyvät on kun lukuja 50000 on 2 kappaletta.
Erinomainen huomio! Oikeastaan tilanne on vielä pahempi, koska Random.Next(min, max) palauttaa luvun välillä min...max-1, eli nykyisillä parametreilla suurin alkio olisi ollut 49999. Muutin hieman koodia, jotta se olisi edes joskus tosi. -DZ
T5. Pisin jono listassa (1 p.)
Lue ensin monisteesta: 23. Dynaamiset tietorakenteet.
Jos haluat tehdä tehtävän Riderissa: Komentorivitehtävien tekeminen Riderissa.
Tee funktio PisinJono, joka ottaa parametrina merkkijonolistan (List<string>), ja palauttaa kyseisen listan pisimmän merkkijonon.
Huomaa, että funktio ei saa muokata parametrina annettua listaa. Toisin sanoin, funktiolla "ei ole sivuvaikutuksia parametrien suhteen".
Palautus: Palautuslaatikkoon palautetaan pelkkä funktio, ei class- eikä Main-koodia. Pääohjelma on jo TIM-versiossa valmiiksi mukana.
Arviointi: Tehtävässä on automaattinen arviointi. Oikein toimista aliohjelmasta annetaan 1 p.
T6. Poista jonot listasta (1 p.)
Lue ensin monisteesta: 23. Dynaamiset tietorakenteet.
Jos haluat tehdä tehtävän Riderissa: Komentorivitehtävien tekeminen Riderissa.
Tee funktio PoistaJonot, joka ottaa vastaan merkkijonolistan (List<string>), sekä poistettavan merkkijonon (string). Funktio poistaa listasta kaikki jälkimmäisen merkkijonon esiintymät. Funktio ei palauta mitään arvoja.
Huomaa, että tämän funktion tulee muokata parametrina annettua listaa eikä palauttaa uutta listaa. Funktion palautustyyppi on siis void. Toisin sanoin, funktiolla "on sivuvaikutus parametrien suhteen".
Palautus: Palautuslaatikkoon palautetaan pelkkä funktio, ei class- eikä Main-koodia. Pääohjelma on jo TIM-versiossa valmiiksi mukana.
Arviointi: Tehtävässä on automaattinen arviointi. Oikein toimista aliohjelmasta annetaan 1 p.
T7. Testaa kaksi aliohjelmaa (1 p.)
Lue ensin monisttesta: 11. Testaaminen
Tarkista vähintään kahden tämän harjoituskerrassa tehdyn aliohjelman toimintaa automaattisella testillä ComTest-työkalua käyttäen.
Huomaa, että ohjelmia, joissa on pelkkä Main-pääohjelma, ei voida tämän kurssin tiedoilla testata, kuten ei myöskään Jypeli-pelejä. Siksi testaamista tehdään harjoitustehtävissä vain static-aliohjelmille, jotka palauttavat jonkun arvon.
On suositeltavaa käyttää ComTest-työkalua Riderin kautta. Pääset eteenpäin seuraavilla ohjeilla:
Palautus: Kerro, minkä tehtävän ja minkä aliohjelman/aliohjelmien toiminnan testasit.
Arviointi: Käytä Set custom points -toimintoa TIMissa. Tee itsearvio pistemäärästäsi ja syötä omat pisteesi väliltä 0-1. Jos teit tehtävän mielestäsi täysin oikein, 1 piste, puoliksi oikein 0.5 pistettä jne.
Taulukon testaaminen Comtestilla:
Jos haluat viedä testiin taulukon ilman, että luot apumuuttujaa, niin tee seuraavasti.
Katso miten 2-ulotteista taulukkoa voidaan testata täältä.
StringBuilderin arvon testaaminen pitää suorittaa ToString()-metodin avulla
V1. ViLLE (1 p.)
Tällä viikolla ei ole uusia ViLLE-tehtäviä. Voit halutessasi tehdä 5 kappaletta tekemättömiä silmukka- ja/tai taulukkotehtäviä tai muita, joita et aikaisemmin ymmärtänyt. Muista ViLLEn käyttöohje.
Oliko näistä ViLLE tehtävistä tarkoitus saada vielä piste? Tai pitääkö kirjoittaa jotain tiettyä palautuslaatikkoon? Kun kommentoin "Tehty" tuli automaattiseti 0 pistettä eikä itse pysty niitä tässä muokkaamaan.
Tästä unohtui tehtävänanto, pahoitteluni. Nyt on lisätty. Tarkoitus on tosiaankin kirjoittaa vähän enemmän kuin vain "Tehty" :) -DZ
—B1. Sanan haku sanakirjasta (1 p.)
Jos haluat tehdä tehtävän Riderissa: Komentorivitehtävien tekeminen Riderissa.
Valmistelut: Ota Kotuksen nykysuomen sanalista (klikkaa hiiren oikealla ja sitten Tallenna linkki nimellä).
Tee uusi ConsoleMain -projekti ja lisää lataamasi tekstitiedosto projektiin: hiiren oikealla projektin päälle Add
Existing Item
Etsi juuri äsken lataamasi
.txt-tiedosto. Nyt kun tiedosto on projektissa, klikkaa siitä vielä hiiren oikealla Properties
Copy to output directory -kohtaan laita
Copy if newer.
Tiedoston sisältämän aineiston saat luettua String-taulukkoon kirjoittamalla Main-pääohjelmaan:
Kirjoita vielä ohjelmakoodin alkuun nimiavaruusviite using System.IO;
Tehtävä: Tee ohjelma, joka kysyy käyttäjältä merkkijonon. Toteuta sitten funktio joka palauttaa listan niistä Kotus-listan sanoista, jotka sisältävät kaikki käyttäjän antamat merkit. Lopuksi ohjelma tulostaa löydetyt sanat ruudulle.
Ota alla olevasta SisaltaaKaikkiMerkit-funktiosta kopio omaan ohjelmaasi ja käytä sitä hyväksesi. Tämä funktio palauttaa true tai false sen mukaan sisältääkö annettu (yksi) merkkijono kaikki annetut merkit.
Palautus: Palautuslaatikkoon palautetaan koko ohjelma, mukaan lukien luokka ja pääohjelma.
Arviointi: Käytä Set custom points -toimintoa TIMissa. Tee itsearvio pistemäärästäsi ja syötä omat pisteesi väliltä 0-1. Jos teit tehtävän mielestäsi täysin oikein, 1 piste, puoliksi oikein 0,5 pistettä jne.
/// <summary>
/// Funktiossa tutkitaan voidaanko annettu merkkijono
/// "upottaa toiseen merkkijonoon", eli
/// sisaltaako sana kaikki annetut merkit.
/// </summary>
/// <param name="sana">Sana, johon upotetaan</param>
/// <param name="merkit">Upotettava sana (eli tämän sanan
/// kirjaimet pitää löytyä ekasta sanasta)</param>
/// <returns>Onnistuko uptus</returns>
/// <example>
/// <pre name="test">
/// SisaltaaKaikkiMerkit("antti", "antti") === true;
/// SisaltaaKaikkiMerkit("antti", "at") === true;
/// SisaltaaKaikkiMerkit("at", "antti") === false;
/// SisaltaaKaikkiMerkit("anttijussi", "tia") === true;
/// SisaltaaKaikkiMerkit("anttijussi", "") === true;
/// SisaltaaKaikkiMerkit("anttijussi", "tiaa") === false;
/// SisaltaaKaikkiMerkit("", "") === true;
/// SisaltaaKaikkiMerkit("", "a") === false;
/// </pre>
/// </example>
public static bool SisaltaaKaikkiMerkit(string sana, string merkit)
{
StringBuilder merkitNyt = new StringBuilder(merkit);
StringBuilder sanaNyt = new StringBuilder(sana);
int i = 0;
while (i < merkit.Length)
{
char merkkiNyt = merkit[i];
// Tehdään seuraavaksi koodi jonka avulla
// löydetään merkin paikka StringBuilder-oliossa.
// Tämä vastaa String-olion IndexOf-metodia, jota
// ei valitettavasti löydy StringBuilderille.
int merkinPaikka = -1; // arvataan aluksi että merkkiä ei löydy.
int j = 0;
while (j < sanaNyt.Length)
{
if (sanaNyt[j] == merkkiNyt)
{
merkinPaikka = j;
break;
}
j++;
}
if (merkinPaikka >= 0)
{
sanaNyt = sanaNyt.Remove(merkinPaikka, 1);
}
else return false;
i++;
}
return true;
}B2. Interaktiivinen hakukone (1 p.)
Jos haluat tehdä tehtävän Riderissa: Komentorivitehtävien tekeminen Riderissa.
Täydennä Tehtävän B1 vastaus siten, että se toimisi täysin interaktiivisesti. Käyttäjä voi syöttää sanan kirjain kerrallaan, ja ohjelma näyttää tulokset heti.
Palautus: Palautuslaatikkoon palautetaan koko ohjelma, mukaan lukien luokka ja pääohjelma. Huomaa, että interaktiivisten ohjelmien toimintaa ei voi testata TIMissa.
Arviointi: Käytä Set custom points -toimintoa TIMissa. Tee itsearvio pistemäärästäsi ja syötä omat pisteesi väliltä 0-1. Jos teit tehtävän mielestäsi täysin oikein, 1 piste, puoliksi oikein 0,5 pistettä jne.
B3. Portaat käyttäen vektoreita (1 p.)
Jos haluat tehdä tehtävän Riderissa: Jypeli-tehtävien tekeminen Riderissa.
Palataan hetkeksi kurssin alkupuolen laatikkotehtäviin. Katso Harjoitustehtävien 2 Tehtävän T4 (Portaat) mallivastaus käyttäen palautuslaatikon yläpuolella olevaa Näytä mallivastaus -painiketta. Voit vaihtoehtoisesti käyttää myös sinun omaa vastauksesi.
Muuta tehtävän vastaus niin, että Begin-aliohjelma toimisi seuraavasti.
Ohjelman tulisi toimia muuten samoin, eli yllä Begin tuottaa kolme porrasta.
Piirrä vielä pieni punainen ympyrä, joka on pisteessä (0, 0). Ympyrän saat muiden olioiden päälle varmasti kun lisäät sen "ylemmälle" tasolle seuraavasti:
Lopullinen tulos pitäisi näyttää seuraavalta:

Tässä viedään siis PiirraNelio-aliohjelmalle laatikon vasemman alakulman sijainti Vector-oliona. Funktio piirtää laatikon ja palauttaa piirtämänsä laatikon oikean yläkulman koordinaatin. Nyt seuraavan laatikon piirtäminen on yksinkertaista koska se voidaan aloittaa edellisen kutsun palauttamasta paikasta.
Alla olevassa palautuslaatikossa on valmiiksi Begin-aliohjelma ja pohja uudelle PiirraNelio-aliohjelmalle. Mieti, mitä tulee ???-merkittyihin kohtiin ja korvaa ne toimivalla koodilla.
Kun klikkaat Näytä koko koodi, huomaat, että luokaan on määritelty vakio SIVUN_PITUUS. Käytä tuota vakiota koodissasi neliön koon määrittelyssä. Älä kirjoita kooksi mitään kiinteää lukuarvoa.
Palautus: Palautuslaatikkoon palautetaan peliluokan sisältö, eli Begin- ja muut aliohjelmat. Peliluokka on TIM-versiossa valmiiksi mukana (ks. Näytä koko koodi -linkki palautuslaatikossa).
Arviointi: Käytä Set custom points -toimintoa TIMissa. Tee itsearvio pistemäärästäsi ja syötä omat pisteesi väliltä 0-1. Jos teit tehtävän mielestäsi täysin oikein, 1 piste, puoliksi oikein 0,5 pistettä jne.
Vinkki: Katso myös Harjoitustehtävien 3 Tehtävän G1-2 (Pienenevät portaat) mallivastaus, joka on ratkaistu hieman tämäntapaisesti.
Vinkki: Aliohjelma ottaa siis parametrina neliön vasemman alareunan koordinaatin. Tee Vector keskipiste, johon lasket keskipisteen sijainnin kun tiedät vasemman alareunan sijainnin ja sivun pituuden. Vastaavasti voit tehdä Vector oikeaYlakulma, johon lasket oikean yläkulman sijainnin vastaavia tietoja käyttämällä.
B4-5. Noppapeli (2 p.)
Jos haluat tehdä tehtävän Riderissa: Komentorivitehtävien tekeminen Riderissa.
Tee seuraava Console Application -peli.
Kaksi pelaajaa kilpailee siitä, kumpi saa noppaa heittämällä ensin 100 pistettä. Jokaisella vuorolla pelaaja heittää toistuvasti noppaa, kunnes saa joko numeron 1 tai pelaaja sanoo "pankki" jolloin hänen vuorollaan heitettyjen silmälukujen summa lisätään hänen kokonaispistemääräänsä.
Pelaaja kullakin heittokerralla joutuu siis tekemään seuraavan valinnan
- heitto - arvotaan nopan silmäluku 1-6, ja jos tulos on
- 1: pelaaja menettää kaikki omalla vuorollaan heittämänsä pisteet ja vuoro vaihtuu vastustajalle
- 2-6: silmäluku lisätään pelaajan "turn totaliin" ja pelaajan vuoro jatkuu
- pankki - pelaajan omalla vuorollaan heittämät pisteet (eli "turn total") lisätään hänen kokonaispistemääräänsä ja vuoro vaihtuu vastustajalle
Palautus: Palautuslaatikkoon palautetaan koko ohjelma, mukaan lukien luokka ja pääohjelma. Huomaa, että interaktiivisten ohjelmien toimintaa ei voi testata TIMissa.
Arviointi: Käytä Set custom points -toimintoa TIMissa. Tee itsearvio pistemäärästäsi ja syötä omat pisteesi väliltä 0-2. Jos teit tehtävän mielestäsi täysin oikein, 2 pistettä, puoliksi oikein 1 piste jne.
B6. Kokonaislukujen sekoittaminen (1 p.)
Jos haluat tehdä tehtävän Riderissa: Komentorivitehtävien tekeminen Riderissa.
Tee algoritmi kokonaislukutaulukon sekoittamiseksi. Tee void-aliohjelma, joka ottaa parametrina int-taulukon ja sekoittaa sen alkiot. Testaa algoritmiasi taulukolla, johon on alustettu järjestyksessä luvut 1, 2, 3, ..., 52. Palauta toimiva ohjelmakoodi, jossa on hyvin kommentoituna mitä algoritmissa tehdään.
Lukuja 1, 2, 3, ..., 52 ei tietenkään kannata laittaa taulukkoon manuaalisesti, koska helpompiakin tapoja on jo opittu ;).
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. Jos matkit tätä, niin vaihda T:n tilalle int ja listan tilalle int-taulukko. Funktion alkuun pitää lisätä nyt Random rand = new Random(); jotta Random-olio on olemassa. Jypelin esimerkissä se on luokan attribuutti.
Palautus: Palautuslaatikkoon palautetaan koko ohjelma, mukaan lukien luokka ja pääohjelma. Huomaa, että interaktiivisten ohjelmien toimintaa ei voi testata TIMissa.
Arviointi: Käytä Set custom points -toimintoa TIMissa. Tee itsearvio pistemäärästäsi ja syötä omat pisteesi väliltä 0-1. Jos teit tehtävän mielestäsi täysin oikein, 1 piste, puoliksi oikein 0,5 pistettä jne.
G1-2. Toiston poistaminen taulukosta (2 p.)
Jos haluat tehdä tehtävän Riderissa: Komentorivitehtävien tekeminen Riderissa.
Tee aliohjelma ToistotonTaulukko, joka saa parametrinaan taulukon, jossa on kokonaislukuja, ja palauttaa taulukon, jossa on alkuperäisen taulukon alkiot kukin vain yhden kerran järjestettynä niiden esiintymiskertojen määrän mukaan nousevaan järjestykseen.
Esim. taulukosta {1, 2, 3, 34, 34, 2, 1, 34, 1, 1, 1} palautetaan {3, 2, 34, 1}.
Palautus: Palautuslaatikkoon palautetaan pelkkä funktio ja testit, ei class- eikä Main-koodia. Pääohjelma on jo TIM-versiossa valmiiksi mukana.
Arviointi: Koodin ajamisesta Aja -painikkeella 1 p; ohjelman oikeasta tulosteesta 0,5 p; onnistuneesti ajetuista testeista Aja omat testit -painikkeella 0,5 p.
These are the current permissions for this document; please modify if needed. You can always modify these permissions from the manage page.