wiki:s2012/kutsunaytelma
Last modified 4 years ago Last modified on 2013-10-11 12:20:24

Näytelmä aliohjelman kutsumisesta

Esitys 15.10.2012

Editoitu video:

Kuvat:

Alkuperäiset videot:

Voi yrittää katsoa enemmän tai vähemmän kameran videoita ja ruutukaappausta rinnakkain. Voi myös katsoa noita kameran 1 tai 2 videoita (mp4) ja yrittää samalla liikkua tuossa debuggauksen still-kuvissa. Ääniraita on kuitenkin paras tuossa ruutukaappauksessa.

Raakavideot:

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)

N: new - osaa varata tilaa ja alustaa nollilla (Paavo 2. 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. (Paavo 1. rooli)

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

Koodi

Kutsuminen.cs (Kutsuminen.asm - koodi optimoidusti käännettynä konekielelle)

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.

source:/esimerkit/2012s/luennot/luento11/debugkuva.png

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: häipyy samalla taka-alalle
       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 vie sen S:lle.
  • D: Askeltaa riville 53
    052     public static int Suurempi(int luku1, int luku2)
    053     {
    
  • S: Ottaa pinon vastaan.
  • 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: Ottaa paluu-lapun
       --------
       |   6  |
       --------
    
  • S: kävelee M:n luo, sanoo että jatka riviltä 22 ja tuossa on tulos ja ojentaa tulos-lapun M:lle.
  • D: Askeltaa riville 22
    022         iso = Suurempi(iso, 7 / 3 + 5 / 2);
    
  • M: Ottaa tuloslapun, katsoo siinä olevan arvon (6) ja kirjoittaa sen iso-muuttujan arvoksi taululle.
  • S: häipyy samalla taka-alalle
       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-237 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   ||  0 ||
           --------                --------
    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   ||  0 ||
           --------                --------
    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 234 kaksi paikkaa eteenpäin ja päätyy paikkaan 236. 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 234 yhden paikan eteenpäin ja päätyy paikkaan 235. 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 234 kolme eteenpäin ja päätyy paikkaan 237. Kirjoittaa sinne 9.
       Pino                       Keko                       Tulostus  
                                                             
           --------                --------                     5
    agrs   | 231  |          231   ||  0 ||                     6
           --------                --------
    a      |   4  |          232   |   0  |
           --------                --------
    b      |   5  |          233   |   0  |
           --------                ========
    iso    |   6  |          234   ||  0 ||
           --------                --------
    luvut  | 234  |          235   ||  6 ||
           --------                --------
    m      | 234  |          236   ||  4 ||
           --------                --------
                             237   ||  9 ||
                                   ========
                             238   |   0  |
                                   --------
                             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   ||  0 ||
           --------                --------
    luvut  | 234  |          235   ||  6 ||
           --------                --------
    m      | 234  |          236   ||  4 ||
           --------                --------
                             237   ||  9 ||
                                   ========
           --------          238   |   0  |
    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   ||  0 ||
           --------                --------
    luvut  | 234  |          235   ||  6 ||
           --------                --------
    m      | 234  |          236   ||  4 ||
           --------                --------
                             237   ||  9 ||
                                   ========
           --------          238   |   0  |
    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   ||  0 ||
       --------                --------
luvut  | 234  |          235   ||  6 ||
       --------                --------
m      | 234  |          236   ||  4 ||
       --------                --------
                         237   ||  9 ||
                               ========
       --------          238   |   0  |
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 237:
       Pino                       Keko                       Tulostus  
                                                             
           --------                --------                     5
    agrs   | 231  |          231   ||  0 ||                     6
           --------                --------
    a      |   4  |          232   |   0  |
           --------                --------
    b      |   5  |          233   |   0  |
           --------                ========
    iso    |   6  |          234   ||  0 ||
           --------                --------
    luvut  | 234  |          235   ||  6 ||
           --------                --------
    m      | 234  |          236   ||  4 ||
           --------                --------
                             237   ||  5 ||
                                   ========
           --------          238   |   0  |
    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   ||  0 ||
           --------                --------
    luvut  | 234  |          235   ||  6 ||
           --------                --------
    m      | 234  |          236   ||  4 ||
           --------                --------
                             237   ||  5 ||
                                   ========
                             238   |   0  |
                                   --------
                             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ä).