```

Demotilanne:

  • Pisteet päivittyvät pienellä viiveellä.
  • Värit: Punainen - puutteellinen. Vihreä - hyväksytty (vähintään 6p, joista 2p tähtiä)
# aikajana

Error in expanding macros: 'luentoaiheet' is undefined

# fields

Ohjelmointi 1, k 2024 / Demo 9

Tehtävät perustuvat luentoihin: 17 ja 18.

OPPIMISTAVOITTEET

Täytä sitä mukaa, kun koet oppineesi uusia asioita. Työkirja-sivulla näet yhteenvedon kaikkien demojen osalta.

# Oppimistavoitteet

Demoista

Ville 1

Tällä kertaa ei tule 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. Tästä Villeen Muista: Villen käyttöohje ja Ville-tehtävien palauttamisohjeet.

# villev1
# tauno1

Tauno (1p)

Tähän hyviä harjoittelutehtäviä ovat: Taulukot silmukalla, Etsiminen

Tee funktio, joka laskee kokonaislukutaulukosta suljetulla välillä 0-10 olevien lukujen keskiarvon. Jotta funktio olisi yleiskäyttöisempi, viedään sille parametrina myös tuo alaraja (esimerkissä 0) ja yläraja (esimerkissä 10). Mikäli keskiarvoa ei voi laskea, palautetaan arvo ala-1. Kirjoita myös testejä ainakin 5 kpl erilaisille taulukoille ja rajoille.

Virheilmoitusten tulkitseminen

# tauno

Muistakaa että kirjoitatte

  if (

eikä

  if(

Sama for, while jne.

Tehtävä 1. Taulukon negatiiviset

Lue ensin: 15. Taulukot.

Jos yhtään vaikeuksia, aloita: harjoitustehtävällä.

Tee funktio EnitenNegatiivisia(taulukko), joka palauttaa talukon pisimmän negatiivisista luvuista koostuvan osajonon pituuden. Esim. taulukosta [0,2,-4,-2,1,-3,5] palautettaisiin 2.

# v1
# pisinOsajono

Oljenkorsi 1: harjoittele

Tehtävä 2. Numeroita

Tee aliohjelma AnnaNumerot, joka palauttaa listan merkkijonossa esiintyvistä numeroista.

# erikirjaimet

Tehtävä 3*. Lumiukko VI

Jos yhtään vaikeuksia, katso: tehtävä jolla voi harjoitella.

Demojen 2 tehtävässä Lumiukko II tehtiin ohjelma, joka osasi piirtää lumiukon aliohjelman PiirraYmpyra avulla. Muuta ohjelmaa nyt siten, että aliohjelmalle PiirraYmpyra viedään parametrinä Vector-olio kahden reaaliluvun sijaan. Tämä vektori toimii piirrettävän ympyrän alimman pisteen koordinaattina.

Aliohjelman kuuluu piirtää ympyrä ja palauttaa sitten sen ylimmän pisteen koordinaatti. Seuraavan ympyrän piirtämisen on sitten helppoa, sillä se voidaan aloittaa edellisen kutsun palauttamasta pisteestä.

Mieti, mitä tulee ???-merkittyihin kohtiin.

Mallikuva
Mallikuva
# v2

Oljenkorsi 1

Oljenkorsi 2

# lumiukko

Tehtävä 4. Lumiukko VII

Jos yhtään vaikeuksia, aloita harjoitustehtävällä.

Tehtävässä 3 (Lumiukko VI) tehty aliohjelma PiirraYmpyra piirsi ympyrän aina ylöspäin ja palautti piirretyn pallon ylimmän pisteen. Muuta ja tuosta ohjelmasta nyt 4 aliohjelmaa: PiirraYmpyraYlos, PiirraYmpyraAlas, PiirraYmpyraOikealle ja PiirraYmpyraVasemmalle, joiden toimintaperiaate on sama kuin alkuperäisellä, mutta kukin kohdistuu omaan suuntaansa. Näiden aliohjelmien avulla tulisi saada toimimaan uusi pääohjelma:

public override void Begin()
{
    Camera.ZoomToAllObjects(100);
    Level.Background.Color = Color.Black;
    Vector piste = new Vector(0, 0);
    piste = PiirraYmpyraYlos(this, piste);
    piste = PiirraYmpyraYlos(this, piste);
    piste += new Vector(YMPYRAN_SADE, -YMPYRAN_SADE);
    piste = PiirraYmpyraOikealle(this, piste);
    piste = PiirraYmpyraOikealle(this, piste);
    piste += new Vector(-YMPYRAN_SADE, -YMPYRAN_SADE);
    piste = PiirraYmpyraAlas(this, piste);
    piste += new Vector(YMPYRAN_SADE, YMPYRAN_SADE);
    piste = PiirraYmpyraOikealle(this, piste);
    piste = PiirraYmpyraOikealle(this, piste);
    piste += new Vector(-YMPYRAN_SADE, YMPYRAN_SADE);
    piste = PiirraYmpyraYlos(this, piste);
    piste = PiirraYmpyraYlos(this, piste);
    piste = PiirraYmpyraYlos(this, piste);
    piste += new Vector(-YMPYRAN_SADE, -YMPYRAN_SADE);
    piste = PiirraYmpyraVasemmalle(this, piste);
    PhysicsObject merkki = new PhysicsObject(5, 5, Shape.Circle);
    Add(merkki, 1);
    merkki.Color = Color.Red;
}

joka piirtää 11 pallosta kuvion:

Mallikuva
Mallikuva
# mutkaukko

Sarja I. Listan muokkaus (4 p)

Ohjeet sarjatehtävien tekoon

Tämä sarja on hieman vaativamman tasoinen. Harjoitellaan lisää listan käsittelyä yhdistelemällä aliohjelmia ja niiden kutsuja.

Tehtävät

Sarjat D. Käyttäjältä kysyminen (1 p)

Ohjeet sarjatehtävien tekoon

...jatkoa aiempaan (Demo 8). Osassa 7 aliohjelma KysySyote paranneltiin sietämään virheellisiä syötteitä ja korjauttamaan ne.

Tehtävät

Sarjat F. Merkit ja kirjaimet (1.5 p)

Ohjeet sarjatehtävien tekoon

...jatkoa aiempaan (Demo 7). Osassa 5 tehtiin aliohjelma Eniten, jonka toteutuksessa hyödynnettiin aliohjelmaa Merkkeja.

Tehtävät

Tehtävä 5*. Viitteiden piirtäminen

Ohjeita piirtämiseen demossa 7.

# listaelaimista

Mikäli haluat (ei ole pakko) kikkailla sijaintien kanssa, voit käyttää komentoja tyyliin:

gn $3 tsx: -20
gn $2 tsx: 70
# viitteetkuvad9t8a
# viitteetkuvad9t8b
# viitteetkuvad9t8c

B1. Vähennyslasku merkkijonossa

Lue ensin: 17. Merkkijonojen pilkkominen ja muokkaaminen.

Meillä on merkkijonoista koostuva lista, jonka jokaisessa alkiossa on tieto sekä henkilön nimestä että heidän omistamista rahoistaan, tyyliin:

"Riitta 45", "Antti 194", "Leevi 4"...

Tehtävänäsi on tehdä funktio Maksu, joka vähentää henkilön omistamia rahoja halutun verran. Funktion pitää lisäksi toimia niin, että voidaan tarkemmin spesifioida henkilö, jonka rahoja vähennetään tai jos tarkennus jätetään tekemättä, kaikkien rahoja vähennetään.

Ohjelman tulee siis toimia seuraavasti:

List<string> henkilot = new List<string>() { "Riitta 45", "Antti 194", "Leevi 4" };
Console.WriteLine(string.Join(", ", henkilot));
        // Tulostaa "Riitta 45, Antti 194, Leevi 4"
        
Maksu(henkilot, 13, 1);
Console.WriteLine(string.Join(", ", henkilot));
        // Tulostaa "Riitta 45, Antti 181, Leevi 4"
        
Maksu(henkilot, 9);
Console.WriteLine(string.Join(", ", henkilot));
        // Tulostaa "Riitta 36, Antti 172, Leevi -5"


Vinkki! Kannattaa ehkä hyödyntää joko kuormittamista tai valinnaisia parametreja.

Tee funktion Maksu toteutus vielä kahdella eri tavalla (kohdat a ja b).

a) Substring

Funktion Maksu toteutuksessa on käytettävä string -luokan ohjelmaa .Substring, muttei saa käyttää ohjelmaa .Split.

# vahennys1

b) Split

Nyt vuorostaan toisin päin. Funktion Maksu toteutuksessa on käytettävä string -luokan ohjelmaa .Split, muttei saa käyttää ohjelmaa .Substring.

# vahennys2

B2. Taulukon sotkeminen

Lue ensin: 25.3 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.

# random

B3. Hirsiapuun jakaumalaskuri

Lisää luennolla tehtyyn Hirsiauta.cs ominaisuus että se laskee mitkä ovat yleisimpiä kirjaimia jäljellä olevasta sanajoukosta ja tulostaa ne käyttäjälle avuksi. Pääohjelmaan on jo lisätty sopiva olio, sinun pitää vain toteuttaa vastaava luokka.

# sanat
# Hirsiapu

G1. Arpakuutio

Tee olioluokka Arpakuutio, jolla on attribuuttina int arvo. Tee niin, että arpakuutiota voi heittää ja sen attribuutti muuttaa heiton perusteella arvoa satunnaisesti välillä [1, 6]. Arvoa voidaan myös kysyä "getterillä".

Anna luokalle seuraava pääohjelmaksi ja laita se toimimaan edellisen ohjeistuksen mukaisesti:

    public static void Main()
    {
        Arpakuutio noppa = new Arpakuutio();

        for (int i = 0; i < 10; i++)
        {
            noppa.Heita();
            Console.WriteLine($"Heitit {noppa.GetArvo()}.");
        }
    }
# arpakuutio

G2. Pyrstötähdet VII

Ota demojen 8 mallivastaus tehtävään Pyrstötähdet VI ja aja se ensin sellaisenaan.

Muuta ohjelmaa niin, että peliin piiretään myös 10 kpl meteoreja, jotka ovat muuten samanlaisia kuin tähdet, mutta niiden kuvana on meteori (meteori.png) ja niihin törmäämisestä menettää yhden pisteen.

Tee meteorista oma olioluokkansa Meteori, joka perii PhysicsObjectin ja hoitaa sekä ominaisuuksiensa määrittelemisen että itsensä piirtämisen. Toisin sanottuna aliohjelmaa PiirraMeteori ei tarvita, vaan voidaan kutsua suoraan pääohjelmasta Begin tyyliin Meteori.Piirra.

Kokeile että toimii.

Meteori
Meteori
Esimerkkikuva pelistä
Esimerkkikuva pelistä


Pelissä käytetyt kuvat:

# pyrstotahdet

H1. Harjoitustyöhön joku viikon luentoihin liittyvä ominaisuus

Tehtävä H1 on vaihtoehto varsinaisille tehtäville, josta voi merkitä itselleen 1-2 p sen mukaan miten sen "vaikeus" suhteutuu muihin tehtäviin.

Lisää harjoitustyöhösi (se voi olla aluksi hyvinkin tyhjä "lumiukkopohja" jokin kurssiviikon aiheeseen liittyvä ominaisuus. Kommentoi koodiin selvästi missä "viikon" ominaisuutta on käytetty. Tällä viikolla esimerkiksi silmukat, taulukot ja 2-ulotteiset taulukot.

Jos harjoitustyöhön ei ominaisuutta saa lisättyä, voit tehdä myös pienen muun ohjelman, jossa harjoittelet ko. ominaisuuksia mikäli varsinaisista tehtävistä ei mieleistä vastaavaa harjoittelua löydy.

# harj1

Mikäli teit toisenkin lisäyksen harjoitustyöhön, laita muutos seuraavaan laatikkoon.

# harj2

PP

PP1

Tee ohjelma, jossa a) arvot kokonaislukuja listaan ja b) etsit halutun luvun esiintymien lukumäärän listassa. Aloita tekemällä aliohjelma, joka ottaa vastaan listan ja lisää siihen halutun määrän satunnaisia kokonaislukuja. Tämän jälkeen tee toinen aliohjelma, jonne viet parametreina käytettävän listan ja etsittävän alkion. Aliohjelma etsii (ja laskee), kuinka monta kertaa etsittävä alkio esiintyy listassa. Aliohjelma palauttaa löydettyjen alkioiden lukumäärän.

Vinkki! 23. Dynaamiset tietorakenteet.

# pp1

PP2-3

Lue vielä kerran monisteen luku 9. Aliohjelman paluuarvo. Katso siellä oleva video keskiarvon laskemisesta. Tee kaikki siellä olevat tehtävät ja katso videot mallivastauksista ja mieti mitä et osannut, korjaa ja mieti joko osaat. Kirjoita alle vaikeutesi ja oppimisesi.

# pp23

Omaa tuotantoa

Näihin tehtäviin voit palauttaa jonkin oman kurssin tämän hetken oppimistavoitteita vastaavia tehtäviä. Ei kuitenkaan enää jos vastaavat tehtävät on tehty edellä olevissa tehtävissä.

Nämä on tarkoitettu lähinnä niille, joilla ei ole mahdollisuutta tehdä varsinaisia tehtäviä ajallaan esimerkiksi kertausharjoitusten tai sairauden takia. Yleensä jos tulee ajoissa ennakoitavia esteitä, pitäisi tehdä perustehtäviä tehdä etukäteen.

Nämä arvostellaan manuaalisesti ja opiskelijan pitää ottaa yhteyttä kurssin opettajiin kun toivoo näitä arvosteltavan. Jos tehtävä on liian lähellä mallivastauksia, ei sitä arvostella tai voidaan pyytää muuttamaan vastaustaan erilaiseksi. Samoin jos tehtävä ei liity viikon oppimistavoitteisiin (vertaa esim tähtitehtävät). Luonnollisesti nuo kaksi ohjelmaa eivät saa olla samanlaisia. Laita ohjelman kommentteihin mitä perustehtäviä nämä korvaisivat ja mikä olisi oma peruste millekin pistemäärälle (se voi olla enemmänkin kuin 1p/tehtävä).

# oma1
# oma2

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