wiki:s2011/demot/demo3
Last modified 6 years ago Last modified on 2011-11-01 18:26:02

Demot » Demo 3, 26.9.2011

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ä.

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

M: 25.4 Negatiiviset binääriluvut: Oletetaan että meillä on olemassa vain 8-bittisiä lukuja. Siihen tilaan on siis myös laskutoimituksen tuloksen mahduttava. Laske allekkain yhteen seuraavat binääriluvut huolellisesti muistinumerot kirjoittaen (myös vasemmanpuoleisesta parista ulos lähtevä muistinumero, vaikka ei tule muistinumeroa, laita silloin 0 niin jokaiselle bitille ja ulos lähtevälle muistinumerolle on oma arvo):

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 kohtien a) - d) summattavat luvut ja summat

e) kun 8-bitin koneessa on vain positiiviset luvut käytössä 
f) kun 8-bitin koneessa on negatiivisille luvuille käytössä 
   2-komplementti
g) Mitkä tulokset olivat oikeita e)-kohdan tapauksessa
h) Mitkä tulokset olivat oikeita f)-kohdan tapauksessa
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ä, milloin tuloksen
   voi todeta olevan oikein ja milloin väärin.

Tehtävä 2

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

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

M: 9. Aliohjelman paluuarvo. Katso netistä miten fahrenheitit muunnetaan celsius-asteiksi. Kirjoita (funktio)aliohjelma jota voidaan kutsua seuraavasti:

double lampotilaC;
lampotilaC = FahrenheitToCelsius(13);

Kirjoita vastaava kutsu funktiolle joka muuntaa mailit kilometreiksi. Kirjoita myös tuo funktio. Muista kirjoittaa aina asianmukaiset kommentit aliohjelmiin! Jos teet tehtävän Visual Studiossa, niin tee ohjelmasi ConsoleApplication-mallin avulla (ei Jypeli-projektimallista).

Tehtävä 5

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

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.

B1

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

G1-2

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