Ohjelmointi, Java ja tärppejä Jyry Suvilehto Helsinki University of Technology, TKK 5. toukokuuta 2008 Jyry Suvilehto 1
Luennon kulku Intro Lähtökohta Ohjelmoinnin yleisiä ongelmia Tauko 10 min Java Tauko 10 min Tärppejä Jyry Suvilehto 2
Hassu setä edessä TIK III Tahtoo suojatöitä seuraavan laman ajaksi En osannut koodata kun tulin taloon Jyry Suvilehto 3
Hassu setä edessä TIK III Tahtoo suojatöitä seuraavan laman ajaksi En osannut koodata kun tulin taloon En osaa vieläkään Jyry Suvilehto 4
Hassu setä edessä TIK III Tahtoo suojatöitä seuraavan laman ajaksi En osannut koodata kun tulin taloon En osaa vieläkään Kuvittelen liikoja huumorintajustani Jyry Suvilehto 5
Luennon alkopuolen kulku Ohjelmointi Java Ongelma 1 Ratkaisu 3 Ongelma 2 Ratkaisu 1...... Luento etenee sarakkeittain Asioiden rakenteellinen jäsentäminen on vanha muistikikka Elämä ei ole helppoa joten ongelmat ja aiheet on sekoitettu Jyry Suvilehto 6
Käytännön juttuja Kysykää Käyttäkää ääntä Luennoitsijalla oikeasti huono kuulo Ei niitä käsiä kuitenkaan huomaa Luentotauoilla tai luennon jälkeen voi nykiä hihasta Jyry Suvilehto 7
Pohjimmainen ongelma Kuva: Alan Turing Kuva: Turingin kone Turingin kone kuvaa ideaalitietokonetta Matemaattisesti kaunis abstraktio, mutta sen ajatteleminen sattuu tikkiläistenkin päähän Tarvitaan helpompi abstraktio, ohjelmointikieli joka tekee asioista helpompia Turha kuriositeetti: L A TEX-kieli jolla nämä kalvot on tehty on ilmaisuvoimaltaan yhtä vahva kuin Java Jyry Suvilehto 8
Ohjelmoinnin yleisiä ongelmia Käydään läpi yleisiä asioita joita ohjelmointikielessä olisi hyvä olla. Jos tuntuu siltä että osaatte ennakoida mitä asioita haetaan takaa, niin hyvä. Jos ette, niin kannattaa panostaa lukemiseen. Jyry Suvilehto 9
Deterministisyys Haluamme tehdä ohjelmia jotka ovat muuntautumiskykyisiä. Ohjelman pitää siis ratkaista jokin yleinen ongelma yleisellä tasolla siten että sen parametrejä voidaan muuttaa. "Ohjelma joka laskee piin likiarvon"vs. "ohjelma joka laskee sille annetun kulman tangentin" Miten esittää tietoa joka on luonteeltaan muuttuvaa? Helppo Vaikeampi 5 + 5 =? tan x x Jyry Suvilehto 10
Ehdollisuus Luonnollinen jatkumo edelliseen Haluamme ohjelman käyttäytyvän eri tavoin riippuen muuttuvien alkioiden arvoista Vaikkapa arvioida kemikaalien reaktionopeutta eri kaavalla mikäli systeemissä on katalyyttiä Käytännössä siis haarautamme suorituspolkua ja hyppäämme eri kohtaan ehdosta riippuen. Täältä nousee myös tarve jakaa ohjelmakoodia selkeisiin lohkoihin Kuva: if-then-else -rakenne Jyry Suvilehto 11
Toistaminen Jälleen luonnollinen jatkumo edelliselle... Tällä kertaa teemmekin hypyn "taaksepäin"koodissa ja suoritamme saman kohdan halutun, mahdollisista muuttuvista arvoista riippuvan määrän kertoja Toistamme samaa asiaa monta kertaa ja haaraudumme tästä kohdasta pois vain kun tietyt, ehkä monimutkaisetkin ehdot ovat täyttyneet Kuva: for-silmukka Jyry Suvilehto 12
Tietorakenteet 3 2 1 0 0 Taulukko: Taulukko Kun kerran voimme tehdä asioita ennalta tietämättömän monta kertaa, eikö olisi loogista tehdä niitä yhtä monelle muuttuvalle alkiolle? Luonnolliselta tuntuva tapa tallentaa jokainen muuttuva alkio "erillisen nimen taakse"ei toimi kun nimiä on tuntematon määrä Tarvitsemme siis rakenteita, joihin voimme tallentaa asioita numeroindeksillä, koska numeroita on melkein loputtomasti Jyry Suvilehto 13
Ideat Ohjelmakoodin pitäisi olla ymmärrettävää ja suhtautua reaalimaailmaan Ohjelman rakenteen tulisi tuntua loogiselta kaikille, jotka ovat suurinpiirtein ihmisiä Otetaan käyttöön vanha Sokrateen määritelmä Ideoista Ideat ovat "puhdas abstraktio"reaalimaailman asioista ja (teoriassa) samanlaisia kaikille ihmisille Idea sisältää abstraktin tiedon aistimaailmasta, jotain yleistä Idean ilmentymä on jokin aistimaailman "objekti"joka täyttää tämän Esimerkki: On idea tuolista esineenä jonka päällä voi istua. Takamuksesi alla on yksi tuoli Jyry Suvilehto 14
Kikkailua Laiskuus on kaiken hyvän ohjelmoinnin alku ja juuri Asiat kannattaa tehdä kerran siten, että työmäärä olemassaolevaan lisäämiseksi on mahdollisimman pieni Tämän voisi ehkä toteuttaa edellämainittujen Ideoiden keskinäisillä suhteilla Jyry Suvilehto 15
Ongelmia Tietokonemaailma on melkein täydellinen mutta reaalimaailma ei ole Mitä jos ohjelmoija on tehnyt virheen tai maailman tila on virheellinen (levyke ei ole asemassa tmv)? Selkeästikin joskus on tarpeen palauttaa metodeista arvoja, jotka ovat normaalin paluuarvon ulkopuolella Jos teemme näistäkin arvoista edellämainittuja Ideoita voimme ehkä saavuttaa monipuolisia etuja Jyry Suvilehto 16
Luentotauko n. 10 min Tähän väliin tauko Taukotehtävä Kirjoita luokka Testi ja sille päämetodi. Päämetodi saa komentoriviparametreinaan vaihtelevan määrän merkkijonoja. Mikäli merkkijonoja tulee parillinen määrä, tulee ohjelman tulostaa saamansa parilliset merkkijonot. Mikäli pariton, parittomat. 0 olkoon parillinen ja indeksointi alkakoon nollasta. Jyry Suvilehto 17
Luentotauko n. 10 min Tähän väliin tauko Taukotehtävä Kirjoita luokka Testi ja sille päämetodi. Päämetodi saa komentoriviparametreinaan vaihtelevan määrän merkkijonoja. Mikäli merkkijonoja tulee parillinen määrä, tulee ohjelman tulostaa saamansa parilliset merkkijonot. Mikäli pariton, parittomat. 0 olkoon parillinen ja indeksointi alkakoon nollasta. Totuuden hetki. Hieman tätä vaikeampi tehtävä hyvin todennäköisesti tentissä. Jyry Suvilehto 18
Yksi ratkaisu public class T e s t i { public s t a t i c void main ( S t r i n g [ ] a r gs ){ for ( i n t i =(args. l ength %2); i <a r gs. l ength ; i=i +2) System. out. p r i n t l n ( a r gs [ i ] ) ; } } Pientä kikkailua, mutta toisaalta lyhyt ja ytimekäs. Empiria opettaa, että paperikoodaustehtävässä assarin vastauksen lukemiseen käyttämä aika on kääntäen verrannollinen tehtävästä saataviin pisteisiin kannattaa panostaa paperikoodauksessa ulkonäköön ja siisteyteen. (ei toki ole huono ohje muissakaan vastauksissa) Jyry Suvilehto 19
Java Miten edellämainitut käsitteet vastaavat Javaa ja siinä olevia asioita Ohimennen-huomautuksia Jyry Suvilehto 20
Alkeismuuttujat Ei pidä sekoittaa oliomuuttujiin! boolean b = false; byte by = 127; char c = w ; short s = 5115; int i = 5116; float f = 3.14; long l = 100000000000; double d = 13.37; Jyry Suvilehto 21
Oliomuuttujat Kaikki muut kuin edellämainitut muuttujat ovat Javassa olioita Seurauksia kaikkiin pätevät samat pelisäännöt viittaustyyppisiä muuttujia pitää varata muistia new -operaattorilla myös taulukot ovat olioita! (tosin niitä varten on erikoiskäsittelyä) Jyry Suvilehto 22
Luokat ja oliot Luokat kehitettiin ihmisille helpoiksi tavoiksi jäsentää reaalimaailman asioita ohjelmakoodiksi Luokka kuvaa jotakin Ideaa. Oliot ovat luokan ilmentymiä. class Tuoli on yleinen idea tuolista, mutta takamuksesi alla on ilmentymä tuolista Luokkaan kuuluu kenttiä ja metodeita Metodi eroaa funktiosta sillä, että se sitoo toiminnallisuutta johonkin luokkaan ja sen kenttiin Jyry Suvilehto 23
Ehtolauseet boolean a=true, b=false, c ; i f ( a ){ System. out. p r i n t l n ( " True " ) ; } i f ( a && b ){ System. out. p r i n t l n ( " F a l s e " ) ; } else i f ( a b ){ System. out. p r i n t l n ( " True " ) ; } Ehtolauseet jakavat ohjelman suoritusta lohkoihin, jotka saattavat olla toisensa poissulkevia Ehtolauseita voi ketjuttaa AND (&&) ja OR ( ) -operaatioilla ja kääntää NOT (!) -operaattorilla Jyry Suvilehto 24
Lokkisulkeet ({ ja }) määrittävät ohjelman rakenteen eli lohkot Jyry Suvilehto Ehto- ja toistolauseiden jälkeen suoritetaan seuraava 25 Ohjelmointi, Java ja tärppejä 5. toukokuuta 2008 Ohjelmalohkoista boolean a=true, b=f a l s e ; i f ( a ){ System. out. p r i n t l n ( " True " ) ; System. out. p r i n t l n ( " True " ) ; } i f ( a && b ) System. out. p r i n t l n ( " F a l s e " ) ; System. out. p r i n t l n ( " True " ) ; i f ( a b ){ System. out. p r i n t l n ( " True " ) ; } else { System. out. p r i n t l n ( " F a l s e " ) ; }
Muuttujien näkyvyys i n t temp ; for (... ) { temp =.... } return temp ; for (){ i n t temp ; temp =.... } return temp ; oikein! väärin! Muuttujat on määritelty sen lohkon sisällä, jossa ne esitellään ja kaikkien sitä alempien lohkojen sisällä. Luokkien kenttien tapauksessa pitää erikseen säätää muuttujien näkyvyyttä luokan ulkopuolelle. Jyry Suvilehto 26
Silmukat Mitä? Silmukoita eli toistolauseita (looppeja) käytetään nimensä mukaisesti toistoon eli siihen että tehdään sama asia monta kertaa. Miksi monta? Jokainen silmukkarakenne on kätevä johonkin usein koodauksessa vastaantulevaan tilanteeseen. Tenttin tulevassa ohjelmointitehtävässä kannattaa käyttää oikeaa työkalua. Jyry Suvilehto 27
for Jyry Suvilehto 28
for // juodaan kunnes r a j a t u l e e t ä y t een public void n a u t i K esasta (){ for ( i n t i = 0: i < t h i s. kanniraja ; i ++){ t h i s. j u o d u t K a l j a t ++; } } for-silmukka on tarkoitettu käytettäväksi kun on helppo määrittää toistojen lukumäärä. Erityisen hyvä taulukoiden ja listojen läpikäymiseen. Toki aina voi kikkailla Jyry Suvilehto 29
while while (! t h i s. kannissa ()){ t h i s. j u o d u t K a l j a t ++; } while on tarkoitettu yleiseen toistoon niin kauan kuin joku ehto on voimassa Tässä tapauksessa humalatilan tarkastus voi olla huomattavasti monimutkaisempi omassa metodissaan (tai sitä voidaan kysyä Partneri-luokan oliolta) Toinen esimerkki tekstipohjainen käyttöliittymä while( eiollalopetettu ) pyydakomento() Kikkailemalla voidaan käyttää for-silmukan korvikkeena Jyry Suvilehto 30
do-while do { t h i s. j u o d u t K a l j a t ++; } while (! t h i s. kannissa ( ) ) do-while tekee samaa kuin while, mutta jatkoehto tarkastetaan vasta lopussa yksi taattu suorituskerta alussa "Aina voi ottaa yhden ja katsoa janottaako sen jälkeen vielä" Jyry Suvilehto 31
Eli for kun määrä tiedetään while noin yleensä do-while brassailuun tai erikoistapauksiin Jyry Suvilehto 32
Kaksi taikasanaa break; Katkaisee silmukan suorituksen ja jatkaa sen jälkeisen koodin suoritusta. continue; Hyppää kyseisen toistokerran loppuun ja aloittaa uuden toiston (for-loopissa myös edistää edistysaskeleella) Jyry Suvilehto 33
Taulukot Taulukot ovat ohjelmoinnin peruskauraa, ja yleisin tapa säilyttää tietoa. i n t [ ] [ ] taulukko = new i n t [ 3 ] [ 4 ] // montako lukua mahtuu yhteensä? taulukko [ 2 ] [ 3 ] = 10; // v i i m e i n e n a l k i o kummassakin suunnassa Oliotaulukon alkiot alustuvat nulliksi Taulukko on kiinteän kokoinen. Jyry Suvilehto 34
ArrayList // A r r a y L i s t i l l ä on p a r a m etriton k o n s t r u k t o r i A r r a y L i s t <Olio > l i s t a = new A r r a y L i s t <Olio >() Olio o l i o = new Olio ( ) ; i n t i = 1; l i s t a. add ( o l i o ) ; l i s t a. add ( o l i o, index ) ; l i s t a. get ( index ) ; l i s t a. remove ( index ) ; Listan koko on alustettaessa 0! Lista muuttaa kokoaan. Älkää antako Array-sanan ArrayListissä hämätä (pitkä tarina) Jyry Suvilehto 35
Taulukot ja Listat Yhteistä Käytetään tiedon tallentamiseen. Käytetään laajalti. Eroja Koon dynaamisuus. Jyry Suvilehto 36
Poikkeustenkäsittely Kuva: OteLipesiTangostaException Poikkeustenkäsittely on turvaverkkojen asettelua "taktisiin"kohtiin Poikkeustenkäsittely sisältää myös toimenpiteet "takaisin nuoralle"pääsemiseksi Jyry Suvilehto 37
Lisää poikkeustenkäsittelystä try { t h i s. t a i t e i l e ( ) ; }catch ( OteLipesiTangostaException o ){ t h i s. n ousetakaisin ( ) ; } Poikkeukset ovat aina olioita ja perivät yliluokan Exception Jyry Suvilehto 38
Perintä Selitetään hieman esimerkkitentin yhteydessä Pääperiaatteita Laiskuus Asioiden mekaaninen toisto on ikävää Muutosten helppous Kun laiskuus on maksimissaan, kaikki muutokset tehdään vain yhteen paikkaan Jyry Suvilehto 39
Käydäänpä läpi vanha tentti Ikävä kyllä Kertun tentit eivät helpotu tilastollisella tenttitehtäväanalyysillä Tenttikysymykset virittävät kurssin aihealueen varsin tarkkaan Viime aikoina ollut varsin koodauspainotteisia tehtäviä ja kysymyksiä poikkeustenkäsittelystä ja perinnästä Jyry Suvilehto 40