TIE 120 Ohjelmointi (kesä 2001)
Pääteohjaus 23.5.2001

Ag B111.1 klo 8-10 ja 10-12 (Ohjaaja: Miika Nurminen)

Seuraavien harjoitusten tarkoituksena on opettaa ohjelmointiympäristön käyttöä. Itse C-kielisten ohjelmien syntaksiin ei vielä ole syytä takertua liiaksi.

Tässä harjoituksessa opittavat asiat tulevat hyödyksi ohjelman koodaamisessa ja testaamisessa. Itse ohjelman suunnittelun kanssa tällä harjoituksella ei ole mitään tekemistä!

  1. Siirry omaan hakemistoosi (C:\MyTemp\ohj\käyttäjätunnuksesi). Jos sitä ei ole, luo se.
  2. Käynnistä C++Builder. Valitse valikoista File->New. Esiin ponnahtavassa ikkunassa kaksoisnapauta "Console Wizard" -kuvaketta. Nyt aukeavassa ikkunassa poista tarvittaessa ruksit Use VCL ja Multi Threaded ja tarvittaessa lisää ruksi kohtaan Console Application. Valitse vaihtoehto C++ ja pidä huoli, että kohdassa Specify project source ei ole ruksia. Paina sitten OK. Valitse valikosta File->Save project as. Tallenna projekti omaan hakemistoosi (muista tarkistaa että se tallettuu oikeaan hakemistoon!) nimella jarj2.c. Poista lopuksi ohjelmakoodi-ikkunassa oleva valmis ohjelmanpätkä valitsemalla koko tiedosto ja sitten painamalla Delete-näppäintä.
  3. Kirjoita edellä avattuun tiedostoon liitteenä oleva ohjelma.Yritä saada vastaavat sisennykset ja ole tarkkana kirjainten 1 (yksi), i (ii, Intia) ja l (ällä, Lima) suhteen. Myös isojen ja pienten kirjainten kanssa on syytä olla tarkkana! Jos huomaat mallissa kirjoitusvirheitä, niin älä korjaa niitä nyt, koska tarkoituksena on opetella tulkitsemaan kääntäjän virheilmoituksia. Mitä luulet ohjelman tulostavan? Tallenna valmis ohjelma. Käännä se (Control-F9).
  4. Mikäli sait ohjelman kirjoitettu aivan vastaavasti kuin mallissa, ilmestyy ruudun alalaitaan "MESSAGE"-ikkuna, johon tulee tekstit:
    [C++ Error] jarj2.c(8): E2451 Undefined symbol 'd'
    [C++ Error] jarj2.c(8): E2121 Function call missing )
    [C++ Error] jarj2.c(8): E2380 Unterminated string or character constant
    [C++ Error] jarj2.c(14): E2451 Undefined symbol 'T'
    [C++ Error] jarj2.c(18): E2379 Statement missing ;
    [C++ Warning] jarj2.c(19): W8070 Function should return a value
    [C++ Warning] jarj2.c(19): W8004 't' is assigned a value that is never used
          

    Kaksoisnapauttamalla ilmoitusta nähdään, millä rivillä ohjelmassa ongelma esiintyy. Kokeile!

  5. Kaksoisnapauta ensimmäistä virhettä. Huomaat varmaakin, että värit osoittavat jotakin ohjelmakoodissa. Mitä? Värit auttavat paikallistamaan useita virheitä.
  6. Korjaa virhe! Virhe ei välttämättä ole kursorin kohdalla, vaan se vasta paljastuu siinä kohdassa. Sama virhe saattaa poikia useita eri virheilmoituksia!
  7. Paina Alt-F8 kunnes olet seuraavassa todellisessa virheessä. Korjaa ja jatka kunnes kaikki virheet on korjattu.
  8. Käännä ohjelma uudelleen.
  9. Talleta korjattu ohjelma.
  10. Paina ohjelmaikkunan vasemmassa laidassa olevaa harmaata palkkia ohjelman viimeisen rivin kohdalla. Kyseisen rivin pitäisi nyt olla punainen. Aja ohjelma Alt-R R. Mitä tapahtuu, jos painat harmaata palkkia uudestaan punaisen rivin kohdalta ja ajat ohjelman?
  11. Borlandin kääntäjissä voidaan monipuolisesti asetella optioita siitä, mistä kääntäjä valittaa. Yleisesti ottaen kannattaa pitää kaikki mahdolliset virheilmoitukset päällä, koska varoitus on käytännössä jotakin vikaa ohjelmassa. Kaikki virheilmoitukset saat päälle valitsemalla valikon Project->Options ja nyt auenneesta ikkunasta välilehden Compiler; katso, että kohdassa Warnings on valittuna All.
  12. Borlandin ohjelmaympäristöissä on varsin hyvä Help-toiminto. F1-näppäimellä saadaan tavallinen Help. Kokeile! Mikä on esimerkiksi komento lohkon sisentämiseksi?
  13. Ctrl-F1 antaa apua siitä sanasta, jonka kohdalla kursori on. Kokeile vaikkapa sanoihin int, printf, scanf ja return.
  14. Tätä käyttäen voidaan yleensä aina löytää syntaksi halutulle käskylle. Myöhemmin tässä ohjauksessa käytetään satunnaislukugeneraattoria rand. Kokeile löytää kutsun syntaksi kirjoittamalla koodiin ylimääräinen rand ja paina Ctrl-F1. Yleensä helpistä löytyy myös valmis esimerkki funktion tai käskyn käytöstä. Tämä esimerkki tai sen osa voidaan tarvittaessa kopioida omaan koodiin. Muista lopuksi pyyhkiä rand pois koodista.
  15. Huomaa, että rand-funktion ohjeessa on kohta Portability. Katso, mitä se kertoo! (Vältä tällä kurssilla mahdollisimman paljon funktioita, joilla ei ole plusmerkkiä kohdassa ANSI C++.)
  16. Käy katsomassa vaikkapa Windowsin Explorerilla mitä juuri kirjoittamaasi ohjelmaan liittyviä tiedostoja on syntynyt hakemistoosi ja mitä varten mikäkin tiedosto on.
  17. Käynnistä komentorivi-ikkuna ja siirry hakemistoosi. Kirjoita jarj2 ja paina rivinvaihtonäppäintä. Mitä tapahtuu? Miksi? (Jos sait virheilmoituksia, käy ottamassa Builderin valikon Project->Options kautta aukeavan ikkunan välilehdestä Linker pois ruksi use dynamic RTL ja käännä ohjelmasi uudestaan.)
  18. Laita yksi kerrallaan WATCH-ikkunaan muuttujat x1, x2 ja t (Ctrl-F5). Watch ikkunaan saa muuttujia myös siirtymällä tekstissä muuttujan nimen päälle ja painamalla sitten Ctrl-F5. Laita WATCH-ikkunaan myös ehdon x1>x2 arvo (Ctrl-F5 x1>x2 RET). Aluksi muuttujien perässä voi olla virheilmoitus, mutta sen pitäisi poistua kun ohjelman suoritus aloitetaan ja muuttujan "elämä alkaa".
  19. Aja ohjelmaa rivi kerrallaan (F8).

    Katso välillä tulostusikkunaa.

    Kokeile uudestaan. Käytä myös kursoriin saakka ajamista (eli siirrä kursori vaikkapa riville x2=t ja paina F4).

    Siirrä vaihtamisessa suoritettavat lauseet samalle riville: t=x1; x1=x2; x2=t; Eli:

    1. siirry rivin loppuun (End)
    2. poista rivin loppu (Ctrl-T tai (Del)
    3. lisää välilyönti

    Kokeile suoritusta rivi kerrallaan uudelleen, kun ko. lauseet on siirretty.

    Kokeile suoritusta rivi kerrallaan käyttämällä nyt näppäintä F7. Mitä eroa näppäimeen F8?

    Aja vielä kerran riville if ( x1... Muuta muuttujan x1 arvoa (Ctrl-F7 x1 RET) ennenkuin jatkat suorittamista rivi kerrallaan.

    Lisää ohjelmaan tulostusrivi, joka kertoo ohjelman käyttäjälle mitä ohjelma tekee.

    Talleta ohjelma lopuksi.

  20. Tallenna ohjelma uudella nimellä JARJ3.C (File->Save as).

    Tarkoituksena on muuttaa ohjelmaa siten, että järjestetäänkin 3 lukua suuruusjärjestykseen (rivit on numeroitu jotta alla voidaan viitata riveihin; numeroita ei missään tapauksessa kirjoiteta!): LUE ENSIN HUOLELLISESTI OHJEET ALTA!

         01  /* Ohjelma järjestää kolme lukua suuruusjärjestykseen.*/
         02  #include <stdio.h>
         03  int main(void)
         04  {
         05    int x1,x2,x3,t;
         06    printf("Anna 1. luku >"); scanf("%d",&x1);
         07    printf("Anna 2. luku >"); scanf("%d",&x2);
         08    printf("Anna 3. luku >"); scanf("%d",&x3);
         09    if ( x1>x2 ) {
         10      t=x1; x1=x2; x2=t;
         11    }
         12    if ( x1>x3 ) {
         13      t=x1; x1=x3; x3=t;
         14    }
         15    if ( x2>x3 ) {
         16      t=x2; x2=x3; x3=t;
         17    }
         18    printf("Luvut: %d %d %d\n",x1,x2,x3);
         19    return 0;
         20  }
    

    Kolmannen luvun lukeminen voidaan kopioida vaikkapa 2. luvun lukemisesta (rivinumerot viittaavat valmiiseen koodiin): siirry rivin 07 alkuun (nuolet ja Home)

    1. merkitse lohkon alku (paina Shift pohjaan ja pidä se siellä)
    2. siirry seuraavan rivin alkuun (nuoli alas)
    3. merkitse lohkon loppu (päästä Shift ylös)
    4. laita lohko leikekirjaan (Ctrl-C)
    5. ota lohko leikekirjasta (Shift-V, mahd uudestaan jos rivi ei tullut kahdesti)
    6. tee riville tarvittavat muutokset

    Vertailut saadaan vastaavasti kopioimalla rivit 09-11 (ed. esim. mukaiset valmiit rivinumrot) kahteen kertaan:

    1. siirry rivin 09 alkuun (nuolet ja Home)
    2. merkitse lohkon alku (Shift pohjaan ja pidä siellä)
    3. siirry rivin 12 alkuun (nuolet alas)
    4. merkitse lohkon loppu (Shift ylös)
    5. laita lohko leikekirjaan (Ctrl-C)
    6. kopioi lohko (Ctrl-V, mahd. uudestaan jos vanha hävisi)
    7. kopioi lohko (Ctrl-V)
    8. tee riveille tarvittavat muutokset

    Tee loput tarvittavat muutokset.

    Talleta ohjelma.

    Lisää myös x3 WATCH-ikkunaan.

    Ajele ohjelmaa ja tutki toimiiko.

    Lohkon voi merkitä myös hiirellä. Kokeile sitäkin, mutta muista että näppäimistö on aina nopeampi ja tarkempi (kun sen kunnolla opettelee)!

  21. Muokkaa tiedostosta JARJ3.C seuraava tiedosto JARJ3A.C: jarj3a.c

    Laita WATCH-ikkunaan muuttujat x1, x2, x3, a, b ja t.

    Kokeile ajaa askel kerrallaan käyttäen sekä F7 että F8. Mikä on näppäinten välinen ero?

    Poista aliohjelmasta kaikki tähdet (*a -> a jne) sekä pääohjelmasta aliohjelman vaihda kutsussa olevat &-merkit.

    Talleta muutettu ohjelma nimelle JARJ3AA.C

    Kokeile muutetun ohjelman toimintaa askel kerrallaan. Muuttuvatko x1, x2 ja x3 aliohjelman suorituksen aikana kuten edellisellä kerralla?

    Avaa edellinen jarj3a.c uudelleen ja kokeile vielä kerran suoritusta askel kerrallaan. Vertaa toimintaa ohjelmaan jar3aa.c.

  22. Sama ohjelma voidaan tehdä myös C++:lla. Erona C++:ssa on että syötössä ja tulostuksessa voidaan käyttää << ja >> -operaattoria (voidaan tulostaa ja lukea myös kuten C-kielessä) sekä voidaan käyttää referenssiä &, jonka ansiosta aliohjelmassa tehdyt muutokset heijastuvat pääohjelmaan vaikkei parametreja viedäkään osoittimien avulla.

    Avaa jarj3aa.c ja lisää siihen aluksi vain muutos:

    void vaihda(int &a, int &b)
          

    Talleta nimelle jarj3.cpp ja kokeile toimintaa. Pitäisi toimia. Muuta ohjelma vielä seuraavaksi "kunnon" C++ -ohjelmaksi: (liitteenä)

  23. Miten edellistä ohjelmaa pitäisi muuttaa mikäli haluttaisiin järjestää 4 lukua? Taitaisi jo tulla varsin sotkuiseksi.

    Muutetaan ohjelmaa (kirjoita nimelle JARJ3TA.C käyttäen pohjana JARJ3.C-ohjelmaa) siten, että apuna käytetään taulukkoa: (liitteenä)

    Hae aliohjelma vaihda voidaan hakea tiedostosta JARJ3A.C.

    Edellinen ohjelma ei ehkä ole yhtä selkeä (?) kuin JARJ3.C, mutta lukujen lukumäärä esiintyy ohjelmassa enää vain yhdessä paikassa. Missä?

    Talleta ohjelma.

    Poista WATCH-ikkunasta kaikki tarpeeton:

    1. siirry WATCH-ikkunaan
    2. siirry poistettavalle riville
    3. poista rivi (Del)

    siirry takaisin C-ikkunaan

    Lisää taulukko luvut sekä muuttujat pienin ja tutki WATCH-ikkunaan.

    Aja ohjelmaa askel kerrallaan. Toimiiko täsmälleen vastaavasti kuin JARJ3.C?

    Muuta KOKO 5 ja kokeile toimintaa.

Viimeksi muutettu: ke 4 heinäkuu 2001 15:09:54
Antti-Juhani Kaijanaho <gaia@iki.fi>
Perustuu osittain Vesa Lappalaisen ja Kari Kärkkäisen tekemiin kurssisivustoihin ja teksteihin.