C-ohjelmointi syksy 2007


Harjoitus 3

Tehtävät käsitellään harjoitustilaisuuksissa 20-21.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 timantti, joka saa parametreina merkin c ja parittoman luvun n. Funktio tulostaa n:n rivin korkuisena merkistä c koostuvan timantin oheisen mallin mukaisesti. Laadi myös pääohjelma, jolla voit testata funktiota.
    Esimerkki, jossa merkki on 'x' ja n on 9:
                                                      x
                                                     x x
                                                    x x x
                                                   x x x x 
                                                  x x x x x
                                                   x x x x 
                                                    x x x
                                                     x x
                                                      x
    
  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:
    • Kerralla sai siirtää vain jonkun neulan yhden päällimmäisen levyn.
    • Missään neulassa suurempi levy ei saanut olla pienemmän päällä.
    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ä.

.