Sinun UserID: 0
Ilmoittaudu missä ryhmässä (live/zoom/video) katsot demojen vastaukset (huom joka viikolla oma ilmoittautuminen)
Please
to interact with this component. Please
to interact with this component. Please
to interact with this component. Please
to interact with this component. Please
to interact with this component.
Alla demotilanteesi.
- Pisteet eivät päivity tähän automaattisesti, vaan aina pienellä viiveellä.
- Värit: Punainen: Minimit ei täyty. Vihreä: vähintään 5p joista 2p tähtitehtävistä.
Ohjelmointi 1, s 2023 / Demo 8
Jos haluat harjoitella vastaavilla tehtävillä, joihin saat myös mallivastaukset, niin katso:
HUOM! Joka kerta on saatava vähintään 2p tähtitehtävistä! Alle 5p tehneillä on huono ennuste loppukurssissa.
Demot palautetaan viimeistään ma 30.10 klo 11:00 mennessä. Voit palauttaa osan tai kaikki tehtäväsi etukäteenkin ja täydentää vastauksia määräaikaan mennessä. Alla mainitut mallivastaukset näkyvät vasta kun demojen palautustilaisuudet on pidetty.
- huomaa että Answer-linkistä pääset katsomaan muiden vastauksia kun palautusaika on ummessa
- mallivastaukset
- muiden vastaukset
Oppimistavoitteet
Klikkaile ruksit niihin kohtiin jotka olet oppinut. Työkirja-sivulla näet yhteenvedon kaikista demoista.
Demokerran päätteeksi 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 (tai zoom) osallistuminen, oppimateriaalin lukeminen, demotehtävien tekeminen, luentovideon katsominen, demojen palautustilaisuuteen osallistuminen ja niin edelleen. Voit päivittää lukua viikon edetessä, se voi helpottaa arvion tekemistä. Huom! Siis tähän ei laiteta kurssin alusta kaikkia tunteja yhteensä, vaan vain tämän viikon tunnit. Tästä annettava 0.25 näkyy Pisteet-sivun demokerran summassa. Kirjoita pelkkä luku esim tyyliin 13.5
Ajankäyttösi tällä viikolla:
Please
Kun tehtävien vastaukset on julkistettu (esim demopalautuksissa), pitää jokaisen korjata omat vastauksensa niin, että ainakin Tauno ja perustehtävät 1-6 tuottavat vähintään 1p kukin. Eli demon palautuksen jälkeen pitää demosivun näyttää vähintään 7 p.
Siis esim. ennen demo 2 tehtävien aloittamista pitää demoista 1 tulla vähintään mainittu pistemäärä.
Voit saada demopisteitä indeksoimalla luento/demovideoita, ks: Videoiden hakemisto aihepiireittäin 23 Lisää em. videosivulle vähintään 3-linkkiä ja kirjoita alla olevaan laatikkoon, mitkä linkit lisäsit. Joka demokerralle voi merkitä aina vähintään 3:sta linkistä yhden demotehtävän.
Kokeeseen ilmottautuminen
HUOM! Syksyn 2023 ohjeita ei vielä päivitetty! Ilmoittautuminen tulee kuitenkin olemaan TIMissä.
Kysely 1 / Vaikeaa
Mikäli vastaisit jo demossa 6 tai 7 tehtävään Kysely 1, saat tästä pisteitä jos osallistut keskusteluun välikyselyn vastauksista on kerättyn synteesiin tuonne palaute-sivulle. Tarkoitus on että siellä jokainen voi osallistua lisää keskusteltuun ja jos löydettäisiin kipukohtiin jotakin yhteisiä lääkkeitä. Tässä tapauksessa kirjoita alle mitä laitoit keskusteluun.
Mikäli et vielä ole vastannut, vastaa kurssin välikyselyyn. Kopioi kyselystä kohta Analysoi omia vaikeuksiasi tai tarkenna edellisiä alla olevaan laatikkoon. Muista painaa return aina kun rivi tulee täyteen ettei tule yli 65 merkkiä pitkiä rivejä !
Ville 1
Tee Ville-tehtävät: 6.5, 9.7 + kaksi sellaista joita et ole aiemmin ymmärtänyt kunnolla (jos kaikki ymmärretty, ei tätä ylim kahta tarvitse tehdä). Mitä 9.7:ssa on väärin C#:ia ajatellen? Muista: Villen käyttöohje.
Villessä tuli viesti 'Session expired' enkä päässyt kirjautumaan enää uudelleen.
VL: Kokeiles jos tyhjennät selaimen välimuistit.
—Toimii
—Jeliot 1
Mikäli et tehnyt tätä demossa 7 (jos teit, ei saa uudestaan ottaa näitä pisteitä!) saat vielä tehdä tämän. Vajaasta 30:stä tässä (syksy 2021) demossa 7 kokeilleelta on tullut palautetta että oli hyötyä!
Ota itsellesi Jeliot.jar, eli ota tuo ja käynnistä Jeliot.jar ohjeen mukaan,
Kun Jeliot on käynnissä Copy/Paste koodialueelle Kutsuminen.java (vertaa Kutsuminen.cs, jollet ole nähyny kutsunäytelmää, niin katso se samalla kun teet tätä). Nyt sinun on tarkoitus Jeliotilla katsella sama asia parametrin välityksestä, mikä oli kutsunäytelmässä. Kun koodi on koodialueella, paina Compile ja sen jälkeen lähde ajamaan ohjelmaa askel kerrallaan ja mieti ajtuksen kanssa mitä missäkin kohti tapahtuu. Vaikka esimerkkikoodi on Javaa, kaikki tapahtuu täsmälleen samalla tavalla C#:issa. Kerro mitä opit tästä ja/tai kutsunäytelmästä.
TDD1
Listojen luominen testejä varten onnistuu esim. luomalla ensin taulukko ja sen avulla muodostamalla lista:
/// Vector[] t = { new Vector(1,2),new Vector(3,4),
/// new Vector(5,2),new Vector(5,5) };
/// List<Vector> luvut = new List<Vector>(t);
tai
/// List<Vector> luvut = new List<Vector>{
/// new Vector(1,2),new Vector(3,4),
/// new Vector(5,2),new Vector(5,5) };
Pohjatiedostot varsinaisille tehtäville
Pohjatiedostoja ei välttämättä tarvia muuta kuin G-tehtävissä. Ja T3 ja 4 jos haluaa tehdä oikealla AngryLegolla, mutta TIMin pohjilla voi samaa harjoitella rupuisemmalla ulkonäöllä.
Katso pohjatiedostojen ottamisesta Demo7 sivulta
Tauno 1
Katso ensin demojen 8 palautusvideo ja mallivastaus Demo 7:n Tauno-tehtävän käsittelystä. Tee Taunolla tehtävä, joka laskee pisimmän rajan ylittävien arvojen yhtenäisen osajonon pituuden taulukosta. Esimerkiksi taulukossa
7 9 8 3 10 12 11 14 5 8
on kolme yhtenäistä ehdon täyttävää osajonoa (osajono on siis tässä peräkkäisissä paikoissa olevien alkioiden jono)
7 9 8
10 12 11 14
8
joiden kaikkien arvot ylittävät raja-arvon 6. Näistä pisin on 4 pitkä. Oikeasti osajonoja ei tarvitse muodostaa, koska lasketaan vaan niiden pituuksia. Ja niistäkin riittää ylläpitää aina nykyisen ja tähän astisen parhaan pituutta.
Huom! "Simuloi" if lauseita tekemällä itsellesi joku apumuuttuja jota käytät "Taunon-laskukoneella" tyyliin
ifRajanYli = raja - t[i]
ja muuta sitten koodissa nämä oikeiksi if-lauseksi tyyliin
if ( raja < t[i] ) ...
Eli tuo valmis ifRajanYli
ei ole tarkoitettu laskuriksi, vaan muuttujaksi, jonka perusteella arvioidaan onko tutkittava luku rajan ylittävä. Koska Taunossa ei ole if-lauseita, näin saadaan "paikka" niihin kohti, missä vertailua pitää suorittaa. Itse tarvittavia laskureita varten tee uusia muuttujia.
Pitäisikö olla demojen 7 palautusvideo?
VL: entä nyt
—Mikäli haluat tehdä suoraan silmukan, niin tee ensin b-kohdan vastaus ja kopioi se tämän ohjelmakohtaan.
Huom. ennen kuin ajat ohjelman, kopioi koodi Taunosta ja poista tämän jälkeen rivi int raja = 50;
ja lisää loppuun tarvittava return
-rivi.
Eli jos tuohon ei pääse kiinni, niin pelatkaa kaverin kanssa korttipeliä seuraavasti:
Teidän tehtävä on kertoa mikä oli suurin määrä peräkkäisiä herttoja korteista joita saitte.
Kaveri antaa teille kortteja yksi kerrallaan ja kun olette kortin katsoneet, se pitää heittää pois (eli ette muista annettuja kortteja yhtä enempää kerrallaan). Kaveri voi kysyä teiltä milloin tahansa (Taunossa se kun taulukko loppuu) että mikä on pisimmän herttaputken pituus.
Te saatte tehdä muistiinpanoja kirjoittamalla muutaman numeron paperille ja korvaamalla sen tarvittaessa toisella (=sijoitetaan muuttujaan uusi arvo, vinkki: 2 muuttujaa riittää, toki Taunossa tarvitaan vielä silmukkamuuttuja).
Valintakoe 2p
Tehtävä 1*. Karkausvuosi
Jos yhtään vaikeuksia, katso: tehtävä jolla voi harjoitella. Täällä kerrotaan mm. jakojäännöksestä (%
).
M: 13. Ehtolauseet. Tee funktio Karkausvuosi(int vuosi)
, joka palauttaa 'true' jos vuosi on karkausvuosi. Seuraavassa sana vuosisata
tarkoittaa katkaistua kokonaislukua joka tulee kun vuosi jaetaan sadalla. Karkausvuosia ovat neljällä jaolliset vuodet, mutta ei täydet vuosisadat paitsi neljällä jaolliset vuosisadat (esim. 1900 ei ollut karkausvuosi, vaikka se on neljällä jaollinen, sillä 1900 on 19 sadalla jaettuna ja 19 ei ole jaollinen neljällä, mutta 20 on ja siksi 2000 on karkausvuosi).
Mieti kunnon testiohjelma / ComTest-testit.
Tehtävä 2*. Vuodenajat (max 2p)
Jos yhtään vaikeuksia, katso: tehtävä jolla voi harjoitella.
M: 13. Ehtolauseet, 13.8 switch-rakenne, 16. Toistorakenteet, 15. Taulukot. Kirjoita 3 erilaista funktiota Vuodenaika(int kk)
, joka palauttaa merkkijonona sen vuodenajan, joka parametrina vietynä kuukautena on. Yksi käyttää if
-lausetta, toinen switch
-lausetta ja kolmas taulukkoa.
Luentomonisteessa sanotaan "Jokaisessa case-kohdassa sekä default-kohdassa on lauseiden jälkeen oltava lause, jolla hypätään pois switch-lohkosta." Mutta jos laitan esimerkin mukaan break-lauseen, niin Rider sanoo että code unreachable, ja koodi toimii hyvin ilman niitä? Eli pitääkö olla vai ei :)
VL: Pitää, mutta jos esim return
on tuollainen lause. Rakenne:
case 1:
return X;
break;
tuottaa varmasti tuon varoituksen, koska tuohon break
ei koskaan päästä koska jo lähdettiin pois.
Seuraavaan katso idea: M: Arvosana kirjalliseksi, eli tavoite on että rajatarkistusten jälkeen itse ongelma ratkeaa ilman silmukoita ja ehtoja yhdellä lausekkeella.
Tehtävä 3. Refaktorointi
Taas pitkä tehtävä, johon lyhyt vastaus (katso tehtävän luona oleva video). Tarkoitus on opetella muuttamaan toistuvaa koodia paremmaksi.
Aluksi esimerkki:
Aluksi AngryLegossa oli laskurinäyttöjen luominen muodossa:
private readonly IntMeter pisteet = new IntMeter(0);
private readonly IntMeter vihollisia = new IntMeter(0);
private readonly IntMeter tasoNr = new IntMeter(0, 0, 10);
private Label pisteNaytto;
private Label tasoNaytto;
private Label vihollisNaytto;
...
private void LuoPistenaytto()
{
pisteet.MinValue = -500;
pisteNaytto.IntFormatString = "Points: {0:00000}";
pisteNaytto.Position = new Vector(Screen.Right - pisteNaytto.Width/2-20,
Screen.Top - pisteNaytto.Height/2);
pisteNaytto = new Label();
pisteNaytto.BindTo(pisteet);
pisteNaytto.Color = Color.Yellow;
pisteNaytto.BorderColor = Color.Black;
pisteNaytto.PreferredSize = new Vector(150,pisteNaytto.Height);
Add(pisteNaytto);
tasoNaytto = new Label();
tasoNaytto.IntFormatString = "Level: {0:0}";
tasoNaytto.BindTo(tasoNr);
tasoNaytto.Position = new Vector(Screen.Right - pisteNaytto.Width/2-20,
Screen.Top - pisteNaytto.Height / 2 - pisteNaytto.Height);
tasoNaytto.Color = Color.Yellow;
tasoNaytto.BorderColor = Color.Black;
tasoNaytto.PreferredSize = new Vector(150,pisteNaytto.Height);
Add(tasoNaytto);
vihollisNaytto = new Label();
vihollisNaytto.IntFormatString = "Enemy: {0:00}";
vihollisNaytto.BindTo(vihollisia);
vihollisNaytto.Position = new Vector(Screen.Right-pisteNaytto.Width/2-20,
Screen.Top - pisteNaytto.Height / 2 - 2*pisteNaytto.Height);
vihollisNaytto.Color = Color.Yellow;
vihollisNaytto.BorderColor = Color.Black;
vihollisNaytto.PreferredSize = new Vector(150,pisteNaytto.Height);
Add(vihollisNaytto);
}
Tässä on kolme hyvin samanlaista koodinosaa. Tällöin kannattaa katsoa mikä samanlaisista osista on erilaista ja miten voisi aliohjelmalle viedä parametrina erilaiset osat ja tehdä samanlaisesta osasta aliohjelman. Muutosten jälkeen esimerkkikoodi voisi olla (vain pisteNaytto
-oliota tarvitaan luomisen jälkeen):
private readonly IntMeter pisteet = new IntMeter(0);
private readonly IntMeter vihollisia = new IntMeter(0);
private readonly IntMeter tasoNr = new IntMeter(0, 0, 10);
private Label pisteNaytto; // vain pistenäyttöä tarvitaan luonnin jälkeen
...
private void LuoNaytot()
{
pisteet.MinValue = -500;
pisteNaytto = LuoNaytto("Points: {0:00000}",pisteet,0);
LuoNaytto("Level: {0:0}",tasoNr,1);
LuoNaytto("Enemy: {0:00}", vihollisia, 2);
}
private Label LuoNaytto(string format, IntMeter mittari, int n)
{
Label naytto = new Label(format);
naytto.Width = 150;
naytto.SizeMode = TextSizeMode.None; // Nämä olivat ennen muualla
naytto.IntFormatString = format;
naytto.BindTo(mittari);
naytto.Position = new Vector(Screen.Right - naytto.Width / 2 - 20,
Screen.Top - naytto.Height / 2 - n * naytto.Height);
naytto.Color = Color.Yellow;
naytto.BorderColor = Color.Black;
naytto.PreferredSize = new Vector(150, naytto.Height);
Add(naytto);
return naytto;
}
Vastaavasti tuhoavien pallojen (Igor
ja Symbian
) luonnissa on nyt koodi (etsi vastaava koodi AngryLego.cs
:stä):
private PhysicsObject LuoPallo()
{
PhysicsObject pallo = new PhysicsObject(tileWidth, tileWidth,
Shape.Circle);
pallo.Image = pallonKuva; // Igor
Add(pallo);
pallo.Tag = "pallo";
pallo.Destroyed += delegate { Savuta(pallo, false, 1.0); };
pallot.Add(pallo);
AddCollisionHandler<PhysicsObject,SarkyvaRakenne>(pallo, "rakenne", PalloOsuiRakenteeseen);
return pallo;
}
private PhysicsObject LuoPallo2()
{
PhysicsObject pallo = new PhysicsObject(tileWidth * 0.6, tileWidth,
Shape.Circle);
pallo.Image = pallonKuva2; // Symbian
Add(pallo);
pallo.Tag = "pallo2";
pallo.Destroyed += delegate { Liekita(pallo, false, 2.0); };
pallot.Add(pallo);
AddCollisionHandler<PhysicsObject,SarkyvaRakenne>(pallo, "rakenne", Pallo2OsuiRakenteeseen);
return pallo;
}
Näissäkin on paljon yhteistä. Yhteisen osan kaikki tyypit eivät vielä ole tuttuja, mutta tekemällä uusi delegaatti saadaan toisen pallon luonti muotoon:
Missä
/// <summary>
/// Luodaan pallo, joka voi tuhota vihollisia
/// </summary>
/// <param name="tag">käytettävä tunniste</param>
/// <param name="kuva">pallolle tuleva kuva</param>
/// <param name="pudostusaanet">äänet joita soitetaan pallon pudotessa</param>
/// <param name="sx">paljonko x-koko on suhteessa y-kokoon</param>
/// <param name="kerroin">mahdollisen räjähdyksen koon kerroin</param>
/// <param name="tehoste">mitä aliohjelmaa kutsutaan tehosteen tekemiseen</param>
/// <param name="tormays">mikä aliohjelma käsittelee törmäyksen rakenteeseen</param>
/// <returns>luotu pallo</returns>
private PhysicsObject LuoTuhoPallo(string tag, Image kuva, double sx, double kerroin,
Tehoste tehoste, CollisionHandler<PhysicsObject, SarkyvaRakenne> tormays)
{
PhysicsObject pallo = new PhysicsObject(tileWidth * sx, tileWidth,
Shape.Circle);
pallo.Image = kuva;
Add(pallo);
pallo.Tag = tag;
pallo.Destroyed += delegate { tehoste(pallo, false, kerroin); };
pallot.Add(pallo);
AddCollisionHandler<PhysicsObject,SarkyvaRakenne>(pallo, "rakenne", tormays);
return pallo;
}
Kirjoita myös LuoPallo2
-metodi yhdellä rivillä käyttäen mallina tuota LuoPallo
-metodia. Tarkista että ohjelma edelleen toimii samalla tavalla. Eli yläorrella on kaksi Igoria ja yksi Symbian kännykkä ja kun Symbian häviää, se "liekittyy" Symbianin kuvilla. Lisäksi Symbian-kännykkä ei ole neliö orrella ollessaan, vaan laihempi (suorakulmio kuten alunperinkin).
Tehtävä 4. Refaktorointi
Kuten edellisessä tehtävässä, myös rakenteiden luonnissa on toistoa (tässä ei tarvitse mitään delegaatteja tms "hankalaa"):
private PhysicsObject LuoSeina()
{
SarkyvaRakenne seina = new SarkyvaRakenne(tileWidth, tileHeight);
seina.Tag = "rakenne";
seina.Kuvat = tiilenKuvat;
return seina;
}
private PhysicsObject LuoKatto()
{
SarkyvaRakenne katto = new SarkyvaRakenne(tileWidth * 1.5, tileHeight);
katto.Tag = "rakenne";
katto.Kuvat = katonKuvat;
return katto;
}
Tee metodi LuoSarkyvaRakenne
sopivilla parametreilla niin, että saat vaihdettua sekä LuoSeina
että LuoKatto
-metodit yhden rivin metodeiksi.
Tehtävä 5. Taulukko listaksi (helppo)
M: 23.2 Listat Vaihda taulukko listaksi. Tästä oli esimerkki luennon 15 lopussa. Ihan aluksi kokeile että Kuvaaja.cs toimii sellaisenaan. Jos otat mallivastuksen Kuvaaja.cs (alapuolella) etkä omaasi, niin joko
- Kommentoi pois
KoordinaattiAnnettu
-metodin sisäosa
tai
- tai ks. tehtävä 6 miten projektiin otetaan mukaan myös
Taulukot.cs
.
Sitten Kuvaaja.cs
:ssä vaihda
private Vector[] pisteet;
tilalle
private List<Vector> pisteet;
ja tee kaikki muut tarvittavat muutokset, jotta ohjelma toimii täsmälleen kuten aikaisemminkin.
TIM antaa tästä pisteitä vaikka vastaus olisi väärin. Tarkista vastauksesi toimivuus Riderissa tms.
Tehtävä 6. Kuukausien keskilämmöt
M: 23.2 Listat Ota aluksi Rideriin pohjaksi tehtävän 5 vastaus tai sitten demo 7 vastaus Kuvaaja.cs. Muuta koodia siten, että se alkaa tyhjällä koordinaatistolla ja aluksi kysytään käyttäjältä merkkijono, jossa olisi tarkoitus olla vuoden kuukausien keskilämpötiloja. Merkkijonosta pilkotaan demo 7:n vastauksella reaalilukutaulukko.
Tuota varten jompi kumpi seuraavista:
- lisää projektiisi (tallenna samaan projektiin kuin
Kuvaaja.cs
ja sitten lisää projektiinAdd Existing Items
) myös demo7 vastauksen demo7.cs
- kopioi sieltä
ErotaLuvut
-funktio ja muut tarvittavat funktiot omaan ohjelmaasi (silloin poistaDemo7.Taulukot.
alla olevasta esimerkistä).
Sitten piirretään kuva (lisätään palloja kuvaan, metodi LuoPisteet
), siten että lukua vastaavat x-koordinaatit ovat 10,20,30
jne.
Eli jos käyttäjä antaa merkkijonon
-10 -12 5 7 14 18
niin piirretään vastaavasti pallukat paikkoihin
(10,-10)
(20,-12)
(30,5)
(40,7)
(50,14)
(60,18)
pallukoiden värit ovat niin, että yli 12 olevat pisteet ovat punaisella ja alle 0:n olevat pisteet sinisellä. Muut mustalla.
Aluksi muuta alueen rajat:
private const double x1 = -1; private const double x2 = 70; private const double y1 = -15; private const double y2 = 25;
Poista pääohjelmasta:
pisteet = ArvoPisteet(20, x1, y1, x2, y2); LuoPisteet(this, pisteet, pallonKoko);
Lisää pääohjelman (
Begin
) loppuunKysyKoordinaatti();
- Muuta sopivasti metodin
KysyKoordinaatti
kysymystekstiä.
Muuta metodi
KoordinaattiAnnettu
muotoon:private void KoordinaattiAnnettu(InputWindow ikkuna) { string vastaus = ikkuna.InputBox.Text; double x = 10; double[] d = Demo7.Taulukot.ErotaLuvut(vastaus); pisteet = new Vector[d.Length]; // Tämä jos teet taulukko-versiota // pisteet = new List<Vector>(); // tämä jos teet List-versiota foreach (double luku in d) { pisteet.Add(new Vector(x,luku)); x += 10; } LuoPisteet(this, pisteet, 0.3,0.0,12.0); kysymassa = false; }
Varsinaiseksi tehtäväksi jää tehdä tuo aliohjelma
public static void LuoPisteet(PhysicsGame game, ??? pisteet,
double r, double ala,double yla)
jossa ala ja yla ovat rajat sille, mitä piirretään milläkin värillä.
Jos teit muutokset esim. Riderissa siihen versioon, joka käyttää List
-rakennetta, saat siitä virheitä alla olevassa koodissa ja 0 p. Vaihda siinä tapauksessa List
tilalle IList
.
Tehtävä 7*. Viitteiden piirtäminen
Tällainen tehtävä tulee olemaan tentissä yksi 5-6p tehtävä (tentti max 24p). Jokaisessa demossa ennen tenttiä tulee olemaan vastaava piirtotehtävä.
Piirtotehtävissä on tarkoitus muokata kuvaa, niin että se vastaa ohjelman tilannetta pyydettynä ajanhetkenä. Tutustu tarvittaessa alla oleviin ohjeisiin. Luennoilla on jo harjoiteltu piirtämistä (mm luento 11).
Seuraavissa tehtävissä on ensin ohjelmanpätkä ja sen kunkin rivin perässä "rivinumero" (vaihe). Ohjelmanpätkät eivät ole ajettavissa ellei niihin lisää koodia. Ajettavaksi muuttamisesta ei saa lisäpisteitä. Koodin alla olevaan kuvaan on piirretty ohjelman tilanne kesken jonkin vaiheen. Korjaa vaiheet kuvissa vastaamaan mikä on tilanne kunkin rivin suorittamisen jälkeen.
Tehtävässä on manuaalinen arvostelu, mutta voit antaa itsellesi arviopisteet, niin saat arvion pisteiden summastasi.
Kuvat piirretään käyttäen "piirtokieltä" vars.js
. Kieli on tarkoitettu vain tekemään samaa asiaa, mitä tehtäisiin perinteisellä piirto-ohjelmalla. Se ei siis yritäkään matkia mitään ohjelmointikieltä. Anna jokaiselle luodulle oliolle (New
, list
, merkkijono yms) Visual Studion tapaan nimiä $1
, $2
, $3
jne. Rider ei anna olioille nimiä, joten siksi matkitaan Visual Studion tapaa. Jos haluat kuvassa nähdä $-muuttujan nimen, niin laita luonnissa nimi muodossa *$1
. Eli esimerkiksi listaan ei voi sijoittaa alkioita viitemuuttujan kautta, vaan suoraan listalle luodulle "oliolle" $
-muuttujan kautta.
Ref nimi
= luo uuden viitemuuttujan kuvanNew $nro Sisältö
= luo uuden kekomuistissa olevan olion kuvan, jolla on nimenä$nro
ja sisältönä mainittu sisältö. Sisältö voi olla lainausmerkeissä tai ilman lainausmerkkejä.nimi -> $nro
= laitetaan viitemuuttujastanimi
viitenuoli kekoon luotuun olioon nimeltä$nro
List $nro R3
= luo listan kuvan, jossa on viitteitä (Reference) 3 kpl.$1.count = 2
= asettaa listan$1
lukumäärälaskurin arvoksi 2gn $3 tsx: 50
= nimetty grafiikkakomento (Graph Named) joka siirtää kuvassa muuttujan$3
paikkaa 50 pykälää oikealle. Näistä ei tarvitse välittää, niillä vain estetään nuolien meneminen kuvan päälle. Toki saat niitä käyttää jos haluat, mutta se ei vaikuta arvosteluun.code: koodia...
= kommentti joka voi olla ennen kuvanpiirtokoodia kertomaan mitä C# lausetta seuraavat kuvanpiirtokoodit vastaavat
Esimerkkejä käytöstä on alla ja kunkin tehtävän kohdalla. Lopulta tehtävänäsi on muuttaa pohjana olevaa kuvanpiirtokoodia, niin, että kuva vastaa ohjelman "vaihetta". Voit rauhassa kokeilla muutella koodia, yrityskertoja ei ole rajattu, ellei sitä ole erikseen sanottu. Tarvittaessa pyyhi liiat "lauseet" pois pohjakuvasta. Ensin kuitenkin esimerkkejä ja harjoittelua:
Esimerkki:
C#-kielen lausetta
List<StringBuilder> lista = new List<StringBuilder>();
vastaten pitää piirtää viitemuuttuja nimeltä lista
ja luoda listaa vastaava olio kekomuistiin (esimerkiksi nimelle$1
. Sitten lista
muuttujasta pitää vetää nuoli luotuun olioon ($1
).
Jos halutaan luoda kuvaan vaikkapa tilanne
List<string> lista = new List<string>();
lista.Append("Mikki");
pitäisi meidän lisätä kuvaan merkkijonoa kuvaava olio (vaikka nimellä $2
) jonka sisältönä on Mikki
. Sitten listan 1. alkio laitetaan viittamaan tähän ja muistetaan laittaa listan lukumäärä kohdalleen.
Jos nyt olisi seuraavana C#-kielinen lause
lista[0].append("1");
pitäisi meidän muuttaa aikaisemmin koodin riviä 04, jotta tämä saataisiin näkymään kuvassa oikein. Kuvissa ei siis ole tarkoituksenakaan yrittää esittää asioiden ajallista järjestystä, vaan aivan kuten piirto-ohjelmalla tilanne siitä, miltä kuva näyttäisi kun ohjelmaa on suoritettu merkittyyn vaiheeseen asti.
Huomaa siis, että piirtokoodiin tehty muutos näkyy heti kuvassa. Siitä ei mene missään tehtävässä vastauskertoja. Mutta muista painaa kuitenkin lopuksi Tallenna
, jotta saat pisteesi.
Tarkemmin ohjeita vars.js-dokumentissa.
Itse piirtotehtävä
Onko tämä tarkoitus muistaa ulkoa vai tuleeko kokeeseen jonkinlainen kaava?
VL: Piirtotehtävien komennot on käytössä. Soveltaminen pitää osata.
—B1 Konvoluutio käsin (videon katsominen pakollista)
Vaikka tehtävä onkin vapaaehtoinen bonus-tehtävä, on siihen liittyvän videon katsominen pakollista, sillä tulevissa demoissa oletetaan että tiedetään mitä tarkoittaa kuvassa olevat väriarvot
Bittikuvat esitetään taulukkona, jossa on kutakin pikseliä vastaava kirkkaus numeroarvona 0-255. Esimerkiksi 7x7 harmaasävykuva jossa on mustalla pohjalla yksi valkoinen vinoristi:
----------------------------
255 0 0 0 0 0 255
0 255 0 0 0 255 0
0 0 255 0 255 0 0
0 0 0 255 0 0 0
0 0 255 0 255 0 0
0 255 0 0 0 255 0
255 0 0 0 0 0 255
----------------------------
Kuvalle voidaan tehdä konvoluutio-muunnos sillä tavalla, että maskia, esim sumennus:
1 1 1
1 1 1
1 1 1
"liutetaan" jokaisen kuvapikselin kohdalle niin, että maskin keskipiste laitetaan vastaavan kuvapikselin kohdalle.
Kunkin "liutus"askeleen kohdalla otetaan kuvan väriarvo yksitellen jokaisen maskin pisteen kohdalta ja kerrotaan se maskin vastaavan pisteen arvolla ja nämä arvot summataan (eli lasketaan vastinosamatriisien sisätulo) sekä jaetaan maskin arvojen summalla ja laitetaan muunnetun (uuteen matriisin tulevan) kuvan uudeksi pisteeksi.
Esimerkiksi em. matriiseilla uuden kuvan paikassa (1,1) olevan pikselin kohdalta lasketuksi sisätuloksi (ks demo 7) tulisi:
255*1 + 0*1 + 0*1 +
0*1 + 255*1 + 0*1 +
0*1 + 0*1 + 255*1 = 3*255 = 765
Tämä jaetaan vielä maskin arvojen summalla, eli 9, jolloin pisteen väriksi tulisi 765/9 = 85. Jos joudutaan käyttämään taulukon ulkopuolisia arvoja, niin arvona käytetään silloin 0:aa. Tässä tehtävässä jakajana käytetään aina 9. Myös muita tulkintoja on olemassa ja ne riippuvat tapauksesta.
Lisäinfoa katso Demo 9. B1-3. Konvoluutio.
Laske tuloskuvan jokaisen pikselin väriarvo.
Katkaise kukin jakolaskun tulos kokonaisluvuksi ja kirjoita tulos matriisimuotoon vastaavan luvun päälle (eli samaan paikkaan, tilalle) niin, että lukujen paikka pysyy täsmälleen samana (oikealta tasattuina). Matriisiin kirjoitetaan nimenomaan lukuja, ei laskuja! TIM antaa pisteet vain jos on vastausalueessa yksi matriisi, luvut täsmälleen samoissa kohti eikä alussa eikä lopuissa yhtään tyhjiä rivejä.
B2. Ääniä peliin
Muuta AngryLego
-peliä niin, että putoava pää huutaa mennessään ja Symbian soittelee pudotessaan kännykän ääniä. Äänet saavat kuulua pitempäänkin, mutta tekemällä niistä noin 1-2 sekuntia pitkiä, ne eivät soi turhan kauaa. Pohjahakemistossa on valmiita ääniä jos et itse halua tehdä ääniä.
Saat tehdä tehtävän myös harjoitustyöllesi. Laita siinä tapauksessa muutosrivien lisäksi vielä linkki työsi GitLab-osoitteeseen.
Huom! Jos käyttää tapaa jota käytin HangryDogsissa
, niin silloin pitää tällä hetkellä äänet laittaa pienen bugin takia Content/Content
kansioon (kun oikea paikka olisi Content
). Jos äänet lataa etukäteen, niin Content
on oikea paikka.
B3. Koordinaatiston pikkuviivat
Muuta Kuvaaja.cs
:ssä olevaa Axis
-luokkaa niin, että se piirtää 4 pikkuviivaa (=jakaa viiteen osaan) jokaisen isomman välin sekä x-akselilla että y-akselilla.
B4. Moodi
M: 15. Taulukot, 16. Toistorakenteet. Tee funktioaliohjelma Moodi(luvut)
, joka etsii taulukon yleisimmän luvun. Jos eniten esiintyviä on yhtä monta, niin silloin ensimmäisenä näistä näistä löytynyt tulkitaan yleisimmäksi. Ennen ohjelmointia, mieti ensin kuinka itse ratkaisit tämän ongelman (eli mieti algoritmi). Et tarvitse aputaulukkoja välttämättä, vaan tehtävän voi ratkaista muutamalla apumuuttujalla. Moodi on yksi keskiluvuista. Toinen on keskiarvo. Kolmas keskiluvuista on mediaani, eli aineiston keskimmäinen alkio. Tätä ei vielä tarvitse tehdä. Mitä mediaanin laskemiseksi pitäisi ensin tehdä? Katso vaikka Wikipediasta keskiluku.
B5-7. Konvoluutio ohjelmalla
Tee C#-ohjelma, joka laskee mille tahansa harmaasävykuvalle ja maskille konvoluution. Ks. B1. Matriisien testaamisessa voit käyttää hyväksi Demo6:n mallivastauksen Matriisit-luokan Jonoksi-funktioita.
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.
G1-2. Hyppivät viholliset
Muuta AngryLego
-peliä niin, että lego-vauvat hyppivät muutaman pikselin verran levottomina ylös/alas. Vinkki: tee vihollisista oma luokka ja tee sen Update-metodiin tarvittavat muutokset. Tarkista myös, että olion IsUpdated
on true.
Saat tehdä tehtävän myös harjoitustyöllesi. Laita siinä tapauksessa muutosrivien lisäksi vielä linkki työsi svn-osoitteeseen.
PP 1
Korjaa annettu luokka syntaktisesti oikeaksi, niin että ohjelman pystyy taas ajamaan. Seuraa tehtävän ohjeita ja pyri tunnistamaan oikeat osat luokasta, pääohjelmasta ja aliohjelmista. Kirjoita myös dokumentit kaikkiin aliohjelmiin.
PP 2 a
Tee LaskeKaikkienMerkkienMaara
-aliohjelma, joka laskee kaikkien string-taulukossa olevien jonojen pituudet yhteen ja palauttaa sen.
PP 2 b
Jatka edellistä aliohjelmaa siten, että sille annetaan myös etsitty merkki parametrinä.
- Ongelma kannattaa pilkkoa osiin!
- Tee ensiksi aliohjelma LaskeMerkkienMaara(string jono, char etsitty).
- Korvaa aiemmasta aliohjelmasta rivi, jossa kasvatat merkkien summaa, aliohjelmakutsulla LaskeMerkkienMaaraan.
- Sinun ei pitäisi tarvita muuttaa aliohjelmaan kuin summaa kasvattavaa riviä ja annettuja parametrejä!
HUOM! Tehtävässä ei tarvitse laskea samaa merkkiä isona ja pienenä vaan pelkästään annetussa muodossa.
PP 3
Tee tehtävälistan alussa oleva Valintakoe-tehtävä.
Korvaavia tehtäviä jotka ovat ei-pelejä - TÄYDENTYMÄSSÄ
Tehtävät 3-6 vaativat Jypelin käyttöä. Tähän kerätään vaihtoehtoisia tehtäviä, joissa on sama oppimistavoite, mutta voidaan tehdä tekstuaalisena konsolisovelluksena. Tehtävät ovat ensisijaisesti tarkoitettu niille, jotka eivät halua tai eivät voi käyttää Jypeliä.
Tällä kertaa EI SAA tehdä molempia, eli pitää tehdä joko perustehtäviä 3-6 tai näitä E3-E6 tehtäviä.
Tehtävien pisteiden laskentaa etenmissivulle ei ole vielä tarkistettu.
Tehtävä E3. Refaktorointi
Tämä tehtävä korvaa perustehtävän 3. Demopisteet tehtävästä on annettava itse.
Tehtävän koko koodissa on minimaalinen Jypelin leikkiversio, josta saadaan satunnaislukugeneraattori ja Vector-luokka. Tämä on tuttu jo demosta 7.
Rideria varten tehtävän koodin saa joko tiedostosta Pisteet.cs tai alla olevasta laatikosta kun valitsee ensin Näytä koko koodi
ja sitten Copy
. Jos tehtävän ottaa noin, saa sen Pastella takaisin vastaukseksi.
Pääohjelman näet kun valitset Näytä koko koodi
.
Tehtävässä 3 on tarkoitus refaktoroida koodia eli poistaa koodista turhaa toisteisuutta. Tehtävät on kirjattu myös koodin kommentteihin.
Tehtävä 3:
Koodin pohjalla on Demo7:stä tuttu Pisteet. Koodiin on lisätty aliohjelmat TulostaTaulukosta1 ja TulostaTaulukosta2, sekä Mainiin lisätty aliohjelmien kutsut.
Tutki lisättyjä aliohjelmia, ja mieti, millä tavoin voisit yhdistää aliohjelmat niin, että koodista saisi toistoa vähemmäksi.
Kirjoita pohdintojesi pohjalta aliohjelma TulostaTaulukosta, joka tekee halutut asiat. Muokkaa TulostaTaulukosta1 ja TulostaTaulukosta2 niin, että niiden sisältö on yksi rivi.
Tehtävä E4. Refaktorointi
Aiempaa ohjelmaa on nyt muutettu niin, että pisteet ovat nyt piste-olioita, joilla on muitakin tietoja, kuin pelkkä sijaintitieto vektorina. Piste-oliolle on mahdollista antaa tietoina:
- vektori
- väri
- nimi
mutta kaikkia näitä ei tarvitse välttämättä antaa. Olio syntyy myös vajavaisin tiedoin. Oikeastaan muuta oliosta ei tarvitse tässä vaiheessa tietää.
Koodista löytyy aliohjelman LuoHienoPiste ja LuoPunainenPiste. Tehtävässä on tarkoituksena tarkastella noiden aliohjelmien toimintaa ja löytää niistä keskeiset, yhtenäväiset ja toisistaan eroavat piirteet. Tehtävänäsi on laatia aliohjelma LuoPiste, jonka avulla voi luoda hienoja pisteitä ja punaisia pisteitä. Kirjoitettuasi aliohjelman, muuta LuoHienoPiste ja LuoPunainenPiste yhden rivin aliohjelmiksi.
Tehtävässä ei ole automaattitarkistusta. Joudut siis itse antamaan pisteet. Varmista, että ohjelma toimii!
Ohjelman tulostaessa pisteen tietoja, tietojen täytyy tulostua edelleen muodossa:
Pisteen nimi: Punainen pallero | Pisteen väri : punainen | Pisteen vektori (0,0,20,0)
Tehtävä E5. Taulukko listaksi (helppo)
M: 23.2 Listat Vaihda taulukko listaksi. Tästä oli esimerkki luennon 15 lopussa. Eli Pisteet.cs:ssä vaihda
private Vector[] pisteet;
tilalle
private List<Vector> pisteet;
ja tee kaikki muut tarvittavat muutokset, jotta ohjelma toimii täsmälleen kuten aikaisemminkin.
TIM antaa tästä pisteitä vaikka vastaus olisi väärin. Tarkista vastauksesi toimivuus Riderissa tms.
Tehtävä E6. Kuukausien keskilämmöt
M: 23.2 Listat Muuta taas edellisen demokerran Pisteet.cs
:ää siten, että se alkaa tyhjällä listalla ja aluksi kysytään käyttäjältä merkkijono, jossa olisi tarkoitus olla vuoden kuukausien keskilämpötiloja. Merkkijonosta pilkotaan demo 7:n vastauksella reaalilukulista.
Saadut keskilämpötilat tulostetaan konsoliin yhdelle riville. Lukujen väliin on hyvä sijoittaa jokin erotinmerkki, esim. '|'.
Alkuperäisessä tehtävässä 6 piirretään palloja kuvaan siten, että kuvasta saa yhdellä silmäyksellä selvää, millaiselle lukualueelle vuoden kuukausien keskilämpötilat sijoittuvat (muodostavat kuvaajan). Vastaavan kaltaista tilastointia voi tehdä selvittämällä listassa olevista keskilämpötiloista, kuinka monena kuukautena keskilämpötila on esim. 0-5, 6-10, 11-15, 16-20 jne astetta. Laadi sopiva luokittelu, ja tulosta keskilämpötilojen tietoja luokitteluusi pohjautuen.
Esim.
-9 | -8 | -5 | 0 | 8 | 13 | 15 | 16 | 14 | 3 | -5 | -8
Kuukausien keskilämpötila oli -10 - 0 astetta 6 kuukautena
Kuukausien keskilämpötila oli 1-10 astetta 2 kuukautena
Kuukausien keskilämpötila oli 11-20 astetta 4 kuukautena vuodessa
Tässä tehtävässä ei ole automaattitarkistinta. Tee tehtävä Riderilla ja katso, että ohjelma lukee syötteet oikein. TIMissä ajettaessa ohjelman tulee kääntyä ajettaessa. Merkitse itsellesi pisteet omatuntosi mukaan.
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.