The referenced paragraph does not exist.

Demo 6

Palauta viimeistään ma 22.2. klo 11:59, läpikäynti ma 22.2. klo 12-14.

Oppimistavoitteet

Tämän demokerran päätteeksi

  • Osaat kirjoittaa funktion esittelyrivin funktiokutsun perusteella
  • Osaat käyttää silmukoita ja taulukoita
  • Osaat "kulkea" silmukan avulla taulukon läpi
  • Muistat, että double-lukuja ei voi vertailla luotettavasti == -operaattorilla

ComTestin asennus

PP2, perjantai 19.2.

PP-tehtävät (näistä saa pisteitä vain käymällä perjantain PP-ryhmässä. Tulevan perjantain PP-tehtävät jaetaan perjantaina.) Mitä ovat PP-tehtävät?

Tehtävä 1

Lue: Aliohjelmien kirjoittaminen

Tee seuraavia funktiokutsuja vastaavat funktioiden esittelyrivit ja lyhyimmät mahdolliset toteutukset, jotta funktiot ovat syntaktisesti oikein (niiden ei tarvitse toimia loogisesti oikein, vielä). Muista kirjoittaa myös dokumentaatiot: niiden tekeminen onnistuu, vaikka ohjelma ei vielä toimikaan loogisesti oikein.

Esimerkki (älä kopioi tätä):

Eli funktioiden ei tarvitse tehdä mitään "järkevää". Funktioiden esittelyrivit pitää olla kirjoitettu oikein, niiden pitää palauttaa oikean tyyppinen arvo ja ne pitää olla dokumentoitu asianmukaisesti. Esim a)-tehtävän toteutuksessa ei tarvitse oikeasti poistaa sanaa. -MR

18 Feb 16 (edited 18 Feb 16)
TÄMÄ ON VALMIIKSI ANNETTUNA
/// <summary>Funktiokutsu ja apumuuttuja</summary>
/// <param name="args">Ei käytössä</param>
public static void Main(string[] args)
{
  String lyhyempi = LyhyempiJono("Matti", "Pertti"); 
}


ALLA OLEVA PITÄÄ ITSE KIRJOITTAA
/// <summary>
/// Palauttaa kahdesta merkkijonosta lyhyemmän.
/// </summary>
/// <param name="s1">Ensimmäinen jono</param>
/// <param name="s2">Toinen jono</param>
/// <returns>Lyhyempi jonoista</returns>
public static String LyhyempiJono(String s1, String s2)
{
    return s1;
}

Varsinainen tehtävä:

/// <summary>Funktiokutsut ja apumuuttujat</summary>
/// <param name="args">Ei käytössä</param>
public static void Main(string[] args)
{
    StringBuilder muuttuvaJono;
    String jono;
    int i;
    double d;
    int[] luvut;
    double[] t;
    bool onko;

    muuttuvaJono = new StringBuilder("kissa istuu ja istuu puussa");
    onko = PoistaJononViimeinen(muuttuvaJono, "istuu"); // palauttaa tiedon siitä, 
                                                        // poistettiinko viimeinen 
                                                        // "istuu"-jonon esiintymä 
                                                        // muuttuvaJono:sta
                                                        // muuttuvaJono tämän jälkeen:
                                                        // "kissa istuu ja  puussa"
    luvut = new int[] {4, 2, 4, 5, 1};
    i = LaskeMaara(luvut, 4);  // laskee luvun 4 esiintymät luvut-taulukossa
    jono = TuplaaMerkki("Janne", 'a'); // "Jaanne"
    t = LuoTaulukko(10, 3.0, 1.1);  // luo taulukon jossa on 10 lukua 
                                    // aloittaen 3.0 ja kasvattaen 1.1:llä
                                    // 3.0, 4.1, 5.2, ...
    d = Keskiarvo(t); 
}

Huom! Ohjelmaa ajetteassa tulee varoituksia. Niistä ei tarvitse välittää. Varoitukset tulevat, koska kaikkia pääohjelmassa esiteltyjä muuttujia ei käytetä. Se ei kuitenkaan vaikuta ohjelman kääntymiseen.

