Nuorten koodauskerho 2016 - syksyn 2. kerran tehtävät

Ehtolauseet

Väite voi olla tosi (eli true) tai epätosi (eli false)
Väite voi olla tosi (eli true) tai epätosi (eli false)

Yleistä if-lauseesta

If-ehtolauseen sisällä oleva ohjelmakoodi suoritetaan, jos ehtolauseke on tosi. Esimerkiksi peleissä if-lauseella voitaisiin tarkistaa, onko pelaajalla rahaa yli tietyn määrän verran, jotta ostoksen voisi tehdä.

Yksinkertainen esimerkki if-lauseen käytöstä:

int a = 1;

if (a == 1)
{
    // tämä koodilohko suoritetaan vain jos a on yhtäsuuri kuin yksi
    System.Console.WriteLine("a oli yksi!");
}

Ehtolausekkeena yllä olevassa oli siis a == 1. Yhtäsuuruusmerkkejä täytyy muistaa kirjoittaa kaksi kappaletta peräkkäin, koska yksi merkki tarkoittaisi jonkin arvon sijoittamista muuttujaan (kuten ylemmällä rivillä on juuri tehty).

Jos muuttuja a sisältäisi mitä tahansa muuta kuin luvun 1, niin yllä oleva koodi ei kirjoittaisi ruudulle mitään.

Tässä esimerkissä lausekkeen a == 1 arvo on true eli tosi. Jos muuttuja a ei sisältäisi ykköstä, olisi lausekkeen arvo false eli epätosi.

If-lause siis toimii niin, että jos sulkujen sisällä oleva lauseke on arvoltaan true, niin tehdään aaltosulkujen { } välissä olevat koodirivit.

# kk-ehtolauseet3

Mieti mitkä kohdista 1-4 tulostuvat. Paina sitten Aja ja tarkasta päättelysi oikeellisuus!

Voit kokeilla muuttaa koodia haluamallasi tavalla ja ajaa ohjelmaa uudelleen. Saatko kaikki neljä tekstiä tulostumaan ruudulle?

Ehtolause if ja sen jälkeen tuleva koodilohko

Perusrakenne if-lauseelle on siis seuraava:

if (ehtolause)
{
    tähän tulee koodia;
}

Jos yläpuolella olevassa esimerkissä komennon if (ehtolause) jälkeen jättää lohkoa merkitsevät aaltosulut pois, ainoastaan heti seuraava lause (puolipisteeseen päättyvä) lasketaan if-lohkon sisällöksi.

if (ehtolause)
    koodia;
tämä lause ei enää ole if-lohkon sisällä;

Tässä vielä esimerkki ajettavaksi. Mieti taas ennen ohjelman ajamista, mitä se tekee ja klikkaa vasta sitten Aja.

# kk-ehtolauseet2

Testaa ohjelman toimintaa vaihtamalla muuttujan a alkuarvoa ja ajamalla ohjelma uudelleen. Tulostuvatko kaikki rivit?

Miten korjailisit ohjelmaa?

Ehtolauseiden harjoittelua!

Päättele ennen aja-painikkeen painamista, mitä tekstejä seuraava ohjelma kirjoittaa:

# kkehtolauseet1

Muuta ohjelmaa niin että muuttujaan a ei sijoitetakaan lukua 1, vaan jokin muu luku! Voit kokeilla eri luvuilla ja ajaa ohjelmaa monta kertaa.

Saat aina nollattua koodin alkutilanteeseen klikkaamalla Alusta.

Monimutkaisempia ehtolausekkeita

Lauseke voi totta kai olla monimutkaisempikin kuin vain "onko muuttujan arvo 1".

Tässä listaa C#-kielen eri vertailuoperaattoreista:

vertailuoperaattori C#-kielessä
pienempi kuin <
suurempi kuin >
yhtäsuuri kuin ==
pienempi tai yhtäsuuri kuin <=
suurempi tai yhtäsuuri kuin >=
erisuuri kuin !=

Tutki seuraavan ohjelman ehtolauseita ennen Aja-painikkeen painamista.

# kk-ehtolauseet4

Oliko jokin ehto yllä olevassa ohjelmakoodissa mielestäsi täysin turha? Mikä tai mitkä?

Sormienlaskuharjoitus

