C-ohjelmointi syksy 2006


Harjoitus 3

Tehtävät käsitellään harjoitustilaisuuksissa 21.9 TO 12-14 salissa B119 ja 22.9 PE 12-14 salissa B119.

  1. Tulosta 333.546372 kenttään, jonka leveys on 15 tarkkuuksilla 1,2,3,4 ja 5 vasemmalle tasattuna.
    Tulosta reaaliku 456.892356 seuraavissa formaateissa
    %f        
    %.2f      
    %2.f      
    %10.4f    
    %10.5f    
    %-10.5f   
    %010.5f   
    %-+10.5f  
    %+-10.4f  
    %10.0f    
    
  2. Etsi virhe seuraavista koodisegmenteistä ja selitä miten se voidaan korjata
    1.   x= 1
        while ( x <= 10);
          x++;
        }
      
    2.   for (y = .1; y!=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ä.

  6. Lisää yhden tehtävän koodiin assert:in avulla ehtoja, joilla varmistut ohjelman oikeasta loogisesta toiminnasta. Kokeile myös virheenjäljitystä ehdollisen kääntämisen avulla jonkin ohjelmointitehtävän yhteydessä.

.