wiki:s2013/demot/demo2
Last modified 4 years ago Last modified on 2013-12-15 16:44:36

Demot » Demo 2, 23.9.2013

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

Palauta tehtävät 1,2,3,4 ja B1 vapaamuotoisena txt-tekstitiedostona. Tehtävän 1 eri osat palauta samassa tiedostossa.

Video 1

Muista että voit saada demopisteitä myös indeksoimalla luento/demovideoita, ks: https://trac.cc.jyu.fi/projects/ohj1/wiki/s2013/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.

Tauno T1

Tee Taunolla- seuraavat tehtävät:

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

Ville V1

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

Tehtävä 1. Lausekkeiden arvot

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 (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. Binääriluvut

M: 25. 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?

Tehtävä 3. Algoritmi puhelinluettelosta hakemiselle

M: 3. Algoritmit: Kirjoita suomenkielinen (ei ohjelmointikielinen) algoritmi eli toimintaohje, jolla kuvaat, miten puhelinluettelosta etsitään tietyn henkilön puhelinnumero. Entä millaisella algoritmilla puhelinluettelosta löytyy tietyn numeron omistaja? Kumpi algoritmeista on nopeampi ja miksi? (Vinkki: Lue Luku 3).

Tehtävä 4. Algoritmit

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 ... mutta muussa tapauksessa ..."):

a) Tiskaaminen b) Kahvin keittäminen c) Ohjeet tämän demotehtävän palauttamiseksi

Tehtävä 5. Portaat

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

using Jypeli;

/// @author  Vesa Lappalainen, modified by (Oma nimesi).
/// @version 15.9.2012
///
/// <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();       // Seuraavia voi kutsua myös muodolla:
        PiirraNelio(this, 0, 0);    //   PiirraNelio(peli:this,x:0,y:0);
        PiirraNelio(this, 80, 80);  //   PiirraNelio(peli:this,x:80,y:80);
        // Täydennä ...
    }
}

Vinkki:: Katso 4. luennon LumiukkoAli, jossa piirretään pallo.

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

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

Tehtävä 6. Ympyrät kolmion muotoon

M: 6. Aliohjelmat: Kopioi ensin itsellesi kurssin Wiki-sivujen ohjeiden 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 nimelle Ympyrat.cs ja palauta tämä tiedosto. Vinkki: Piirrä paperille kolme toisiaan sivuavaa ympyrää ja niiden keskipisteiden muodostama kolmio. Laske kolmion korkeus (ks. System.Math.Sqrt). Yritä tehdä ohjelmasta sellainen, että ympyröiden säde on yhdessä ainoassa paikassa. Ja muuttamalla sädettä tulee täsmälleen samanlainen kuva, vain eri "mittakaavassa". Saat merkitä tehtävästä yhden pisteet vaikket tuossa "yleistämisessä" vielä onnistuisikaan.

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

B1. Harjoitustyö

Kurssille kuuluu harjoitustyö, mutta mitä harjoitustyössä sitten pitäisi tehdä? Jollei valmista peli-ideaa ole, tutustu aiempien vuosien tuotoksiin ja raportoi mietteesi kolmesta eri (Jypeli) pelistä yhteen tehtB1.txt-tiedostoon. Liitä mukaan myös linkki, mistä ko. pelin/videon löytää.

Alla linkkejä, mistä voi löytää peleihin liittyviä videoita ja itse pelejä:

Ohjelmointi 1, kevät 2012 (Youtube)

Ohjelmointi 1 Kevät 2011

Nuorten Peliohjelmointikurssi Mallipelejä

Nuorten pelikurssin pelejä, kesä 2012 (Youtube)

Tietokoneesta, johon on Jypeli asennettuna, löytyy käynnistä-valikosta Jypelin alta myös esimerkkipelejä(Jos ei toimi, klikkaa hiiren oikealla ja käynnistä järjestelmänvalvojana/run as administrator).

Katso myös video GalaxyTripin tekemisestä ja sen lähdekoodi.

B2. Alice ja puut

Joko Alice 2.3: Aloita avaamalla Alicen luisteluesimerkki Eli aloita luistelu-tutorial ja poistu siitä saman tien. Taustalla on puita. Laita kaksi niistä saapumaan luistelijan luo niin, että ensimmäinen saapuu 2 sekunnin aikana ja "kaatuu" 45 astetta vasemmalle sen jälkeen, kun toinen on saapunut. Ensimmäisen kaatumisen jälkeen toinen kaatuu 45 astetta oikealle. Tehtävän vastauksena palauta lisäämäsi "ohjelmarivit" tekstiksi kopioituna tyyliin

IceSkater.do simple spin

Tai Alice 3: Luo maailma missä on vähintään 3 "oliota". Sitten kuten edellä että kaksi saapuu sen kolmannen luo ja kaatuu kuten edellä.

B3. Innovaatio

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 (esim. se yksi MS kilpailun 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.

B4. Khan Academy ja Code Org

Tee Khan Academyn "luennot" Intro to Variables ja More on Variables. Kokeile lisätä koodiin joku oma muuttuja ja kokeile muutella sitä.

Kokeile myös Code.ogia

Tehtävän vastauksena palauta tiedosto tehtb4.txt jossa kerrot mielipiteitä Khan Academyn "luennoista" ja käytön järkevyydestä tällä kurssilla.

G1-2. Tippuvat suorakulmiot

Tee ohjelma nimeltä SuorakulmiotFysiikalla.cs. Tee siihen aliohjelma nimeltä PiirraSuorakulmio(), joka lisää ruudulle (peliin) PhysicsObject-tyyppisen suorakulmion. Tee aliohjelma siten, että se ottaa parametrinä 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 satunnaisen kokoista suorakaidetta satunnaiseen paikkaan. Vinkki: for-silmukka ja RandomGen.