s2012/demot/demo10 – Ohjelmointi 1
wiki:s2012/demot/demo10
Last modified 5 years ago Last modified on 2012-11-16 09:17:54
Demot » Demo 10, 19.11.2012
Tehtävä 1-2. Rekursiivinen pallokuva
Tehtävä 3. Lotto
Tehtävä 4-5. n yli k
Tehtävä 6. Poikkeukset
B1-2. Valuuttakurssit
B3-4. Rekursiivinen puu
B5. BigInteger
G1-2. Valuuttakurssit netistä
G3-4. PNS
Tarvitsemme tietoa siitä, mitkä ovat kurssin vaikeudet suhteessa siihen, mitä kurssilla on tehty. Kysely toimii samalla itsearviona. Siksi kurssista on Korpissa ​välikysely. Täytä kysely ja tee tiedosto vaikeaa.txt, johon kerrot, mikä oli vaikeaa tällä demokerralla. Palauta yhtenä DemoWWW:n "tehtävänä" ja merkitse 1p, jos olet vastannut itse kyselyyn tällä kertaa (mutta et aikaisemmalla kerralla). Muuten laita 0.2 pistettä.
PP-tehtävät (Pahasti Pihalla) on tarkoitettu niille, joilla on vaikeuksia aivan perusasioissa. Tarkoitus on, että nämä ovat helpompia tehtäviä (mutta yhdessä on monta tehtävää), joiden avulla pakollisen kahden tehtävän 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.
Tee for-silmukka, joka tulostaa seuraavaa:
Lataa itsellesi ​Laskuharjoituksia.cs tiedosto ja täydennä aliohjelmat siten, että pääohjelma tulostaa konsoliin annettujen lukujen tulojen summan 2 * 3 + 4 * 7.
Tee (funktio)aliohjelma, joka laskee (ja palauttaa) tuotteen alennetun hinnan kun viedään parametrina alkuperäinen hinta ja alennusprosentti. Tee pääohjelma, josta kutsut tekemääsi aliohjelmaa ja tulostat sen antaman arvon.
Tee aliohjelma LaskeMatkanKesto, joka laskee kuinka kauan jokin matka kestää annetulla matkan pituudella ja keskinopeudella. Pääohjelma voisi näyttää tältä:
Tee (funktio)aliohjelma joka laskee (ja palauttaa) tuotteen alkuperäisen hinnan kun viedään parametrina alennettu hinta ja alennusprosentti. Tee pääohjelma, josta kutsut tekemääsi aliohjelmaa ja tulostat sen antaman arvon.
M: ​21. Rekursio. Katso ​mallia rekursiivisesta kolmion piirtämisestä. Tee mallia muokaten ohjelma, joka piirtää ​puu.png -kuvan kaltaisen puun rekursiosta:
double vSuunta = suunta + ???;
double oSuunta = suunta - ???;
Pallo(peli, x + Math.Cos(vSuunta) * (sade + r),
y + Math.Sin(vSuunta) * (sade + r),
r, vSuunta);
Pallo(peli, x + Math.Cos(oSuunta) * (sade + r),
y + Math.Sin(oSuunta) * (sade + r),
r, oSuunta);
HUOM : Jos tehtävä ei aukea, älä aloita tällä tehtävällä, vaikka tämä periaatteessa onkin helppo tehtävä. Tehtävän ymmärtämiseksi on lähes pakko että on katsonut luennon 19.
Vinkki: Tässä tehtävässä ei tarvita listoja tms., pelkästään kerto- ja jakolaskuja sekä silmukoita. Vastaus on nätimpi, jos avuksi kirjoittaa yhden pienen aliohjelman.
// käyttöjärjestelmän mukaan, oletuksena suomenkielisissä windowseissa
// se on pilkku.
double d3 = MuutaJono("kana", 3.1);
Console.WriteLine("{0:0.00}, {1:0.00}, {2:0.00}",d1,d2,d3);
// tulostaa: 12,30 0,00 3,10
Eli funktio yrittää poimia annetusta merkkijonosta liukuluvun (double) ja palauttaa sen. Mikäli tämä ei onnistu, palauttaa se oletuksen. Funktiolle on oikeassa elämässä käyttöä koska käyttäjältä saatu syöte on aina merkkijono ja se pitää pystyä muuttamaan reaaliluvuksi laskemista varten. Tuo desimaalierotin on vaikeampi. Parse käyttää sitä erotinta, mikä on järjestelmään asetettu. Oikeasti pitäisi siis vielä osata tulkita oikealla tavalla riippumatta siitä, antaako käyttäjä pilkun vai pisteen. Tässä tehtävässä tuosta ongelmasta ei tarvitse välittää, vaan riittää yllä olevaan esimerkkiin käsin vaihtaa merkkijonoissa "12,3" piste pilkun tilalle, jos järjestelmässäsi on piste desimaalierottimena (C#-koodin vakioissahan se on aina piste).
M: ​21. Rekursio: Katso mallia ​rekursiivisesta kolmion piirtämisestä suoraan canvakselle. Tee mallia muokaten ohjelma, joka piirtää ​puu.png -kuvan kaltaisen puun käyttäen rekursiota:
* Puun yksi oksa ja kolme muuta rekursiivisesti
*  x oksan alkupiste
*  y oksan alkupiste
*  d oksan suunta radiaaneina
*  l oksan pituus
oksa( x, y, d, l)
viiva pisteestä (x,y) pisteeseen (x+l*cos(d),y+l*sin(d))
jos l < 2 lopeta
oksa(x+l*cos(d),y+l*sin(d),d+0.6,l*0.6);
oksa(x+l*cos(d),y+l*sin(d),d-0.6,l*0.6);
oksa(x+l*cos(d),y+l*sin(d),d,l*0.3);
Hyvä alkukulma piirtämiseen on vaikkapa pi/2 ja pituus vajaa puolet ikkunan korkeudesta. Tee ohjelmaan näppäinohjaus, jolla voit vaikuttaa kulman muutoskertoimeen 0.6, pituuden muutoskertoimeen 0.6 (eri luku kuin kulmalle) sekä keskioksan pituuden kertoimeen 0.3.
Tutki, miten C#:issa toimii BigInteger -luokka ja tee NYliK(int n, int k) sen avulla. Tee siis tehtävää 4 vastaava toteutus erityyppisellä kokonaisluvulla. Jos jossakin sanotaan, että Assembly XXX.dll, niin tuon Assemblyn voi joutua lisäämään projektiin hiiren oikealla ja Add Reference ja sitten kohta .NET.
Tutki, miten C#:ssa voidaan lukea syötettä WWW-osoitteesta ja tee tehtävä B1-2 niin, että tiedot luetaan suoraan netistä.