avoin/avoin23
Huom! TÄMÄ ON AVOIMEN YLIOPISTON SIVU.
Et voi suorittaa kurssia, ellet ole ilmoittautunut täällä.
```
Demotilanne:
- Pisteet päivittyvät pienellä viiveellä.
- Värit: Punainen - puutteellinen. Vihreä - hyväksytty (vähintään 6p, joista 2p tähtiä)
Please
Osa-alue |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
12 |
12 |
Luennot | 1&2 | 3&4 | 5&6 | 7&8 | 9&10 | 11&12 | 13&14 | 15&16 | 17&18 | 19&20 | 21&22 | 23&24 | |||
Deadlinet |
HT1 (suu- nnitelma) |
Väli- kysely |
Debug- näyte |
HT2 (50%) |
Tentti- ilmo |
HT3 (100%) |
Tentti | ||||||||
Ohjaus | 1 | 2 | 3 | 4 | 5 | ||||||||||
Demo | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | Summa | d% | |
Pisteet |
Please |
Please |
Please |
Please |
Please |
Please |
Please |
Please |
Please |
Please |
Please |
Please |
Please |
Please |
|
Korjattu |
Please |
Please |
Please |
Please |
Please |
Please |
Please |
Please |
Please |
Please |
Please |
||||
Tunnit |
Please |
Please |
Please |
Please |
Please |
Please |
Please |
Please |
Please |
Please |
Please |
Please |
Please |
Please |
Please |
Please
Ohjelmointi 1, avoin 2023 / 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.
Demo 11 on mallitentti, harjoittele sen tehtäviä milloin ehdit, niin näet mitä vielä pitäisi tsempata. Tenttiin ilmoittaudutaan ruksilla aikaan TIMIssä, kunhan saan sivun valmiiksi. Ilmoitan siitä sitten tarkemmin.
Tauno ja Tehtävä 1 ovat tyypillisiä tenttitehtäviä, joten ne kannattaa vääntää, vaikkeivät ole tähtitehtäviksi merkittykään.
TDD1
Tehtävät, joissa on Test-painike, tulee testata Comtestillä, jotta saa täydet pisteet.
Eli tällä kertaa testit eivät ole bonusta vaan tehtävään kuuluva osa. Piirtotehtäviä (portaat yms) on hankala testata ja sitä ei tehdä tällä kurssilla.
Lue tarvittaessa (eli jos et ole vielä koskaan contenttia lisännyt) ohjeita kuvien ja äänien lisäämisestä: Sisällön tuominen peliin.
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.
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.
Aja-painikkeesta saatavien virheilmoitusten lukeminen:
1 piti: 33.429 -> 0.000 {12,0,42,14,99,12,55} 0 99
1 testiajo nr 1
piti: 33.429 tuloksen piti olla näin paljon
0.000 mutta ohjelma palautti 0
{12,0,42,14,99,12,55} ajossa käytetty taulukko
0 ajossa käytetty alaraja
99 ajossa käytetty yläraja
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.
Vinkki: Jos algoritmi ei ole kristallin kirkas, harjoittele Taunolla ja/tai kynällä ja paperilla.
Tehtävä 2. Numeroita
Tee aliohjelma AnnaNumerot
, joka palauttaa listan merkkijonossa esiintyvistä numeroista.
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.
Jypelissä voi lisätä kaksi vektoria yhteen käyttämällä +
merkkiä. Esimerkiksi
olio.Position = vector1 + new Vector(0,12);
Aliohjelma PiirraLaatikko ottaa laatikon vasemman alareunan koordinaatin ja palauttaa oikean yläreunan koordinaatin. Tästä kannattaa piirtää kuva paperille ja laskea auki, missä kohtaa neliön keskipiste on, kun vasen reuna on punaisen pallon päälle (parametrinä tuleva piste). Kuinka tästä tai alkuperäisestä koordinaatista lasketaan oikea yläkulma? Käytä neliön kokoa ilmaisevaa muuttujaa laskutoimituksissa.
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:
Sarja I. Listan muokkaus (4 p)
- Sarjatehtävät ovat useammasta osasta koostuvia tehtäviä, joissa samaa ohjelmaa työstetään kussakin osassa eteenpäin.
- Seuraavaan osaan pääset aina vasta, kun olet lukinnut antamasi vastauksen.
- Lukitsemisen jälkeen voit edelleen työstää osioon antamaasi vastausta, muttet voi enää saada siitä lisää pisteitä.
- Ei haittaa, vaikket onnistu jokaisessa osassa, sillä saat lukitsemisen jälkeen aina kyseisen osan mallivastauksen, jotta voit edetä tehtävässä.
Lue ensin: 23. Dynaamiset tietorakenteet.
Tämä sarja on hieman vaativamman tasoinen. Harjoitellaan lisää listan
käsittelyä yhdistelemällä aliohjelmia ja niiden kutsuja.
Osa 1*. Listasta sanojen hakeminen merkkillä
Tee aliohjelma EtsiSanat(sanat, kirjain)
, joka palauttaa merkkijonolistasta uutena listana ne jonot, joissa esiintyy tietty kirjain."
mallivastauksen dokumentoinnissa "returns = Listan pisimmän sanan", testaustakaan en aivan ymmärrä?
Mallivastauksessa oli virhe returns
-kohdassa. Korjasin sen. Testeissä testattiin tässä sitä, että täsmäävien merkkijonojen määrä on oikea. Toki voitaisiin testata myös, että tulosjoukosta löytyy täsmälleen tietyt sanat. Lisäsin nyt tällaisenkin testin mallivastaukseen. -AJL
Osa 2*. Listasta sanojen poistaminen merkillä
Muuta aliohjelmaa EtsiSanat
ja nimeä se uudelleen aliohjelmaksi PoistaSanat
siten, että se poistaa listalta kaikki ne merkkijonot, jotka sisältävät tietyn kirjaimen.
Osa 3. Taulukosta sanojen poistaminen merkillä
Listan
dynaaminen koko on yksi sen suurimmista eduista suhteessa taulukkoon
. Uusien alkioiden lisääminen tai poistaminen käyvät vaivattomasti listassa, siinä missä taulukossa nuo operaatiot ovat tuskallisia. Tämän tehtävän tekijät oppivat tuon kantapään kautta.
Muuta tekemäsi aliohjelma PoistaSanat(sanat, kirjain)
toimimaan taulukolla
listan sijaan.
Vinkki! Tarvitset todennäköisesti useamman silmukan (ei-sisäkkäisiä) tässä onnistuaksesi. Joudut myös luomaan uuden taulukon, sillä kuten todettu, jo luodun taulukon kokoa ei voida muuttaa.
Huom! Dynamisen rakenteen puutteen vuoksi, joudut myös palauttamaan tekemäsi uuden taulukon.
Sarjan I loppu.
Sarjat D. Käyttäjältä kysyminen (1 p)
- Sarjatehtävät ovat useammasta osasta koostuvia tehtäviä, joissa samaa ohjelmaa työstetään kussakin osassa eteenpäin.
- Seuraavaan osaan pääset aina vasta, kun olet lukinnut antamasi vastauksen.
- Lukitsemisen jälkeen voit edelleen työstää osioon antamaasi vastausta, muttet voi enää saada siitä lisää pisteitä.
- Ei haittaa, vaikket onnistu jokaisessa osassa, sillä saat lukitsemisen jälkeen aina kyseisen osan mallivastauksen, jotta voit edetä tehtävässä.
Lue ensin: 16.3.1 Kysyminen käyttäjältä ja 23. Dynaamiset tietorakenteet.
...jatkoa aiempaan (Demo 8). Osassa 7 aliohjelma KysySyote
paranneltiin sietämään virheellisiä syötteitä ja korjauttamaan ne.
Osa 8. Vaihto taulukosta listaksi
Yksinkertaistetaan aliohjelmaa KysySyote
muuttamalla sen toteutus hyödyntämään listoja taulukoiden sijaan. Voit käyttää pohjana joko omaa tai mallivastausta sarjan D osasta 7 (demo 8).
Huom! Pisteytyksen toimimiseksi ohjelman tulee tulostaa TÄSMÄLLISESTI
Anna 1. merkki >K
Anna 2. merkki >oira
Virheellinen syöte!
Anna 2. merkki >i
Anna 3. merkki >s
Anna 4. merkki >s
Anna 5. merkki >a
Anna 6. merkki >
Syötteet:
K
i
s
s
a
Vinkki! Kun hyödynnät listaa
, et tarvitse ohjelmaa Erottele
tai edes StringBuilderia
enää ollenkaan. Listaan voidaan vain lisäillä merkkejä, sillä sen rakenne on dynaaminen, toisin kuin taulukon. Kannattaa siis ehkä vain vaihtaa StringBuilder
suoraan Listaksi
.
Sarjan D loppu.
Sarjat F. Merkit ja kirjaimet (1.5 p)
- Sarjatehtävät ovat useammasta osasta koostuvia tehtäviä, joissa samaa ohjelmaa työstetään kussakin osassa eteenpäin.
- Seuraavaan osaan pääset aina vasta, kun olet lukinnut antamasi vastauksen.
- Lukitsemisen jälkeen voit edelleen työstää osioon antamaasi vastausta, muttet voi enää saada siitä lisää pisteitä.
- Ei haittaa, vaikket onnistu jokaisessa osassa, sillä saat lukitsemisen jälkeen aina kyseisen osan mallivastauksen, jotta voit edetä tehtävässä.
Lue ensin: 12.8 Char-luokka, 23. Dynaamiset tietorakenteet ja 27. ASCII-koodi.
...jatkoa aiempaan (Demo 7). Osassa 5 tehtiin aliohjelma Eniten
, jonka toteutuksessa hyödynnettiin aliohjelmaa Merkkeja
.
Osa 6. Vaihto taulukosta listaksi
Muuta aliohjelmat Merkkeja
ja Eniten
toimimaan listoilla taulukoiden sijaan. Voit käyttää pohjana joko omaa tai mallivastausta sarjan F osasta 5 (demo 7).
Osa 7. Kahdesta funktiosta yksi (Tuple)
Lue ensin: Tuple.
Osan 6 pääohjelmassa joudutaan nyt kutsumaan kahta ohjelmaa: ensin ohjelmaa Eniten
ja sitten Merkkeja
. Siisteyden ja joskus muidenkin syiden vuoksi voisi olla mielekkäämpää saada tehtyä tuo yhdellä kutsulla. C#:ssa se on mahdollista käyttämällä tuple
-muuttujaa. Se on tietorakenne, joka koostuu useammasta eri tyyppisestä tietueesta (esim. int
ja string
).
Aliohjelma Eniten
itseasiassa selvittää jo valmiiksi useimmin esiintyvän merkin lisäksi kyseisen merkin esiintymislukumäärän. On siis tosi tyhmää selvittää se kutsumalla aliohjelmaa Merkkeja
, joka vain tekee saman asian heti uudelleen pääohjelmassa.
Muuta aliohjelma Eniten
palauttamaan tieto sekä useimmin esiintyvästä merkistä että sen esiintymismäärästä.
Vinkki! Joudut toteutuksen lisäksi muuttamaan aliohjelman palautustyypin tupleksi.
Sarjan F loppu.
Tehtävä 5*. Viitteiden piirtäminen
Ohjeita piirtämiseen demossa 7.
Mikäli haluat (ei ole pakko) kikkailla sijaintien kanssa, voit käyttää komentoja tyyliin:
gn $3 tsx: -20
gn $2 tsx: 70
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
.
b) Split
Nyt vuorostaan toisin päin. Funktion Maksu
toteutuksessa on käytettävä string
-luokan ohjelmaa .Split
, muttei saa käyttää ohjelmaa .Substring
.
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.
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.
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()}.");
}
}
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.
Pelissä käytetyt kuvat:
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.
Mikäli teit toisenkin lisäyksen harjoitustyöhön, laita muutos seuraavaan laatikkoon.
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.
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.
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ä).
These are the current permissions for this document; please modify if needed. You can always modify these permissions from the manage page.