Näytelmä aliohjelman kutsumisesta

Katso 13.10.2014 esityksen vasemmasta reunasta kuvattu video.

Esitys 13.10.2014

Vanhat videot ja kuvat

Rekvisiitta

Tarvitaan yksi Visual Studion käyttäjä (D, Vesa)

Tarvitaan 5 näyttelijää:

  • S: int Suurempi(int a, int b) - osaa palauttaa suuremman kahdesta luvusta (Simo -2013, Riikka 2014)
  • N: new - osaa varata tilaa ja alustaa nollilla (Paavo rooli)
  • V: void VaihdaSuurin(int[] t, int a) - osaa etsiä suurimman luvun paikan ja korvata sen a:lla (Matti)
  • W: void Console.WriteLine(int a) - osaa tulostaa yhden kokonaisluvun taululle. (Atte)
  • M: main - pääohjelma joka pyytää muita hommiin (Vesa)

Tarvikkeet:

  • Yksi tietokone, josta tykillä heijastetaan ruutu
  • nippu tyhjiä A4:ia
  • väh. 2 kpl paksuja tusseja joilla voi kirjoittaa
  • jokaisella näyttelijällä oma nimikyltti kaulassa
  • taulu, johon tulee muuttujien "nimet" ja jossa on "ruudukko", josta voidaan varata 4 kokonaislukua
  • sinitarraa, jolla lappuja voidaan liimata taululle

askeltaa -linkeistä pääsee katsomaan miltä Visual Studion pitäisi näyttää milläkin hetkellä ja sitten voi palata takaisin. Debuggaukset ovat myös [wiki:s2012/kutsudebug yhdellä sivulla].

Koodi

Koodi näytetään Visual Studiolla tykillä


014     public static void Main(string[] args)
015     {
016         int a = 4, b = 5;
017         int iso;
018 
019         iso = Suurempi(a, b);
020         Console.WriteLine(iso);
021 
022         iso = Suurempi(iso+1, 7 / 3 + 5 / 2);
023         Console.WriteLine(iso);
024 
025         int[] luvut = new int[4];
026         int[] m = luvut;
027 
028         luvut[2] = 4;
029         luvut[1] = 6;
030         m[3] = iso+3;
031 
032         VaihdaSuurin(luvut, 5);
033 
034         Console.WriteLine(String.Join(" ",luvut));
035     }
036 
037 
052     public static int Suurempi(int luku1, int luku2)
053     {
054         if (luku1 >= luku2) return luku1;
055         return luku2;
056     }
057 
058 
085     public static void VaihdaSuurin(int[] t, int korvaavaArvo)
086     {
087         int paikka = -1;
088         int suurin = int.MinValue;
089         for (int i = 0; i < t.Length; i++)
090         {
091             int luku = t[i];
092             if (luku > suurin)
093             {
094                 suurin = luku;
095                 paikka = i;
096             }
097         }
098 
099         if (paikka < 0) return;
100         t[paikka] = korvaavaArvo;
101     }

1. Lähtötilanne

Taululle on piirretty tilanne pääohjelman rivillä 15.

   Pino                       Keko                       Tulostus  

       --------                --------
agrs   | 231  |          231   ||  0 ||
       --------                --------
a      |   0  |          232   |   0  |
       --------                --------
b      |   0  |          233   |   0  |
       --------                --------
iso    |   0  |          234   |   0  |
       --------                --------
luvut  |   0  |          235   |   0  |
       --------                --------
m      |   0  |          236   |   0  |
       --------                --------
                         237   |   0  |
                               --------
                         238   |   0  |
                               --------
                         239   |   0  |
                               --------
  • D: Laittaa näkyviin ikkunat: Watch, Locals, Call Stack, Registers. Piilota koodista kommentit.

