wiki:s2014/demot/demo3
Last modified 3 years ago Last modified on 2014-09-25 17:09:46

Demot » Demo 3, 29.9.2014

Demot palautetaan viimeistään maanantaina klo 11:00 mennessä kurssin NettiDemoWWW:llä https://www.mit.jyu.fi/demowww/ohj1/. Voit palauttaa osan tai kaikki tehtäväsi etukäteenkin ja täydentää vastauksia määräaikaan mennessä.

Huomaa, että jos teet tehtäviä Visual Studiolla Jypelin projektimalleja käyttäen, niin silloin pääohjelma jää erilliseen tiedostoon ja sitä ei saa enää uudestaan toistaa omassa ohjelmassa. Kääntäen jos otat esimerkin joka on tehty Jypelin projektimallilla ja haluat kääntää sen komentoriviltä, niin sinun on lisättävä pääohjelma (Main()) kuten kurssin alkuesimerkeissä.

Kurssin ydinsisällön kannalta tärkeät tehtävät ovat 4 ja 5. Ne kannattaa tehdä ensin. Ohjeita noihin on pääteohjauksessa 3.

VIDEO 1

Muista että voit saada demopisteitä myös indeksoimalla luento/demovideoita, ks: videohakemisto. Lisää vähintään 3 linkkiä ja kerro tiedostoon video.txt mitkä linkit lisäsit. Tehtävän numeroksi VIDEO1. Jatkossa voi joka demokerralle merkitä aina vähintään 3:sta linkistä yhden demotehtävän.

Tauno 1

Katso ensi video Demo 2:n Tauno-tehtävän käsittelystä. Tee Taunolla- seuraavat tehtävät:

  1. Taulukon parillisissa paikoissa olevien lukujen summa miinus parittomissa paikoissa olevien summa
    Esim:
      5 4 6 2 9 1 => (5-4) + (6-2) + (9-1) = 13
    
  2. Taulukon summa (1. - viimeinen) + (2. - toiseksi viimeinen) jne...

Koita vastauksissa välttää turhia apumuuttujia ja mieti kuinka hyvin ratkaisusi yleistyy jos taulukon kokoa kasvatetaan. Muistakaa laittaa tauno.txt:n loppuun kommentteja siitä mitä optitte.

Voit palauttaa myös vaihtoehtoisella tavalla:

  1. Tee uusi konsoliprojekti projekti nimelle Tauno3.
  2. Korvaa tiedoston Tauno3.cs sisältö pohjatiedostolla Tauno3.cs.
  3. Aja ohjelma tuollaisena (ja jos teet ComTestejä, aja nekin).
  4. Korvaa TODO-kohdissa olevat tiedot Taunoon tekemilläsi. TODO-löytyy VisualStudiossa helposti kun ottaa View/Task List.
  5. Aja ja kokeile saatko oikeat tulokset.
  6. Palauta Tauno3.cs ja kirjoita sen Summary-kohtaan mitä opit.

Ville 1

Tee Ville-tehtävät: 3.1, 3.2, 3.4, 7.1 - 7.6. (Villessä voi olla virhe, että Sum on välillä kirjoitettu isolla ja välillä pienellä, kuvittele että se on aina kirjoitettu isolla alkukirjaimella.)

Muista: Villen käyttöohje ja Ville-tehtävien palauttamisohjeet.

Tehtävä 1. Negatiiviset binääriluvut

M: 25.4 Negatiiviset binääriluvut:

Bittien yhteenlasku

     0 + 0 =  0  =>  0 ja 0 muistiin
     0 + 1 =  1  =>  1 ja 0 muistiin
     1 + 0 =  1  =>  1 ja 0 muistiin
     1 + 1 = 10  =>  0 ja 1 muistiin 
 1 + 1 + 1 = 11  =>  1 ja yksi muistiin

Esimerkki yhteenlaskusta allekkain 4-bittisillä luvuilla kaikki vastinbiteistä saadut muistinumerot merkiten

               esim1         esim2 
muistinumero  0111           1111   
luku 1         0101           1111
luku 2      +  0011        +  1111 
              =====          ===== 
