Harjoitustehtävät 7
Osaamistavoitteet
Tämän harjoituksen päätteeksi
- osaat jo soveltaa taulukoita, funktioita ja silmukoita paremmin
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.
T1*. Laske kirjaimet (1 p.)
Lue ensin monisteesta: 16. Toistorakenteet (silmukat), 12.1.1. Merkkijono on kuin taulukko.
Jos haluat tehdä tehtävän Riderissa: Komentorivitehtävien tekeminen Riderissa.
Kirjoita aliohjelma LaskeKirjaimet(string teksti, char kirjain), joka palauttaa sen, montako kertaa annettu kirjain esiintyy merkkijonossa. Laskemisen tulee olla kirjainkoosta riippumaton (esimerkiksi sekä r että R tulee laskea mukaan).
Alla jotain esimerkkejä aliohjelman toiminnasta:
int s1 = LaskeKirjaimet("kissa", 's'); // 2
int r1 = LaskeKirjaimet("Ritari", 'r'); // 2
int i1 = LaskeKirjaimet("Mississippi", 'i'); // 4
int a1 = LaskeKirjaimet("Ååh", 'å'); // 2Vinkki: Muuta merkit samaan kirjainkokoon ennen vertailua, esim. Char.ToLower() tai Char.ToUpper().
Palautus: Palautuslaatikkoon palautetaan pelkkä funktio, ei class- eikä Main-koodia. Pääohjelma on jo TIM-versiossa valmiiksi mukana.
Arviointi: Tehtävässä on automaattinen arvostelu. Jos vastaus kääntyy ja toimii odotetusti, 0,9 p. Omien ComTest-testien kirjoittamisesta ja onnistuneesta ajamisesta Aja omat testit -painikkeella 0,1 p.
T2*. Luo kolmio merkkijonoilla (1 p.)
Lue ensin monisteesta: 16. Toistorakenteet (silmukat), 12.4. Muokattavat merkkijonot.
Jos haluat tehdä tehtävän Riderissa: Komentorivitehtävien tekeminen Riderissa.
Tee aliohjelma LuoKolmio, joka palauttaa suorakulmaisen kolmion niin kutsutulla ASCII-grafiikalla (ASCII-grafiikalla tarkoitetaan kirjoitusmerkeillä tuotettua "taidetta"). LuoKolmio-funktio ottaa parametreina char-merkin sekä yhden luvun, joka on kolmion leveys ja korkeus. Funktio palauttaa string-merkkijonon. Aliohjelman ei saa tulostaa mitään, vaan se palauttaa valmiin kolmion merkkijonona.
Esimerkki aliohjelman käytöstä:
Yllä olevan aliohjelman ajossa pitäisi tulostua seuraava kolmio:
@
@@
@@@
@@@@
@@@@@
@@@@@@
@@@@@@@
@@@@@@@@
Huomaa, että tulostaminen tapahtuu Main-pääohjelmassa eikä LuoKolmio:ssa.
Palautus: Palautuslaatikkoon palautetaan koko ohjelma, mukaan lukien luokka ja pääohjelma.
Arviointi: Koodin ajamisesta Aja -painikkeella 0,1 p; oikeasta tulostuksesta 0,6 p. Omien ComTest-testien kirjoittamisesta ja onnistuneesta ajamisesta Aja omat testit -painikkeella 0,3 p.
Ohje: Merkkijono rakennetaan StringBuilder-olioon. Kunkin rivin päätteeksi lisätään rivinvaihto seuraavasti (tässä sb on StringBuilder-muuttujan nimi):
sb.Append('\n');
Funktio palauttaa lopuksi StringBuilder-olion "tavallisena" merkkijonona sanomalla
return sb.ToString();
Lähde laajentamaan seuraavasta ajatuksesta. Mieti itse mihin kohtaan allaoleva pituus täytyy funktioon kirjoittaa.
for (int i = 0; i < pituus; i++)
{
for (int j = 0; [MIETI TOISTOEHTO ITSE]; j++)
{
// Tässä kohtaa lisää StringBuilder-olioon merkkejä.
}
// Tässäkin kohtaa pitää tehdä jotakin
}
Liittyen sisemmän silmukan toistoehtoon: Kokeile laittaa toistoehtoon mukaan i-muuttuja. Pelkkä j < i ei kuitenkaan riitä, mitä pitää muuttaa?
Mikäköhän tässä tehtävän palautuksessa nyt mättää?
Palautuslaatikkoon palautetaan koko ohjelma, mukaan lukien luokka ja pääohjelma. Eli copy-pasteta kaikki se mitä Riderissa sinulla oli. -AJL
—T3. Lauseen sanojen pituuksien keskiarvo (1 p.)
Lue ensin monisteesta: 17.1. String.Split().
Jos haluat tehdä tehtävän Riderissa: Komentorivitehtävien tekeminen Riderissa.
Tee aliohjelma SanojenPituusKeskiarvo. Aliohjelma ottaa parametrina merkkijonon, ja palauttaa merkkijonossa olevien sanojen pituuksien keskiarvon. Sanat erotellaan välilyöntien (' '), pisteiden ('.') ja pilkkujen (',') kohdalta. Esimerkiksi syötteellä
Kolme miestä istuu saunassa.
aliohjelma palauttaisi 6, sillä sanoja on neljä kappaletta, ja sanojen pituudet ovat 5 + 6 + 5 + 8 = 24.
Vastaavasti syötteellä
Kolme miestä, myös Pertti, istuskeleepi lauteilla.
tulos olisi 7, sillä sanoja on kuusi, ja pituudet ovat 5 + 6 + 4 + 6 + 12 + 9 = 42.
Aliohjelma ei saa tulostaa mitään.
Palautus: Palautuslaatikkoon palautetaan pelkkä funktio, ei class- eikä Main-koodia. Pääohjelma on jo TIM-versiossa valmiiksi mukana.
Arviointi: Tehtävässä on automaattinen arvostelu. Jos vastaus kääntyy ja toimii odotetusti, 0,9 p. Omien ComTest-testien kirjoittamisesta ja onnistuneesta ajamisesta Aja omat testit -painikkeella 0,1 p.
Vinkki 1: Käytä String.Split-metodia (ks. dokumentaatio). Voit antaa Split-metodille useita erotinmerkkejä pilkuilla erotettuna.
Vinkki 2: Split-metodi voi synnyttää taulukkoon tyhjiä alkoita, kuten esimerkiksi yllä olevassa tapauksessa käy. Tyhjiä alkioita ei saa laskea keskiarvoon mukaan. Katso ohje monisteesta.
T4-5. Lähin pallo Jypelissä (2 p.)
Lue ensin monisteesta: 16. Toistorakenteet (silmukat), 15. Taulukot.
Jos haluat tehdä tehtävän Riderissa: Jypeli-tehtävien tekeminen Riderissa.
Seuraava ohjelma luo 20 palloa satunnaisiin paikkoihin ympäri kenttää. Pallot tallennetaan pallot-taulukkoon. Tee Fysiikkapeli nimeltään Lahinpallo ja korvaa pelitiedosto Lahinpallo.cs seuraavalla sisällöllä:
public class Lahinpallo : PhysicsGame
{
public override void Begin()
{
SetWindowSize(800, 600);
Level.Size = new Vector(800, 600);
PhysicsObject[] pallot = TeeSatunnaisetPallot(20, 30.0);
Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
}
/// <summary>
/// Tekee palloja satunnaisiin paikkoihin
/// </summary>
/// <param name="montako">Montako palloa tehdään</param>
/// <param name="koko">Pallon koko</param>
/// <returns>Pallot</returns>
private PhysicsObject[] TeeSatunnaisetPallot(int montako, double koko)
{
PhysicsObject[] pallot = new PhysicsObject[montako];
for (int i = 0; i < montako; i++)
{
PhysicsObject p = new PhysicsObject(koko, koko, Shape.Circle);
pallot[i] = p;
p.Position = RandomGen.NextVector(Level.BoundingRect);
Add(p);
}
return pallot;
}
}Tee Begin-aliohjelmaan vielä yksi fysiikkaolio-pallo haluamaasi paikkaan, vaikkapa kohtaan x=100, y=100.
Anna pallolle väriksi sininen, jotta se erottuu muista palloista.
Sen jälkeen tee funktio
joka etsii ja palauttaa annettua pistettä lähimmän pallon, siis PhysicsObject-olion.
Seuraavaksi, kutsu Begin:ssä LahinPallo-funktiota siten, että annat argumentteina pallot-taulukon, ja juuri äsken tekemäsi sinisen pallon paikan (sininenPallo.Position).
Saat paluuarvona lähimmän pallon olioviitteen. Värjää lähin pallo punaiseksi. Funktiota voidaan käyttää seuraavasti. (Laita tämä Begin:iin.)
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-2. Jos teit tehtävän mielestäsi täysin oikein, 2 pistettä, puoliksi oikein 1 piste jne.
Harjoitustehtävien 6 Tehtävässä B2-3 etsittiin kokonaislukutaulukosta lukua, jolla on pienin etäisyys toiseen lukuun (tehtävän B2-3 tapauksessa keskiarvoon).
Sen idea sopii täysin, mutta nyt pitää palauttaa fysiikkaolio, jonka etäisyys annetuun pisteeseen on pienin. Toisin sanoin, Tehtävässä B2-3:ssa alkion tyyppinä oli int, mutta nyt PhysicsObject.
Etäisyyden voit helpoiten laskea Jypelin Vector-luokasta löytyvällä Vector.Distance-funktiolla tai käyttämällä Harjoitustehtävien 6 Tehtävän B5 (Pisteiden etäisyys 2-ulotteisella tasolla) mallivastausta.
Jypelissä fysiikkaolion paikan saat fysiikkaolion Position-ominaisuuden avulla. Position on tyyppiä Vector, joka sisältää olion X- ja Y-koordinaatit samaan aikaan.
T6. Lähin pallo Jypelissä interaktiivisesti (1 p.)
Lue ensin monisteesta: 16. Toistorakenteet (silmukat), 15. Taulukot.
Jos haluat tehdä tehtävän Riderissa: Jypeli-tehtävien tekeminen Riderissa.
Täydennä Tehtävän 4-5 vastaus seuraavasti:
Lisää peliin pieni sininen pallo. Tee aliohjelma, joka siirtää pienen sinisen pallon siihen kohtaan, mihin klikkasit hiirellä. Hiiren paikan ruudulla saat tätä ohjetta käyttäen.
Jatka tehtävää niin että lähimmän pallon kohdalle ilmestyy punainen pallo. Sama toistuu kun hiirellä klikataan uudestaan jonnekin muualle, niin sinisen kuin punaisen pallon paikka päivittyy.
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.
Ohje tehtävän tekemiseen:
Tee hiiren vasemman painikkeen kuuntelijaksi delegaatti, jossa hoidetaan sekä pallon siirtely että lähimmän pallon päivittäminen.
Mouse.Listen(MouseButton.Left, ButtonState.Pressed, delegate ()
{
// Siirrä sinistä palloa
// Päivitä lähin pallo
}, "");Selitys: Delegaatti on nimetön aliohjelma, jota tässä kutsutaan hiiren napin painamisen yhteydessä. Delegaatilla on käytössään kaikki paikalliset muuttujat, joten tämä kuuntelija tulee tehdä samaan aliohjelmaan sinisen pallon kanssa (Beginiin).
V1. ViLLE (1 p.)
Tee ViLLE-tehtävät: 5.9 - 5.13 sekä 9.8.
Palauta tehtävä kirjoittamalla alla olevaan tekstilaatikkoon mitä opit ja mitä mieltä olit tämän kerran Ville-tehtävistä ja auttoivatko Ville-tehtävät sinua yhtään. Muutama rivi riittää.
B1. Luo puu merkkijonoilla (1 p.)
Lue ensin monisteesta: 16. Toistorakenteet (silmukat), 12.4. Muokattavat merkkijonot.
Jos haluat tehdä tehtävän Riderissa: Komentorivitehtävien tekeminen Riderissa.
Tee konsoliohjelma, joka tulostaa ASCII-grafiikka-"puun" (ASCII-grafiikalla tarkoitetaan kirjoitusmerkeillä tuotettua "taidetta"). Puun alaosassa on yhden merkin korkuinen ja kolme merkkiä leveä jalka/runko, jonka päällä kolmio siten, että alin "kerros" on N merkkiä (N=pariton), seuraava N-2, sitten N-4 jne, jolloin ylimpään kerrokseen jää yksi merkki. Alla esimerkki tulostuksesta.
Voit joko (a) pääohjelmassa pyytää käyttäjää syöttämään puun leveys (eli kolmion alimman rivin merkkien lukumäärä), merkki jolla kolmio täytetään, sekä merkki jolla jalka täytetään, tai (b) käyttää seuraavaa valmista pääohjelmaa:
Ohjelman tuloste näyttäisi tällöin seuraavanlaiselta:
@
@@@
@@@@@
@@@@@@@
@@@@@@@@@
|||
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.
Vinkki: StringBuilder.Append-metodille voit antaa toisena parametrina toistojen määrän.
Vinkki: Puun kolmion osan rakentamisessa kannattaa lähteä seuraavasta ajatuksesta.
- Lisää aluksi sopiva määrä välilyöntejä. Tähän voit käyttää StringBuilder-olion Append-metodia.
- Sitten lisää sopiva määrä puun merkkejä. Tähänkin voit käyttää Append-metodia.
Kaksinkertaista for-silmukkaa ei tarvitse välttämättä tehdä tässä tehtävässä. Hyödynnä parametrina saamaasi leveys-muuttujaa ja silmukan i-muuttujaa.
Vinkki: Yhden merkin voit lukea käyttäjältä näin:
B2-3. Lisää koristeita puuhun (2 p.)
Lue ensin monisteesta: 16. Toistorakenteet (silmukat), 12.4. Muokattavat merkkijonot.
Jos haluat tehdä tehtävän Riderissa: Komentorivitehtävien tekeminen Riderissa.
Täydennä Tehtävän B1 vastauksesi lisäämällä puuhun satunnaisia koristeita sinne tänne.
Koko ohjelma voisi toimia esimerkiksi seuraavasti:
Miten levea puu > 15
Mistä puu on tehty > $
Mistä jalka on tehty > /
o
$$$
$o$o$
$o$$o$o
o$$$o$$$o
o$$$o$$$$oo
$$o$$o$$$$$$$
$$$$$$$$$$$$$$$
///
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-2. Jos teit tehtävän mielestäsi täysin oikein, 2 pistettä, puoliksi oikein 1 piste jne.
Vinkki: Kannattaa ehkä tehdä apufunktio kolmion yksittäisen rivin rakentamiseen, jossa arvotaan minkä verran koristeita riviin tulee. Palautuksena String jonka sitten liität StringBuilder-olioon pääohjelmassa.
B4. Matriisien summa (1 p.)
Lue ensin monisteesta: 15.5. Moniulotteiset taulukot, 16. Toistorakenteet (silmukat).
Jos haluat tehdä tehtävän Riderissa: Komentorivitehtävien tekeminen Riderissa.
Tee funktio Summa, joka summaa yhteen kaksi double[,]-matriisia vastinalkioittain. Funktio siis joutuu ensin luomaan oikeankokoisen tulosmatriisin. Mitä on syytä olettaa parametrimatriiseilta? Dokumentoi kommentteihin oletuksesi. Sitten funktio laskee tulosmatriisiin komponenteittain summan. Esimerkiksi:
tulostaisi
10.00 4.00 11.00
3.00 4.00 7.00
7.00 21.00 0.00
Tehtävässä on valmiiksi apufunktio Jonoksi, jolla matriisin voi tulostaa näytölle (ks. Näytä koko koodi -linkki palautuslaatikossa)
Palautus: Palautuslaatikkoon palautetaan pelkkä funktio, ei class- eikä Main-koodia. Pääohjelma on jo TIM-versiossa valmiiksi mukana.
Arviointi: Koodin ajamisesta Aja -painikkeella 0,2 p; oikeasta tulostuksesta 0,6 p. Omien ComTest-testien kirjoittamisesta ja onnistuneesta ajamisesta Aja omat testit -painikkeella 0,2 p.
G1. Game of Life erilaisilla säännöillä (1 p.)
Lue ensin monisteesta: 15.5. Moniulotteiset taulukot, 16. Toistorakenteet (silmukat).
Jos haluat tehdä tehtävän Riderissa: Komentorivitehtävien tekeminen Riderissa.
Katso Harjoitustehtävien 5 Tehtävän G1-2 mallivastaus menemällä tehtävän palautuslaatikon kohdalle ja painamalla laatikon yläpuolella olevaa Näytä mallivastaus -painiketta.
Harjoitustehtävien 5 Tehtävässä G1-2 tehtiin Game of Life -peli käyttäen b3s23-sääntöä (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 (Huom! myös ?-lause on if-lause, samoin switch :-)
Huom: Jos kopioit Harjoitustehtävien 5 Tehtävän G1-2 mallivastausta suoraan Rideriin, lisää .cs-tiedoston aivan ensimmäiseksi riviksi:
Tämän avulla voit käyttää mallivastauksessa olevaa Main-pääohjelmaa. Muussa tapauksessa sinun tulee kirjoittaa aivan oma Main-pääohjelma TAI sinun tulee poistaa #if ja #endif -rivit mallivastauksesta.
Palautus: Palautuslaatikkoon palautetaan ohjelmaluokan sisältö, eli Main- ja muut mahdolliset tekemäsi aliohjelmat. Luokka 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.
G2. Tasohyppelypeli (1 p.)
Katso ohjeita: Kevät 2024 Luento 13 (PellottavaPelin aloitus) sekä Kevät 2024 Luento 14 (PelottavaPeli loppuun).
Jos haluat tehdä tehtävän Riderissa: Jypeli-tehtävien tekeminen Riderissa.
Tee pieni (tasohyppely tms.) peli, jossa on
- liikuteltava pelaaja, jolla voi "ampua" jotain, ja joilla voi osua vihollisiin
- vihollisia/seiniä/esteitä tai jotain, jolla on elämäpisteitä eli eivät häviä yhdestä. Vinkki: perintä.
- olioilla on tekstuurit
Huom! Et voi ajaa TIMissä peliäsi, koska pelin ulkopuolisia tiedostoja (tekstuurit, ym.) ei voi viedä TIMiin. Saat pisteet pelin ajamisesta, mutta TIM tulee valittamaan sinulle puuttuvista tiedostoista.
Palautus: Palautuslaatikkoon koko pelitiedosto, eli peliluokka ja sen aliohjelmat. Ohjelma.cs-tiedostoa ei palauteta.
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.
These are the current permissions for this document; please modify if needed. You can always modify these permissions from the manage page.