
           OHJEITA C-OHJELMOINNIN HARJOITUSTYÖTÄ VARTEN (Syksy 1997)

                                       
YLEISTÄ

   Valitse yksi  tehtävälistan ohjelmointitehtävä ja toteuta se
   C-kielellä. Voit tehdä työsi millä tahansa koneella, mutta tuloksen on
   kuitenkin ehdottomasti toimittava myös kruunassa (muista siis
   siirrettävyys).
   
   Varsinaisia työnohjaustilaisuuksia ei järjestetä.  Voit kuitenkin
   kysellä työhön tarvittavia ohjeita ja opastusta ainakin kurssin
   harjoitusten yhteydessä. Ilmoita valitsemasi ohjelmointyön numero
   harjoitusten pitäjälle.
   
   Kokoa lopuksi ratkaisuusi liittyvät tiedostot yhdeksi nipuksi ja
   lähetä ratkaisu elektronisessa postissa harjoitusten pitäjällesi.
   Tarkemmat ohjeet löytyvät tästä lappusesta myöhemmin.
   
   Harjoitustyö ON PAKOLLINEN.  Jos se jää tekemättä, et voi osallistua
   kurssin uusintakokeeseen, vaan sinun on tultava kurssille uudestaan.
   
   Harjoitustyö on palautettava 12.12.1997 klo 23:59:59 mennessä. Vastuu
   sopivasta aikataulusta on sinulla itselläsi. Muista välikokeesi ja
   pysy aikataulussasi!
   
   
HYVIN SUUNNITELTU PUOLIKSI TEHTY

   Hahmottele ongelmakenttää ja lyö lukkoon toiminnallinen määrittely,
   käytettävät tietorakenteet sekä ratkaisujen päälinjat.  Esittele
   valintojasi ja ratkaisujasi harjoitusten ohjaajalle. Voit säästää
   koodinkirjoitusvaivojasi jo hyvillä tietorakenteilla.
   
   POIS TURHA HIENOSTELU: Eli tee se ja vain se mitä pyydetään ja tee
   lisävirittelysi vain omaan versioosi!
   
   Sopiva ohjelman pituus on 200-500 riviä koodia (plus kommentit).
   Pituutta tärkeämpää on kuitenkin, että ohjelma tekee mitä pyydetään.
   
   Älä aliarvioi suunnittelun merkitystä toimintapainotteisessakaan
   lähestymistavassa.
   
   
HYVÄT OHJELMAT EIVÄT KASVA ITSESTÄÄN - NE TEHDÄÄN

   Arvioi tehdyn suunnitelman toteuttamiskelpoisuutta:
     * Ensimmäinen mieleentuleva ratkaisu ei ole välttämättä paras.
     * Huonoon ratkaisuun ei saa investoida liikaa liian aikaisin.
     * Hyvä ohjelma toimii oikein, tehokkuus on usein vähemmän tärkeää.
       
   Sijoita funktioiden esittelyt, tietorakenteiden tyyppimäärittelyt  ym.
   yhteiset esittelyt .h -loppuisiin alustustiedostoihin.   Varsinainen
   suoritettava koodi ja muuttujamäärittelyt tulevat .c -loppuisiin
   lähdekooditiedostoihin.
   
   Tee työsi hyvällä maulla (AINA):
     * yhtenäinen ohjelmointityyli
     * vältä kielen erikoisuuksia ja kryptistä koodia
     * iskunkestävä ohjelma - ei natise, eikä kaadu
     * pieni opastus mukaan
     * muuttujat: kuvaavat nimet, joista selviää käyttötarkoitus merkitys
       ja  käyttö huomioonottaen
       
   Testausta kannattaa tehdä järjestelmällisesti heti alusta alkaen.
   Voit etsiä yksinkertaisia virheitä ja 'epäilyttäviä' kohtia
   gcc-kääntäjän  optioilla -Wall -ansi
   
DOKUMENTOINTI: TARPEELLINEN OSA

   Tiedostoon ohje kirjattu noin parisivuinen ohjelman käyttöohje ja
   huolellisesti tehty kommentointi riittää tällä kertaa.
   
   Ohjelman kommentoinnissa pätevät seuraavat yksinkertaiset säännöt:
     * Kukin ohjelmatiedosto sisältää yleiskommentin:
          + Mihin tiedosto on tarkoitettu
          + Mitä funktioita tiedosto sisältää
          + Mitä muiden tiedostojen funktioita tiedosto käyttää
          + Käytettyjä kirjastofunktioita ei tarvitse listata
     * Selvitä tärkeät tietorakenteet.
     * Kerro kustakin funktiosta:
          + Mitä funktio tekee
          + Mitkä ovat parametrit
          + Mitä funktio palauttaa
     * Varo liiallista kommentointia.  Käytä selkeitä muuttujanimiä,
       kielen rakenteet oletetaan tunnetuksi jne.
     * Kommentoi vaikeat ja erikoiset ratkaisut
       