2. Muuttujien esittely ja tilanvaraus

  • D: Askeltaa rivit 16-18

     016         int a = 4, b = 5;
     017         int iso;
     018 
     019         iso = Suurempi(a, b);
  • M: Muuttaa samalla taululla olevien muistipaikkojen arvoja, lopputilanne:

        Pino                       Keko
    
            --------                --------
     agrs   | 231  |          231   ||  0 ||
            --------                --------
     a      |   4  |          232   |   0  |
            --------                --------
     b      |   5  |          233   |   0  |
            --------                --------
     iso    |   0  |          234   |   0  |
            --------                --------
     luvut  |   0  |          235   |   0  |
            --------                --------
     m      |   0  |          236   |   0  |
            --------                --------
                              237   |   0  |
                                    --------
                              238   |   0  |
                                    --------
                              239   |   0  |
                                    --------

3. Aliohjelman kutsu

  • D: Askeltaa riville 19

     019         iso = Suurempi(a, b);
  • M: "Nyt pitäisi tietää kumpiko näistä a ja b on suurempi."

  • S: Vilkuttaa iloisena

  • M: Meillä näyttää tuolla olevan valmis aliohjelma, joka osaa sen selvittää. Mitähän se haluaa tietää homman tekemiseksi?"

  • M: Menee lukemaan S:n esittelyriviä. "Ai kaksi kokonaislukua. Ja se näköjään palauttaa kokonaisluvun. Kutsutaampa sitä."

  • M: Ottaa kolme paperia ja kirjoittaa ensimmäiseen luvun 4 ja pistää sen pöydälle. Kirjoittaa toiseen luvun 5 ja pistää se pöydälle edellisen päälle. Kirjoittaa kolmanteen luvun 19 (rivinumero johon palataan) ja laittaa sen edellisten päälle.

        --------
        |   4 --------
        ------|  5   --------
              -------|   19 | 
                     --------
  • M: Ottaa kolmen paperin pinon ja vie sen S:lle.

  • D: Askeltaa riville 53

     052     public static int Suurempi(int luku1, int luku2)
     053     {
  • S: Ottaa pinon vastaan ja liimaa ne järjestyksessä taululle ja antaa niiden viereen liidulla nimet samassa järjestyksessä

        Pino                       Keko                       Tulostus  
    
            --------                --------
     agrs   | 231  |          231   ||  0 ||
            --------                --------
     a      |   4  |          232   |   0  |
            --------                --------
     b      |   5  |          233   |   0  |
            --------                --------
     iso    |   0  |          234   |   0  |
            --------                --------
     luvut  |   0  |          235   |   0  |
            --------                --------
     m      |   0  |          236   |   0  |
            --------                --------
                              237   |   0  |
                                    --------
            --------          238   |   0  |
     paluu  |  19  |                --------
            --------          239   |   0  |
     luku2  |   5  |                --------
            --------
     luku1  |   4  |                
            --------
  • D: Askeltaa riville 54

     054         if (luku1 >= luku2) return luku1;
  • S: Pähkäilee luku1:n ja luku2:n kanssa että kumpiko on suurempi. Kun tulos selviää, kirjoittaa suuremman arvon tulospaperille.

  • D: Askeltaa riville 56 ja näyttää että tulos on EAX-rekisterissä.

     056     }
  • S: Poistaa taululta luku1:n ja luku2:n. Ottaa paluu-lapun, katsoo siinä olevan numeron (näyttää myös yleisölle) ja heittää kaikki kolme alkuperäistä lappua roskiin.

        --------
        |   5  |
        --------
  • S: kävelee M:n luo, sanoo että "jatka riviltä 19 ja tuossa on tulos" ja ojentaa tulos-lapun M:lle.

  • M: Ottaa tuloslapun, katsoo siinä olevan arvon ja kirjoittaa sen iso-muuttujan arvoksi taululle.

  • D: Askeltaa riville 19

     019         iso = Suurempi(a, b);
  • S: mene oven luokse, ripustaa nimilapun oven kahvaan, menee oven taakse ja odottaa siellä lisää tehtäviä

        Pino                       Keko                       Tulostus  
    
            --------                --------
     agrs   | 231  |          231   ||  0 ||
            --------                --------
     a      |   4  |          232   |   0  |
            --------                --------
     b      |   5  |          233   |   0  |
            --------                --------
     iso    |   5  |          234   |   0  |
            --------                --------
     luvut  |   0  |          235   |   0  |
            --------                --------
     m      |   0  |          236   |   0  |
            --------                --------
                              237   |   0  |
                                    --------
                              238   |   0  |
                                    --------
                              239   |   0  |
                                    --------

