wiki:k2015/demot/demo2
Last modified 3 years ago Last modified on 2015-01-25 08:36:43

Demot » Demo 2

Palauta demot ma klo 11:59 mennessä kurssin NettiDemoWWW:llä.

Palauta tehtävät 1, 2, 3, ja 6 vapaamuotoisena txt-tekstitiedostona, esim t1.txt, t2.txt, jne. Palauta tehtävän 1 eri osat samassa txt-tiedostossa.

Huomio: Pidä aina esillä kynä ja paperia. Koskee myös ohjausryhmiä.

Oppimistavoitteet

Tämän demokerran päätteeksi

  • osaat laskea lausekkeen arvon,
  • osaat sijoittaa (lausekkeen) arvon muuttujaan,
  • ymmärrät aliohjelmien perusajatuksen, ja osaat kirjoittaa itse yksinkertaisen aliohjelman,
  • muistat, miten kaksi- ja kymmenjärjestelmä liittyvät toisiinsa, ja osaat muuntaa 2-järjestelmän lukuja 10-järjestelmään

Tehtävä 1

Mieti ensin kustakin alakohdasta, että mitä ohjelma tekee. Kirjoita päätelmäsi ylös ja kokeile vasta sitten itse ohjelmaa. Ohjelmakoodin lukeminen on tärkeä taito.

a) Olkoon meillä seuraavanlainen pääohjelma. (Pääohjelma kirjoitetaan tietenkin luokan sisään. Tee luokka omatoimisesti.):

/// <summary>
/// Pääohjelmassa alustetaan muuttujia ja tulostetaan muuttujan sisältö.
/// </summary>
/// <param name="args">Ei käytössä.</param>
public static void Main(string[] args)
{
    int a = 1;
    int b = 2;
    int c = 3;
    int x = a + b * ((2 - c) / a + b);
    System.Console.WriteLine(x);
}

Mitä viimeinen rivi (ennen aaltosulkua) tulostaa?

b) Miten tuloste muuttuisi, jos kaikki sulut otettaisiin pois riviltä

int x = a + b * ((2 - c) / a + b);

c) Muutetaan pääohjelmaa seuraavasti:

/// <summary>
/// Pääohjelmassa alustetaan muuttujia ja tulostetaan muuttujan sisältö.
/// </summary>
/// <param name="args">Ei käytössä.</param>
public static void Main(string[] args) {
  int a = 0;
  int b = 2;
  int c = 3;
  int x = a + b * ((2 - c) / a + b);
}

Mikä ongelma tässä tulee? Mieti, ennen kuin käännät ohjelman. Kun ajat ohjelman, mitä huomaat?

d) Tehdään seuraavanlainen pääohjelma:

/// <summary>
/// Asetetaan muuttujan arvo ja tulostetaan luku.
/// </summary>
/// <param name="args">Ei käytössä</param>
public static void Main(string[] args) {
  int c = 3;
  System.Console.WriteLine(c + 1);
}

Mitä ohjelma tulostaa? Mikä on c:n arvo viimeisen rivin jälkeen?

Tehtävä 2

Tee sekä a- että b-kohta.

