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 8
Tehtävät perustuvat luentoihin: 15 ja 16.
OPPIMISTAVOITTEET
Täytä sitä mukaa, kun koet oppineesi uusia asioita. Työkirja-sivulla näet yhteenvedon kaikkien demojen osalta.
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) };
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.
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, eli ota tuo Download Jeliot JAR. Pura .zip jonnekin ja
Windows: käynnistä syntynyt
Jeliot.bat
.Mac: Komentoriviltä:
java -jar /Users/vesal/Downloads/Jeliot3/jeliot.jar
mukaellen sitä, mihin tuo
jeliot.jar
on mennyt. Toimii myös Win ja Linux.
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ä.
Tauno 1
Katso ensin mallivastaus Demo 7:n Tauno 1 -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.
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 (2 p)
Sarja G. Karkausvuosi (3.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: 13. Ehtolauseet ja 7.7.1 Aritmeettiset operaatiot.
Jos yhtään vaikeuksia, aloita: harjoitustehtävällä.
Tässä sarjassa käsitellään karkausvuosia ja tehdään niihin sekä päivämääriin perustuvia ohjelmia.
Karkausvuosia ovat vuosiluvut, jotka ovat jaollisia neljällä. Poikkeuksena ovat kuitenkin täydet vuosisadat. Niistä vain ne lasketaan karkausvuosiksi, joiden alkuosa on jaollinen neljällä seuraavasti:
1900 EI OLE karkausvuosi, sillä 19 ei ole jaollinen 4:llä.
2000 ON karkausvuosi, sillä 20 on jaollinen neljällä (20 / 4 = 5).
Osa 1. Karkausvuosi totuusarvolla
Tee aliohjelma Karkausvuosi(vuosi)
, joka palauttaa totuusarvon siitä, onko tutkittava vuosi karkausvuosi.
Vinkki! Voit käyttää tehtävässä apuna jakojäännöstä (%
).
Osa 2. Karkausvuosi kokonaisluvulla
Riippuen ohjelman tarkoituksesta, joskus totuusarvojen (true
/ false
) sijaan voi olla hyödyllisempää palauttaa kokonaislukuarvoja (0 <
/ < 0
) ilmaisemaan jonkin onnistuminen tai toteutuminen.
Muuta aliohjelma Karkausvuosi(vuosi)
palauttamaan yksi (1
), jos tutkittava vuosi on karkausvuosi; ja nolla (0
), jos ei ole.
Osa 3. Montako päivää kuukaudessa
Lue ensin: 15.5 Moniulotteiset taulukot.
Seuraavaksi voitaisiin yrittää rakentaa ohjelma, joka osaa kertoa tietyn vuoden tietyn kuukauden pituuden. Karkausvuoden olemassaolo tekee kuukauden päivien määrittämisestä kuitenkin haastavaa. Onneksi osassa 2 tehty aliohjelma Karkausvuosi
osaa jo ainakin määrittää, mitkä vuodet ovat karkausvuosia.
Tee funktio PaiviaKuussa(kuukausi, vuosi)
, joka palauttaa tietyn vuoden tietyn kuukauden pituuden päivissä. Hyödynnä tässä osan 2 aliohjelmaa Karkausvuosi
ja seuraavaa matriisia, jonka ensimmäisellä rivillä on tavallinen vuosi, toisella rivillä karkausvuosi ja kussakin sarakkeessa yksittäiset kuukaudet:
int[,] kkPituudet =
{ { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }, // tavallinen
{ 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 } }; // karkaus
Vinkki! Osassa 2 muutettu aliohjelma Karkausvuosi
palauttaa (1
) silloin, kun kyseessä on karkausvuosi ja (0
), silloin kun tavallinen. Pohdi voisiko tuota tietoa käyttää jotenkin hyväkseen yhdistettynä annettuun matriisiin.
Osa 4. Vuoden ja kuukauden kysyminen
Tehdään ohjelmasta vielä sellainen, että se osaa kysyä käyttäjältä tutkittavan vuosiluvun ja kuukauden.
Lisää osan 3 toteutukseen aliohjelmat KysyVuosi
ja KysyKuukausi
, jotka kysyvät ja palauttavat käyttäjän antaman vuoden ja kuukauden kokonaislukuina. Tee lisäksi niin, että ohjelma estää virheellisten kuukausiarvojen (< 0 ja 12 <) sekä nollaa pienempien kuukausiarvojen palauttamisen.
Huom! Pisteytyksen toimimiseksi ohjelman tulee tulostaa TÄSMÄLLISESTI
Anna vuosi >1984
Anna kuukausi >2
Vuoden 1984 kuussa 2 on 29 päivää.
Sarjan G loppu.
Tehtävä 1*. Kuukauden pituudet
Lue ensin: 16. Toistorakenteet.
Jos yhtään vaikeuksia, aloita harjoitustehtävällä.
Kuukausien pituudet vaihtelevat lyhyiden ja pitkien välillä. Tehtävänäsi olisi tehdä ohjelma, joka osaa eritellä lyhyet ja pitkät kuukaudet toisistaan niin, että <= 30
pituiset kuukaudet ovat lyhyitä ja muut pitkiä. Erottelu voidaan tehdä mm. ehtolauseilla, mutta myös taulukoilla.
a) If-lauseella
Lue ensin: 13. Ehtolauseet.
Tee aliohjelma OnkoPitka(kk)
, joka palauttaa totuusarvon siitä, onko tutkittava kuukausi pitkä vai ei. Toteuta käyttäen if
-lausetta.
b) Switch-rakenteella
Lue ensin: 13.8 switch-rakenne.
Toteuta sama, mutta nyt käyttäen switch
-rakennetta.
c) Taulukolla
Lue ensin: 15. Taulukot (erityisesti 15.4 Arvosana kirjalliseksi).
Toteuta sama vielä käyttäen taulukkoa
.
Vinkki! Et tarvitse silmukoita.
Sarja H. Listat (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.2 Listat.
Tässä sarjassa käsitellään dynaamista rakennetta List
ja harjoitellaan sen käyttämistä. Lähdetään liikkeelle kuitenkin tutusta ja turvallisesta taulukosta
.
Osa 1. Kokonaisluvut taulukoksi
Tee aliohjelma Taulukoksi(a, b, c)
, joka muodostaa ja palauttaa taulukon
kolmesta kokonaisluvusta. Tee lisäksi aliohjelma Nollaa(taulukko)
, joka asettaa käsiteltävän taulukon jokaisen alkion arvoksi 0.
Osa 2. Kokonaisluvut listaksi
Lista (List
) toimii monin tavoin samalla tavalla kuin taulukko, mutta eroaa siitä myös merkittävästi.
Tee nyt aliohjelma Listaksi(a, b, c)
, joka vastaavasti muodostaa ja palauttaa kolmesta kokonaisluvusta muodostetun List
-olion. Muokkaa myös aliohjelma Nollaa(lista)
, nollaamaan taulukon sijaan listan alkioiden arvot.
Vinkki! Listan .Count
vastaa taulukon .Length
.
Osa 3. Listaan lisääminen I
Listassa alkiomäärää on mahdollista muuttaa toisin kuin taulukossa, joka on syntymästään asti aina saman kokoinen.
Tee aliohjelma Nollaa
toisella aliohjelmalla Lisaa(lista, luku)
, joka lisää listan loppuun yhden uuden alkion.
Osa 4. Taulukko listaksi
Ei ole järkeä tehdä ohjelmaa, joka osaa tehdä listan juuri kolmesta luvusta. Olisi paljon parempi, että ohjelma osaisi tehdä minkä tahansa kokoisen listan kokonaislukujen määrän mukaan. Tämä onkin mahdollista, kun ohjelmalle annetaan käsiteltäväksi yksittäisten lukujen sijaan lukutaulukko, jossa on haluttu määrä lukuja.
Muuta aliohjelma Listaksi
ottamaan vastaan kolmen luvun sijaan yksi kokonaislukutaulukko.
Osa 5. Listaan lisääminen II
Listan joustavuuden ansiosta sen loppuun voitiin lisätä helposti uusia alkioita Add
-ohjelmalla. Lisäyksiä voidaan kuitenkin tehdä myös muualle kuin loppuun.
Tee aliohjelma LisaaValiin(lista, paikka, luku)
, joka lisää listan tiettyyn paikkaan uuden alkion.
Osa 6. Listalta poistaminen I
Lisäämisen ohessa on hyödyllistä voida myös poistaa alkioita listalta.
Tee aliohjelma Poista(lista, paikka)
, joka poistaa alkion listan tietystä paikasta.
Huom! Komennot Remove
ja RemoveAt
toimivat eri tavoin.
Osa 7. Listalta poistaminen II
Joskus voi myös olla, että halutaan poistaa kaikki saman arvon edustajat listalta.
Tee aliohjelma PoistaKaikki(lista, luku)
, joka poistaa kaikki alkiot, joiden arvona on tietty luku.
Sarjan H loppu.
Sarja C. Lämpötilaseuranta matriisissa (2 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: 15.5 Moniulotteiset taulukot ja 16.6 Sisäkkäiset silmukat.
...jatkoa aiempaan (Demo 6). Osassa 5 tehtiin ohjelma Paivia
, jonka avulla laskettiin mittaushetkien välistä etäisyyttä päivissä.
Lämpöseuranta matriisina:
double[,] lammotKK =
{ { 16.4, 14.3, 15.6, 17.2, 18.3, 16.6, 14.7 }, // iy=0 (viikko 1)
{ 15.2, 13.0, 13.5, 16.7, 12.9, 16.1, 14.8 }, // iy=1 (viikko 2)
{ 13.3, 15.2, 15.0, 12.1, 11.7, 11.1, 15.0 }, // iy=2 (viikko 3)
{ 11.3, 10.1, 11.9, 13.7, 12.0, 10.4, 13.1 } }; // iy=3 (viikko 4)
// ix=0 ix=1 ix=2 ix=3 ix=4 ix=5 ix=6
Osa 6. Matriisin keskiarvot I
Jos lämpötilan muutosta haluttaisiin tarkastella pienemmässä mittakaavassa, voisi olla järkevää selvittää esimerkiksi kuukausien keskilämpötilat.
Tee funktio Keskiarvo
, joka palauttaa matriisin kaikkien alkioiden välisen keskiarvon.
Vinkki! Joudut todennäköisesti käyttämään silmukan sisäistä silmukkaa.
Osa 7. Matriisin keskiarvot II
Päiväkohtainen lämpötilojen seuraaminen voi olla liian ailahtelevaa ja kuukausilämmöt antavat tietoa liian harvoin. Siksi lämpötilaa kannattaa ehkä seurata viikkojen tasolla.
Tee funktio KeskiarvotRiveittain
, joka palauttaa matriisin viikkolämmöt listana.
Vinkki! Kaksiulotteisen matriisin rivien määrän saa komennolla .GetLength(0)
ja sarakkeiden määrän .GetLength(1)
.
Sarjan C loppu.
Sarja D. Käyttäjältä kysyminen (2 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ä.
...jatkoa aiempaan (Demo 7). Osassa 5 aliohjelma KysySyote
muokattiin kysymään käyttäjältä useita sanoja, jotka palautettiin merkkijonotaulukkona Erottele
ohjelman avulla.
Osa 6. Merkkien kysyminen I
Muuta nyt ohjelmaa KysySyote
siten, että se kysyy merkkijonojen sijaan yksittäisiä merkkejä ja palauttaa vastaavasti syötetyistä merkeistä koostuvan merkkitaulukon. Muuta myös aliohjelma Erottele
niin, että se hoitaa nyt syötteen muuttamisen merkkijonotaulukon sijaan merkkitaulukoksi.
Huom! Pisteytyksen toimimiseksi ohjelman tulee tulostaa TÄSMÄLLISESTI
Anna 1. merkki >K
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! Muuttaaksesi syötteen merkkijonon merkiksi, tarvitset ohjelmaa char.Parse(syote)
.
Osa 7. Merkkien kysyminen II
Osan 6 ohjelma osaa kyllä muuttaa ja palauttaa yksittäin syötetyt merkit merkkitaulukoksi. Saatoit kuitenkin jo itse huomata, ettei tuo ohjelma ole vielä täydellinen, vaan kaatuu virheeseen, jos syötteeksi annetaan yhtä merkkiä pidempi jono.
Virhe johtuu siitä, ettei char.Parse()
pysty käsittelemään yhtä merkkiä pidempiä jonoja järkevästi. Ratkaisuna on estää liian pitkien syötteiden pääseminen koodissa ohjelmaan char.Parse()
asti.
Muuta ohjelmaa KysySyote
niin, ettei se hyväksy yhtä merkkiä pidempiä syötteitä, ja sen sijaan informoi käyttäjää virheellisestä syötteestä, pyytäen uutta sen tilalle.
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! Vastaavasti kuin komennolla break
, jolla voitiin keskeyttää koko silmukka; komennolla continue
voidaan keskeyttää silmukan yksittäinen toistokierros ja siirtyä seuraavaan.
Sarja D jatkuu demoissa 9...
Tehtävä 2*. 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ä. Tutusta tarvittaessa alla oleviin ohjeisiin. Luennoilla on jo harjoiteltu piirtämistä (mm luento 11 - viitteet). **
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. 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ä
B1. Erilaiset kirjaimet
Lue ensin: 27. ASCII-koodi.
Demoissa 7 aloitetussa sarjassa F tutkittiin merkkien ja kirjainten eroja. Tässä tehtävässä jatketaan tuon idean työstämistä vielä pidemmälle ASCII-koodien avulla.
a) Kirjaimia
Tee funktio EriKirjaimia
, joka palauttaa lukumäärän siitä, kuinka monta eri kirjainta (ei merkkiä, esim. 'a'
ja 'A'
ovat samoja kirjaimia, mutta eri merkkejä) merkkijonossa on.
Vinkki! Hyödynnä toteutuksessa ASCII-koodeja. Kuten kaikilla merkeillä, myös jokaisella kirjaimella on oma ASCII-koodinsa.
b) Kirjaimia & muita merkkejä
Lue ensin: Tuple.
Tee funktio KirjaimiaJaMerkkeja
, joka palauttaa tiedon sekä eri kirjainten että muiden merkkien (eli ei-kirjainten) lukumäärästä merkkijonossa.
Vinkki! Tarvitset tuple
-muuttujaa palauttaaksesi useamman kuin yhden muuttujan arvon samasta funktiosta.
B2. Ääniä peliin
Ota demojen 7 mallivastaus tehtävään Pyrstötähdet V ja aja se ensin sellaisenaan.
Muuta ohjelmaa sitten niin, että osuma tähteen ei olekaan räjähdyksen aiheuttava "törmäys", vaan ennemminkin jonkin järkevämmän äänitehosteen (voit tehdä myös oman) aiheuttava "keräys". Eli korvaa tuo räjähdys äänitehosteella.
Kokeile että toimii.
Pelissä käytetyt kuvat:
Huom! Muista laittaa ohjelmassa käytetyt äänet ja kuvat Content
-kansioon ja tarkistaa, että sen asetukset Visual Studiossa ovat kunnossa.
B3. Moodi
Lue ensin: 15. Taulukot ja 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.
G1. Pyrstötähdet VI
Ota demojen 7 mallivastaus tehtävään Pyrstötähdet V ja aja se ensin sellaisenaan.
Muuta ohjelmaa niin, että pelissä on mukana myös ruudulla näkyvä ajastin, joka laskee pelin suoritukseen kuluvaa aikaa. Voitto-onnittelujen yhteydessä näytetään pisteiden keräämiseen kulunut aika.
Voitto-onnittelujen jälkeen (esim. 5 sekuntia) peli alkaa alusta, jolloin tähdet piirretään uudelleen satunnaisesti ja pelaaja lähtee jälleen keskeltä liikkeelle. Pisteet ja ajastin nollataan alkamaan myös alusta.
Kokeile että toimii.
Vinkki! Kannattaa tehdä esim. aliohjelma AloitaPeli
, joka sisältää pelin nollaamiseen ja aloittamiseen tarvittavat komennot. Sitä voidaan sitten kutsua pääohjelmasta Begin
ja myöhemmin uudelleen, kun peli halutaan "resetoida".
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 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.
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.