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

Avaa palautelomake klikkaamalla tästä

T1*. Laske kirjaimet (1 p.)

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", 'å');          // 2

Vinkki: 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.

# tehtava_laske_kirjaimet

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

public static void Main()
{
  string kolmio = LuoKolmio('@', 8);
  Console.WriteLine(kolmio);
}

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.

Ohjeita ja vinkkejä tehtävän tekemiseen

# tehtava_kolmio_merkkijonoilla

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

16 Oct 25 (edited 16 Oct 25)

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.

Ohjeita ja vinkkejä tehtävän tekemiseen

# tehtava_sanojen_pituuksien_keskiarvo
# tehtava_lahin_pallo_jypeli_link

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

public PhysicsObject LahinPallo(PhysicsObject[] pallot, Vector piste)
{
 // täydennä ...
}

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

PhysicsObject lahinPallo = LahinPallo(pallot, sininenPallo.Position);
lahinPallo.Color = Color.Red;

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.

Ohjeita ja vinkkejä tehtävän tekemiseen

# tehtava_lahin_pallo_jypeli

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:

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

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

Katso video siitä, miltä lopputuloksen pitäisi näyttää

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.

Ohjeita ja vinkkejä tehtävän tekemiseen

# tehtava_lahin_pallo_jypeli_interaktiivinen

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

# visu_ville
# bonus_puu_merkkijonoilla_link

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:

public static void Main()
{
  string puu = LuoPuu(9, '@', '|');
  Console.WriteLine(puu);
}

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.

Ohjeita ja vinkkejä tehtävän tekemiseen

# bonus_puu_merkkijonoilla

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.

# bonus_puu_merkkijonoilla_koristele

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:

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 = Summa(mat1, mat2);
  Console.WriteLine(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

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.

# bonus_matriisi_summa

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:

#define USE_SOPULIT_EXAMPLE_MAIN

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.

# guru_game_of_life_saannot

G2. Tasohyppelypeli (1 p.)

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.

# guru_tasohyppelypeli

These are the current permissions for this document; please modify if needed. You can always modify these permissions from the manage page.