4. Tulostaminen

  • D: Askeltaa riville 20.

     020         Console.WriteLine(iso);
  • M: Nyt pitäisi tulostaa. Ottaa kaksi lappua, kirjoittaa toiseen "ison" arvon (5) ja toiseen 20 ja antaa ne W:lle.

        --------
        |  5   --------
        -------|   20 | 
               --------
  • W: piirtää taululle toisen lapun arvon (5) ja katsoo toisesta (ja näyttää yleisölle 20) mistä käskee M:n jatkaa. Heittää laput roskiin.

  • W: tulee M:n luo ja sanoo: "Jatka riviltä 20"

5. Toisen aliohjelman kutsu

  • D: Askeltaa riville 22.

     022         iso = Suurempi(iso+1, 7 / 3 + 5 / 2);
  • M: "Nyt pitäisi tietää kumpiko on suurempi iso+1 vai hirvee lasku. Meillä näyttää tuolla olevan valmis aliohjelma joka osaa sen selvittää. Mitähän se haluaa parametriksi. Ai kaksi kokonaislukua. Ja se näköjään palauttaa kokonaisluvun. Kutsutaampa sitä."

  • M: Ottaa kolme paperia ja laskee iso+1 kirjoitaa sen (6) paperille ja pistää sen pöydälle. Laskee toisen luvun (7/3+5/2 = 2+2 = 4), kirjoittaa toiseen luvun 4 ja pistää se pöydälle edellisen päälle. Kirjoittaa kolmanteen luvun 22 (rivinumero johon palataan) ja laittaa sen edellisten päälle.

        --------
        |   6 --------
        ------|  4   --------
              -------|   22 | 
                     --------
  • M: Ottaa kolmen paperin pinon ja työntää sen oven alta S:lle.

  • S: Kirjoittaa paluu lapulle suuremman arvon (6)

        --------
        |   6  |
        --------
  • S: työntää paluulapun oven alta ja sanoo että jatka riviltä 22 ja tuossa on tulos ja ojentaa tulos-lapun M:lle.

     022         iso = Suurempi(iso, 7 / 3 + 5 / 2);
  • M: Ottaa tuloslapun, katsoo siinä olevan arvon (6) ja kirjoittaa sen iso-muuttujan arvoksi taululle.

  • S: voi poistua oven takaa

        Pino                       Keko                       Tulostus  
    
            --------                --------                     5
     agrs   | 231  |          231   ||  0 ||
            --------                --------
     a      |   4  |          232   |   0  |
            --------                --------
     b      |   5  |          233   |   0  |
            --------                --------
     iso    |   6  |          234   |   0  |
            --------                --------
     luvut  |   0  |          235   |   0  |
            --------                --------
     m      |   0  |          236   |   0  |
            --------                --------
                              237   |   0  |
                                    --------
                              238   |   0  |
                                    --------
                              239   |   0  |
                                    --------
  • D: Askeltaa riville 23

     023         Console.WriteLine(iso);
  • M: Nyt pitäisi taas tulostaa. Ottaa kaksi lappua, kirjoittaa toiseen "ison" arvon (6) ja toiseen 23 ja vie ne W:lle.

  • W: piirtää taululle toisen lapun arvon (6) ja katsoo toisesta mistä käskee M:n jatkaa. Heittää laput roskiin.

  • W: tulee M:n luo ja sanoo: "Jatka riviltä 23"

  • D: Askeltaa riville 24