Kuvituskuva: sormien laskemista Kirjoita seuraavien kommenttien alle vastaavat ehtolauseet C#-ohjelmointikielellä ja paina sitten Aja. Kokeile vaihtaa aluksi asetetun luvun arvoa niin näet, toimiko vastauksesi varmasti oikein.

# kk-ehtolauseet5
# kk-ehtolauseet6

Muistithan aaltosulut?

if, else if sekä else

Joskus ohjelmassa halutaan tehdä jokin asia silloin, kun ehto on tosi, mutta kaikissa muissa tapauksissa jokin toinen asia.

Yksinkertainen täysi-ikäisyyden tarkastava ohjelma voisi olla seuraavanlainen:

# kk-ehtolauseet-else

Seuraavassa esimerkissä mukaan on lisätty vielä teini-ikäiset nuoretkin omaksi luokittelukseen (13-17-vuotiaat):

# kk-ehtolauseet-else2

Muokkaa yllä olevaa ohjelmaa niin, että mukana on vielä erillisenä ryhmänä eläkeläiset!

Voit olettaa jonkin tietyn iän olevan eläkeiän rajana. Päätä itse, mikä olisi paras eläkkeellä olemisen ikäraja tätä ohjelmaa varten.

Loogiset operaattorit

Jotta ehtolauseita ei tarvitsisi kirjoittaa sisäkkäin, voidaan käyttää loogisia operaattoreita, joilla voi yhdistää monta lauseketta saman if-lauseen ehtolausekkeeksi.

looginen operaattori C#-kielessä
ehdollinen tai (eli OR) ||
ehdollinen ja (eli AND) &&
totuusarvon kääntäminen
päinvastaiseksi
!

Esimerkiksi koodinpätkä:

if (a > 5)
{
    if (a < 10)
    {
        System.Console.WriteLine("a oli yli 5 ja alle 10");
    }
}

...voitaisiin kirjoittaa lyhyemmin näin:

if ((a > 5) && (a < 10))
{
    System.Console.WriteLine("a oli yli 5 ja alle 10");
}

Ylimääräisiä sulkuja ei olisi pakko kirjoittaa merkintöjen a > 5 sekä a < 10 ympärille, mutta se selkeyttää if-lausetta.

Seuraavaan laatikkoon on kopioitu sama koodi kuin mitä ylempänä oli. Muokkaa ohjelmaa sillä tavalla, että yhdistät sisäkkäisiä if-lauseita käyttämällä loogisia operaattoreita kuten &&.

# kk-ehtolauseet7

Silmukat

Silmukka Joskus ohjelmoidessa tulee tarve toistaa jotain toimintoa monta kertaa. Esimerkiksi pelissä saatetaan haluta luoda kymmeniä objekteja kerralla peliin.

C#-kielessä on muutamia erilaisia tapoja tehdä silmukoita, joista yksi on while-silmukka. Silmukoiden toiminta perustuu siihen, että joitain toimintoja suoritetaan monta kertaa peräkkäin kunnes jokin tietty ehto ei enää pidä paikkaansa.

Alla on yritetty tehdä useita palloja, jotka ovat vierekkäin. Koodi toimii ja tekee neljä palloa, mutta sen kirjoittaminen on erittäin työlästä, jos palloja tarvitaankin useita kymmeniä tai vaikka satoja.

# kkpallot

Otetaan avuksi while-silmukka. Sen rakenne on seuraavanlainen:

int i = 0;     // Alustetaan silmukkamuuttuja nimeltään i.
while (i < 8)  // Silmukan ehto on samantyylinen kuin yllä olevissa if-lauseissakin.
{
    // Tähän tulee toistettavat asiat.
    
    i += 1;    // Kasvatetaan i:tä yhdellä.
}

Aluksi alustetaan muuttuja, jota käytetään apuna silmukan kierroksien laskemiseen. Silmukkamuuttujan nimi on yleensä i. Sen jälkeen tulee while rakenne, jonka sulkuihin kirjoitetaan saman tyylinen ehto, kuin mitä aikaisemmin esitetyissä ehtolauseissakin on. Sen jälkeen tulee aaltosulut, joiden välissä olevia rivejä suoritetaan niin kauan, kunnes silmukan ehto ei enää pidä paikkaansa. Yllä olevassa esimerkissä silmukkaa suoritetaan kahdeksan kertaa ja joka kierroksella i:n arvoa kasvatetaan. Ensimmäisellä kierroksella i:n arvo on 0 ja viimeisellä se on 7. Viimeisen kierroksen lopussa i saavuttaa arvon 8, eikä silmukkaa enää suoriteta.

