C-ohjelmointi syksy 2009


Harjoitus 3

Tehtävät käsitellään harjoitustilaisuuksissa 22-28.9.

  1. Oleta, että MAX on makro, joka on määritelty seuraavasti:
    #define MAX(x,y)   x < y ? y : x
    
    Näytä seuraavien lausekkeiden laajennettu muoto ja laske näiden lausekkeiden arvo.
    1 + MAX(2,3)
    1 + MAX(3,2)
    MAX(2,3) + 1
    MAX(3,2) + 1
    
    Kirjoita makro ISLOWER(c) joka antaa tulokseksi luvun 1, jos merkki on pieni kirjain ja muuten arvon nolla.

    Kirjoita makro MED(a,b,c), joka tulostaa arvon 1, jos b:n arvo on a:n ja c:n välillä muuten makro tulostaa arvon 0. Oleta, että a, b ja c ovat kokonaislukuja.

  2. Etsi virhe seuraavista koodisegmenteistä ja selitä miten se voidaan korjata
    1.   x= 1
        while ( x <= 10);
          x++;
        }
      
    2.   for (y = .1; y!=1.0; y += .1)
          printf( "%f\n", y);
      
    3.   switch (n) {
        case 1:
          printf( "The number is 1\n");
        case 2:
          printf( "The number is 2\n");
          break;
        default:
          printf( "The number is not 1 or 2\n");
          break;
        }
      
    4. Seuraavan koodin pitäisi kirjoittaa arvot yhdestä kymmeneen.
        n = 1;
        while (n < 10)
          printf( "%d ", n++);
      
  3. Kirjoita funktio, joka saa parametrinaan ajan kolmessa argumentissa (tunnit, minuutit ja sekunnit) ja palauttaa sekunnit laskettuna siitä, kun kello löi viimeksi 12. Käytä tätä funktiota laskemaan sekuntteina ajan kahden ajan välillä. Voit olettaa, että ajat ovat yhden kahdentoista tunnin syklin sisällä.
  4. Kirjoita funktio, joka saa parametrinaan yhden kokonaisluvun n ja tulostaa Pascalin kolmion arvolla n > 0. Jos n=4, niin funktio tulostaa:
    1	1
    1	2	1
    1	3	3	1
    1	4	6	4	1
    
    Tee myös pääohjelma, jolla voit testata funktion toimintaa.
  5. Hanoin tornit.
    Vanhan tarinan mukaan jumala oli luodessaan maailmaa asettanut erääseen aasialaiseen temppeliin kolme timanttineulaa pystyyn. Yhdessä neulassa (A) oli päällekkäin 64 erikokoista kultalevyä suuruusjärjestyksessä siten, että alimpana oli suurin levy ja ylimpänä pienin levy ja aina päällä oleva levy oli pienempi kuin sen alla oleva. Temppelin pappien tehtävänä oli siirtää levyt neulasta A neulaan C kolmannen neulan B avulla. Siirtämistä rajoittivat seuraavat säännöt: Tarinan mukaan maailmanloppu koittaa, kun papit ovat saaneet kaikki levyt siirrettyä neulaan B. Kirjoita rekursiivinen ohjelma, joka antaa ohjeet levyjen siirtämiseen seuraavaan tapaan: Siirrä levy neulasta A neulaan B". Testaa ohjelmaasi pienillä (4-10) levymäärillä.

Ohjausaikoina opittavia asioita:
  1. Muistinhallinta
  2. Ajan sallisessa johdatusta geneerisiin funktioihin