C-ohjelmointi syksy 2008


Harjoitus 3

Tehtävät käsitellään harjoitustilaisuuksissa 18-22.9.

  1. Oleta, että MIN on makro, joka on määritelty seuraavasti:
    #define MIN(x,y)   x < y ? x : y
    
    Näytä seuraavien lausekkeiden laajennettu muoto ja laske näiden lausekkeiden arvo.
    1 + MIN(2,3)
    1 + MIN(3,2)
    MIN(2,3) + 1
    MIN(3,2) + 1
    
    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.

    Kirjoita makro OPEN(f), joka avaa tiedoston f lukemista varten käyttäen "junk":a tiedostonimenä. Palauttaa arvon 1, jos avaus onnistuu muuten arvon 0.

  2. Kirjoita ohjelma, joka lomittaa kaksi tiedostoa, joissa on double arvoja nousevassa järjestyksessä. Tulos kirjoitetaan tiedostoon. Jos esimerkiksi olisi annettu seuraavan sisältöiset lomitettavat tiedostot:
    1.2	3.4	6
    2.4	5	9
    

    Tuloksena saadun tiedoston sisältö olisi:
    1.2	2.4	3.4	5	6	9
    
    Käytä ehdollista kääntämistä ja muuta ohjelmaa niin, että virheenjäljitystilassa ohjelma tulostaa viestin kertoen ohjelman käyttäjälle mitä tiedostoa luettiin, jos lukeminen ei onnistunut.
  3. Kirjoita funktio findSum(), joka saa parametrinaan kaksi kokonaislukua n ja m sekä palauttaa kaikkien kokonaislukujen summan n:stä m:ään. Tee myös pääohjelma, jolla voit testata funktion toimintaa.
  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ä.

.