6 Taulukon luominen

  • D: Askeltaa riville 25

     025         int[] luvut = new int[4];
  • M: "Nyt tarviis saada taulukko."

  • N: new (vilkuttelee iloisesti)

  • M: "Haa, new osaa varmaan sen mulle antaa".

  • M: Ottaa paperin

  • M: "4 voi olla hyvä koko"

  • M: kirjoittaa yhdelle paperille 4 ja toiselle 25 ja vie kasan new:lle

        --------
        |  4   --------
        -------|   25 | 
               --------
  • M: "inttejä tarviisin"

  • N: ottaa kasan vastaan. Tiirailee taululle. Katsoo koon toisesta lapusta (ja näyttää yleisölle 4).

  • N: "Vaikka 234 kohdasta näyttäisi olevan 4 paikkaa vapaata"

  • N: Kehystää taululla 234-238 raamilla. Kirjoittaa uudelle paperille 234. Katsoo alkuperäisistä papereista paluuosoitteen (ja näyttää yleisölle 25) ja heittaa kaksi alkuperäistä paperia roskiin.

  • N: kävelee M:n luo, ojentaa paperin 234 ja sanoo "jatka riviltä 25".

  • M: ottaa paperin, kirjoittaa luvut-kohtaan 234 ja heittää paperin roskiin.

        Pino                       Keko                       Tulostus  
    
            --------                --------                     5
     agrs   | 231  |          231   ||  0 ||                     6
            --------                --------                       
     a      |   4  |          232   |   0  |
            --------                --------
     b      |   5  |          233   |   0  |
            --------                ======
     iso    |   6  |          234   ||  4 ||
            --------                --------
     luvut  | 234  |          235   ||  0 ||
            --------                --------
     m      |   0  |          236   ||  0 ||
            --------                --------
                              237   ||  0 ||
                                    --------
                              238   ||  0 ||
                                    ======
                              239   |   0  |
                                    --------

7. Toisen viitteen tekeminen

  • D: Lisää Watch-ikkunaan luvut ja avaa se

  • D: Askeltaa riville 26

     026         int[] m = luvut;
  • M: menee taululle, katsoo luvut kohdassa olevan arvon

  • M: "234"

  • M: kirjoittaa 234 m-paikkaan.

        Pino                       Keko                       Tulostus  
    
            --------                --------                     5
     agrs   | 231  |          231   ||  0 ||                     6
            --------                --------
     a      |   4  |          232   |   0  |
            --------                --------
     b      |   5  |          233   |   0  |
            --------                ======
     iso    |   6  |          234   ||  4 ||
            --------                --------
     luvut  | 234  |          235   ||  0 ||
            --------                --------
     m      | 234  |          236   ||  0 ||
            --------                --------
                              237   ||  0 ||
                                    --------
                              238   ||  0 ||
                                    ======
                              239   |   0  |
                                    --------

8. Taulukon arvojen laittaminen

  • D: Askeltaa riville 28

     028         luvut[2] = 4;
  • M: "siis 4 pitäisi laittaa siihen taulukkoon joka alkaa 234:sta ja sen paikkaan 2"

  • M: laskee paikasta 235 kaksi paikkaa eteenpäin ja päätyy paikkaan 237. Kirjoittaa sinne 4.

  • D: Askeltaa riville 29

     029         luvut[1] = 6;
  • M: "siis 6 pitäisi laittaa siihen taulukkoon joka alkaa 234:sta ja sen paikkaan 1"

  • M: laskee paikasta 235 yhden paikan eteenpäin ja päätyy paikkaan 236. Kirjoittaa sinne 6.

  • D: Askeltaa riville 30

     030         m[3] = iso+3;
  • M: "Kappas, m on paikassa 234, siis tuon laskun tulos pitäisi laittaa siihen taulukkoon joka alkaa 234:sta ja sen paikkaan 3"

  • M: "lasketaampas: iso+3 = 6+3 = 9, eli 9 pitäisi laittaa sinne"

  • M: laskee paikasta 235 kolme eteenpäin ja päätyy paikkaan 238. Kirjoittaa sinne 9.

        Pino                       Keko                       Tulostus  
    
            --------                --------                     5
     agrs   | 231  |          231   ||  0 ||                     6
            --------                --------
     a      |   4  |          232   |   0  |
            --------                --------
     b      |   5  |          233   |   0  |
            --------                ======
     iso    |   6  |          234   ||  4 ||
            --------                --------
     luvut  | 234  |          235   ||  0 ||
            --------                --------
     m      | 234  |          236   ||  6 ||
            --------                --------
                              237   ||  4 ||
                                    --------
                              238   ||  9 ||
                                    ======
                              239   |   0  |
                                    --------