Esim. /prg.cs(11,15): warning CS0168: The variable `jono' is declared but never used

Vastaukset

Kirjoita kuhunkin vastauslaatikkoon otsikon mukainen funktion esittelyrivi ja funktiolle minimaalinen tynkätoteutus. Huomaa, että funktioiden ei tarvitse tehdä mitään "järkevää". Funktioiden esittelyrivit pitää olla kirjoitettu oikein, funktion pitää palauttaa oikean tyyppinen arvo ja funktio pitää olla dokumentoitu asianmukaisesti. Esim a) tehtävän toteutuksessa ei tarvitse oikeasti poistaa sanaa, vaan funktion toteutus on pelkkä return ja perään sopivan tyyppinen arvo.

Kustakin kohdasta a-e saa 0.2 p., jos kyseinen kohta kääntyy ilman virheitä, eli se on syntaktisesti oikein.

# esittely_a
# esittely_b
# esittely_c
# esittely_d
# esittely_e

Tehtävä 2

Tee sekä a)- että b)-kohdat.

a) M: 13. Ehtolauseet. Kirjoita ilman minkään valmiin funktion käyttöä funktioaliohjelma, jota voi kutsua muodossa...

double lukuEiNegatiivisena = Itseisarvo(luku);

...ja joka palauttaa luvun aina positiivisena (tai nollana).

Aloita kirjoittamalla sopiva testipääohjelma (tai ComTest-testit), jossa kutsut funktiota erilaisilla testattavilla arvoilla.

Tehtävässä saa sen ajamisesta 0.05 p. + testien tekemisestä ja niiden läpäisemisestä + 0.25 p. + oikeasta tulostuksesta 0.15 p. + dokumentaatiosta 0.05 p.

# itseisarvo

!!! Error code 1 /prg.cs (Csharp) || skipped: no tests error CS2001: Source file `/prgTest.cs' could not be found Compilation failed: 1 error(s), 0 warnings

Testejä ei ole olemassa?

19 Feb 16

Eikös ne testit ole kirjoitettava itse?

19 Feb 16

Näköjään homma toimi kun itse lisäsi kommentteihin testiarvot. Kokeile sitä. -HJ

19 Feb 16

b) M: 9. Aliohjelman paluuarvo.

Kirjoita funktio Etaisyys, jota voidaan kutsua seuraavasti...

double a, b;

...

double etaisyys = Etaisyys(a, b);

...ja joka palauttaa kahden reaaliluvun välisen etäisyyden.

Esimerkiksi Etaisyys(3.2, 8.5) on melkein 5.3, samoin Etaisyys(8.5, 3.2). Voit hyödyntää a-kohtaa, sekä tehtävässä 6 tekemääsi Samat-funktiota.

Tehtävässä saa sen ajamisesta 0.05 p. + testien tekemisestä ja niiden läpäisemisestä + 0.25 p. + oikeasta tulostuksesta 0.15 p. + dokumentaatiosta 0.05 p.

# etaisyys

Ei anna dokumentoida, vaan heittää jotain virhettä. Pisteitäkään ei tule.

19 Feb 16

Tehtävä 3

M: 16. Toistorakenteet, 15. Taulukot

Katso Wikipediasta Keskiluvut-kohdasta erilaisia keskilukuja. Yksi lisää voisi olla keskiarvoa lähinnä oleva joukon alkio, josta tässä käytetään nimitystä ''miidi'' - tällaista keskilukua ''ei'' siis oikeasti ole olemassa.

Tee Miidi-niminen funktio, joka palauttaa reaalilukutaulukon lukujen miidin.

Et valitettavasti voi käyttää hyväksesi (eli kutsua) luentojen Summa-funktiota (koska se oli int-taulukolle), vaan joudut kopioimaan sen ja muuttamaan taulukon tyypin. Aloita kuitenkin tekemällä tuo reaalilukutaulukon keskiarvon laskeva funktio. Voit testata vaikka aineistolla:

double[] luvut = {1, 2, 3, 2, 5}; // keskiarvo == 2.6
double m1 = Miidi(luvut);              // 3
double m2 = Miidi(new double[] {1});   // 1
double m3 = Miidi(new double[] {3, 3});// 3
double m4 = Miidi(new double[] {});    // 0
// tulosta m1-m4

