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 5
Tehtävät perustuvat luentoihin: 09 ja 10.
OPPIMISTAVOITTEET
Täytä sitä mukaa, kun koet oppineesi uusia asioita. Työkirja-sivulla näet yhteenvedon kaikkien demojen osalta.
Tehtäviä voi tehdä suoraan TIMissä, mutta niitä kannattaa jo ruveta tekemään Visual Studiossa, jolloin niitä voi debugata samalla ja etsiä mahdollisia virheitä siitä, miksi silmukka tms ei toimi. Kun vastauksia kopioi Visual Studiosta TIMiin, kannattaa olla huolellinen, että kopioi nimenomaan sen osan, mikä TIMiin pitäisi kirjoittaa.
Muista: Jotta konsolisovelluksen tekeminen olisi helpompaa, ota "parempi" template ConsoleMain
Jypelin alta.
Samaan solutioniin kannattaa tehdä useampi demotehtävä. Suositus, olisi että tekee 1. tehtävää varten projektin, jolle antaa kuvaavan nimen (esim JonojenLisaily
ja sen solutionille nimen demo5
). Sitten seuraavaa tehtävää varten klikkaa hiiren oikealla Solution Explorerissa Add/New project
ja näin lisää projektin olemassa olevaan solutioniin. Muista taas antaa projekille kuvaava nimi!
Tehtävien nimeämisestä: Älä anna C#-tiedostoille nimiä, jotka eivät ole kuvaavia! Esimerkiksi tehtG1.cs
on huono sen kannalta, että tarkoitus on opetella käyttämään nimiä, jotka toimisivat oikeassakin ohjelmassa. Pallopeli.cs
on taas paljon parempi (ja muista se luokan nimen suhde tiedoston nimeen).
Huom! Älä käytä C#:in valmiita luokkakirjastojen nimiä omien luokkien niminä! Esim. sarjassa A älä käytä nimeä StringBuilder
omalle luokallesi, projektillesi, solutionillesi tms., sillä se peittää (hides) silloin näkyvistä C#:in oman luokan, ja saat vain virheitä jokaisesta rivistä, jossa lukee StringBuilder
. Varminta on siis nimetä omia "juttuja" aina tässä vaiheessa opettelua suomenkielisillä nimillä, jolloin vältät nimikonfliktit C#:in valmiiden nimien kanssa.
Vinkki! Askella luentomonisteessa silmukka- ja taulukkoesimerkkejä läpi ja seuraa mitä silmukoissa tapahtuu. Nuo esimerkit ovat toistaiseksi hieman huonosti näkyvillä ja ne hyppäävät esiin, kun vie hiiren niiden päälle. Niitä löytää, kun etsii jonoa "Animaatio:".
Monisteen lisäksi kannattaa lukea:
- Aliohjelmien kirjoittaminen
- AliohjelmienKutsuminen.cs - luento 9:än esimerkki StringBuilder:in käytöstä ja asiaa Aliohjelmien kutsumisesta
- 1-ulotteiset taulukot
- Taulukoita.cs - luento 10:n malliohjelma (esimerkki myös lukujen tulostamisesta silmukassa)
Kunkin kerran minimipistemäärä 2 on tehtävä käyttäen *
-merkittyjä tehtäviä. Esim. pelkkä Ville ja Tauno ei riitä minimimäärään. Jos pakolliset tehtävät eivät lähde luonnistumaan, kannattaa käydä pääteohjauksissa tai Pahasti Pihalla -ryhmissä saamassa apua.
Tauno 1
Huomaa, että nyt Tauno on muuttunut. Et voi enää ottaa mitä tahansa taulukon alkiota, vaan sinun pitää ensin luoda indeksimuuttuja (joka tässä tehtävässä sinulle on luotu valmiiksi). Sitten indeksimuuttuja pitää raahata sen taulukon alkion alle, johon sen halutaan "viittaavan" (tehty valmiiksi 1. kerralla). Vain sellaisen taulukon alkion voit raahata jonnekin, jonka alla sinulla on indeksimuuttuja.
Indeksimuuttujan paikkaa voit vaihtaa raahaamalla sen toisen taulukon alkion alapuolella tai kohdentamalla siihen +1 tai -1 operaatioita.
Huom! Jos haluat Taunon sijaan tehdä suoraan silmukoita, niin tee sama silmukkakoodi a) ja b) kohtiin.
Kun olet saanut Taunossa koodin toimimaan, kirjoita alle vastaava koodi silmukalla. Aloittelijalla while
-silmukka on aluksi helpompi. Ja se on helppo sitten muuttaa for
-silmukaksi.
- sisennykset mitä sattuu (koskee n. 80% vastaajista)
- pyydetään silmukka, mutta vastauksessa ei ole silmukkaa
- turhia tyhjiä rivejä
- käytetään < merkin sijaan <= merkkiä
- käytetään vakiota 6 taulukon pituuden tilalla
- ylimääräisiä muuttujia, tarvitaan vain apumuuttuja summaa varten ja toinen silmukkaa varten
- aliohjelma tulostaa, sitä se EI SAA tehdä (koska niin ei ole dokumentoitu)
- aliohjelmassa esitellään taulukko. Sitä EI SAA tehdä koska se tulee parametrina
- yleensä kannattaa käyttää < eikä >-vertailua
- foreach ei ole tähän oikea silmukka (for tai while ok)
- aliohjelma palauttaa jotakin vaikka se on void
- indeksiä kasvatetaan liian monesti
- sijoitetaan indeksiin eikä sen osoittamaan paikkaan
Ville 1
Tee Ville-tehtävät: 4.5, 4.6, 5.1-5.5, 9.1, 9.2, 9.3. Huom! Lue tarkasti kysymykset (montako kertaa, montako tulostetaan). Villen mallissa loppusulkuun } mennään kun silmukka loppuu. Muista Villen käyttöohje.
TDD 1
Jos tarkistat vähintään kahden funktion toiminnan automaattisella testillä (esim ComTest) Visual Studiossa tai vastaavassa, saat merkitä yhden lisäpisteen. Testit eivät saa olla täsmälleen samoja kuin mitkä saa kopioimalla tehtävien TIM-versiosta. Vastauksena kerrot minkä tehtävän ja minkä funktion/funktioiden toiminnan testasit. Voit antaa samalla palautetta ja kehitysehdotuksia Comtestin käytöstä.
Taulukon testaaminen ComTestillä:
/// int[] luvut = {1,3,6};
/// String.Join(" ",luvut) === "1 3 6";
Jos haluat viedä testiin taulukon "luomatta" sitä apumuuttujaan, niin seuraava auttaa:
/// SuurinJaPienin.Pienin(new int[]{1, 2 ,3}) === 1;
Valitettavasti 2-ulotteiselle taulukolle ei ole vastaavaa Join-funktiota, vaan sellaisen joutuu tekemään itse. StringBuilderin arvon testaaminen pitää suorittaa ToString()-metodin avulla.
/// StringBuilder j1 = new StringBuilder("123");
/// Jonoja.LisaaAlkuunJaLoppuun(j1,"XX");
/// j1.ToString() === "XX 123 XX";
Tulostavia tai Jypeliin perustuvia aliohjelmia on turhan vaikea vielä nykytietämyksellä testata ComTestillä. Joten niitä ei vaadita testattavaksi. Tyydytään testaamaan funktio-tyylisiä aliohjelmia. Toki myös sellaisia jotka ovat void, mutta muuttavat taulukko tai StringBuilderiä.
Sarja A. StringBuilder (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: 12.4 Muokattavat merkkijonot: StringBuilder.
Jos yhtään vaikeuksia, aloita: harjoittelutehtävällä.
Sarjassa tutustutaan muuttuvan merkkijonon StringBuilder
toimintaan ja harjoitellaan sen peruskäyttöä.
Osa 1. Jonoon lisääminen I
Tee seuraavaan pääohjelmaan tarvittava aliohjelma:
public static void Main()
{
StringBuilder jono;
jono = new StringBuilder("a");
Console.WriteLine("Jono on nyt: \"" + jono + "\"");
// Tulostaa "a"
LisaaAlkuun(jono, "kiss");
Console.WriteLine("Jono on nyt: \"" + jono + "\"");
// Tulostaa "kissa"
}
Ei tule pisteitä, vaikka laitettu mallivastauksen mukaan?
VL: Onko sulla Osa 1 tekemättä ja tämän vastaus tekemättä. Ks näytä koko koodi.
—Osa 3. Jonossa korvaaminen
Kahdessa ensimmäisessä osassa StringBuilder
-muuttujaan lisättiin tekstiä. Nyt tehtävänäsi on korvata jo olemassa oleva osa StringBuilderin tekstistä. Tarvitset nyt kaksi aliohjelmaa lisää. Yhden tunnistamaan korvattavan alueen ja toisen korvaamaan tuon kyseisen alueen. Tutki koodia tunnistaaksesi nuo tarvitsemasi ohjelmat.
Kopioi edellisen osion vastauksesi pohjaksi. Tee pääohjelmaan Main
tarvittavat aliohjelmat. Pääohjelman näät "näytä koko koodi"
-painikkeesta.
Osa 4. Jonossa siirtäminen
Tässä osassa joudut yhdistelemään ja hyödyntämään jo tekemiäsi ohjelmia uuden ohjelman tekemiseksi. Selvitä koodista jälleen, millainen ohjelma tulisi tehdä.
Kopioi edellisen osion vastauksesi pohjaksi. Tee pääohjelmaan Main
tarvittavat aliohjelmat. Pääohjelman näät "näytä koko koodi" -painikkeesta.
Sarjan A loppu.
Tehtävä 1. Taulukko
Lue ensin: 15.1 Taulukon luominen.
Toisin kuin vaikkapa merkit (char
) tai kokonaisluvut (int
), taulukot ovat viitemuuttujia, minkä vuoksi ne esitellään ja alustetaan hieman erilailla.
Taulukko voidaan C#:ssa luoda useilla eri tavoilla, joista jokaisella on oma tarkoituksensa. Alla on esitetty 6 tapaa luoda kokonaislukutaulukko (int[]
).
a) Taulukon luontilauseet
Pohdi ja arvioi, mitä kullakin esittelyriveistä tapahtuu, mitä luotu taulukko sisältää ja miten luodut taulukot eroavat toisistaan.
b) Viallinen luontilause
Jos yritit ajaa ohjelman, saatoit jo huomata, etteivät kaikki taulukoiden luontilausekkeet olleet kelvollisia. Yksi niistä on viallinen/puutteellinen, minkä vuoksi ohjelma kaatuu kääntövirheeseen (compile error).
Selvitä, mikä luontilausekkeista on viallinen ja perustele oma johtopäätöksesi.
c) Taulukon tulostus
Lue ensin: 15.2 Taulukon alkioon viittaaminen ja 16. Silmukat.
Sinulla on kokonaisluvuista koostuvia taulukoita, kuten
4, 6, 2, 9, 2
Tehtävänäsi on tehdä aliohjelma Tulosta
, joka tulostaa halutun taulukon yhdelle riville. Ohjelman tulee toimia seuraavasti:
int[] luvut = { 4, 6, 2, 9, 2 };
Tulosta(luvut); // Tulostaa "46292"
Huom! Et saa käyttää string
-luokan valmista ohjelmaa .Join
.
d) Taulukon alustus
Tee aliohjelma Alusta
, joka alustaa taulukon arvot siten, että olemassa olevat arvot korvataan järjestysnumerolla, tyyliin:
int[] luvut = { 4, 6, 2, 9, 2 };
Tulosta(luvut); // Tulostaa "46292"
Alusta(luvut);
Tulosta(luvut); // Tulostaa "12345"
Lisää ohjelmaan myös c-kohdassa tekemäsi aliohjelma Tulosta
, jotta se kääntyy ja toimii.
Tehtävä 2*. Aikaisin ja viimeisin II
Lue ensin: 15. Taulukot ja luento 11 kooste.
Jos yhtään vaikeuksia, aloita harjoitustehtävällä.
Kopioi vastauskenttään ensin demojen 4 tehtävässä 5 tekemäsi funktiot Aikaisin
ja Viimeisin
.
Tehtävänäsi on muokata näitä kahta funktiota siten, että ne edelleen palauttavat pienimmän ja suurimman, mutta tällä kertaa n
kokoisen taulukon alkioiden arvoista.
Niiden tulee nyt siis ottaa vastaan merkkitaulukko (char[]
) yksittäisten merkkien (char
) sijaan.
Tehtävässä on a-d kohdat, joissa em. on tarkoitus toteuttaa 4 eri tavalla.
a) Tyhmästi
Aluksi tehdään tyhmästi ja osoitetaan samalla, miten EI KANNATA tehdä. Tämä tapahtuu niin, että käyt taulukon alkiot läpi rivi kerrallaan samaan tapaan kuin demojen 4 tehtävässä yksittäiset merkit käytiin.
Ideana siis oikeastaan vain vaihtaa toteutus toimimaan niin, että parametrina on taulukko, tyyliin:
a => merkit[0]
b => merkit[1]
...
Pahoittelut ettö häiritsen tämänkin kanssa. En oikein pääse tässä alkuun kun kaikki näkemäni esimerkit taulukko tehtävistä on int tyyppisillä muuttujilla, enkä oikein tiedä kuinka char käyttäytyy tässä.
Tämän tehtävän kannalta ei ole väliä onko taulukossa olevien alkioiden tyyppi int
vai char
. Vertailut tapahtuvat ihan samalla tavalla olipa sitten kyseessä kumman tyyppinen alkio tahansa. -AJL
Selvä, muutin tämän nyt mielestäni oikeaan muotoon mutta en siltikään saa sitä menemään testeistä läpi.
Voitaisiinko katsoa ohjauksessa? Hankala selittää tässä kommenttikentässä. -AJL
Valitettavasti en pysty tänään osallistumaan ohjaukseen sillä en ole hiljaisella paikalla. Yritän selvitellä tätä ja jos en pääse eteenpäin lainkaan yritän ensiviikolla tulla asiaa selvittelemään.
AJL :
Perusajatus, josta sinun tulisi jatkaa, on tämä (koodisi muuttujien nimiä mukaillen)
char aikaisin = aivanEka;
// kirjoita aivanEka kohdalle miten saat taulukon aivan ensimmäisen alkionif (toka < aikaisin) aikaisin = toka;
// kirjoita toka kohdalle miten saat taulukon toisen alkion- //tähän väliin lisää rivejä
return aikaisin;
b) While -silmukalla
Lue ensin: 16.2 while-silmukka.
Nyt kun on tehty tyhmästi ja hävettää, niin yritetään tehdä sama toistorakenteita käyttäen.
Näiden etuna a-kohdan toteutukseen on ensinnäkin se, että niitä hyödyntäviä ohjelmia on mahdollista käyttää käsittelemään muunkin kokoisia taulukoita kuin esim. nyt vain 3-paikkaisia.
Aloitetaan kenties helpoimmin lähestyttävästä toistorakenteesta: while
-silmukasta.
Yritin ajaa tässä testejä, ja silloin kun vaikuttaa että olisi väärä vastaus tulee herjaus "Runtime exceeded, maybe loop forever".
Mulla ei toistu tuo Runtime ongelma. Tulee ainoastaan virheet epäonnistuneista testeistä. Ainakin loopin sisällä näyttäisi olevan vähän väärää logiikkaa! -JE
Okei, ongelma on sitten varmaan mun koneessa. Ei ehkä jaksa pyörittää niin pitkään. Yritän keksiä kuinka saan tämän toimimaan, ymmärrän miksi tällä ei toimi mutta en vielä ole keksinyt miten saan korjattua virheen.
VL: Sulla ei silmukassa vaihdu noiden tutkittavien indeksi => ei voi toimi yleisesti.
—c) For -silmukalla
Lue ensin: 16.4 for-silmukka.
While
-silmukan jälkeen on melko helppo siirtyä for
-silmukkaan. Pitkälti niiden ero on ulkoasullinen ja ne toimivat useissa tilanteissa samalla tavalla. Toki poikkeustilanteitakin löytyy. For
-silmukka on esitystavaltaan while-silmukkaa kenties hieman siistimpi ja kompaktimpi.
d) Foreach -silmukalla
Lue ensin: 16.5 foreach-silmukka.
For
-silmukka on helppo muuttaa edelleen foreach-silmukaksi. Foreach
-silmukka on ulkoasullisesti kaikista selkein ja sen esitys lyhin, mutta sen käyttökohteet rajoittuneimmat. Toistorakenteen muuttaminen foreach-silmukaksi on hyvä nyrkkisääntö lähes aina, kun se on mahdollista.
En saa oikein tästä foreach:in logiikasta kiinni vaikka luin tuon 16.5 kappaleen. Olisiko mahdollista saada vähän jotain vinkkiä tämän toteutukseen?
—Tehtävä 3*. Osamäärä
Lue ensin: 12.7. String.Format ja luento 11 kooste.
Tehtävänäsi on tehdä aliohjelma, joka tulostaa osamääriä parametreinä välitetyn osoittajan ja nimittäjien määrän perusteella. Lisäksi, jos osamäärän tulos sisältää desimaaleja, tulostetaan niitä maksimissaan 2 kpl.
Esimerkiksi TulostaOsamaarat(10, 3)
tulostaisi osoittajan 10 ja nimittäjien 1-3 väliset osamäärät seuraavasti:
10 / 1 = 10
10 / 2 = 5
10 / 3 = 3.33
Tulostettava voidaan muotoilla käyttämällä joko string
-luokan Format
tai Interpolation
-metodia. Alhaalla on pikaiset esimerkit molemmista allekkain (Format aina ylempi ja Interpolation alempi). Laajemmin tietoa: 12.7. String.Format.
1. Tulostusleveyden muotoilu ja tasaaminen tyhjällä tilalla:
- Ensimmäinen tulostuu itsensä levyisenä (ei koskaan tyhjää tilaa).
- Toinen tulostuu 5 levyisenä (jos jää tyhjää tilaa, tulee ennen).
- Kolmas tulostuu 5 levyisenä (jos jää tyhjää tilaa, tulee jälkeen).
2. Tulostettavien desimaalien määrän ja käyttäytymisen muotoilu:
- Ensimmäinen tulostuu mahdollisimman tarkkana (kaikki desimaalit).
- Toinen tulostuu 3 desimaalilla (jos desimaaleja vähemmän, korvataan 0:lla).
- Kolmas tulostuu maksimissaan 3 desimaalilla, tarpeen mukaan.
3. Edelliset kaksi voidaan yhdistää ja hyödyntää yhtäaikaisesti:
- Ensimmäinen tulostuu itsensä levyisenä ja mahdollisimman tarkkana.
- Toinen tulostuu 10 levyisenä ja mahdollisimman tarkkana.
- Kolmas tulostuu itsensä levyisenä ja maksimissaan 3 desimaalilla.
- Neljäs tulostuu 10 levyisenä ja maksimissaan 3 desimaalilla.
Jos yhtään vaikeuksia, aloita harjoitustehtävällä.
a) While -silmukalla
Lue ensin: 16.2 while-silmukka.
Tee aliohjelma TulostaOsamäärät
, joka tulostaa parametrien mukaiset osamäärät TÄSMÄLLEEN samassa formaatissa kuin ylemmässä esimerkissä.
Toteuta while
-silmukalla ja dokumentoi aliohjelma.
Hei, olisiko mahdollista saada tämä tehtävä auki. Sain sen melkein oikein, en vaan hoksannut että ensimmäisen parametrin tulisi olla eri kun toisen. Nyt ymmärrän että tuota toista muuttujaa käytetään siksi kun kyseessä on decimaaliluku
—b) Do-while -silmukalla
Lue ensin: 16.3 do-while-silmukka.
Toteuta nyt sama do-while
-silmukalla ja dokumentoi aliohjelma.
c) Silmukoiden erot
Kun jakojen määrä on 0 kpl, miten while
- ja do-while
-silmukoiden käyttäytyminen eroaa? Pohdi myös miksi näin on.
Tehtävä 4. Rajan alittavat/ylittävät I
Lue ensin: 16. Toistorakenteet.
Jos yhtään vaikeuksia, aloita harjoitustehtävästä.
a) Taulukon tulostus
Tee aliohjelma TulostaAli(taulukko, raja)
, joka tulostaa yhdelle riville taulukon kaikkien alkioiden arvot, jotka alittavat annetun rajan. Dokumentoi aliohjelma.
public static void Main()
{
int[] luvut = { 12, 3, 5, 9, 7, 1, 4, 9 };
TulostaAli(luvut, 5);
// Tulostaa "3 1 4 "
}
b) Taulukon keskiarvo
Tee funktio KeskiarvoYli(taulukko, raja)
, joka palauttaa kaikkien rajan ylittävien taulukon alkioiden arvojen välisen keskiarvon. Dokumentoi funktio.
public static void Main()
{
int[] luvut = { 12, 3, 5, 9, 7, 1, 4, 9 };
double keskiarvo = KeskiarvoYli(luvut, 8);
Console.WriteLine($"{keskiarvo:0.##}");
// Tulostaa "10"
}
Tehtävä 5. Rajan alittavat/ylittävät II
Lue ensin: 15. Taulukot, 16. Toistorakenteet ja 27. ASCII-koodi.
Demojen 4 tehtävä 5 opetti, että lukuarvojen lisäksi myös char
tyyppisiä muuttujia voidaan vertailla operaattoreilla, kuten <
, >
ja =
. Tämä selittyi sillä, että jokaiselle merkeistä on määritetty oma ASCII-koodiarvo, joka on kokonaisluku ja siis mahdollista asettaa suuruusjärjestykseen.
Vastaavasti kuin 4a-b tehtävässä kokonaislukujen kohdalla, tehtävänäsi on nyt "karsia" merkkejä perustuen niiden ASCII-koodiarvoihin ja siten selvittää, mitä alla esitettyyn salakirjoitukseen on piilotettu.
#{7åunT%mû&(a8Is8A¤K%.n¤7lSC&îrB.êaQmj&%u¤§G%0£åHlzG5*{#RJ(56F
OapkÄ=?½6G@*P$2Aj0=k}3hâo1{/k}7Dl#)3!ûF|+1ôP|<%}u-mlM6/a>#2säHô
a) Salakirjoitus I
Tee aliohjelma KarsiMerkit
, joka ottaa vastaan kolme parametriä: tutkittavan tekstin
, ASCII-koodin alarajan
ja ASCII-koodin ylärajan
. Ohjelma käy tutkittavan merkkijonon läpi sen alusta loppuun ja muodostaa sekä palauttaa uuden merkkijonon niistä merkeistä, jotka sijoittuvat ala- ja ylärajojen väliin, karsien muut merkit pois.
Joudut myös itse selvittämään mitkä ala- ja ylärajojen ASCII-arvot ovat ja sitten täydentämään pääohjelman niillä. Tiedät, että alarajan arvoa vastaava merkki on 'R'
ja ylärajan 'h'
.
Huom! Testit löytyy valmiiksi, ei tarvitse tehdä itse.
b) Salakirjoitus II
Salakirjoitukseen on piilotettu toinenkin sana. Sen selvittämiseksi salakirjoitus on kuitenkin käytävä läpi takaperin. Tee aliohjelma KarsiMerkitTakaperin
, joka ottaa edelleen vastaan kolme parametriä, mutta kokonaisluvut (int
) alaraja
ja yläraja
on korvattu merkeillä (char
) aikaisin
ja viimeisin
.
Nyt onkin tehtävä toisin päin ja selvitettävä, mitkä ovat nuo merkit aikaisin
ja viimeisin
, ja täydentämään pääohjelman niillä. Tiedät, että aikaisinta merkkiä vastaava ASCII-koodi on 111
ja viimeisintä 117
.
Huom! Testit löytyy valmiiksi, ei tarvitse tehdä itse.
Tehtävä 6. Sopulit
Olkoon meillä 4 x 4 matriisi (siis 2-ulotteinen taulukko):
[ 0 0 0 1 ]
[ 0 1 1 0 ]
[ 1 0 1 0 ]
[ 0 1 0 1 ]
Ykköset kuvaavat tässä "sopuleita", ja nollat ovat tyhjiä paikkoja.
Lisäksi olkoon seuraavanlainen algoritmi:
1) Kun ruudussa on sopuli (eli alkion arvo on 1)
* Jos sillä on naapureita (ykkösiä) yksi tai
nolla kappaletta, se kuolee yksinäisyyteen
(muuttuu nollaksi).
* Jos sillä on neljä tai enemmän naapureita,
se kuolee ylikansoitukseen (muuttuu nollaksi).
* Sellainen, jolla on täsmälleen kaksi tai kolme
naapuria, selviää hengissä.
2) Kun ruutu on tyhjä (eli arvo on 0)
* Jos on täsmälleen kolme naapuria, ruutu "herää
eloon" (muuttuu ykköseksi).
Tee yllä olevalle matriisille kolme seuraavaa "generaatiota", eli käy jokainen alkio läpi yllä annettua algoritmia käyttäen alusta loppuun kolme kertaa. Naapureita ovat sekä pysty-, vaaka- että "vinot" naapurit.
Tee tehtävä kahdella eri tavalla:
1. Uusi generaatio aina uuteen taulukkoon:
- Teet uuden tyhjän taulukon ja siihen vastinpaikkaan kuuluvan alkion arvon katsot edellisestä taulukosta em. säännöillä.
2. Kaikki generaatiot yhdessä taulukossa.
- Teet muutokset "lähtötaulukossa" vasemmalta oikealle, ylhäältä alas. Kun olet mennyt taulukon läpi, otat siitä "kuvan" (eli kopioit vaiheen tilanteen) ja jatkat sitten samalla taulukolla uudestaan vasemmasta yläkulmasta.
Tuleeko eri tavoilla tehtynä eri tulos? Miksi?
Kopioi alle olevaan laatikkoon alkuperäisen taulukon (sukupolvi) alle kumpaankin eri tapaan kolme uutta samankokoista taulukkoa (sukupolvea). Kirjoita taulukot allekkain. Yhteensä siis 7 taulukkoa.
Tarkista vastauksesi, onko sinulla:
- Ensimmäisen tavan kolmannessa generaatiossa on vain kaksi ykköstä päällekkäin toisiinsa nähden?
- Toisen tavan kolmannessa generaatiossa on vain yksi ykkönen oikeassa alakulmassa?
Tehtävä 7. Merkkien kysyminen silmukassa
Lue ensin: 15. Taulukot ja 16. Toistorakenteet.
Lisää joko tehtävässä 2 tai demojen 4 tehtävässä 5 tekemäsi funktiot Aikaisin
ja Viimeisin
aluksi pääohjelman Main
alle. Muuta sitten itse pääohjelman toteutusta niin, että se kysyy tutkittavia merkkejä silmukassa.
Toisin sanottuna tunnista pääohjelman toistuvat osat ja siirrä ne silmukkaan, poistaen kaiken ylimääräisen toiston.
L1. Liukuhihna
Dokumentissa Liukuhihna on hauska robotti. Vastaa siellä oleviin kysymyksiin. Maksimissaan voit tuolta kerätä 2.5 p. Kirjoita alla olevaan tehtävään miltä liukuhihnatehtävä tuntui ja laita itse tehtävän pisteisiin liukuhihnan tuloksesi. Saat tehdä tähän demoon sen tehtävästä osan jota et jo tehnyt aikaisemmissa, kunhan kumpaankin merkkaamasi (demo2 + demo3 + demo4 + demo5) summa on sama kuin Liukuhihnatehtävän pistemäärä.
Huom!. Pisterajatarkistus ei vättämättä toimi, joten et saa huijata laittamalla liikaa pisteitä!
B1. Keskimmäisin
Jatka tehtävää 2 tekemällä funktio Keskimmaisin
, joka palauttaa 3-kokoisen taulukon keskimmäisimmän merkin. Voit käyttää tässä hyödyksesi tekemiäsi funktioita Aikaisin
ja Viimeisin
.
Tee funktiolle Keskimmaisin
myös ainakin 3 testitä lisää.
B2. Pistelaskuri
Alustus
Kopioi aikaisemman vuoden demojen 4 Pallot -tehtävän pohja johonkin oman koneesi hakemistoon ja avaa demo4.sln Visual Studiolla.
Kokeile että Pallot-projekti toimii.
Tehtävä
Katso Jypelin ohjeista, miten lisätään pistelaskuri ja sille tapahtuma, kun pisteitä tulee tarpeeksi. Lisää pallopeliin laskuri, joka lisääntyy aina, kun saat "metsästettyä" pallon puolen välin yläpuolella. Kun 10 palloa on saatu poksautettua, lisää tähän joku onnittelu.
G1. Pyrstötähdet III
Ota demojen 4 mallivastaus tehtävään Pyrstötähdet II ja aja se ensin sellaisenaan.
Muuta ohjelmaa niin, että piirrettävät tähdet ovat satunnaisen värisiä ja pyörivät paikallaan satunnaisella nopeudella välillä [-1.0, -0.5] tai [0.5, 1.0] (eli osa pyörii myötäpäivään ja osa vastapäivään, kukin eri nopeudella).
Muuta myös ohjattavan pallon luominen omaksi aliohjelmakseen LuoPelaaja
, joka ottaa vastaan parametrin siitä, minkä muotoinen ohjattavasta objektista tulee. Siirrä pelaajan ohjaimien ja törmäyskäsittelijöiden määrittely myös samaan aliohjelmaan.
Kokeile että toimii.
PP
PP tehtävät (Pahasti Pihalla) on tarkoitettu niille, joilla on vaikeuksia aivan perusasioissa.
Tarkoitus on että nämä ovat helpompia ja kertaavia tehtäviä, joiden avulla pakollisen viikottaisen 2 pisteen saaminen on mahdollista. PP tehtävät eivät ole tarkoitettu niille, jotka ovat tehneet säännöllisesti 4 tai enemmän tehtäviä/kerta. Tekemällä kaikki PP-tehtävät voit saada enintään 1 pistettä.
PP 1
Seuraava pääohjelma laskee ihmisen painoindeksin. Tee tarvittavat aliohjelmat, jotta pääohjelma toimii.
public static void Main()
{
Console.WriteLine("Ohjelma laskee painoindeksisi.");
string nimi = KysyNimi();
Console.WriteLine("Hei " + nimi);
Console.Write("Syötä pituutesi (m) muodossa x,xx > ");
double pituus = double.Parse(Console.ReadLine());
Console.Write("Syötä painosi (kg) > ");
double paino = double.Parse(Console.ReadLine());
double indeksi = LaskePainoIndeksi(pituus, paino);
Console.WriteLine("Painoindeksisi on {0:00.00}", indeksi);
}
Vinkkejä painoindeksin laskemiseen voit katsoa luentomonisteesta
PP 2
Kopioi alla oleva ohjelma painamalla ENSIN Näytä koko koodi
-nappulaa ja tämän jälkeen Copy
-Nappulaa. Korvaa sitten konsoliprojektisi .cs
-tiedoston sisältö juuri kopioimallasi sisällöllä. Kun olet tehnyt tehtävän Visual Studiossa, kopioi .cs
-tiedoston sisältö alla olevaan tehtävälaatikkoon.
Tehtävänäsi on kutsua annettuja aliohjelmia oikeassa järjestyksessä sopivilla parametreillä, jotta ohjelma tulostaa "Autot lastattu onnistuneesti!". Kiinnitä huomiota erityisesti aliohjelmien paluuarvoihin sekä siihen, missä kohti kutsut mitäkin aliohjelmaa.
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.