C-ohjelmointi kevät 2006


Harjoitus 2
Tehtävät käsitellään keskiviikon 15.2.2006 harjoitustilaisuuksissa 12-14 salissa B222 ja 14-16 salissa CK107.
Vain tietokoneella koetellut ratkaisut kelpaavat!
  1. Kirjoita funktio kolmio, joka saa parametreina merkin c ja luvun n. Funktio tulostaa n:n rivin korkuisena merkistä c koostuvan kolmion oheisen mallin mukaisesti. Laadi myös pääohjelma, jolla voit testata funktiota.
    Esimerkki, jossa merkki on 'x' ja n on 5:
                                                      x
                                                     x x
                                                    x x x
                                                   x x x x 
                                                  x x x x x
    
  2. 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ä.

  3. Kirjoita makro swap(t,x,y), joka vaihtaa kaksi tyypin t argumenttia keskenään. Käytä lohkorakennetta.

  4. Kirjoita funktio swap(t, x,y), joka vaihtaa kaksi tyypin t argumenttia keskenään. Kirjoita myös testausta varten pääohjelma, joka käyttää sekä makroa swap että funktiota swap. (Jos et osaa muuten käsitellä tyyppiä, niin koodaa ne numeroilla.)
    Lisätehtävä, josta ei saa pisteitä:
                   Miten makro ja funktio eroavat
                       - käännettäessä
                       - lopullisessa ohjelmassa
                       - ohjelmoijan kannalta
                       - ylläpidon kannalta?