wiki:s2012/demot/demo3
Last modified 4 years ago Last modified on 2013-09-18 10:22:12

Demot » Demo 3, 1.10.2012

Demot palautetaan viimeistään maanantaina klo 13: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: https://trac.cc.jyu.fi/projects/ohj1/wiki/s2012/videohakemisto. Lisää vähintään 2-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.

Ville 1

Tee Ville-tehtävät: 3.1, 3.2, 3.4, 7.1 - 7.6.

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-bitib 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);

Miten tulostaisit lämpötilan pääohjelmassa?

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

HUOM: Jos teet tehtävän Visual Studiossa, niin tee ohjelmasi ConsoleApplication-mallin avulla (ei Jypeli-projektimallista). Kannattaa ehkä poistaa mallin mahdollisesti tekemä namespace. Ja lisätä "puuttuvat" public -sanat. Voit kirjoittaa samaan luokkaan monta funktiota (vrt: luentojen 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), ja muuta se sellaiseksi, että PiirraNelio voidaan kutsua kahdella eri tavalla (eli on kaksi eri PiirraNelio-aliohjelmaa eri parametrimäärillä). Muista kommentointi! Vinkki: aloita tekemällä aliohjelmalla jota voidaan kutsua tavalla b.

a) Ilman "sädettä", piirtää aina neliön, jonka sivu on 80  
   (parametrina siis keskipisteen koordinaatit) 
      PiirraNelio(this,0,0);
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.

Aluksi Jypelin pääohjelman (Begin) tulisi pysyä muuttumattomana portaiden piirtämiseksi. Kun tämä toimii, muuta kuitenkin Begin-metodia vielä niin, että piirretään vähintään yksi erikokoinen neliö portaiden ulkopuolelle.

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);

B1. Pallojen pukkailu

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

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

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.