HARJOITUSTYÖN PALAUTUS: MITENKÄS SE MENIKÄÄN?

   Palauta harjoitustyö harjoitusryhmäsi vetäjälle tutkittavaksi
   sähköpostitse. Lähetä harjoitustyö yhtenä helposti purettavana
   pakettina.
   
   Paketissa tulee olla mukana:
     * ohje-tiedosto
     * kaikki lähdekieliset koodi- ja alustustiedostot
     * tiedosto Makefile, jonka avulla ohjelma saadaan käännettyä
     * testaukseen käytetyt tiedostot ja muu testausmateriaali
       
   Makefile-tiedostoa ei tarvitse tehdä itse.  Tässä on malli:
   
   ______________________________________________________________________
                                      
   
   #Laita =:n perään käyttämäsi C-kääntäjä (esim. gcc)
   CC=
   
   #laita =:n perään käyttämäsi optiot (esim. -Wall)
   CFLAGS=
   
   #laita =:n perään .c-ohjelmatiedostot (esim. paa.c runko.c)
   SRC=
   
   #laita =:n perään vastaavat tiedostot .o -päätteisinä (esim. paa.o
   runko.o)
   OBJS=
   
   #laita =:n perään ohjelmasi nimi (esim. pasianssi)
   PROGRAM=
   
   #Huom.  Ennen $(CC):ta pitää olla Tabulaattori-merkki, ei
   välilyöntejä!
   $(PROGRAM): $(OBJS)
           $(CC) $(OBJS) -o $(PROGRAM)
   
   #Huom.  Ennen rm:aa pitää olla Tabulaattori-merkki, ei välilyöntejä!
   clean:
           rm $(OBJS) $(PROGRAM) core *.bak *~
   ______________________________________________________________________
                                      
   
   Tässä on esimerkki-Makefile.  Tämä kääntää ohjelman, joka muodostuu
   kolmesta lähdekielisestä tiedostosta paa.c, kaanna.c ja apu.c (ja
   mahdollisesti joukosta .h-päätteisiä alustustiedostoja, ne eivät näy
   tässä).  Tuloksena saadaan ohjelma ympari:
   ______________________________________________________________________
                                      
   
   #Laita =:n perään käyttämäsi C-kääntäjä (esim. gcc)
   CC=gcc
   
   #laita =:n perään käyttämäsi optiot (esim. -Wall)
   CFLAGS=-Wall -ansi
   
   #laita =:n perään .c-ohjelmatiedostot (esim. paa.c runko.c)
   SRC=paa.c kaanna.c apu.c
   
   #laita =:n perään vastaavat tiedostot .o -päätteisinä (esim. paa.o
   runko.o)
   OBJS=paa.o kaanna.o apu.o
   
   #laita =:n perään ohjelmasi nimi (esim. pasianssi)
   PROGRAM=ympari
   
   #Huom.  Ennen $(CC):ta pitää olla Tabulaattori-merkki, ei
   välilyöntejä!
   $(PROGRAM): $(OBJS)
           $(CC) $(OBJS) -o $(PROGRAM)
   
   #Huom.  Ennen rm:aa pitää olla Tabulaattori-merkki, ei välilyöntejä!
   clean:
           rm $(OBJS) $(PROGRAM) core *.bak *~
   ______________________________________________________________________
                                      
   Voit käyttää mainiosti Makefilea toteutusvaiheessa.  Jos Makefile on
   oikein tehty, komento make kääntää lähdekoodisista tiedostoista
   nimeämäsi ohjelman.  Komento make clean puhdistaa työhakemistostasi
   ylimääräiset tiedostot.
   
   Kun olet valmis palauttamaan työsi, toimi seuraavasti:

    1. Luo hakemisto c-harjoitus ja siirrä tarvittavat tiedostot sinne.
       Sen voi tehdä esim. näin (sillä oletuksella, että
       testimateriaalilla on aina pääte .tst):
        mkdir c-harjoitus
            mv *.c *.h ohje Makefile *.tst c-harjoitus

    2. Suorita komento

        tar cf - c-harjoitus | uuencode c-harjoitus.tar | mail

            ohjaajan-osoite missä ohjaajan-osoite on harjoitusryhmäsi
            ohjaajan sähköpostiosoite. Esim.  luennoijan ryhmissä oikea
            komento on:

            tar cf - c-harjoitus | uuencode c-harjoitus.tar | mail
            juha.taina@cs.helsinki.fi

            Jos ylläoleva komento ei toimi, kokeile korvata mail
            komennolla /usr/ucb/mail (ATK-keskuksen koneissa tuntuu
            olevan tällainen lisävaatimus).
            Komentoa kannattaa kokeilla ensin lähettämällä sähköpostia
            itselleen.  Tuloksena pitäisi olla sähköposti, joka alkaa
            rivillä begin 600 c-harjoitus.tar ja sen jälkeen on kummaa
            sotkua.  Luku 600 voi olla muutakin.

       Älä lähetä pakettia ohjaajalle useaan kertaan!

       Harjoitustyö on hyväksytty, kun
          + palautat sen ohjetta noudattaen määräaikaan mennessä,
          + se toimii virheettömästi ja tehtävämäärittelyn mukaisesti ja
          + olet tehnyt dokumentoinnin vaatimusten mukaisesti.

       Isot puutteet palautetaan korjattavaksi.

       Harjoitustyön palautusaika määräytyy elektronisen postin
       aikaleimasta.  Palautusajan ehdoton takaraja on  12.12.1997 klo
       23:59:59

       Onnea työlle!
       
