```

Demotilanne:

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

Error in expanding macros: 'luentoaiheet' is undefined

# fields

Ohjelmointi 1, k 2024 / Demo 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.

# Oppimistavoitteet

Demoista

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.

# Plugin1

Huom! Jos haluat Taunon sijaan tehdä suoraan silmukoita, niin tee sama silmukkakoodi a) ja b) kohtiin.

# lisaaTaulukkoonJuokseva

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.

# lisaaTaulukkoonJuoksevaSilmukka

Yleisiä virheitä, katso onko sinulla

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.

# villev1

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ä.

# tdd

Sarja A. StringBuilder (2 p)

Ohjeet sarjatehtävien tekoon

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

Sarjassa tutustutaan muuttuvan merkkijonon StringBuilder toimintaan ja harjoitellaan sen peruskäyttöä.

Tehtävät

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[]).

# taulukot1

a) Taulukon luontilauseet

Pohdi ja arvioi, mitä kullakin esittelyriveistä tapahtuu, mitä luotu taulukko sisältää ja miten luodut taulukot eroavat toisistaan.

# taulukot2

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.

# taulukot3

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.

# taulukot4

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.

# taulukot5

Tehtävä 2*. Aikaisin ja viimeisin II

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]
 ...
# aikaisinViimeisin1

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.

# aikaisinViimeisin2

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.

# aikaisinViimeisin3

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.

# aikaisinViimeisin4

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
Apua tulostuksen muotoiluun

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.

# osamaarat1

b) Do-while -silmukalla

Lue ensin: 16.3 do-while-silmukka.

Toteuta nyt sama do-while-silmukalla ja dokumentoi aliohjelma.

# osamaarat2

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.

# osamaarat3

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 "
  }
# alimenevat

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"
  }
# keski

Tehtävä 5. Rajan alittavat/ylittävät II

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.

# sala1

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.

# sala2
# sopulit

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.

# tehtava6

Tarkista vastauksesi, onko sinulla:

  1. Ensimmäisen tavan kolmannessa generaatiossa on vain kaksi ykköstä päällekkäin toisiinsa nähden?
  2. Toisen tavan kolmannessa generaatiossa on vain yksi ykkönen oikeassa alakulmassa?

Tehtävä 7. Merkkien kysyminen silmukassa

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.

# kysyminensilmukassa2
# liuku

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ä!

# tehtavaL1

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ää.

# lassytysta

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.

# pistelaskuri

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.

Esimerkkikuva pelistä
Esimerkkikuva pelistä
# pyrstotahdet

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

# pp1

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.

# pp2

Omaa tuotantoa

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

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

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

# oma1
# oma2

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