wiki:k2012/demot/demo2
Last modified 6 years ago Last modified on 2012-01-23 17:32:59

Demot » Demo 2, 23.1.2012

Demot palautetaan viimeistään maanantaina klo 7:30 mennessä kurssin NettiDemoWWW:llä https://www.mit.jyu.fi/demowww/ohj1k/. Voit palauttaa osan tai kaikki tehtäväsi etukäteenkin ja täydentää vastauksia määräaikaan mennessä. Demotehtävien palautuksessa kannattaa käyttää jotain muuta kuin Internet Exploreria (käytä esimerkiksi Mozilla Firefoxia), ainakin versio 9 toimii vähän huonosti.

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

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

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

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 

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

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

Tehtävä 4

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

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 16.1.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();
        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

Tehtävä 6

M: 6. Aliohjelmat: Kopioi ensin itsellesi kurssin Wiki-sivujen: https://trac.cc.jyu.fi/projects/ohj1/wiki/csharpCommandLine#a2.Lumiukko 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).

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

B1

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 2011

Nuorten Peliohjelmointikurssi Mallipelejä

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

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 toisen saapumisen jälkeen ja toinen kaatuu sitten 45 astetta oikealle. Tehtävän vastauksena palauta lisäämäsi "ohjelmarivit" tekstiksi kopioituna tyyliin

IceSkater.do simple spin

B3

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.

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.