```

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 6

Tehtävät perustuvat luentoihin: 11 ja 12.

OPPIMISTAVOITTEET

Täytä sitä mukaa, kun koet oppineesi uusia asioita. Työkirja-sivulla näet yhteenvedon kaikkien demojen osalta.

# Oppimistavoitteet

Demoista

Välipalautekysely (1p)

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 tulisi yli 65 merkkiä pitkiä rivejä. Vaihtoehtoisesti paina wrap aina välillä.

Analysoi omia vaikeuksiasi kurssilla alla olevaan laatikkoon ja käy lukemassa/lisäämässä mielipiteitä palaute-sivulla. Suhteuta myös siihen, miten paljon olet käyttänyt kurssilla tarjottuja apuja, mm. pääteohjausta, keskustelukanavia, demojen harjoittelutehtäviä yms.

# kysely

Tauno 1

Tee alla olevat Tauno-tehtävät. Kun saat oikeat tulokset, niin laita Taunon generoima koodi kommentteihin ja korvaa se koodilla, jossa sama asia tehdään silmukassa. Varmista Aja- ja Test-painikkeilla, että koodi edelleen toimii.

# kaannataulukko

Voiko tuollaisella graafisella taunon käyttöliittymällä suoraan tehdä tuohon taunon generoimaan koodiin for silmukkaa? Eli onko tuo mallivastaus mahdollinen toteuttaa tuossa muodossa?

VL: Ei voi. Eikä edes ehtolausetta. Lopetettiin Taunon kehitys tuohon että sillä pääsee alkuun ja näkee millaista koodia ihan perustempuista tulee. Sitten on aika siirtyä itse tuotettavaan koodiin :-)

13 Sep 22 (edited 13 Sep 22)
# vaihdajokatoinen

Huom 1: Tämä on "par 1" tehtävä, eli yksi apumuuttuja riittää kahden indeksimuuttujan lisäksi. Haluamasi muuttujan arvoa voit kasvattaa/vähentää yhdellä, kun raahaat sen päälle "laskupalkissa" olevan +1/-1 laatikon. Voit käyttää olemassa olevaa muuttujaa taulukon indeksinä raahaamalla muuttujan taulukon solun alla olevaan laatikkoon. Mikäli haluat käyttää toista indeksimuuttujaa, tulee sinun raahata toinen muuttuja toisen taulukon solun alle.

Huom 2: Tämän hetken Taunossa on sellainen bugi, että indeksit eivät saa mennä päistä ylitse ja jos menee, se ei näy "kuvassa".

# taunoOppi

Tauno 2*

# v2
# sopulitaulukko

Jos yhtään vaikeuksia, katso: tehtävä jolla voi harjoitella.

Tehtävää ei tehdä oikealla Taunolla mutta periaatteessa samalla idealla. Ongelma: Edellisen kerran "sopuli-pelin" tietyn sopulin naapurit voidaan laskea ehtolauseen sijaan ainoastaan summaamalla kussakin naapuriruudussa olevat luvut yhteen, ja mikäli ruuduissa on vain arvoja 0 tai 1. Tämä tarkoittaa jokaista laskettavaa ruutua kohti 8 naapuriruudun arvojen summaamista. "Matriisin" reunoilla oleville ruuduille ei VIELÄ yritetä laskea naapureiden määrää, koska reunoilla olevin naapuriruutujen määrä vaihtelee. Tehtävässä siis lasketaan naapureiden määrä vain niille ruuduille, joilla on 8 naapuriruutua.

Piirrä itsellesi kuva ruutupaperille tilanteesta, jossa "pelissä" on 6 riviä ja 5 saraketta. Kirjoita ruutuihin sopulimääriä (0 tai 1) ja ruutujen nurkkiin pienellä ruudun osoite tyyliin [1,2] (rivi ensin, sarake sitten). Kertaa itsellesi vielä, miten lasketkaan jonkin ruudun naapurisopuleiden määrän.

  1. Tee alla olevan aliohjelman tehtävä taunomaisesti, eli käyttäen vain vakioindeksejä. Toisin sanoen kopioi n +=... riviä seitsemän kertaa ja muuta paikassa [1,2] olevan sopulin nurkkanaapurin indeksiparin [0,1] tilalle kullakin uudella rivillä vastaavan naapurin paikka. Mene paikat läpi rivi kerrallaan vasemmalta oikealle. Käytännössä siis kirjoita ruudun [1,2] naapureiden osoitteet (8 kpl).
# tauno62
  1. Kopioi edellinen vastaus alle kohtaan Tauno 2.2 ja muuta vastauksesi niin, että vakioiden sijaan käytät hyväksesi aliohjelman parametreinä tuotuja indeksejä iy ja ix siten, että minkä tahansa ei-reunassa olevan ruudun naapurit voidaan laskea. Esimerkiksi tämän tehtävän kohdan 1 vastauksen 1. rivi olisi n += sukupolvi[iy-1,ix-1];. HUOM! Älä merkitse pelkkä iy vaan iy+0.
# tauno622
  1. (Vapaaehtoinen). Kohdan 2 vastauksen jälkeen sinulla pitäisi olla 8 riviä, jotka ovat hyvin samankaltaisia, mutta eivät kuitenkaan täysin samanlaisia. Kopioi edellinen vastaus kohtaan Tauno 2.3 ja jatka sen muuttamista alla olevilla ohjeilla. Esittele apumuuttujat int x=-1, y=-1; ja muuta kaikki rivit muotoon n += sukupolvi[iy+y,ix+x]; niin, että ennen riviä muutat indeksejä x ja y siten, että seuraavalla rivillä viitataan samaan paikkaan kuin ennen muuttujien x ja y käyttämistä, eli kuten Tauno 2.2 kohdassa. Muuttamiseen saat käyttää vain lauseita x++, x=-1, y++. Älä kirjoita näitä lauseita hakasulkeiden sisään, vaan omille riveilleen.
# tauno623
  1. (Vapaaehtoinen). Kohdasta 3 pitäisi nyt erottua kaksi sisäkkäistä silmukkaa. Tee kohtaan Tauno 2.4 kohdasta 3 uusi vastaus silmukoita käyttäen (edelleen ei reunassa oleville sopuleille).
# tauno624
# taunoOppi2

Ville 1

Tee Ville-tehtävät: 5.6-5.8, ja 9.4-9.6. Villen käyttöohje.

# villev1

Tehtävä 1. Aliohjelman esittely

# v3

Tehtävänäsi on tehdä pääohjelmaan tarvittavan aliohjelman tai funktion esittely ja tynkä-toteutus eli lyhyin mahdollinen runko tehtävän jokaiseen kohtaan. Itse ohjelmien kuvausta vastaavia toteutuksia ei tarvitse tässä tehtävässä tehdä. Riittää, että ohjelma kääntyy. Parametrit on kuitenkin nimettävä hyvin!


Kun olet tyytyväinen vastaukseesi, paina Aja.

  • Jos tulostuu "ok", tehtävä on suoritettu.
  • Jos tulee virheitä, tehtävää ei ole läpäisty.

Huom! Oikeastakin vastauksesta tulee varoituksia (warning), koska tehtävissä on muuttujia, joista jokaista ei käytetä. Niistä ei tarvitse nyt välittää, vaan riittää, että tulostuu "ok".

Kustakin kohdasta saa 0.2 p.

Tynkiä tehtävään

Tehtävä (10 kohtaa)

Tehtävä 2*. Ehtolauseet

Lue ensin: 13. Ehtolauseet ja Liukulukujen testaaminen.

Jos yhtään vaikeuksia, aloita harjoitustehtävällä.

Aloita tehtävien teko Visual Studiossa kirjoittamalla ComTest-testit, joissa kutsut funktiota sopivilla testattavilla arvoilla. TIM versiossakin testit pitää tästä edespäin kirjoittaa itse.

a) Käänteisluku

Tee funktio, jota voi kutsua muodossa:

double kaanteisluku = Kaanteisluku(luku);

Huom! Luvulla 0 ei ole olemassa käänteislukua. Sen vuoksi funktion tulee 0:n kohdalla palauttaa aina 0.

# kaanteis

b) Jaollisuus

Kirjoita vastaavasti nyt seuraavalle kutsulle funktio:

bool jaollinen = OnkoJaollinen(luku, jakaja);


Vinkki! Jaollisuutta voidaan tutkia operaattorilla %.

# jaollisuus

c) Taulukon arvot

Kirjoita vielä funktio seuraavalle toteutukselle:

int[] luvut = { 1, 2, 3 };
bool ovatko = Positiivisia(luvut);
Console.WriteLine(ovatko);
      // Tulostaa "True"
# ehtosilmukassa

Sarja B*. Keskiluku (2 p)

Ohjeet sarjatehtävien tekoon

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

Olkoon tässä tehtävässä keskiluku se taulukon alkio, joka on lähimpänä taulukon alkioiden välistä keskiarvoa.

Tehtävänäsi on tehdä ohjelma, joka osaa etsiä ja palauttaa minkä tahansa lukutaulukon keskiluvun. Tätä varten tarvitaan useampi hyvin määritelty aliohjelma. Tehtävässä on monta osaa, joissa jokaisesta edetään pala-palalta kohti tuota lopullista päämäärää.

Tehtävät

Tehtävä 3. Lukujen yhtäsuuruus

Lue ensin: 11.3 Liukulukijen testaaminen ja 13. Ehtolauseet.

Monesti tarvitaan tieto siitä, ovatko kaksi arvoa keskenään saman suuruiset vai eivät. Tehtävänäsi on tehdä aliohjelma, joka osaa vastata tuohon kysymyksen niin kokonaislukujen kuin reaalilukujenkin kohdalla.

Reaalilukuja ei voi luotettavasti verrata operaattorilla "==". Tämän vuoksi reaalilukujen yhtäläisyyttä joudutaan arvioimaan raja-arvoilla. Raja-arvon sisällä reaalilukujen voidaan katsoa olevan riittävän lähellä, vastatakseen toinen toistaan. Raja-arvon suuruus on aina tilanneriippuvainen ja valitaan tarpeen mukaan.

Täydennä funktio Erit, joka palauttaa totuusarvon siitä, ovatko vertailtavat kaksi reaalilukua sovellettavan raja-arvon sisällä yhtäläiset. Toisin sanottuna, jos kaksi reaalilukua ovat "riittävän" lähellä toisiaan, palautetaan false, muuten aina true.

a) Kokonaislukujen vertaaminen

Tee funktio YhtaSuuret, joka palauttaa totuusarvon siitä, ovatko vertailtavat kaksi kokonaislukua (int) yhtä suuria keskenään.

# vertaaminen1

b) Reaalilukujen vertaaminen I

Muuta a-kohdassa tekemääsi funktioa YhtaSuuret niin, että se osaa nyt palauttaa totuusarvon kahden reaaliluvun (double) välisestä yhtäsuuruudesta.

# vertaaminen2

c) Miksei toiminut?

Kuten saatoit b-kohdan tulostuksesta huomata, reaalilukujen vertaaminen ei onnistunutkaan samalla tavalla kuin kokonaislukujen. Muuttujien a (6.3) ja c (6.3) arvot olivat ohjelman mukaan eri suuruiset, vaikka oikeastihan ne olivat samat. Miksi näin kävi? Pohdi ja perustele johtopäätöksesi.

# vertaaminen3

d) Reaalilukujen vertaaminen II

Lue ensin: Optional arguments.

Muuta b-kohdan aliohjelmaa YhtäSuuret siten, että se ottaa vastaan kolmannen parametrin ja käyttää sitä raja-arvona reaalilukujen vertaamisessa. Aliohjelman YhtaSuuret tulee nyt palauttaa totuusarvo raja-arvon asettaman vaihteluvälin perusteella.

Tee tuosta raja-arvosta vielä valinnainen parametri (optional parameter/argument), jonka oletusarvo on 0.00001.

# vertaaminen4

Sarja C. Lämpötilaseuranta matriisissa (3 p)

Ohjeet sarjatehtävien tekoon

Lue ensin: 15.5 Moniulotteiset taulukot.

Tässä sarjassa harjoitellaan 2-ulotteisten taulukoiden eli matriisien käyttöä.

Olet kirjannut ulkolämpötilat kuukauden ajalta matriisiin, joka on käytännössä kaksiulotteinen taulukko. Haluaisit myöhemmin hyödyntää kirjaamiesi lämpötilojen tietoja tutkiaksesi, miten lämpötila on muuttunut ajankohdasta toiseen.

Logaamasi lämpötilat matriisissa:

    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, 111.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

Tehtävät

Tehtävä 4. Merkkijonon pätkiminen II

Demojen 4 tehtävässä 6 Merkkijonon pätkiminen I harjoiteltiin merkkijonon käsittelyä ja pilkkomista. Tässä tehtävässä jatkojalostetaan noita taitoja eteenpäin.

Tee tarvittavat aliohjelmat, jotta seuraava pääohjelma toimisi.

public static void Main()
{
    string kokonimi = "Juho Enäkoski";
    string etunimi = PoistaSukunimi(kokonimi);
    string sukunimi = AnnaSukunimi(kokonimi);
    Console.WriteLine($"Etunimesi on siis {etunimi} ja sukunimesi {sukunimi}.");
    
    kokonimi = "Antti Jussi Lakanen";
    etunimi = PoistaSukunimi(kokonimi);
    sukunimi = AnnaSukunimi(kokonimi);
    Console.WriteLine($"Etunimesi on siis {etunimi} ja sukunimesi {sukunimi}.");
}


Huom! Muista aina painaa Näytä koko koodi nähdäksesi pääohjelman.

Vinkki! Voidaan toteuttaa valmiiden ohjelmien IndexOf ja Substring TAI Split avulla.

# muokkaus

B1. Kirjaimet isoksi

Lue ensin: 27. ASCII-koodi.

Tee funktio Isoksi, joka palauttaa merkkijonon kaikki kirjaimet isoiksi muutettuina. Nyt kuitenkaan ET SAA KÄYTTÄÄ valmista ohjelmaa .ToUpper, vaan joudut itse tekemään sitä vastaavan toteutuksen.

Vinkki! Kannattaa hyödyntää ASCII-koodeja:

  • Mitkä ovat pienten kirjainten ASCII-koodit?
  • Miten pieni kirjain muutetaan ASCII-koodien avulla isoksi?
# isoksi

G1. Pyrstötähdet IV

Ota demojen 5 mallivastaus tehtävään Pyrstötähdet III ja aja se ensin sellaisenaan.

Muuta ohjelmaa niin, että pelissä on ruudulla näkyvä pistekyltti (Label) ja laskuriin (IntMeter) sidottu pistemäärä. Pisteen ansaitsee jokaisen tähden tuhoamisesta.

Korvaa tähtien satunnaisvärjäys annetulla .png kuvalla tähdestä (tahti.png). Anna myös pelaajalle oma kuva (koira.png).

Kokeile että toimii.

Tähti
Tähti
Koira
Koira
Esimerkkikuva pelistä
Esimerkkikuva pelistä
# pyrstotahdet

G2. Toiston poisto

StringFormat.cs-esimerkissä on paljon copypaste-koodia. Muotoiluesimerkin muuttaminen vaatisi paljon muutoksia koodiin, samoin esimerkkinumeroiden. Tee ohjelma, jossa on yhdessä taulukossa muotoiluesimerkit ja toisessa käytetyt numerot ja sitten itse ohjelman (mahdollisten aliohjelmien kanssa) toteutus perustuu vain näiden kahden taulukon käyttöön. Nyt muotoiluesimerkin muuttaminen on vain yksi muutos yhdessä paikassa. Samoin kuin yhden esimerkkinumeron muuttaminen tai jopa lisääminen.

# toistonpoisto

H1. Harjoitustyöhön jokin viikon luentoihin liittyvä ominaisuus

Jatkossa on aina tehtävä H1, 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.

Pyydetty linkki esim. muodossa:

https://gitlab.jyu.fi/oma_kayttajatunnus/ohj1ht
# harkkaominaisuus

PP 1

PP-tehtävät on kertaavia tehtäviä.

Lue ensin: 16. Toistorakenteet ja Taulukoita.cs.

Tee aliohjelma, joka tulostaa lukujen neliöitä seuraavan esimerkin mukaisesti:

 1 * 1  =   1
 2 * 2  =   4
 3 * 3  =   9
 4 * 4  =  16
 5 * 5  =  25
 6 * 6  =  36
 7 * 7  =  49
 8 * 8  =  64
 9 * 9  =  81
10 * 10 = 100
# neliot

PP 2

Lue ensin: 12.7 Char-luokka ja 16. Toistorakenteet.

Tee aliohjelma, joka tulostaa parametrina annetusta merkkijonotaulukosta vain ne sanat, jotka alkavat isolla alkukirjaimella.

Esimerkiksi taulukosta

["kissa", "Kana", "Koira", "hevonen", "Vuohi"]

Tulostuu vain

Kana 
Koira
Vuohi
# isollaAlkavat

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.