9. Taulukko-aliohjelman kutsuminen

  • D: Askeltaa riville 32

     032         VaihdaSuurin(luvut, 5);
  • M: "Nyt pitäisi saada suurin vaihdettua viitokseksi?"

  • V: vilkuttelee iloisena

  • M: "Ahaa tuolla on sellainen joka sen osaa, mitäs se haluaa tietoja? Taulukon viitteen ja korvaavanArvon. Selvä!"

  • M: Kirjoittaa 1. paperille 234, toiselle 5 ja kolmannelle 32.

        --------
        | 234 --------
        ------|  5   --------
              -------|   32 | 
                     --------
  • M: Vie paperipinon V:lle.

  • V: Ottaa pinon ja liimaa ne taululle sekä samalla vielä tekee neljä paikkaa lisäksi:

        Pino                       Keko                       Tulostus 
    
            --------                --------                     5
     agrs   | 231  |          231   ||  0 ||                     6
            --------                --------
     a      |   4  |          232   |   0  |
            --------                --------
     b      |   5  |          233   |   0  |
            --------                ======
     iso    |   6  |          234   ||  4 ||
            --------                --------
     luvut  | 234  |          235   ||  0 ||
            --------                --------
     m      | 234  |          236   ||  6 ||
            --------                --------
                              237   ||  4 ||
                                    --------
            --------          238   ||  9 ||
     luku   |   0  |                ======
            --------          239   |   0  |
     i      |   0  |                --------
            --------
     suurin |   0  |                
            --------
     paikka |   0  |                
            --------
     paluu  |  32  |                
            --------
     korvaa |   5  |                
            --------
     t      | 234  |                
            --------
  • D: Askeltaa riville 86

     085     public static void VaihdaSuurin(int[] t, int korvaavaArvo)
     086     {
  • V: "Pitäisi etsiä ensin suurimman paikka että tietää missä vaihdetaan". "Kun ei ole mitään veilä tehty, niin olkoon paikka -1". "Ja kun suurinta ei tiedetä, niin pistetään siihen tosi huono luku"

  • D: Askeltaa riville 89

     089         for (int i = 0; i < t.Length; i++)
    
    
        Pino                       Keko                       Tulostus  
    
            --------                --------                     5
     agrs   | 231  |          231   ||  0 ||                     6
            --------                --------
     a      |   4  |          232   |   0  |
            --------                --------
     b      |   5  |          233   |   0  |
            --------                ======
     iso    |   6  |          234   ||  4 ||
            --------                --------
     luvut  | 234  |          235   ||  0 ||
            --------                --------
     m      | 234  |          236   ||  6 ||
            --------                --------
                              237   ||  4 ||
                                    --------
            --------          238   ||  9 ||
     luku   |   0  |                ======
            --------          239   |   0  |
     i      |   0  |                --------
            --------
     suurin | -2147|                
            --------
     paikka |  -1  |                
            --------
     paluu  |  32  |                
            --------
     korvaa |   5  |                
            --------
     t      | 234  |                
            --------

Seuraavaa toistetaan kunnes i >= 4:

  • V Katsoo i:n arvon ja toteaa että i< 4

  • D: Askeltaa riville 91

     091             int luku = t[i];
  • V "Pitäisi mennä siis paikasta 234 i pykälää eteenpäin ja ottaa siellä oleva arvo ja laittaa muuttujaan luku."

  • V Hakee arvon ja kirjoittaa arvon muuttujaan luku

  • D: Askeltaa riville 92

     092             if (luku > suurin)
  • V Vertailee arvoja ja päättää mitä tehdään

  • D: Askeltaa riville 96

  • D: Askeltaa riville 89

     089         for (int i = 0; i < t.Length; i++)
  • V kasvattaa i:n arvoja ja jatkaa silmukkaa

  • D: Askeltaa riville 96

  • D: Askeltaa riville 96

  • D: Askeltaa riville 89

Kun silmukka tehty

       Pino                       Keko                       Tulostus  
                                                             
           --------                --------                     5
    agrs   | 231  |          231   ||  0 ||                     6
           --------                --------
    a      |   4  |          232   |   0  |
           --------                --------
    b      |   5  |          233   |   0  |
           --------                ======
    iso    |   6  |          234   ||  4 ||
           --------                --------
    luvut  | 234  |          235   ||  0 ||
           --------                --------
    m      | 234  |          236   ||  6 ||
           --------                --------
                             237   ||  4 ||
                                   --------
           --------          238   ||  9 ||
    luku   |   9  |                ======
           --------          239   |   0  |
    i      |   4  |                --------
           --------
    suurin |   9  |                
           --------
    paikka |   3  |                
           --------
    paluu  |  32  |                
           --------
    korvaa |   5  |                
           --------
    t      | 234  |                
           --------
  • D: Askeltaa riville 99

     099         if (paikka < 0) return;
  • V "paikka >= 4, ei lähdetä pois"

  • D: Askeltaa riville 100

     100         t[paikka] = korvaavaArvo;
  • V "Eli pitäisi mennä 234:ta alkavaa taulukkoa 3 eteenpäin ja laittaa sinne arvo 5".

  • V laittaa 5:n paikkaan 238:

        Pino                       Keko                       Tulostus  
    
            --------                --------                     5
     agrs   | 231  |          231   ||  0 ||                     6
            --------                --------
     a      |   4  |          232   |   0  |
            --------                --------
     b      |   5  |          233   |   0  |
            --------                ======
     iso    |   6  |          234   ||  4 ||
            --------                --------
     luvut  | 234  |          235   ||  0 ||
            --------                --------
     m      | 234  |          236   ||  6 ||
            --------                --------
                              237   ||  4 ||
                                    --------
            --------          238   ||  5 ||
     luku   |   9  |                ======
            --------          239   |   0  |
     i      |   4  |                --------
            --------
     suurin |   9  |                
            --------
     paikka |   3  |                
            --------
     paluu  |  32  |                
            --------
     korvaa |   5  |                
            --------
     t      | 234  |                
            --------
  • D: Askeltaa riville 101

  • V ottaa omat "muuttujat" pois ja katsoo paluuosoitteen 32

  • D: Askeltaa riville 32

     032         VaihdaSuurin(luvut, 5);
  • V menee M:n luo ja sanoo "jatka 32".

        Pino                       Keko                       Tulostus  
    
            --------                --------                     5
     agrs   | 231  |          231   ||  0 ||                     6
            --------                --------
     a      |   4  |          232   |   0  |
            --------                --------
     b      |   5  |          233   |   0  |
            --------                ======
     iso    |   6  |          234   ||  4 ||
            --------                --------
     luvut  | 234  |          235   ||  0 ||
            --------                --------
     m      | 234  |          236   ||  6 ||
            --------                --------
                              237   ||  4 ||
                                    --------
                              238   ||  5 ||
                                    ======
                              239   |   0  |
                                    --------
  • D: Askeltaa riville 34

     034         Console.WriteLine(String.Join(" ",luvut));
  • M "nyt pitäisi tulostaa...."

Lisäasioita

  • mitä jos Suurempi-funktiossa olisi ollut

    public static int Suurempi(int luku1, int luku2)
      int suurin = luku1;
      if ( luku2 > suurin ) suurin = luku2;
      luku1 = 99;
      return suurin;
    }  

    niin miten tämä olisi vaikuttanut pääohjelmaan?

  • oikeasti paramterit ovat tietysti binäärisiä, eli esim: 5 = 0000 0101 ja -1 = 1111 1111. Aliohjelman int-tarkoittaa että "bittimömmöt" tulkitaan 2-komplementin mukaan. Jos aliohjelmassa olisi ollut (unit luku1, unint luku2) niin silloin kutsun -1 olisi tulkittu suurimmaksi mahdolliseksi luvuksi (kaikki bitit päällä).

These are the current permissions for this document; please modify if needed. You can always modify these permissions from the manage page.