(a) M: 3. Algoritmit: Kirjoita suomenkielinen (ei ohjelmointikielinen) algoritmi eli toimintaohje, jolla kuvaat, miten puhelinluettelosta etsitään tietyn henkilön nimi. Entä millaisella algoritmilla puhelinluettelosta löytyy tietyn numeron omistaja? Kumpi algoritmeista on nopeampi ja miksi? (Vinkki: Lue http://users.jyu.fi/~vesal/kurssit/ohj2/moniste/html/m.htm luku 4).

Ohje tehtävän palauttamiseksi: Algoritmi (eli toimintaohje) kuvataan usein perättäisinä askeleina, joita edetään ylhäältä alaspäin, tai tarvittaessa toistaen. Sinun pitäisi siis kirjoittaa tällainen toimintaohje perättäisinä askelina. Esimerkiksi, kuvitteellinen siirtyminen Agoran ala-aulasta työhuoneeseen voitaisiin kuvata seuraavilla askeleilla.

  1. Mene C-siiven portaiden juurelle.
  2. Kävele kerros ylöspäin.
  3. Jos olet kerroksessa nro 4, mene seuraavaan kohtaan. Muuten, palaa kohtaan 2.
  4. Kävele eteenpäin, kunnes näet huoneen C414.2. Olet perillä.

(b) M: 3. Algoritmit: Pitäydy tässä tehtävässä vielä irti C#:sta ja muista ohjelmointikielestä. Kuvaile suomen kielellä tai korkeintaan pseudokoodilla, miten jakaisit seuraavat tehtävät yhtä pykälää tarkemmiksi osatehtäviksi. Jaa sitten vielä kukin osatehtävä seuraavalle tasolle pienemmiksi osatehtäviksi. Käytä jotakin luonnollisia ilmauksia toistolle ja päätöstilanteille ("jos ... niin ... muuten ..."):

  • a. Tiskaaminen
  • b. Kahvin keittäminen
  • (b2. Jos osaat: Espresson tekeminen)
  • c. Ohjeet tämän demotehtävän palauttamiseksi

Tehtävä 3

Tee kaikki kohdat.

M: 7.3.2. Muuttujan arvon muuttaminen

(a) Mitä seuraava pääohjelma tulostaa? (Mieti ensin, kirjoita sitten vastaus, ja kokeile vasta sen jälkeen kirjoittaa vastaava koodi.)

public static void Main()
{
    int a = 5;
    int b = a;
    b++;
    System.Console.WriteLine(a);
    System.Console.WriteLine(b);
}

(b) Lisää viimeisen tulostuslauseen jälkeen seuraavat rivit.

a = b;
a = 15;

Paljonko on b:n arvo nyt?

(c) Lisää vielä edellisten rivien perään seuraavat rivit.

double c = b + a;
System.Console.WriteLine("Summa on " + c);

Tuleeko ongelmia? Mitä tulostuu?

Tehtävä 4

M: 6. Aliohjelmat: Täydennä alla oleva ohjelma Portaat.cs toimimaan kuten kommenteissa on sanottu. Vinkki: Shape.Rectangle.

using Jypeli;

/// @author  Antti-Jussi Lakanen, modified by (Oma nimesi).
/// @version 21.1.2014
///
/// <summary>
/// Ohjelma piirtää viisi neliötä (sivun pituus 80) siten, että
/// ensimmäisen neliön keskipiste on origossa, ja viimeisen
/// neliön keskipiste pisteeessä (320, 320).
/// </summary>
public class Portaat : PhysicsGame
{
    /// <summary>
    /// Pääohjelmassa laitetaan "peli" käyntiin.
    /// </summary>
    /// <param name="args">Ei käytössä</param>
    public static void Main(string[] args)
    {
        using (Portaat game = new Portaat())
        {
            game.Run();
        }
    }
    /// <summary>
    /// Aliohjelma piirtää ruutuun yhden neliön, jonka
    /// sivun pituus on 80, ja keskipiste on (x, y).
    /// </summary>
    /// <param name="peli">Peli, johon neliö piirretään</param>
    /// <param name="x">Neliön keskipisteen x-koordinaatti.</param>
    /// <param name="y">Neliön keskipisteen y-koordinaatti.</param>
    public static void PiirraNelio(PhysicsGame peli, double x, double y)
    {
        // Täydennä ...
    }

    /// <summary>
    /// Kutsutaan PiirraNeliota muutaman kerran.
    /// </summary>
    public override void Begin()
    {
        Camera.ZoomToLevel();
        PiirraNelio(this, 0, 0);
        PiirraNelio(this, 80, 80);
        // Täydennä ...
    }
}

Tuloksen pitäisi näyttää tältä

https://trac.cc.jyu.fi/projects/ohj1k11/attachment/wiki/demot/demo2-luonnos/laatikot.png

HUOM! Jos teet tehtävän Visual Studiossa (Jypeli-projektimallista luonnollisesti), niin poista Main-pääohjelma peliluokasta (tai älä copy-pasteta sitä yo. koodista), sillä se on valmiina Ohjelma.cs-tiedostossa.

Tehtävä 5

M: 6. Aliohjelmat: Kopioi ensin itsellesi ohjeen mukaan Jypeli-kirjasto. Tee ja aja mallin mukainen ohjelma, joka piirtää lumiukon kuvaruudun alareunaan. Ensin muuta ohjelma sellaiseksi, että yksittäisen pallon piirtämiseksi on oma aliohjelma PiirraPallo. Mieti, mitä parametreja pallon piirtämiseksi tarvitaan. Muuta sitten ohjelma sellaiseksi, että se piirtää kuusi ympyrää kolmeen riviin siten, että ympyrät juuri koskettavat toisiaan. Alla mallikuva ratkaisusta. Anna ympyröille säteeksi 50. Tallenna nimellä Ympyrat.cs ja palauta tämä tiedosto. Vinkki: Piirrä kynällä paperille kolme toisiaan sivuavaa ympyrää ja niiden keskipisteiden muodostama kolmio. Laske kolmion korkeus (ks. System.Math.Sqrt).

https://trac.cc.jyu.fi/projects/ohj1k11/attachment/wiki/demot/demo1/d1-pallot.png

Lisätehtävä (+ 1 bonuspiste): Tee ohjelmasta sellainen, että ympyröiden säde on yhdessä ainoassa paikassa. Ja muuttamalla sädettä (eli yhtä lukua yhdestä paikasta) tulee täsmälleen samanlainen kuva, vain eri "mittakaavassa". Jos teet myös lisätehtävän, saat merkitä tästä tehtävästä 2 pistettä. Kahteen pisteeseen kuitenkin vaaditaan, että et ole "arvannut" ympyröiden paikkoja.

Tehtävä 6

M: 26. Lukujen esitys tietokoneessa. Binäärilukujärjestelmässä on kaksi numeroa, nolla ja yksi. Tätä sanotaan bitiksi (binary digit). Vähiten merkitsevä eli viimeisimmäksi kirjoitettu bitti tarkoittaa lukumäärää yksi, toiseksi vähiten merkitsevä bitti lukumäärää kaksi, kolmanneksi vähiten merkitsevä lukumäärää neljä ja niin edelleen aina kakkosen potensseja jatkaen (8, 16, 32, 64, ...). Kokonaisen binääriluvun ilmoittama lukumäärä saadaan kun summataan nämä yksittäisten bittien ilmoittamat lukumäärät toisiinsa. Esimerkiksi binääriluku 1000101 olisi kymmenjärjestelmässä

1*64 + 0*32 + 0*16 + 0*8 + 1*4 + 0*2 + 1*1 == 69

Muunna seuraavat binääriluvut ihmiselle tutumpaan 10-järjestelmään:

10010 
1001110001 
1000000000000000 
1010101010101011 
10000000000000001 
10000000000000010 
10000000000000011 

Muista vastaukseen laittaa myös aukilaskettuna se, miten sait tuloksen. Pelkkä numero ei riitä.

Nykytietokoneissa on tyypillistä jakaa muisti kahdeksan bitin mittaisiin tallennuspaikkoihin eli tavuihin (byte). Mikä on suurin kokonaisluku, jonka voit tallentaa kahden tavun (eli 16 bitin) kokoiseen tilaan (oletetaan että negatiivisia lukuja ei tarvitse esittää)? Entäpä jos pitää voida esittää positiivisia ja negatiivisia lukuja: mikä silloin on toisaalta pienin ja toisaalta suurin luku, joka kahden tavun kokoiseen tilaan mahtuu?

Tauno T1

Tee Taunolla- seuraavat tehtävät:

  1. Laske yhteen taulukon luvut.
  2. Laske yhteen taulukon parillisissa paikoissa olevat luvut.

Kokeilla ohjelmien oikeellisuutta: voit tehdä sen ajamalla nämä Timissä.

Taunojen palautus: Kopioi Taunon tekemä "koodi" tiedostoon tauno.txt. Kirjoita vielä tiedoston perään lyhyesti, että mitä opit Taunolta. Muista, että Tauno on vielä prototyypin prototyyppi.

Ville V1

Tee Villestä tehtävät 2.2--2.6 ja 6.1--6.4. Muodollinen parametri on "turkulaisten kielessä" aliohjelman esittelyrivillä oleva muuttujan nimi, ja todellinen parametri sille kutsussa sijoitettu arvo. Lue huolella kohta 1.4 Ville-tehtävien palautus NettiDemoWWW:llä.

B1

Tee Khan Academyn neljä "luentoa" Intro to Variables, Review Variables, Challenge: Bucktooth Bunny ja More on Variables. Neljännessä tehtävässä (More on Variables) piirrä Winstonille hattu.

Tehtävän vastauksena palauta tiedosto tehtb1.txt johon copy-pasteta koodi neljännestä tehtävästä. Kirjoita perään lyhyt oppimispäiväkirja (mitä teit, mitä opit, jäikö jotain epäselvää, sekä vapaa sana Khan Academyn käytöstä ohjelmoinnin opetuksessa).

B2

Innovoi jokin ongelma/idea jonka voisi ratkaista ohjelmateknisesti/järjestelmällä jossa ohjelmateknisellä ratkaisulla on oma roolinsa. Palauta tekstitiedostona tehtb3.txt, johon olet kirjoittanut lyhyen selostuksen ongelmasta ja sen ratkaisuideasta. Muista että idea voi olla hyvinkin lennokas (esimerkiksi Microsoftin opiskelijakilpailun voittajasovellus auttoi säästämään 50 % kasteluvettä Australiassa). Saat merkitä itsellesi 1 demopisteen jos idea on sinunkin mielestäsi OIKEASTI hyvä. Tekijänoikeus säilyy keksijällä. AMK:ssa tällaisella kyselyllä syntyi useita jatkokehitykseen menneitä innovaatioita.

G1-2

Tee ohjelma nimeltä SuorakulmiotFysiikalla.cs. Tee siihen aliohjelma nimeltä PiirraSuorakulmio(), joka lisää ruudulle (peliin) PhysicsObject-tyyppisen suorakulmion. Tee aliohjelma siten, että se ottaa parametrina pelin, suorakaiteen koordinaatit ja mitat. Laita peliin vielä painovoima seuraavasti (2d-vektori ottaa vastaan kaksi koordinaattia) ja sijoita se Begin()-aliohjelmaan

Gravity = new Vector(/*täydennä 2d-vektorin parametrit...*/);

Vector-luokan dokumentaatio.

ja laita kenttään reunat, etteivät palaset putoile ulos ruudusta.

Level.CreateBorders();

Lisää kentälle 100 eri kokoista suorakaidetta. Vinkki: for-silmukka ja RandomGen.