Sinun UserID: 0
Ilmoittaudu missä ryhmässä (live/zoom/video) katsot demojen vastaukset (huom joka viikolla oma ilmoittautuminen)
Please
to interact with this component. Please
to interact with this component. Please
to interact with this component. Please
to interact with this component. Please
to interact with this component.
Alla demotilanteesi.
- Pisteet eivät päivity tähän automaattisesti, vaan aina pienellä viiveellä.
- Värit: Punainen: Minimit ei täyty. Vihreä: vähintään 5p joista 2p tähtitehtävistä.
Ohjelmointi 1, s 2023 / Demo 4
Jos haluat harjoitella vastaavilla tehtävillä, joihin saat myös mallivastaukset, niin katso:
HUOM! Joka kerta on saatava vähintään 2p tähtitehtävistä! Alle 5p tehneillä on huono ennuste loppukurssissa.
Demot palautetaan viimeistään ma 2.10 klo 11:00 mennessä. Voit palauttaa osan tai kaikki tehtäväsi etukäteenkin ja täydentää vastauksia määräaikaan mennessä. Alla mainitut mallivastaukset näkyvät vasta kun demojen palautustilaisuudet on pidetty.
- huomaa että Answer-linkistä pääset katsomaan muiden vastauksia kun palautusaika on ummessa
- mallivastaukset
- muiden vastaukset
Oppimistavoitteet
Klikkaile ruksit niihin kohtiin jotka olet oppinut. Työkirja-sivulla näet yhteenvedon kaikista demoista.
Demokerran päätteeksi kirjoita arvio tällä viikolla käyttämästäsi työmäärästä. Laske työmäärään mukaan kaikki tällä viikolla käyttämäsi aika: lähiopetukseen (tai zoom) osallistuminen, oppimateriaalin lukeminen, demotehtävien tekeminen, luentovideon katsominen, demojen palautustilaisuuteen osallistuminen ja niin edelleen. Voit päivittää lukua viikon edetessä, se voi helpottaa arvion tekemistä. Huom! Siis tähän ei laiteta kurssin alusta kaikkia tunteja yhteensä, vaan vain tämän viikon tunnit. Tästä annettava 0.25 näkyy Pisteet-sivun demokerran summassa. Kirjoita pelkkä luku esim tyyliin 13.5
Ajankäyttösi tällä viikolla:
Please
Huomioitavaa
Oppimisen kannalta näistä tärkeimmät 2 tehtävää voisivat olla tehtävät joukosta 2, 5 ja 6.
Kunkin kerran minimipistemäärä 2 on tehtävä käyttäen tähdellä (*) merkittyjä tehtäviä. Esim. pelkkä Ville ja Tauno ei riitä minimimäärään. Jos nämä tehtävät eivät lähde luonnistumaan, kannattaa käydä pääteohjauksissa saamassa apua.
Muista että B-tehtävät ovat Bonus tehtäviä, joiden tekemiseksi joutuu yleensä etsimään materiaalia kurssin sen hetken materiaalin ulkopuolelta (esim. lukemalla monistetta eteenpäin). Jos niitä ei osaa tehdä, se ei ole vielä vakavaa.
G-tehtävät ovat Guru-tehtäviä, jossa pitää jo osata selkeästi enemmän kuin kurssin taso tällä hetkellä.
Kun tehtävien vastaukset on julkistettu (esim demopalautuksissa), pitää jokaisen korjata omat vastauksensa niin, että ainakin Tauno ja perustehtävät 1-6 tuottavat vähintään 1p kukin. Eli demon palautuksen jälkeen pitää demosivun näyttää vähintään 7 p.
Siis esim. ennen demo 2 tehtävien aloittamista pitää demoista 1 tulla vähintään mainittu pistemäärä.
Voit saada demopisteitä indeksoimalla luento/demovideoita, ks: Videoiden hakemisto aihepiireittäin 23 Lisää em. videosivulle vähintään 3-linkkiä ja kirjoita alla olevaan laatikkoon, mitkä linkit lisäsit. Joka demokerralle voi merkitä aina vähintään 3:sta linkistä yhden demotehtävän.
Tauno 1a
Katso alta ensin video Demo 3:n Tauno-tehtävän käsittelystä. Koita vastauksissa välttää turhia apumuuttujia ja mieti kuinka hyvin ratkaisusi yleistyy jos taulukon kokoa kasvatetaan.
Tauno 1b
Ville 1
Tee Ville-tehtävät 3.3, 3.5, 3.6. 4.1-4.4. Sanoin luennolla että Villen merkkijonot toimivat kuten Javassa, mutta tuo taitaa nyt olla korjattu Villessä, eli Substring
-metodin jälkimmäinen indeksi on merkkien määrä.
Muista Villen käyttöohje.
Funktioista F1
Mikäli olit luennolla 5 ma 18.09.2023 ja sait kaverin kanssa tehtyä aliohjelmien kutuja, voit hypätä kohdan 1 yli ja jatkaa suoraan tämän tehtävän kohdasta 2.
Mikäli et ollut luennolla 05 tai et saanut luennolla tehtyä sitä tehtävää, jossa opiskelijat "leikkivät" aliohjelmia ja "paperilaput" parametrejä, tee se nyt yksin tai yhden/kahden kaverin kanssa.
Seuraavaksi lue huolella monisteen luku 9. Aliohjelman paluuarvo.
Suorita kohdan 9.2 Funktion kutsuminen lopussa oleva animaatio huolella miettien, mitä tapahtuu ja miten asiat samaistuvat luentojen "paperilappujen leikkiesimerkkiin".
Aja kohdan 9.3 Funktion kirjoittaminen toisella tavalla toisen esimerkin testit. Vaihda
2.0
tilalle2
. Aja testit ja katso, mitä tapahtuu. Vaihda jakolaskun tilalle kertominen luvulla0.5
ja aja testit uudelleen.
Katso alla olevat molemmat animaatiot ajatuksen kanssa.
Kirjoita alle:
- mitä opit animaation ja luentojen "paperilappujen" antamisen yhteydestä?
- mitä hyötyä oli testeistä?
- miksi sanotaan, että merkijono on muuttumaton (immutable) vaikka merkkijonoanimaation esimerkissä muuttuja
jono
muuttui? - jos vastauksesi on että et oppinut uutta, niin milloin opit em asiat
TDD 1
M: 11. Comtest
Jos teet itse omia testejä vähintään kahteen funktioon (esim ComTest) Riderissa 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ä. Huom! Ohjelmia joissa on pelkkä pääohjelma on vielä tämän kurssin tiedoilla aika haastavaa testata, samoin esim. pelijuttuja. Siksi testaamista kannattaa ehkä tehdä tässä demoissa vain sellaisille funktioille, jotka selkeästi palauttavat jotakin. Tässä demossa sellaisia on tehtävissä 2, 5 ja 6.
Jos ComTest ei toimi koneellasi, voit Copy/Pasteta ohjelmia alla olevaan laatikkoon ja testata siinä.
Tehtävä 1. Pong tai työaikatutoriaali
Valitse seuraavista jompikumpi sen mukaan mikä on kiinnostus peleihin:
Jos et tykkää pelin tekemisestä, niin tutustu Työaikaraportti tutoriaaliin Toki voit tämän toisen tutoriaalin tehdä myöhemmin vaikka peleistä pitäisitkin :-) Kuten Pongissakin, kirjoita alle muutaman kappaleen mittainen oppimispäiväkirja
Tee Pong-tutoriaalista vaiheet 4-7. Pong-tehtävää ei voi tehdä TIMissä! (Tee myös 1-3 jos et niitä ohjauksissa tehnyt.) Kirjoita parin kappaleen mittainen oppimispäiväkirja (väh. 5 riviä), eli mitä opit, mikä oli uutta? Mikä oli helppoa ja mikä vaikeaa? Oliko tästä tehtävästä sinulle hyötyä? Voit antaa myös palautetta tutoriaalin sisällöstä. Pong-tutoriaalin kooditiedostoja EI tarvitse palauttaa.
Älä jää liikaa suremaan hieman omituista fysiikan käytöstä joissakin pompuissa :-)
Tehtävä 2*. Merkkijonoja vertaava funktio
- katso erityisesti animaatio siitä, miten merkkijonofunktio toimii: ToLower
- käytä ensisijaisena lähteenä luentomonisteen Merkkijonot-lukua
Tätä tehtävää tehdessä älä yhtään mystifioi asioita. Kyseessä on periaatteessa täsmälleen samanlainen tehtävä kuin viikko sitten Kuutio tai Fahrenheit. Ainoastaan funktion tyyppi on eri, samoin parametrien tyypit. Ja toki sisällöllinen toteutus johon kannattaa paneutua vasta kun on toimiva tynkä tehtynä.
Tee alla olevaan (ConsoleMain-projektin) pääohjelmaan tarvittava funktio PidempiMerkkijono
. Huomaa! TIMissä täytyy syöte antaa etukäteen input-kenttään. Paremman kuvan toiminnasta saat oikeassa ympäristössä (Rider).
public static void Main()
{
Console.Write("Anna 1. sana >");
string sana1 = Console.ReadLine();
Console.Write("Anna 2. sana >");
string sana2 = Console.ReadLine();
string pidempi = PidempiMerkkijono(sana1, sana2);
Console.WriteLine("\"" + pidempi + "\" on pidempi sana");
}
Muista että ensin teet funktion esittelyrivin (sen missä on public static jne...). Sitten kirjoita funktion dokumentaatio (se /// ja täydennä summary ja parametrien merkitys). Lisätietoa TIM-sivulta aliohjelmien kirjoittamisesta. Aluksi itse funktion sisältö voi olla vaikka pelkkä (lainausmerkeissä saa tynkä-versiossa olla mitä tahansa):
return "testi";
Sitten kokeilet, että ohjelma kääntyy ja kyselee ja tulostaa tuollaisenaan. Kun se toimii, voit ruveta muuttamaan funktion sisältöä niin, että funktio tekee sen mitä pitääkin.
Paitsi jos teet kunnon TDD:tä (Test Driven Development), niin ennen funktion toteutusta kirjoitat testit ja kokeilet, että testit epäonnistuvat. Sitten vasta toteutat funktion ja ajat testit, korjaat funktiota, jos testit eivät toimi jne... Testit (ks. Näytä koko koodi
) tätä funktiota varten voisivat olla esim:
/// PidempiMerkkijono("Eka sana", "toka") === "Eka sana";
/// PidempiMerkkijono("Eka", "Toka") === "Toka";
/// PidempiMerkkijono("Eka", "Tok") === "Eka";
/// PidempiMerkkijono("", "Toka") === "Toka";
/// PidempiMerkkijono("", "") === "";
Muista jakaa tehtävä osiin:
- Saan kaksi merkkijonoa (sanaa), pidempi pitää palauttaa!
- Mistä olen ensin kiinnostunut? En jonojen sisällöstä vaan sana1 XXX ja sana2 XXX?
- Miten saan selville XXX? Mikä on XXX tyyppi?
- Vertaa jonojen XXX ja päättele sen perusteella mitä palautetaan? Mitä tyyppiä palautettavan tuloksen pitää olla?
Kun olet tehnyt tehtävän, niin kopioi funktio esittelyriveineen tuohon alapuolelle.
Jos yhtään vaikeuksia, katso: tehtävä jolla voi harjoitella.
VL: Jos Rider valittaa ReadLinestä että voi palauttaa null, niin ota se virhe pois ainakin tästä projektista.
—Jaa-a, testaamalla näyttää ok:ta, mutta kun ajaa niin eipä tuo 0.6 ykköseksi muutu enkä keksi enää miten saisin täysiin pisteisiin ni jää nyt tähän..
VL: Laita siihen alempaan ikkunaan kaksi sanaa alekkain, ei ohjelmaa.
—Multa on se alempi ikkuna varmaan hävinny johonkin koska en saa tuon "kirjoita ohjelman syöte.."- osuuden alapuolelle kirjoitettua mitään. Hiiri näyttää siinä nuolta, ei anna kursiivia näkyviin ollenkaan niin että voisi kirjoittaa..
—Ps. minkähän vuoksi mulla näkyy sekä demojen että korjattujen pisteet punaisella?
—Tehtävä 3 Lässytystä
M: 12. Merkkijonot. Luennon 08 esimerkki Merkkijonot.cs, Aliohjelminen kutsuminen
Huomaa! TIMissä konsolilta lukeminen ei toimi samalla tavalla kuin oikeassa ohjelmassa. TIMissä käyttäjän syöte pitää antaa sille varattuun tilaan ENNEN ohjelman ajamista.
Tee Console-ohjelma, joka toimisi seuraavasti (vinkki: katso String-luokan dokumenttia ja etsi metodi, jolla voit vaihtaa kirjaimia. Tiedon lukemista varten katso edellisen tehtävän pääohjelmaa (tässä tehtävässä ei välttämättä tarvitsisi itse kirjoittaa yhtään aliohjelmaa, tosin tulevia demoja ajatellen apufunktiosta ei ole haittaakaan).
Toistan mitä sanot, mutta en osaa sanoa l:ää!
Anna teksti >ralliauto ajaa superkovaa.
Sanoit siis : lalliauto ajaa supelkovaa.
Muutamilla seuraavia virheitä (vaikka olisiki täydet pisteet, samoja virheitä myös T5):
- sisennykset väärin
- jos kutsutaan funktiota, sulku kiinni nimeen
- muuttujien nimien pitää alkaa pienellä kirjaimella
- valmiissa kommentissa oli parametrin sivunpituus nimeksi annettu
lause
ja sitä pitäisi käyttää! - turhia tyhjiä rivejä
- parametria (
lause
) ei saisi käyttää apumuuttujana, kannattaa esitellä uusi apumuuttuja
Tehtävä 4. Char-luokka
Kirjaimet: Katso ensin huolellisesti luennon 08 esimerkki Merkkijonot.cs. Sitten katso Char-dokumentaatiota sekä dokumenttia Aliohjelminen kutsuminen
Tehtävä 4a. Kirjain isoksi (0.4 p)
Katso, mikä kutsu sinun on kirjoitettava XXX:n paikalle, jotta seuraava ohjelma toimisi:
Tehtävä 4b. Onko iso? (0.6 p)
ONko tätä tehtävää mahdollista tehdä toistaiseksi kurssilla käydyn materiaalin perusteella? Jos on, niin ensimmäisen merkin koon tutkimisen osio on mennyt itseltä täysin ohitse.
VL: Tarkoitus on vähän lukea monistetta. Ks Char-luokka.
—Oletetaan että tehtävänä olisi tehdä ohjelma, jossa kysytään käyttäjältä sana tai jono ja tulostetaan, onko sen ensimmäinen kirjain iso kirjain (uppercase) vai ei (lower case). Käyttönä voisi olla vaikkapa tarkistaa onko annettu muuttujan nimi koodauskäytänteiden mukainen.
Tehtävä kannattaa ilman muuta silloin aloittaa niin, että ensin tehdään funktion IsoVaiPieni
, joka selvittää merkkijonon 1. kirjaimen suuruuden. Sitten kun tämä on tehty ja testattu, ruvetaan miettimään käyttäjältä kysymistä. Tässä tehtävässä tyydytään vasta tuon funktion tekemiseen. Erikoistapausten tulkinnan saat selville valmiista testeistä; jos ensimmäistä merkkiä ei ole tai se on muu kuin kirjain, palautetaan aina "pieni".
TIM-versiossa pääohjelmassa on vakiojono, jossa funktiolla selvitetään, onko jonon 1. kirjain iso vai pieni. Katso tarkasti, mitä itse funktiossa testataan (Näytä koko koodi
) ja mieti, mitä mikäkin tapaus tarkoittaa funktion kannalta. (Array index is out of range = taulukon indeksi on rajojen ulkopuolella, saattaa liittyä tyhjään merkkijonoon. Eli mitä on mj[0]
jos mj == ""
:-) Katso myös luentomoniste.
Jaa ongelma ensin selkeästi pienempiin osiin:
- Voinko edes ottaa 1. kirjaimen? Missä tilanteessa en? Mitä silloin palautetaan?
- Miten saan jonon 1. kirjaimen?
- Miten tutkin, onko 1. kirjain iso?
- Miten tuon perusteella palautan tekstin "iso" tai "pieni"?
Jos yhtään vaikeuksia, katso: tehtävä jolla voi harjoitella.
Tehtävä 5*. Kolmen luvun suurin ja pienin
Tee ohjelma, joka kysyy kolme kokonaislukua ja tulostaa niistä suurimman ja pienimmän. Tee avuksi funktioaliohjelmat Suurin
ja Pienin
(joille kummallekin viedään kolme parametriä). Millä arvoilla aliohjelmia olisi hyvä testata? Oletetaan, että käyttäjä syöttää kokonaisluvun, eli poikkeuksia (jokin muu kuin kokonaisluku annettu) ei tarvitse tässä ottaa huomioon. Numeron saat luettua päätteeltä seuraavasti:
Console.Write("Anna 1. kokonaisluku >");
int a = int.Parse(Console.ReadLine());
Vinkki! Tehtävää on helpointa lähteä laajentamaan ajatuksesta
int suurin = a;
if ( b > suurin ) suurin = b;
return suurin;
Tehtävä 6. Merkkijonon pätkiminen
Tee tarvittavat aliohjelmat, jotta seuraava pääohjelma toimisi:
public static void Main()
{
Console.Write("Anna nimesi muodossa sukunimi etunimi: ");
string kokonimi = Console.ReadLine();
string sukunimi = AnnaEkaSana(kokonimi);
string etunimi = PoistaEkaSana(kokonimi);
Console.WriteLine("Etunimesi on siis " + etunimi +
" ja sukunimesi " + sukunimi);
}
Vinkki: Katso monisteesta String-luokan IndexOf
ja Substring
tai Split
(Split
vaatii taulukon jota ei vielä ole kunnolla käsitelty). Muista aina painaa Näytä koko koodi
.
Mikähän tässä menee pieleen? sain aikaisemmin samalla vastauksella 1 pisteen ja nyt vain 0.4
VL: nyt ei mene testit läpi (testien osuus on 0.5 p).
—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 demo2:ssa tai demo3:ssa, kunhan kumpaankin merkkaamasi (demo2 + demo3 + demo4) 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-2. Pallojen pukkaileminen
Ota pohjaksi demo 2:n mallivastaus G1-2. Tippuvat suorakulmiot (Näytä mallivastaus/Show model answer
, SuorakulmiotFysiikalla.cs). Aja se ensin sellaisenaan. Muuta sitten se niin, että luodaan pelikentälle satunnaisiin paikkoihin 30 palloa (mielellään satunnaisin värein), joilla on satunnainen säde 5 ja 30 välillä. Kokeile että toimii. Lisää vielä yksi 40-säteinen valkoinen pallo, jota voi ohjata "tökkimällä" nuolinäppäimillä (katso mallia edellisen demon Lumiukon tökkimisestä). Ohjainten lisäämiseen voit katsoa vinkkiä Pong-tutoriaaleista.
G1. Räjähdys
Lisää edelliseen pallopeliin sellainen ominaisuus, että jos ohjattavalla pallolla osuu toiseen palloon kentän puolivälin yläpuolella, niin toinen pallo räjähtää ja poistuu pelistä (vinkki: Jypelin ohjeet. Pelin tarkoituksena on räjäyttää kaikki pallot.
Korvaavia tehtäviä jotka ovat ei-pelejä
Tehtävät B1-B2 sekä G1 vaativat Jypelin käyttöä. Tähän kerätään vaihtoehtoisia tehtäviä, joissa on sama oppimistavoite, mutta voidaan tehdä tekstuaalisena konsolisovelluksena. Tehtävät ovat ensisijaisesti tarkoitettu niille, jotka eivät halua tai eivät voi käyttää Jypeliä. Tehtäviä voivat kuitenkin tehdä myös muutkin.
B1-2e. Piin likiarvo
Tehtävän tavoitteena on tehdä funktio, joka laskee piin likiarvon Monte-Carlo-simuloimalla.
Piin likiarvo voidaan laskea Monte-Carlo-simuloimalla seuraavasti:
- Arvotaan pistettä jonkin neliön sisälle.
- Lasketaan, moniko pisteistä osuu neliön sisälle asetetun ympyrän sisälle ()
- Lasketaan arvio ympyrän pinta-alalle käyttäen lukuja ja .
- Lasketaan saadusta ympyrän pinta-alasta.
Palauta vastauskenttään kokonainen ohjelma, joka sisältää pääohjelman ja toteuttamasi funktion.
Laske ja tulosta lisäksi pääohjelmassa piin likiarvo kun
(Huom. Kun olet tallentanut vastauksesi, arvioi oma suoriutumisesi tehtävästä asteikolla 0-2p. valitsemalla automaatin antaman pistemäärän vierestä Set custom points.)
- Piirrä paperille tilanteesta kuva! Kannattaa ajatella, että ympyrän ja neliön keskipisteet ovat origossa.
- Piste on -säteisen ympyrän sisällä, jos pisteen etäisyys ympyrän keskipisteestä on pienempää kuin säde .
- Arvio ympyrän pinta-alalle voidaan laskea , kun on neliön pinta-ala
- Satunnaisuutta voit hakea
- Jypelin RandomGen-luokasta. Jos käytät tätä, projektiin pitää saada mukaan Jypeli, eli seuraava voi olla helpompi projekin luonnin kannalta.
- C#:n Random-luokasta.
Mikäli käytät tätä, täytyy ensin luoda Random-olio. Esimerkiksi olion metodi nextDouble palauttaa satunnaisen reaaliluvun väliltä 0-1:
/* Satunnaisreaaliluku C#:ssa */ Random rand = new Random(); // Uusi Random -luokan olio double a = rand.NextDouble(); // a = satunnainen luku väliltä 0-1 double b = 15*a; // b = satunnainen luku väliltä 0-15
These are the current permissions for this document; please modify if needed. You can always modify these permissions from the manage page.