summa          1000           1110

Oletetaan että meillä on olemassa vain 8-bittisiä lukuja. Siihen tilaan on siis myös laskutoimituksen tuloksen mahduttava.

Aluksi laske allekkain yhteen seuraavat binääriluvut huolellisesti kaikki muistinumerot (myös 0) kirjoittaen (myös vasemmanpuoleisesta parista ulos lähtevä muistinumero, vaikka ei tulisi muistinumeroa, laita silloin 0):

a)             b)            c)             d)
   0101 1111      0101 1111      0000 0001     1111 1111
   0001 1111      0101 1111      1111 1111     1111 1111

Huom! Tässä siis nuo välistykset ovat vain selvyyden vuoksi. Kaikki luvut ovat 8-bittisiä lukuja.

Useimmiten nykytietokoneissa käytetään negatiivisille luvuille niin sanottua kahden komplementtia. Eli positiivinen luku muutetaan negatiiviseksi muuttamalla kaikki bitit päinvastaisiksi ja sitten lisäämällä saatuun lukuun 1. Vastaavasti kun lukua muutetaan "ihmismuotoon", katsotaan sen ensimmäinen bitti ja jos se on 1, niin kyseessä on negatiivinen luku ja se muutetaan positiiviseksi ottamalla siitä kahden komplementti (kaikki bitit päinvastoin ja +1). Tällöin tulostuksessa tulostetaan ensin -merkki ja sitten itse luvun arvo. Esimerkiksi:

3 =  0000 0011
-3 tehdään seuraavasti:  1)  kaikki päinvastoin 1111 1100
                         2)  +1               = 1111 1101 = -3

Vastaavasti jos meillä on binääriluvut 0010 1101 ja 1101 1111 ja ne pitäisi tulkita, niin tulkinta aloitetaan seuraavasti:

0010 1101 luku on positiivinen, eli 45
1101 1111 luku on negatiivinen, siis ensin 2:n komplementti
           0010 0000 + 1 = 0010 0001 = 33, eli tulos on -33

Tulkitse 10-järjestelmässä kohdissa a) - d) summattavien lukujen ja niille laskemasi summaluvun (siis kussakin kohdassa ne 3 binäärilukua) kahdella eri tavalla:

e) kun 8-bitin koneessa on vain positiiviset luvut käytössä (eli ei etumerkkiä, vrt. demo 2)

f) kun 8-bitin koneessa on negatiivisille luvuille käytössä 2-komplementti (eli jos luku alkaa 1-bitillä se on negatiivinen)

Em. 4-bitin esimerkissä olisi ollut

                      e)  f)             e)   f) 
muistinumero  0111               1111   
               0101   5   5       1111   15   -1
            +  0011   3   3    +  1111   15   -1
              =====              =====  
               1000   8  -8       1110   14   -2

g) Mitkä tulokset olivat oikeita e)-kohdan tulkinnalla (oikein jos tulos on sama kuin tekemällä laskut 10-järjestelmän luvuilla)

h) Mitkä tulokset olivat oikeita f)-kohdan tapauksessa

Esimerkissä olisi ollut

  g) 5 + 3 = 8 olisi ollut oikein e-kohdan tulkinnalla (ei etumerkkiä), 
     15+15 ei mahtunut 4 bittiin
  h) -1 + -1 = -2  olisi ollut oikein f-kohdan tulkinnalla (2-komp.),
     5+3 tuotti negatiivisen luvun

i) Anna esimerkki missä kahden negatiivisen luvun summa olisi positiivinen 8-bitin koneessa jossa negatiiviset luvut esitetään 2:n komplementtina.

j) Anna laskemiesi lukujen ja "virheellisten" tulosten ja muistinumeroiden perusteella sääntö siitä, miten tuloksen voi mekaanisesti todeta olevan oikein tai väärin.

Tehtävä 2. Muuttujien tyypit ja nimet

M: 7. Muuttujat. Miten esittelisit (tyyppi ja nimi) muuttujat seuraavia tilanteita varten. Anna myös esimerkki miten sijoittaisit muuttujalle jonkin arvon. Vastauksen voit palauttaa C#-tiedostonakin.

