Helsingin yliopisto / tietojenkäsittelytieteen osasto / Ohjelmointikielten periaatteet / © Arto Wikla 2019

Ohjelmointikielten periaatteet: 4. harjoitukset 28.11.

Muutettu viimeksi 21.11.2019. Sivu luotu 20.11.2019.

Vastaajan arvonta —>

  1. Kurssikirjan tehtävät 4.6.8 ja 4.6.10 modifioituina:

    1. State what is printed by the following fragment of code written in a pseudo-language which uses static scope and passes parameters by reference. Simuloi aktivaatiotietuepinon käyttäytyminen!
         { int x = 2;
           void fie(reference int y) {
              x = x + y;
              y = y + 1;
           }
           { int x = 5;
             int y = 5;
             fie(x);
             write(x);
           }
           write(x);
         }
      
    2. State what will be printed by the following fragment of code written in a pseudo-language which uses static scope and call by name. Simuloi aktivaatiotietuepinon käyttäytyminen!
         { int x = 2;
           void fie(name int y) {
              x = x + y;
           }
           { int x = 5;
               { int x = 7
               }
             fie(x++);
             write(x);
           }
           write(x);
         }
      

  2. Kurssikirjan tehtävät 4.6.12 modifioituna: State what will be printed by the following fragment of code written in a pseudo-language which uses static scope and call by reference. Simuloi aktivaatiotietuepinon käyttäytyminen tarkasti! Myös staattinen ketju on syytä esittää.
       { int x = 0;
         int A(reference int y) {
            int x =2;
            y=y+1;
            return B(y)+x;
         }
         int B(reference int y) {
            int C(reference int y){
               int x = 3;
               return A(y)+x+y;
            }
            if (y==1)
               return C(x)+y;
            else
               return x+y;
         }
         write (A(x));
       }
    

  3. Kurssikirjan tehtävät 7.6.2 ja 7.6.3:

    1. State what will be printed by the following code fragment written in a pseudo-language permitting reference parameters (assume Y and J are passed by reference).
         int X[10];
         int i = 1;
         X[0] = 0;
         X[1] = 0;
         X[2] = 0;
         void foo (reference int Y,J) {
            X[J] = J+1;
            write(Y);
            J++;
            X[J]=J;
            write(Y);
         }
         foo(X[i],i);
         write(X[i]);
      
    2. State what will be printed by the following code fragment written in a pseudo-language which allows value-result parameters:
         int X = 2;
         void foo (valueresult int Y) {
            Y++;
            write(X);
            Y++;
         }
         foo(X);
         write(X);
      

  4. Kurssikirjan tehtävät 7.6.5 ja 7.6.7 modifioituina:

    1. Say what will be printed by the following code fragment which is written in pseudo-language allowing name parameters:
         int X = 2;
         void foo (name int Y) {
            X++;
            write(Y);
            X++;
         }
         foo(X+1);
         write(X);
      
    2. Consider the following fragment in a language with exceptions and call by value-result and call by reference:
         { int y=0;
           void f(int x) {
              x = x+1;
              throw E;
              x = x+1;
           }
           try{ f(y); } catch E {};
           write(y);
         }
      
      State what is printed by the program when parameters are passed: (i) by value-result; (ii) by reference.

  5. Merkitään funktioarvoisen funktion tyyppi tyyliin: (funktion_parametrit)->funktion_palautusarvon_tyyppi. ja kirjoitetaan funktioliteraali muodossa: (funktion_parametrit)->{funktion_runko}.

    (Tässä ei tarvitse täsmentää, miten parametrit ilmaistaisiin, koska esimerkissä käsitellään vain parametritonta funktioarvoa.

    Kielessä on staattiset näkyvyyssäännöt ja funktioarvoiset funktiot ovat sallittuja. Kielen virtuaalikone ylläpitää aktivaatiotietuepinoaan linkitettynä listana.

    Simuloi aktivaatiotietuepinon käyttäytyminen ja sulkeumien toteutus hylättävien aktivaatiotietueiden avulla seuraavan ohjelman suorituksessa:

       ()->int teeLaskuri() {
          int lkm=0;
          return ()->{lkm=lkm+1; return lkm;}
       }
    
       int a = teeLaskuri();
       int b = teeLaskuri();
    
       a(); a(); b(); a(); b();
    
    
  6. Vertaile Javan ja Pythonin ratkaisuja seuraavissa teknisissä ratkaisuissa:
    1. rakenteisia tyyppejä, taulukoita, tietueita, listoja, yms.
    2. luokkien määrittely ja olioiden luonti
    3. olioiden ominaisuudet