Huom! Jokaisella silmukan kieroksella on tärkeää kasvattaa silmukkamuuttujaa, tai muuten joudutaan ikuiseen silmukaan. Jos teet tällä sivulla olevissa koodilaatikoissa ikuisen silmukan, niin saat virheilmoituksen. Oikeissa ohjelmissa ohjelman suoritus jää jumiin silmukkaan.

Kokeillaan seuraavaksi soveltaa silmukoita usean pallon luomiseen. Alla oleva esimerkki luo kahdeksan palloa, mutta kokeile muokata koodia siten, että se luo 20 palloa. Kokeile myös muuttaa pallojen X-koordinaattia siten, että pallon ovat vierekkäin aivan kiinni toisissaan.

# kkpallot2

For-silmukka

while-silmukan lisäksi C#-kielessä on for-silmukka, joka toimii samalla tavalla, mutta näyttää hieman erilaiselta. Kaikki silmukan hallinnointiin liittyvät asiat ovat siististi samalla rivillä.

while-silmukka muuttuu for-silmukaksi näin:

Muunnos while-silmukasta for-silmukaksi
Muunnos while-silmukasta for-silmukaksi

Voit kokeilla alla olevassa koodilaatikossa for-silmukan toimintaa:

# kkpallot3

Haastetehtävät

1. tehtävä

Vuorokaudenajat: aamu, päivä, ilta, yö
Vuorokaudenajat: aamu, päivä, ilta, yö


Muokkaa alla olevaa ohjelmaa niin, että tarkastelet if-lauseiden avulla mikä arvo muuttujassa tunninNumero on. Riippuen tunnin numerosta ohjelman pitäisi asettaa muuttujan vuorokaudenaika sisältämä merkkijono kyseistä vuorokaudenaikaa vastaavaksi.

Katso myös ohjelmakoodissa olevat kommentit ymmärtääksesi tehtävänannon tarkemmin.

Kun olet mielestäsi saanut oikean vastauksen, paina painiketta Test niin näet automaattisten testien tulokset. Saat virheilmoituksen, jos ohjelmasi ei toimikaan jonkin tietyn tunnin kohdalla niin kuin pitäisi.

Vinkki: Piirrä paperille avuksesi aikajana, johon sijoitat kaikki vuorokauden tunnit! Se helpottaa koodin kirjoittamista.

# kk2-haastetehtava1

2. tehtävä


Tee ohjelma, joka piirtää kaksi riviä palloja. Kummassakin rivissä on kymmennen palloa ja jokaisen pallon välissä on yhden pallon verran tilaa. Kuvassa olevien pallojen halkaisija on 50.

Tehtävästä saa pisteen, jos lopputulos vastaa yllä olevaa kuvaa ja ohjelmassa on ainakin kerran käyttänyt onnistuneesti silmukkaa.

Joudut tehtävässä muuttamaan myös pallojen Y-koordinaattia, jotta saat pallot menemään kahteen riviin. Se onnistuu samaan tyyliin kuin X-koordinaatin muuttaminenkin:

pallo.X = ...
pallo.Y = ...
# kkteht2

Bonustehtävä


Bonustehtävän tekemällä saa yhden extrapisteen. Jos joltain kerralta jää tekemättä tehtäviä, niin bonustehtävillä pystyy korvaamaan niitä. Bonustehtävää saa (ja kannattaa) yrittää tehdä vaikka olisikin tehnyt kaikki muut tehtävät.

Kopioi tehtävän 2 vastaus alla olevaan koodilaatikkoon ja muokkaa se sellaiseksi, että siinä luodaan kymmenen kappaletta kymmenen pallon rivejä, eli yhteensä sata palloa.

Pisteen saamiseksi ohjelman pitää vastata yllä olevaa kuvaa ja tehtävässä pitää käyttää sisäkkäistä silmukkaa, eli tähän tyyliin:

while (...)
{
    while (...)
    {
        ....
    }
}
# kkteht3

Mallivastaukset

# kk2-malli1
Tehtävä 1

Open plugin

# kk2-malli2
Tehtävä 2

Open plugin

# kk2-malli3
Tehtävä 3

Open plugin

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