Vinkki 1: Lähimmän etsimiseksi unohda aluksi koko C# ja tee kynällä ja paperilla vastaava tehtävä ja mieti vaiheittain mitä joudut tekemään ja mitä "apumuuttujia" käyttämään. Ajattele niin, että joku näyttää sinulle yksi kerrallaan yhtä lukua, et tiedä tulevia etkä muistele menneitä, joten sinun täytyy "pitää muistissa" tietoa siitä, mikä on tähän mennessä lähinnä etsittävää lukua.

Vinkki 2: Tehtävän ratkaisuun on muutamia eri tapoja. Voit lähteä seuraavasta: Tee (ellet jo tehnyt) funktiot Itseisarvo, Etäisyys, Summa, Keskiarvo, sekä Miidi.

Tehtävässä saa sen ajamisesta 0.1 p. + testien läpäisemisestä + 0.5 p. + oikeasta tulostuksesta 0.3 p. + dokumentaatiosta 0.1 p.

# miidijaetsilahin

Sikahuonot ohjeet... Siis Miidi ei olekaan "keskiarvoa lähinnä olevan joukon alkio" #- vaan keskiarvo? Ja oma aliohjelmansa on sitten se lähin luku? Vai häh?

22 Feb 16

Tehtävä 4

M: 9. Aliohjelman paluuarvo.

Pythagoraan lauseen avulla voidaan laskea 2-ulotteisella tasolla olevan kahden pisteen välisen etäisyys. (Vaikkapa tavallinen paperiarkki on 2-ulotteinen taso :-).

Kirjoita funktio...

double Etaisyys(double x1, double y1, double x2, double y2)

...joka laskee kahden pisteen p1 ja p2 (missä p1=(x1, y1) ja p2=(x2, y2)) välisen euklidisen, eli tuon meille "tavallisen" etäisyyden.

Tehtävässä saa sen ajamisesta 0.1 p. + testien läpäisemisestä + 0.5 p. + oikeasta tulostuksesta 0.3 p. + dokumentaatiosta 0.1 p.

The default tolerance is by six digits and it can be changed by #TOLERANCE:

///    #TOLERANCE=0.01
///    double d = 0.101; 
///    d ~~~ 0.1;
# euklidinenetaisyys