a) Työmatkan pituus polkupyörällä
b) Suoritettujen opintopisteiden määrä 
c) Koko tutkinnon laajuus opintopisteissä
d) Tehtyjen demojen lukumäärä 
e) Kirjan ensimmäinen kirjain
f) Sadan metrin juoksun voittajan aika.
g) 3 kuukauden euribor-korko
h) euron markka-muuntokerroin

Tehtävä 3. Muuttujien nimien kritisointia

M: 7. Muuttujat. Arvostele seuraavat muuttujien tyypit ja nimet. Ovatko syntaktisesti oikein? Entä ovatko hyviä valintoja:

int mansikanKiloHinta;
double default;
char omaNimi;
double metriMm;
double tuntejaVuorokaudessa;
real nopeus;
boolean AuringonEtaisyys;
ulong kuukaudenKeskiLampo;
int kissoja,2_kanaa,kolmeKoiraa;
int i,j,l,I;

Tehtävä 4. FahrenheitToCelsius

M: 9. Aliohjelman paluuarvo. Lue myös kurssin Wiki-sivuilta aliohjelmien kirjoittamisesta. Katso netistä miten fahrenheitit muunnetaan celsius-asteiksi. Älä kuitenkaan Copy/Paste sieltä mitään, sillä miinusmerkiltä näyttävä merkki ei välttämättä ole siellä - vaan muuten vaan saman näköinen merkki. Desimaalierottimena maasta riippumatta C#:issa käytetään pistettä (.) ei pilkkua (,). Kirjoita (funktio)aliohjelma, jota voidaan kutsua seuraavasti esim. 13°F muuttamiseksi Celsius asteiksi:

double lampotilaC;
lampotilaC = FahrenheitToCelsius(13);

Aloita kirjoittamalla pääohjelma. Miten tulostaisit lämpötilan pääohjelmassa? Kun pääohjelma on "kunnossa", kirjoita vasta sitten tarvittava aliohjelma (funktio).

Kirjoita vastaava kutsu funktiolle, joka muuntaa mailit kilometreiksi. Kirjoita myös tuo funktio. Muista kirjoittaa aina asianmukaiset kommentit aliohjelmiin!

Palauta .cs-päätteinen tiedosto, joka sisältää tehtävää varten kirjoittamasi koodin.

HUOM: Jos (ja kuten kannattaisi) teet tehtävän Visual Studiossa, niin tee ohjelmasi ConsoleMain-mallin avulla (ei Jypeli-projektimallista). Voit kirjoittaa samaan luokkaan monta funktiota (vrt: luentojen video ja esimerkki Funktioita.cs tai sama kommentoimattomana).

Tehtävä 5. Kuormittaminen

M: 6. Aliohjelmat (Kuormittaminen). Ota Demo 2:n Portaat-esimerkki (poista Main jos teet Visual Studiolla Jypelin projektimallista, koska sieltä tulee oma Main sinne Program.cs-tiedostoon). Tehtävänä on muuttaa ohjelma sellaiseksi, että PiirraNelio-aliohjelmaa voidaan kutsua kahdella eri tavalla (eli on kaksi eri PiirraNelio-aliohjelmaa eri parametrimäärillä):

a) Ilman "sädettä", piirtää aina neliön, jonka sivu on 80  
   (parametrina siis keskipisteen koordinaatit) 
      PiirraNelio(this,0,0);  // kuten nyt portaiden piirtämisessä
b) antamalla neliön "säde" (eli puolet sivun pituudesta, näin se 
   on helpompi samaistaa ympyrään) koko    
      PiirraNelio(this,0,0,50); // neliö, jonka sivunpituus on 100.

Ennenkuin teet mitään muutoksia, kokeile niin, että Jypelin pääohjelma (Begin) on täsmälleen sama kuin mallissa portaiden piirtämiseksi. Kun tämä toimii, lisää Begin-metodiin portaiden jälkeen vielä yksi rivi niin, että piirretään yksi erikokoinen neliö portaiden ulkopuolelle (eli kutsutaan uutta 4 parametristä aliohjelmaa). Muista kommentointi! Vinkki : Ks: kuormitettu lumiukko, luento 05.

