Tietotyypit ja lausekkeet Lewis & Loftus & Jukka Juslin 1
Tietotyypit Perustavaa laatua olevia ohjelmoinnin käsitteitä Luku 2 käsittelee seuraavia: Merkkijonot Primitiivitietotyypit (eli alkeistietotyypit) Muuttujien esittely ja käyttös Ilmaisut ja operaattoreiden presedenssi Tiedon muuttaminen tyypistä toiseen Syötteen lukeminen käyttäjältä Lewis & Loftus & Jukka Juslin 2
Missä ollaan? Merkkijonot Muuttujat ja sijoittaminen Primitiivitietotyypit Ilmaisut Tiedon konvertointi (kastaus) Interaktiiviset ohjelmat Lewis & Loftus & Jukka Juslin 3
Merkkijono eli String String on merkkijono: tälläinen jono esitetään laittamalla lainausmerkit tekstin ympärille: Esimerkkejä: Tämä on String literaali." Ratapihantie 13" Y" Jokainen String on olio, joka määritellään Javassa String luokassa Jokainen String literaali esittää String oliota Lewis & Loftus & Jukka Juslin 4
println metodi ja String Olemme jo aikaisemmin kutsuneet println metodia tulostaaksemme Stringin System.out olio esittää kohdetta, jonne voimme Stringin lähettää System.out.println ( Ole mikä tähansa, mutta ole hyvä."); olio metodin nimi informaatio metodille (parametrit), tässä tapauksessa String Lewis & Loftus & Jukka Juslin 5
print metodi System.out oliossa oli myös tapa tulostaa Stringejä toisella tavalla print metodi on sama kuin println metodi, mutta tulostus ei vaihda riviä \n merkin avulla lopuksi (ns. Backslash merkit tulosteen ohjauksessa) Lewis & Loftus & Jukka Juslin 6
Stringien konkatenointi String konkatenointioperaattori plusssaa (+) käytetään liittämään yhteen Stringiin toinen Yksi kahvi " + ja maitoa" Plus-operaattoria voidaan myös käyttää liittämään numero Stringiin Yhtä String literaalia ei voi voi hajoittaa kahdelle riville ohjelmassa Lewis & Loftus & Jukka Juslin 7
Stringien konkatenointi + operaattoria käytetään myös aritmeettiseen summaukseen (vrt. 1 + 1) Mikä funktio toimii missäkin yhteydessä riippuu siitä minkälaisella tiedolla sitä kutsutaan (tämä liittyy myös ylikuormitukseen, jota käsittelemme myöhemmin) Jos molemmat operandit ovat Stringejä tai jos yksi operandi on String ja toinen esim. Int + suorittaa String konkatenaation Jos molemmat operandit ovat numeerisia, Java lisää ne toisiinsa (esim. 1+1) + operaattori evaluoidaan vasemmalta oikealle, mutta sulkeita voidaan käyttää muuntelemaan evaluointijärjestystä (pakottaa muutos) Lewis & Loftus & Jukka Juslin 8
Escapet merkkijonoissa Mitä jos haluamme tulostaa lainausmerkin? Seuraava rivi hämäisi kääntäjää, sillä toinen lainausmerkki tulkittaisiiin Stringin lopuksi: System.out.println ( Sanoin Moro" sinulle."); Escape komento ilmaisee jonon merkkejä, jotka esittävät erikoismerkkejä Eskape komento aloitetaan aina kenoviivalla (backslash vrt. slash, vrt. usa näppäimistö) System.out.println ( Sanoin \ Moro\" sinulle."); Lewis & Loftus & Jukka Juslin 9
Escape merkit Joitain Java escape merkkejä: Escape merkit \b \t \n \r \" \' \\ Tarkoitus backspace tab uusi rivi rivin vaihto (carriage return) double quote single quote backslash Lewis & Loftus & Jukka Juslin 10
Missä ollaan? Merkkijonot Muuttujat ja sijoittaminen Primitiivitietotyypit Ilmaisut Tiedon muuttaminen (kastaus) Interaktiiviset ohjelmat Grafiikka Lewis & Loftus & Jukka Juslin 11
Muuttujat muuttuja (tästä käytetään joskus myös nimikettä attribuutti) on muistissa olevan muistipaikan nimi Muuttuja pitää esitellä määrittelemällä muuttujan nimi ja minkätyyppistä tietoa se tulee sisältämään tietotyyppi Muuttujan nimi int summa; int laskuri, temp, tulos; Useita muuttujia voidaan luoda yhdellä esittelyllä. (vrt. taulukot ja hashit myöhemmin) Lewis & Loftus & Jukka Juslin 12
Muuttujan alustus Muuttujien esittelyn yhteydessä muuttujalle voidaan antaa lähtöarvo int summa = 0; int aloitusarvo = 32, max = 149; Kun muuttujaan viitateen ohjelmasta, sen senhetkistä arvoa käytetään Lewis & Loftus & Jukka Juslin 13
Sijoitus sijoitusoperaatio muuttaa muuttujan arvoa Sijoitusoperaattori on = merkki (huomaa epäjohdonmukaisuus matematiikan kanssa, vrt. == myöhemmin) yht = 55; Ilmaisu oikealla evaluoidaan ja tulos talletetaan vasemman puolen muuttujaan Arvo, joka oli yht muuttujassa ylikirjoitetaan Voit sijoittaa muuttujaan vain sellaisia arvoja, jotka ovat samaa tyyppiä kuin muuttuja Lewis & Loftus & Jukka Juslin 14
Vakiot Vakio on tavallinen muuttuja muuten, paitsi että se sisältää saman arvon koko olemassaolonsa ajan Kuten nimi ilmoittaa, kyseessä on vakio ei muuttuja Kääntäjä antaa virheilmoituksen, jos koitat muuttaa vakion arvoa Javassa käytämme final sanaa esitellessämme vakion: final int MIN_HEIGHT = 69; Lewis & Loftus & Jukka Juslin 15
Vakiot Vakiot ovat tärkeitä kolmen syyn takia Ensinnäkin, ne antavat merkityksen muuten maagisille numeroille Esimerkiksi, MAX_LOAD kertoo enemmän kuin vain luvun 250 esiintyminen koodissa Toiseksi, vakiot helpottavat ohjelman ylläpidettävyyttä Vakion arvo täytyy päivittää vain yhteen kohtaan ohjelmaa, vaikka sitä käytettäisiinkin monesta eri paikasta käsin Kolmanneksi, vakiot formaalisti kertovat että ko. Muuttujan arvo ei saa muuttua: näin vältetään toisten ohjelmoijien tekemiä virheitä hekin ymmärtävät että ko. Arvo on tarkoitus pitää vakiona Lewis & Loftus & Jukka Juslin 16
Missä ollaan? Merkkijonot Muuttujat ja sijoittaminen Primitiivitietotyypit Ilmaisut Tiedon konvertointi (kastaus) Interaktiiviset ohjelmat Lewis & Loftus & Jukka Juslin 17
Alkeistietotyypit (primitiivityypit) Javassa on kahdeksan primitiivitietotyyppiä Neljä näistä esittää kokonaislukuja: byte, short, int, long Kaksi näistä esittää desimaalilukuja: float, double (erottimena. merkki pääsääntöisesti) Yksi esittää merkkejä: char Ja yksi esittää boolean arvoja (true/false): boolean Lewis & Loftus & Jukka Juslin 18
Numeerinen primitiivitieto Eri numeeristen pirimitiivityyppien välinen ero on koko ja siksi ne pystyvät tallettamaan erisuuruisia lukuja: Tyyppi Koko Minimiarvo Maksimiarvo byte short int long 8 bits 16 bits 32 bits 64 bits -128-32,768-2,147,483,648 < -9 x 10 18 127 32,767 2,147,483,647 > 9 x 10 18 float double 32 bits 64 bits +/- 3.4 x 10 38 ja 7 desimaalia +/- 1.7 x 10 308 ja 15 desimaalia Lewis & Loftus & Jukka Juslin 19
Merkit char muuttujaan talletetaan yksi merkki Merkit esitetään alaspäin osoittavissa hipsuissa (single quotes): Esimerkkejä: 'a' 'X' '7' '$' ',' '\n' char topgrade = 'A'; char terminator = ';', separator = ' '; Huomaa ero primitiivi char-muuttujan, joka tallettaa vain yhden merkin, ja String olion, joka tallettaa useita merkkejä, välillä Lewis & Loftus & Jukka Juslin 20
Merkistöt merkistö on järjestetty lista merkkejä, jossa jokainen merkki vastaa uniikkia numeroa char muuttuja Javassa voi periaatteessa tallettaa minkä tahansa merkin Unicode merkistötä (ko. Merkin näyttäminen ja syöttäminen ei silti ole välttämättä niin helppoa ) Unicode merkistö käyttää kunkin merkin tallentamiseen 16 bittiä, joten kullekin merkille on mahdollista 65,536 erilaista arvoa Unicode on kansainvälinen merkistö, sisältäen symboleja ja merkkejä monista maailman kielistä Lewis & Loftus & Jukka Juslin 21
Merkit ASCII merkistö ion vanhempi ja pienempi kuin Unicode, mutta on silti melko suosittu (ASCII 7-bit vs. ASCII 8-bit) esim. Windowsissa ASCII merkit ovat osajoukko Unicode merkistöstä, kuten: isot kirjaimet A, B, C, pienet kirjaimet a, b, c, pisteet Piste, puolipiste, numerot 0, 1, 2, erikoissymbolit &,, \, kontrollimerkit car. return, rivinvaihto, tab,... Lewis & Loftus & Jukka Juslin 22
Boolean boolean arvo esittää true tai false tilannetta Varatut sanat true ja false ovat ainoat validit arvot boolean tyypille boolean tehty = false; boolean muuttujaa voidaan myös käyttää esittämään mitä tahansa kahta tilaa: kuten esimerkiksi onko hehkulamppu päällä vai pois päältä Lewis & Loftus & Jukka Juslin 23
Missä ollaan? Merkkijonot Muuttujat ja sijoittaminen Primitiivitietotyypit Ilmaisut Tiedon muuttaminen (kastaus) Interaktiiviset ohjelmat Lewis & Loftus & Jukka Juslin 24
Ilmaisut (laskutoimitukset) ilmaisu koostuu yhdestä tai monista operaattoreista ja operandeista Aritmeettinen ilmaisu laskee numeeriset tulokset ja käyttää hyväkseen aritmeettisia operaattoreita: summa erotus kertolasku jako jakojäännös + - * / % Jos jompikumpi tai molemmat operandeista ovat desimaalilukuja -> myös tulos on desimaaliluku Lewis & Loftus & Jukka Juslin 25
Jako ja jakojäännös Jos kummatkin operandit ovat jakolaskussa ovat kokonaislukuja -> tulos on myös kokonaisluku (desimaalit dropataan pois, ei pyöristetä) 14 / 3 on 8 / 12 on 4 0 Jakojäännös operaattori (%) palauttaa palauttaa jakojäännöksen koitettuaan laittaa toisen operandin ensimmäiseen operandiin 14 % 3 on 2 8 % 12 on 8 Lewis & Loftus & Jukka Juslin 26
Operaattorien presedenssi Operaattoreita voidaan yhdistellä monimutkaisemman funktion aikaansaamiseksi: result = total + count / max - offset; Operaattoreilla on presedenssi, mikä määrää missä järjestyksessä laskutoimitus evaluoidaan Kertolasku, jakolasku ja jakojäännös evaluoidaan ennen summaa, erotusta ja Stringien konkatenaatiota Aritmeettiset operaattorit, joilla on sama presedenssi evaluoidaan vasemmalta oikella, mutta sulkeita voidaan käyttää (edelleen kuten matematiikassa) pakottamaan evaluointijärjestys toisin (huom. Älä käytä hakasulkeita tässä yhteydessä) Lewis & Loftus & Jukka Juslin 27
Operaattorien presedenssi Mikä on seuraavien funktioiden evaluointijärjestys? a + b + c + d + e 1 2 3 4 a + b * c - d / e 3 1 4 2 a / (b + c) - d % e 2 1 4 3 a / (b * (c + (d - e))) 4 3 2 1 Lewis & Loftus & Jukka Juslin 28
Funktiopuut Puut ovat ohjelmoijalle tärkeät: hakemistopuut, tietorakenteet yms. Tietyn funktion evaluointi voidaan näyttää puun avulla Operaattoreilla alempana puussa on korkeampi presedenssi ko. Lauseessa. Puun purkaminen aloitettaisiin siis alarivistä + a + (b c) / d a / - d b c Lewis & Loftus & Jukka Juslin 29
Sijoituslauseet Sijoituslauseella on alempi presedenssi kuin aritmeettisilla operaattoreilla Ensin lause = operaattorin oikealla puolella evaluoidaan vast = sum / 4 + MAX * lowest; 4 1 3 2 Lopuksi tulos talletetaan muuttujaan vasemmalla puolella Lewis & Loftus & Jukka Juslin 30
Sijoituslauseet Sijoituslauseen oikealle ja vasemmalla puolella voi olla sama muuttuja (HUOMAA, sijoituslause on aivan eri asia kuin matematiikan yhtäsuurikuin merkki -> Javassa vastaava on ==) Ensin, yksi lisätään luku-muuttujan alkuperäiseen arvoon luku = luku + 1; Lopuksi tulos talletetaan takaisin lukuun (alkuperäinen arvo ylikirjoitetaan) Lewis & Loftus & Jukka Juslin 31
Inkrementointi ja dekrementointi Inkrementointi ja dekrementointi operaattorit käyttävät vain yhtä operandia Inkrementointi operaattori (++) lisää yhden operandiinsa dekrementointi operaattori (--) vähentää yhden operandistaan Lause luku++; on siis aivan sama kuin (mutta lyhyempi kirjoittaa) luku = luku + 1; Lewis & Loftus & Jukka Juslin 32
Inkrementointi ja dekrementointi Inkrementointi ja dekrementointi operaattoreita voidaan käyttää joko postfix muodossa: tai prefix muodossa: count++ ++count Kun nämä ovat osana laajempaa lausetta, näillä kahdella voi olla erilaiset vaikutukset (postfix suorittaa laskutoimitukset ennen, ennenkuin tekee esim. Inkrementaation, muussa tapauksessa inkrementaatio tehdään heti -> for-silmukka myöhemmin) Koska inkrementointi ja dekrementointi operaattoreilla on omat erikoiset käyttäytymisensä niiden käytössä tulee olla aluksi kohtuullisen varovainen Lewis & Loftus & Jukka Juslin 33
Sijoitusoperaattorit Usein teemme operaation muuttujalle ja sitten talletamme ko. muuttuneen arvon muuttujan vanhan arvon päälle Java tarjoaa sijoitusoperaattorit yksinkertaistamaan tätä prosessia (lyhyempi kirjoittaa ) Esimerkiksi lause on sama kuin num += count; num = num + count; Lewis & Loftus & Jukka Juslin 34
Sijoitusoperaattorit Javassa on monia sijoitusoperaattoreita, mukaanlukien seuraavat: Operaattori += -= *= /= %= Esimerkki x += y x -= y x *= y x /= y x %= y On sama kuin x = x + y x = x - y x = x * y x = x / y x = x % y Lewis & Loftus & Jukka Juslin 35
Sijoitusoperaattorit Sijoitusoperaattorin oikea puoli voi olla monimutkainen lause Oikean puolen lause kokonaisudessaan evaluoidaan ensin, sitten tulos yhdistetään alkuperäiseen muuttujaan Siksi result /= (total-min) % num; on sama kuin result = result / ((total-min) % num); Lewis & Loftus & Jukka Juslin 36
Sijoitusoperaattorit Joiden sijoitusoperaattoreiden käyttäytyminen riippuu operandien tyypistä Jos += operaattorit operandit ovat Stringejä, sijoitusoperaatio suorittaa Stringien konkatenaation Sijoitusoperaation käyttäytyminen (+=) on aina konsistentti sitä vastaavaan operaattorin kanssa (+) Lewis & Loftus & Jukka Juslin 37
Missä ollaan? Merkkijonot Muuttujat ja sijoittaminen Primitiivitietotyypit Ilmaisut Tiedon konvertointi (kastaus) Interaktiiviset ohjelmat Lewis & Loftus & Jukka Juslin 38
Tiedon muuntaminen Joskus on tarpeen muuntaa tietoa tyypistä toiseen Esimerkiksi, tietyssä tilanteessa voimme haluta käsitellä kokonaislukua (integer) desimaalilukuna (floating point) Nämä konversiot eivät muuta muuttujan tyyppiä tai siinä pidettyä arvoa ne ainoastaan muuntavat arvon osana laskutoimitusta Lewis & Loftus & Jukka Juslin 39
Tiedon konversio Konversiotilanteissa pitää olla varovainen, jotta vältyttäisiin tiedon hukkaamiselta Avartavia konversiot ovat turvallisia, sillä niissä tarkennetaan pienen tietotyypin esitystä suuremmaksi (kuten short:sta int:iin) Kaventavissa konversioissa voidaan hukata informaatiota, sillä niissä mennään suuremmasta tietotyypistä pienempään (kuten int:stä short:iin) Javassa konversiot voivat tapahtua jollakin seuraavasta kolmesta tavasta: sijoituksen tyyppimuunnos promootio kastaus (tyyppimuunnos) Lewis & Loftus & Jukka Juslin 40
Sijoituksen tyyppimuunnos Sijoituksen tyyppimuunnos tapahtuu kun yhden tyyppienn muuttuja sijoitetaan toisentyyppiseen muuttujaan Jos money on float muuttuja ja dollars on int muuttuja, seuraava sijoituslause muuntaa dollars muuttujassa olevan arvon float:ksi. money = dollars Vain avartavia muunnoksia voi tapahtua sijoituksessa Huomaa, että dollars muuttujassa olevan arvon tyyppi ei muuttunut Lewis & Loftus & Jukka Juslin 41
Tiedon muuntaminen Promootio tapahtuu automaattisesti, kun operaattorit muuntavat operandinsa Esimerkiksi, jos sum on float ja count on int, count:n arvo muutetaan automaattisesti desimaaliluvuksi (float), jotta seuraava laskutoimitus voidaan suorittaa: result = sum / count; Lewis & Loftus & Jukka Juslin 42
Kastaus (casting, eli tyyppimuunnos) Kastaus on voimakkain, ja vaarallisiin muunnoskeino Sekä laajentavia että supistavia tyyppimuunnoksia voisaan tehdä kastauksen avulla Kastaus tapahtuu laittamalla haluttu tyyppi sulkeisiin muutettavaksi halutun arvon eteen Esimerkiksi, jos total ja count ovat kokonaislukuja, mutta haluamme vastauksen desimaalilukuna, voimme kastata total muuttujan: result = (float) total / count; Lewis & Loftus & Jukka Juslin 43
Missä ollaan? Merkkijonot Muuttujat ja sijoittaminen Primitiivitietotyypit Ilmaisut Tiedon muuttaminen (kastaus) Interaktiiviset ohjelmat Lewis & Loftus & Jukka Juslin 44
Interaktiivinen ohjelma Ohjelmat tarvitsevat syötettä (inputtia), jonka perusteella toimia Scanner luokka tarjoaa helppokäyttöiset metodit lukea erityyppisiä syötteitä (numeroita tai tekstiä yms.) Scanner olio voidaan asettaa lukemaan syötettä useista lähteistä, mukaanlukien käyttäjän mahdollisuus syöttää tietoa näppäimistöltä Näppäimistön syöte esitetään System.in olion avulla Lewis & Loftus & Jukka Juslin 45
Syötteen lukeminen Seuraava rivi luo Scanner olion, joka ottaa syötettä vastaan näppäimistöltä: Scanner scan = new Scanner (System.in); new operaattori luo Scanner olion Kun luotu, Scanner oliota voidaan käyttää kutsumaan erityyppisiä input metodeita, kuten: vastausstringi = scan.nextline(); Lewis & Loftus & Jukka Juslin 46
Syötteen lukeminen Scanner luokka on osa java.util luokkakirjastoa, ja ko. Luokka pitää importata ohjelmaan, jotta sitä voidaan käyttää import java.util.scanner; nextline metodi lukee kaiken syötteen, kunnes rivinvaihto havaitaan Olion luomisen ja luokkakirjastojen yksityiskohtia valotetaan luvussa Lewis & Loftus & Jukka Juslin 47
Sanasyöte (tokens) Jollei muuten ilmoiteta, tyhjä tila ymmärretään sanojen, elementtien (tokenien) erottimena. Huomaa, että Java ei voi ymmärtää käsitettä sana, se näkee vain erilaisia merkkijonoja Tyhjä tila voi olla välilyönte(jä), tabeja tai rivinvaihtoja next metodi Scanner luokassa lukee lukee seuravaavan input tokenin ja palauttaa sen Stringinä Metodit kuten nextint ja nextdouble lukevat ko. Tyypin mukaista tietoa (ja palauttavat ko. Tyypin mukaista tietoa) Lewis & Loftus & Jukka Juslin 48
Missä ollaan? Merkkijonot Muuttujat ja sijoittaminen Primitiivitietotyypit Ilmaisut Tiedon muuttaminen (kastaus) Interaktiiviset ohjelmat Lewis & Loftus & Jukka Juslin 49
Yhteenveto Luvussa kaksi keskityimme seuraaviin: Merkkijonot Primitiivitietotyypit Muuttujien esittely ja käyttö Lauseet ja operaattoreiden presedenssi Tiedon konversiot Syötteen vastaanottaminen käyttäjältä Lewis & Loftus & Jukka Juslin 50