!!! Error code 1 /Mittauksia.cs (Csharp) || skipped: no tests error CS2001: Source file `/MittauksiaTest.cs' could not be found

Mulle tuli tällainen...

20 Feb 16

Tehtävä 5

M: 9. Aliohjelman paluuarvo. Tee funktio

Skaalaa(double luku, double min, double max)

joka skaalaa välillä [0, 1] olevan luvun välille [min, max]. Esimerkkejä:

Skaalaa(0.2, -3, 3) ~~~ -1.8;
Skaalaa(0.2, 1, 6)  ~~~ 2.0;
Skaalaa(0.0, 1, 6)  ~~~ 1.0;
Skaalaa(1.0, 1, 6)  ~~~ 6.0;

Eli esimerkiksi ensimmäinen testitapaus tarkoittaa että välin \([0, 1]\) luku \(0.2\) on omaan väliinsä nähden samassa suhteessa kuin luku \(-1.8\) on väliin \([-3, 3]\).
Piirrä vaikka molemmat välit ja ko. luvut oman välinsä sisälle.

Vinkki: jos sinulla on luku väliltä \([0, 1]\) ja haluat saada siitä luvun välille \([a, b]\), niin mieti mitä pitää tehdä jotta \(0\):sta tulisi \(a\) ja \(1\):stä b. (eli \(f(x) = a + (b-a)*x\)).

Perustelu: Edellä vinkissä on väli \([0, 1]\) esimerkkinä, koska ohjelmointikielten tyypillinen satunnaislukugeneraattori tuottaa lukuja puoliavoimelle välille ja jatkossa meillä on tälle Skaalaa-funktiolle käyttöä nimenomaan tuottamaan satunnaisia lukuja muillekin väleille. Tosin onneksi esim. Jypelissä tämä on valmiina. Pyöristysten kanssa on nimittäin oltava tarkkana :-)

Tehtävässä saa sen ajamisesta 0.1 p. + testien tekemisestä ja niiden läpäisemisestä + 0.5 p. + oikeasta tulostuksesta 0.3 p. + dokumentaatiosta 0.1 p.

# skaalaa

Tehtävä 6

(Jos jäät "jumiin" tähän tehtävään, niin kannattaa tehdä ensin noita aikaisempia tehtäviä, sillä niiden tekeminen saattaa helpottaa myös tämän tehtävän tekemistä.)

M: 13. Ehtolauseet.

Muista: Reaalilukuja ei (harvoja erikoistilanteita lukuun ottamatta) saa verrata == -operaattorilla.
Kirjoita reaalilukujen yhtäsuuruusvertailun avuksi funktiot, joita voisi käyttää esimerkiksi seuraavasti:

double a = 7.1001;
double b = 7.1002;
double c = 7.2002;
bool lahella = Samat(a, b, 0.01);
if (lahella)            Console.WriteLine("Ovat melkein samoja");
if (!Samat(a, b))       Console.WriteLine("Ovat eri suuria");
if (!Samat(a, c, 0.01)) Console.WriteLine("Ovat eri suuria");
if (Samat(a, c, 0.2))   Console.WriteLine("Ovat sinnepäin");

Samat–funktion ideana on siis se, että jos kaksi lukua ovat "riittävän" lähellä toisiaan, palautetaan true, muuten false. Esimerkissä "riittävän" on 0.01 ja 0.2. Jos tarkkuutta ei anneta, silloin käytetään esimerkiksi 0.00001 tms. varsin pientä lukua. Huomaa, että toinen kutsu on vähemmillä parametreillä kuin muut (kuormitettu funktio, function overloading). Tee aina ensin funktio sellaiseksi, että se ovat syntaktisesti oikein, mutta ei vielä tee mitään järkevää. Esimerkiksi, tee yllä oleva funktio ensin alla olevaan muotoon.

public static bool Samat(double a, double b, double eps)
{
  return false;
}

Sitten aja ohjelma ja totea se syntaktisesti oikeaksi. Tämän jälkeen pienillä muutoksilla tee siitä kunnolla toimiva. Kiinnitä myös huomiota funktioiden kommentoitiin ja muuttujien nimeämiseen. Jos käytät Visual Studion Auto Method Stub-toimintoa, niin huomaa, että parametrien nimet eivät oletuksena ole välttämättä lainkaan kuvaavia.

Tehtävässä saa sen ajamisesta 0.1 p. + testien tekemisestä ja niiden läpäisemisestä + 0.5 p. + oikeasta tulostuksesta 0.3 p. + dokumentaatiosta 0.1 p.

# samat

Onko dokumentaatio-osassa joku bugi tässä tehtävässä. Ei jostain syystä näytä tekemääni dokumentaatiota, eikä aliohjelmia. Dokumentaatiossa pelkkä Main. Pisteet tuli toki silti.

18 Feb 16 (edited 18 Feb 16)

(Valinnaista lisätietoa: Funktion kuormittamisen voit vaihtoehtoisesti C#:ssa hoitaa myös ns. oletusparametreillä, eng. default parameters. Jos haluat käyttää oletusparametreja tässä tehtävässä, kirjoita eps-parametri muotoon double eps=0.00001.)

V1

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

https://drive.google.com/file/d/0B3WNg1p9dCC5OVRsS3VWUkd5dkU/view?usp=sharing Mielestäni tässä kysymyksessä ei ole oikeaa vastausta. Vai olenko (taas) väärässä?

21 Feb 16
# villev1

On sillä. Siinä kysytään mitä se funktio palauttaa, ei mitä jonkun muuttujan arvo jossain silmukan vaiheessa mahdollisesti olisi.

21 Feb 16

TDD1

Jos tarkistat vähintään kahden funktion toiminnan automaattisella testillä (ComTest), saat merkitä yhden lisäpisteen. Kirjoita alle olevaan vastauslaatikkoon minkä tehtävän ja minkä funktion/funktioiden toiminnan testasit. Voit antaa samalla vastauksen kautta palautetta ja kehitysehdotuksia Comtestin käytöstä.

# tdd1

B1

M: 15.5 Moniulotteiset taulukot:

Tee funktioaliohjelma, joka etsii 2-ulotteisen reaalilukutaulukon suurimman alkion. Käyttöesimerkki:

public static void Main(String[] args) 
{
  double[,] mat1 = {{1, 2, 3}, {2, 2, 2}, {4, 2, 3}};
  double[,] mat2 = {{9, 2, 8}, {1, 2, 5}, {3, 19, -3}};
  double suurin1 = Suurin(mat1);
  double suurin2 = Suurin(mat2);        
}

Tulosta lopuksi tulos.

Tehtävässä saa sen ajamisesta 0.1 p. + testien tekemisestä ja niiden läpäisemisestä + 0.5 p. + oikeasta tulostuksesta 0.3 p. + dokumentaatiosta 0.1 p.

# matriisinsuurin

B2

M: 13. Ehtolauseet

Tehtävässä 2 vertailit ehkä lukujen absoluuttista suuruutta. Kuitenkin esimerkiksi 1000 ja 1100 ovat samoja 10% tarkkuudella, mutta eivät 0.1:n tarkkuudella.

Usein voikin jolla järkevä puhua suhteellisesta yhtäsuuruudesta 'absoluuttisen' yhtäsuuruuden sijaan.

Kirjoita vielä yksi funktioaliohjelma, jolle pätee:

SuhtSamat(0.10, 0.12, 0.1) === false
SuhtSamat(0.10, 0.11, 0.1) === true
SuhtSamat(1.0, 1.2, 0.1)   === false
SuhtSamat(1.0, 1.1, 0.1)   === true
SuhtSamat(10, 12, 0.1)     === false
SuhtSamat(10, 11, 0.1)     === true
SuhtSamat(1000, 1200, 0.1) === false
SuhtSamat(1000, 1100, 0.1) === true

Tehtävässä saa sen ajamisesta 0.1 p. + testien tekemisestä ja niiden läpäisemisestä + 0.5 p. + oikeasta tulostuksesta 0.3 p. + dokumentaatiosta 0.1 p.

# suhtsamat

B3

  1. Ota edellisen demokerran Sopulit.cs ja tee siitä graafinen versio, jossa on paljon ruutuja (suuruusluokkaa 60 y-suunnassa) ja sukupolvia lasketaan 0.1 sekunnin välein.

  2. Luo uusi FysiikkaPeli (tai PerusPelikin käy aivan hyvin, siinä ei ole fysiikka eikä sitä tässä tarvita) ja kirjoita luokkaan seuraava koodi ja täydennä aliohjelmat (ja metodit).

  3. Liitä projektiin tuo Sopulit.cs ja käytä sitä sukupolvi-taulukoiden päivittämiseen.

  4. Projektiin liittäminen:

    • kopioi tiedosto samaan paikkaan kuin projektin muut .cs tiedostot
    • Solution Explorerissa paina hiiren oikeata projektin nimen päällä
    • Add -> Existing Item
    • valitse lisättävä tiedosto Add
    • lisää omaan .cs-tiedostoon alkuun (tässä esimerkissä)
using Demo5;

tällöin kääntäjä tietää että esim kutsut:

Sopulit.Arvo(sukupolvi, 0, 1);
Demo5.Sopulit.Arvo(sukupolvi, 0, 1);

ovat samoja.

Koodipohjaa uudelle pelille:

# sopulitB3

G1

Täydennä GameOfLife (ks. B3) siten, että voit Delete napista tyhjentää kentän ja sitten hiirellä klikkailla päälle ja pois ruutuja. Hiiren klikkaus pysäyttää aina animaation ja sitten voi rauhassa rakentaa haluamansa kuvion (ks: Bitstorm ja Wikipedia) ja sitten laittaa Enter-nappulalla animoinnin uudelleen käyntiin. Välilyönti arpoo kokonaan uuden alkutilanteen.

# gameoflifebetter

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