Palauta .cs-päätteinen tiedosto, joka sisältää tehtävää varten kirjoittamasi koodin.

Tehtävä 6. Aritmeettiset lausekkeet

M: 7.5 Operaattorit (ja aritmeettiset lausekkeet). Kirjoita lausekkeet, joilla lasket muuttujiin, joille olet valinnut hyvät nimet, alla luetellut arvot. Tee Console C#-ohjelmaksi, Main() riittää, ei tarvitse aliohjelmia:

a) vuorokauden sekuntien lukumäärän
b) vuoden tuntien lukumäärän
c) kauanko valolla kuluu aikaa matkaan auringosta maahan 
   (keskietäisyydet riittävät).
d) valovuosi kilometreinä

Tulosta muuttujien arvot. Periaattessa tyyliin:

  int tunnissaSekunteja = 60*60;
  System.Console.WriteLine("Tunnissa sekunteja {0}",tunnissaSekunteja);

Palauta .cs-päätteinen tiedosto, joka sisältää tehtävää varten kirjoittamasi koodin.

B1. Pallojen pukkailu

Katso Voimia ja sitominen. Tee ohjelmasta sellainen, että voit "pukkailla" keskipalloa nuoli vasemmalle ja nuoli oikealle näppäimillä.

Palauta .cs-päätteinen tiedosto, joka sisältää tekemäsi koodin.

B2. Winston

Ota Khan Academyn Winston -esimerkki. Muuta koodi sellaiseksi, että se on muodossa

var Winston = function(x,y)
{
 // piirtää Winstonin naaman keskipisteen paikkaan (x,y)
 // ... nykyinen koodi muutettuna niin, että keskipiste
 // ... riippuu x:stä ja y:stä eli laske esim jokaiselle
 // ... y:lle muoto   y + vanhaY - 208
 // ... esim vasen silmä:
 // ... ellipse(x-50, y-57, eyeSize, eyeSize); 
};
Winston(200,208); // nykyinen
Winston(300,400); // toinen Winston

Palauta Winston.js -tiedosto, johon olet kopioinut toimivan koodin tuosta koodi-ikkunasta.

G1-2. Suppeneva laatikkojono

Jatketaan demo 2 tehtävää 5. Tee ohjelmasta sellainen, että se piirtää viiden laatikon sijaan n laatikkoa, vieläpä siten, että laatikot pienenevät. Tällöin i:nnen laatikon koko tulisi olla

(n+1-i) / n * laatikonKoko

eli esimerkiksi jos halutaan piirtää yhteensä 10 laatikkoa, niin 7:nnen laatikon koko on

10+1-7 / 10 = 4/10 * laatikonKoko

Palauta .cs-päätteinen tiedosto, joka sisältää tehtävää varten kirjoittamasi koodin.

TDD 1

Lisätehtävä "ammattilaisiksi" tähtääville.

Jos tarkistat vähintään kahden funktion toiminnan automaattisella testillä (ComTest), saat merkitä yhden lisäpisteen. Palauta DemoWWW:ssä tehtävänä TDD1 tekstitiedosto TDD.txt (jonka siis arvostelet yhden pisteen arvoiseksi), missä kerrot minkä tehtävän ja minkä funktion/funktioiden toiminnan testasit. Voit antaa samassa tiedostossa palautetta ja kehitysehdotuksia ComTestin käytöstä. Huom! Ohjelmia joissa on pelkkä pääohjelma on vielä tämän kurssin tiedoilla aika haastava testata, samoin esim. peli-juttuja. Siksi testaamista kannattaa ehkä tehdä tässä demoissa vain sellaisille funktioille, jotka selkeästi palauttavat jotakin. Tässä demossa sellaisia on tehtävässä 4. Siinä on kuitenkin kaksi funktiota testattavaksi, joten lisäpisteen tuon tehtävän testaamisella saa.