wiki:paate10-3
Last modified 7 years ago Last modified on 2010-09-22 09:58:40

Pages linking to paate10-3:
paate10

Pääteohjaus 3 / 2010

Taustaa työkaluista

Tähän asti olemme harjoitelleet Java-ohjelmakoodin kirjoittamista ConTEXT:lla, joka on tavallinen tekstieditori. Koodin kirjoittamisen lisäksi olemme harjoitelleet koodin kääntämistä (javac-komento) ja suorittamista (java-komento komentoriviltä. Tämä siksi, jotta opimme ymmärtämään mitä taustalla oikeasti tapahtuu.

Eclipse käyttöön

Nyt siirrymme käyttämään ohjelmointityökaluna ilmaista avoimeen lähdekoodiin perustuvaa ohjelmaa nimeltä Eclipse, joka on yksi monista nk. integroiduista kehitysympäristöistä (IDE, Integrated Development Environment). Eclipse tukee oletuksena mm. Java- ja PHP-ohjelmointia ja siihen voidaan lisäosien avulla lisätä tuki monen muunkin ohjelmointikielen käyttämiseen. Eclipse onkin saavuttanut suuren suosion ohjelmointityökaluna osittain ilmaisuutensa, osittain monipuolisuutensa ja erinomaisen laajennettavuutensa ansiosta.

Integroidun ohjelmointiympäristön käytön hyödyt

Integroidun kehitysympäristön käyttämisestä on monia hyötyjä, kuten esim. se, ettemme enää joudu tekemään ohjelman kääntämistä ja kääntämisen jälkeistä suorittamista manuaalisesti. Kuitenkin, jos olisimme suoraan aloittaneet kehitysympäristöä käyttäen, olisi kokonaisuuden ymmärtäminen jäänyt puutteelliseksi.

Tehtävät

  1. Eclipsen käytön aloittaminen ja asetusten säätäminen
    • Käynnistä Eclipse jollakin seuraavista tavoista:
      • komentorivi auki, siirry oikeaan hakemistoon ja kirjoita eclipse
      • Start => Run... => eclipse
      • Start => All Programs => Eclipse 3.6
    • Aseta Workspace: U:\kurssit\ohj1\demot
    • Mikäli Welcome-ruutu aukeaa, sulje se vasemmalta ylhäältä Welcome-välilehden raksilla.
    • Tee Eclipsen käyttö -sivun Perusasetuksia-kohdassa selitetyt toimenpiteet.
  1. Luo uusi projekti
    • Huom! Eclipsessä .java-tiedoston on sisällyttävä johonkin projektiin, jotta se voidaan ajaa/suorittaa
    • Luo uusi Java Projekti:
      • File => New => Project... => Java => Java Project (TAI File => New => Java Project, mikäli Java Perspective on jo valittuna, jos olet jo aiemmin käyttänyt Eclipseä)
      • Projektin nimeksi demo3, muuten oletusasetukset; klikkaa Next.
      • Libraries-välilehti => Add External JARs... => etsi ja valitse ohj1.jar
      • Finish
  1. Eclipsen peruskäyttö / D3T4
    • Tee D3T4:
    • Luo projektiisi uusi Java-luokka: File => New => Class
      • valitse luokalle nimi, esim. Muunnoksia; muista nimen iso alkukirjain
      • raksi public static void main(String[] args) niin Eclipse luo pääohjelman rungon automaattisesti
    • Luo luokalle dokumentaatiokommentti: kirjoita luokan määrittelyn yläpuolelle /**, paina Enter, täydennä nimesi ja selitys luokan käytöstä. (tehtävässä 1 määritetyt asetukset aiheuttavat, ettei ohjelman ajaminen onnistu ilman public- ja protected-tasoisten luokkien/metodien/aliohjelmien dokumentointia)
    • Kopioi tehtävänannon mukaiset kaksi koodiriviä pääohjelmaan (main) ja luo puuttuva aliohjelma ja lisää Javadoc-kommentti.
    • Huomaa, että Javassa kahden kokonaisluvun välinen jakolasku voi olla yllättävä, esim. 3/2 = 1, mutta 3.0/2 = 3/2.0 = 3.0/2.0 = 1.5!
    • Jatka tehtävä loppuun demon tehtävänannon mukaan.
    • Lisää pääohjelmaan joitain tulostusrivejä yksikkömuunnosten tulostamiseksi.
    • Tallenna ohjelmasi ja aja se käyttäen F11 (tai Debug => Debug As => Java Application)
    • Tulosteet näkyvät alareunan Console-välilehdellä
    • Mikäli aliohjelmasi toimivat oikein, saat seuraavat tulokset:
      • fahrenheitToCelsius(32) = 0.0
      • fahrenheitToCelsius(212) = 100.0
      • poundsToGrams(3) = 1360.77711
  1. Kommenttien viilausta edelliseen tehtävään
    • Lisää ed. tehtävän luokan kommentteihin: @version vvvv-kk-pp käyttäen tätä päivää
    • Lisää edelleen: @see <a href="http://eclipse.org">eclipse.org</a>
    • Klikkaa alareunasta Javadoc-välilehteä, varmista, että hiiren kursori on äsken kirjoitetun kommenttiosion tai luokan nimen päällä. Mitä huomaat? Klikkaa eclipse.org-linkkiä. Klikkaa taas hiiri yläreunan kommenttiosion tai luokan nimen päälle.
    • Yhteenveto: koodiin määrämuotoisena kirjoitettujen kommenttien perusteella voidaan automaattisesti luoda koodista dokumentaatio. Vertaa esim. Graphics-kirjaston EasyWindow-luokan koodia ja dokumentaation ensimmäistä tekstikappaletta.
  1. Tarkastele mitä tiedostoja Eclipse on luonut
    • Avaa resurssienhallinta (esim. Winkey+E) ja tarkastele mitä tiedostoja ja mihin alihakemistoihin Eclipse on luonut hakemistoon U:\kurssit\ohj1\demot\demo3.
    • Suorita kohdassa 3 syntynyt Muunnoksia.class komentoriviltä käynnistämällä.
  1. Lumiukot
    • Luo samaan projektiin uusi luokka kuten edellä tehtiin, luokan nimeksi Lumiukot.
    • Kopioi kakkosdemossa luomasi lumiukkokoodi tähän uuteen Lumiukot-tiedostoon korvaten tiedoston kaiken sisällön. Varmista, että tiedoston ja luokan nimi täsmäävät. Jos ei, vaihda luokan nimeä (tiedostonimenkin vaihtaminen onnistuisi, mutta on hiukan mutkikkaampaa tässä vaiheessa).
    • Kokeile kaksoisnapauttaa kyseisen välilehden otsaketta. Mitä huomaat? Sama toimii kaikilla välilehdillä, esim. Help
    • Varmista, että luokalla ja kaikilla aliohjelmilla on asianmukaiset Javadoc-kommentit
    • Lisää ohj1.jar tarvittaessa mukaan projektiin mikäli unohdit sen tehdä kohdassa 2:
      • Project => Properties => Java Build Path => Libraries => Add External JARs...
    • Aja ohjelma
    • Tarkastele eri aliohjelmien Javadoc-dokumentaatioita Javadoc-välilehdeltä
    • Muuta lumiukko demo 3 tehtävä 5:n mukaiseksi.
  1. Hyödyllisiä näppäinkomentoja
    • F11: ohjelman ajaminen debuggerilla, mainittiin jo aiemmin
    • Ctrl+Space:
      • itse määriteltyjen muuttujien ja funktionimien yms. täydennys
        • esim. jos olet määritellyt muuttujan lukumaara, voit kirjoittaa esim. lu ja sitten Ctrl+Space täydentääksesi muuttujanimen
      • asetuksista kohdasta: Window => Preferences => Java => Editor => Templates löytyvien koodipätkien täydentäminen
        • esim. syso (tai sysout) ja sitten Ctrl+Space luo System.out.println(...) -rivin
        • huomaa, että voit ko. asetusten kohdassa halutessasi myös itse luoda koodipätkiä ja niille lyhytkomentoja
      • jos Code Assist (komentoja ehdottava ponnahdusvalikko) ei jostain syystä aukea automaattisesti, saat sen auki Ctrl+Space
    • Ctrl+1:
      • voidaan käyttää esim. siten, että kirjoitetaan ensin aliohjelmakutsu vaikka itse aliohjelmaa ei vielä ole määritelty ja painetaan sitten Ctrl+1, jolloin Eclipse tarjoaa vaihtoehdon Create method ..., kokeile.
    • Paljon muitakin näppäinkomentoja on tarjolla, ks. Help => Key Assist... ja silmäile avautuva pikanäppäinlista läpi
  1. Helpin käyttö / pikanäppäinharjoituksia
    • Avaa Muunnoksia.java ja tuplaklikkaa ko. välilehteä.
      • Klikkaa sitten kursori pääohjelmassa olevan System.out.println(...) -rivin println-sanan kohdalle
      • Paina F1 ja valitse oikealla avautuvasta Helpistä ylin linkki
        • Sait auki Javan virallisen dokumentaation ko. metodille.
    • Luo Muunnoksia-luokan pääohjelmaan aliohjelmakutsu gallonsToLiters(5); (ennen itse aliohjelman luomista).
      • Siirrä nyt kursori sanan gallonsToLiters päälle ja paina Ctrl+1.
      • Tuplaklikkaa Create method...
      • System.out.println(); saat kirjoitettua kun kirjoitat syso ja painat Ctrl+Space.
      • Lisää pääohjelmaan rivi: System.out.println(gallonsToLiters(3.2)); Koeta ajaa ohjelma. Miksi ei toimi? Korjaa toimivaksi.
    • Aliohjelma gallonsToLiters on tyyppiä private static..., selvitä mitä eroa public static ? (hiukan tekninen, ei äärettömän tärkeää ymmärtää tässä vaiheessa, mutta Ohjelmointi2:lla kylläkin erittäin tärkeä)

Huomioita pääteohjauksista

  • Ctrl+Space:lla voi täydentää myös itse määriteltyjen muuttujien/aliohjelmien nimiä
    • esim. jos on määritelty muuttuja int lukumaara = 20 niin kirjoittamalla muuttujan alusta esim. lu ja sitten Ctrl+Space saa muuttujan nimen täydennettyä.
  • Muunnostehtävässä D3T4 tarvittavissa jakolaskuissa laskusta i/j, missä i, j kokonaislukuja, aiheutuu ongelmia:
    • esim. 9/5 ei anna odotettua tulosta vaan antaa tulokseksi jakolaskun kokonaisosan, eli 9/5 = 1
    • oikea tulos saadaan esim. millä tahansa näistä tavoista: 9.0/5 = 9/5.0 = 9.0/5.0 = 1.8
    • tarkkaan ottaen asia on näin: C-sukuisissa kielissä (mm. C, C++, Java) laskutoimituksen tarkkuus on siihen asti käytettyä suurinta tarkkuutta. Kokonaisluvuilla laskettaessa tulos on siis kokonaisluku.
  • D3T6, int:n käyttäminen aiheuttaa "valovuosi kilometreissä" -laskussa int-muuttujatyypin lukualueen ylivuodon ja sitä myöten monella kertaluokalla heittäviä tuloksia:
    • määritellään ensin tarvittavat muuttujat (älä oikeasti aloita nimiä i- tai db- !):
      int iValonNopeusKmSek     = 299792; // huomaa, että tästä määrittelystä (verrattuna alempiin)
                                          // aiheutuu kohdan 1b epätarkempi, mutta lähtöarvot
                                          // huomioiden oikea tulos.
      int iValonNopeusMetriaSek = 299792458;
      double dbValonNopeusKmSek = 299792.458;
      double dbValovuosiInKm;
      
    • nyt seuraavalla tavalla saadaan virheelliset tulokset, ks. int-lukualueen yläraja. Tässä saatavat tulokset heittävät yli 9000-kertaisesti todellisesta:
      // 1a)
      dbValovuosiInKm = iValonNopeusKmSek * 60 * 60 * 24 * 365;
      System.out.println(dbValovuosiInKm);  // tulos: 1.017493504*10^9, väärin
      
      // 2a)
      dbValovuosiInKm = iValonNopeusMetriaSek / 1000 * 60 * 60 * 24 * 365;
      System.out.println(dbValovuosiInKm);  // tulos: 1.017493504*10^9, väärin
      
    • korjaamalla koodia saadaan oikeat tulokset:
      // alla olevissa tulos: <luku> -kohdissa alaviivat ovat vain korostamassa tulosten eroja,
      // eivätkä luonnollisestikaan ole oikeasti osa ruudulle tulostettua.
      
      // 1b)
      dbValovuosiInKm = iValonNopeusKmSek * 60.0 * 60 * 24 * 365;
      System.out.println(dbValovuosiInKm);  // tulos: 9.4542_40512_*10^12, lähtöarvot
                                            // huomioiden ok. Ero kohtiin 2b/3 aiheituu
                                            // lähtöarvojen pienemmästä tarkkuudesta
                                            // (iValonNopeusKmSek)
      
      // 2b)
      dbValovuosiInKm = iValonNopeusMetriaSek / 1000.0 * 60 * 60 * 24 * 365;
      System.out.println(dbValovuosiInKm);  // tulos: 9.4542_54955487998_*10^12, ok, vertaa 1b
      
      // 3)
      dbValovuosiInKm = dbValonNopeusKmSek * 60 * 60 * 24 * 365;
      System.out.println(dbValovuosiInKm);  // tulos: 9.4542_54955487998_*10^12, ok, vertaa 1b
      
    • ero kohdan 1b ja toisaalta kohtien 2b/3 välillä ei aina ehkä ole merkitsevä, mutta esim. tarkempia tieteellisiä laskuja tehtäessä pitää olla tarkka tällaisten kanssa!