OHJELMOINTITEKNIIKKA



Samankaltaiset tiedostot
OHJELMOINTITEKNIIKKA 1

PLA OHJELMOINTITEKNIIKKA. Syksy 2015 Mika Saari

Ohjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti:

Java-kielen perusteita

Java-kielen perusteita

Java-kielen perusteet

Java-kielen perusteet

20. Javan omat luokat 20.1

Sisällys. 20. Javan omat luokat. Java API. Pakkaukset. java\lang

17. Javan omat luokat 17.1

Metodien tekeminen Javalla

Java-kielen perusteet

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

Seuraavassa on esimerkki for-, while- ja do-while -lauseesta:

17. Javan omat luokat 17.1

Luokka Murtoluku uudelleen. Kirjoitetaan luokka Murtoluku uudelleen niin, että murtolukujen sieventäminen on mahdollista.

13. Loogiset operaatiot 13.1

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

Sisältö. 22. Taulukot. Yleistä. Yleistä

Listarakenne (ArrayList-luokka)

Metodit. Metodien määrittely. Metodin parametrit ja paluuarvo. Metodien suorittaminen eli kutsuminen. Metodien kuormittaminen

Ohjelmointi 1 / 2009 syksy Tentti / 18.12

Yleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma.

11. Javan toistorakenteet 11.1

12. Javan toistorakenteet 12.1

Tietorakenteet. JAVA-OHJELMOINTI Osa 5: Tietorakenteita. Sisällys. Merkkijonot (String) Luokka String. Metodeja (public)

Sisältö. 2. Taulukot. Yleistä. Yleistä

Taulukot. Jukka Harju, Jukka Juslin

Javan perusteet. Ohjelman tehtävät: tietojen syöttö, lukeminen prosessointi, halutun informaation tulostaminen tulostus tiedon varastointi

Vertailulauseet. Ehtolausekkeet. Vertailulauseet. Vertailulauseet. if-lauseke. if-lauseke. Javan perusteet 2004

7. Näytölle tulostaminen 7.1

Sisällys. 12. Näppäimistöltä lukeminen. Yleistä. Yleistä

13. Loogiset operaatiot 13.1

2. Lisää Java-ohjelmoinnin alkeita. Muuttuja ja viittausmuuttuja (1/4) Muuttuja ja viittausmuuttuja (2/4)

Taulukot. Taulukon määrittely ja käyttö. Taulukko metodin parametrina. Taulukon sisällön kopiointi toiseen taulukkoon. Taulukon lajittelu

Olio-ohjelmointi Javalla

12. Javan toistorakenteet 12.1

Ohjelmointi 2 / 2008 Välikoe / Pöytätestaa seuraava ohjelma.

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?

Taulukoiden käsittely Javalla

Taulukot. Taulukon käsittely. Tämän osan sisältö. Esimerkki. Taulukon esittely ja luonti. Taulukon alustaminen. Taulukon koko

Java kahdessa tunnissa. Jyry Suvilehto

Rajapinta (interface)

ITKP102 Ohjelmointi 1 (6 op)

Kääreluokat (oppikirjan luku 9.4) (Wrapper-classes)

ITKP102 Ohjelmointi 1 (6 op)

12. Näppäimistöltä lukeminen 12.1

ITKP102 Ohjelmointi 1 (6 op)

Tietojen syöttäminen ohjelmalle. Tietojen syöttäminen ohjelmalle Scanner-luokan avulla

Informaatioteknologian laitos Olio-ohjelmoinnin perusteet / Salo

Ohjelmassa on käytettävä funktiota laskeparkkimaksu laskemaan kunkin asiakkaan maksu. Funktio floor pyöristää luvun lähimmäksi kokonaisluvuksi.

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Taulukot & Periytyminen

Harjoitus 4 (viikko 47)

14. Hyvä ohjelmointitapa 14.1

ITKP102 Ohjelmointi 1 (6 op)

Alkuarvot ja tyyppimuunnokset (1/5) Alkuarvot ja tyyppimuunnokset (2/5) Alkuarvot ja tyyppimuunnokset (3/5)

Sisällys. 11. Javan toistorakenteet. Laskurimuuttujat. Yleistä

Ohjelmoinnin perusteet, kurssikoe

Tässä tehtävässä käsittelet metodeja, listoja sekä alkulukuja (englanniksi prime ).

Ehto- ja toistolauseet

Lauseet. Ehdollinen lause. Tämän osan sisältö. Ehdollinen lause. Esimerkkejä. Yksinkertainen ehto. Lohkosulut ja sisennys. Ehdollinen lause if

Kerta 2. Kerta 2 Kerta 3 Kerta 4 Kerta Toteuta Pythonilla seuraava ohjelma:

// Tulostetaan double-tyyppiseen muuttujaan "hinta" tallennettu // kertalipun hinta ja vaihdetaan riviä. System.out.printf("%.1f euros.

Ohjelmoinnin jatkokurssi, kurssikoe

4. Luokan testaus ja käyttö olion kautta 4.1

Koottu lause; { ja } -merkkien väliin kirjoitetut lauseet muodostavat lohkon, jonka sisällä lauseet suoritetaan peräkkäin.

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

11. Javan valintarakenteet 11.1

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

13. Hyvä ohjelmointitapa (osa 1) 13.1

1. Omat operaatiot 1.1

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op. Standardi- ja tietorakenneluokkia

1. Kun käyttäjä antaa nollan, niin ei tulosteta enää tuloa 2. Hyväksy käyttäjältä luku vain joltain tietyltä väliltä (esim tai )

5/20: Algoritmirakenteita III

8. Näppäimistöltä lukeminen 8.1

Java-kielen perusteita

Olion elinikä. Olion luominen. Olion tuhoutuminen. Olion tuhoutuminen. Kissa rontti = null; rontti = new Kissa();

Sisällys. 1. Omat operaatiot. Yleistä operaatioista. Yleistä operaatioista

Merkkijono määritellään kuten muutkin taulukot, mutta tilaa on varattava yksi ylimääräinen paikka lopetusmerkille:

System.out.printf("%d / %d = %.2f%n", ekaluku, tokaluku, osamaara);

Sisällys. 12. Javan toistorakenteet. Yleistä. Laskurimuuttujat

Perusteet. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät Pasi Sarolahti

Perusteet. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät Pasi Sarolahti

System.out.printf("%d / %d = %.2f%n", ekaluku, tokaluku, osamaara);

Lohkot. if (ehto1) { if (ehto2) { lause 1;... lause n; } } else { lause 1;... lause m; } 15.3

14. Poikkeukset 14.1

11. Javan valintarakenteet 11.1

1. Mitä tehdään ensiksi?

Python-ohjelmointi Harjoitus 2

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

Tehtävä 1. Tehtävä 2. Arvosteluperusteet Koherentti selitys Koherentti esimerkki

Harjoitus 2 (viikko 45)

8. Näppäimistöltä lukeminen 8.1

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet, syksy 2006

Rinnakkaisohjelmointi kurssi. Opintopiiri työskentelyn raportti

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä. Tiedonkätkentä. Aksessorit. 4.2

Muuttujat ja kontrolli. Ville Sundberg

public static void main (String [] args)

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

Transkriptio:

OHJELMOINTITEKNIIKKA 1 Kurssin suoritus Kurssin kahdesta tentistä saa kummastakin enintään 10 pistettä ja harjoituksista enintään 10 pistettä eli kurssin maksimipistemäärä on 30. Arvosana määräytyy oheisen taulukon mukaan. Tentit ovat ohjelmointitehtäviä. Harjoituksen jokaisesta kolmesta tehdystä tehtävästä saa 1 pisteen (hyvä yritys riittää). Opiskelija lähettää harjoitusohjelmansa sähköpostin liitteenä osoitteeseen mika.saari@tut.fi eräpäivään mennessä. Tenttiohjelman arviointikriteerit ovat: kääntyy(2), tekee annetun tehtävän(3), ratkaisulogiikka(3), luettavuus(2). Harjoitus- ja tenttipisteet huomioidaan kevään 2015 uusintatenteissä. Uusintatenttejä on kaksi ja ne kattavat kurssin koko aihealueen. Yhdellä uusintatentillä voi korvata yhden tenttisuorituksen. Harjoituksia ei voi korvata eräpäivän jälkeen. Luentomateriaali, luennolla laaditut ohjelmat, harjoitustehtävät ja harjoitusten mallivastaukset löytyvät verkko-osoitteesta http://www.students.tut.fi/~saari5/pla_31100_2014/ PISTEET ARVOSANA 27 5 24 4 21 3 18 2 15 1 <15 0 3 Ohjelmointitekniikka - Markku Nevanranta 1

Java-kirjoja Mika Vesterholm, Jorma Kyppö: Java-ohjelmointi, Talentum 2008, ISBN 978-952-14-1356-8 Simo Silander, Vesa Ollikanen, Juha Peltomäki: Java, WSOY 2010, ISBN 978-951-846-237-2 Jukka Harju, Jukka Juslin: Java-ohjelmointi opas ammattimaiseen osaamiseen, Readme.fi 2009, ISBN 978-952-220-084-6 http://courses.caveofprogramming.com/course/java-for-complete-beginners/ 4 Java-ohjelmointikielen yleisyys TIOBE Programming Community Index (ohjelmoijia, kursseja, toimijoita) 2014 2013 kieli % %muutos 1 2 C 16 +0.43 2 1 Java 15-0.99 3 4 Objective-C 10 +1.47 4 3 C++ 5-4.68 5 7 Basic 4-0.24 6 6 C# 3-2.71 7 8 Python 3-0.48 8 5 PHP 2-3.83 9 11 Perl 2 +0.18 10 9 JavaScript 2 +0.08 11 - Visual Basic 1 +2.01 12 13 Visual Basic.NET 1-0.01 13 10 Ruby 1-0.83 14 23 F# 1 +0.56 15 18 Pascal 1 +0.42 16 12 Transact-SQL 1-0.35 17 38 ActionScript 1 +0.69 18 14 Delphi 1-0.00 19 16 Lisp 1 +0.08 20 17 PL/SQL 1 +0.03 6 Ohjelmointitekniikka - Markku Nevanranta 2

Ohjelmointikielten käytön kehitys 7 OHJELMANKEHITYS JAVA-YMPÄRISTÖSSÄ 8 Ohjelmointitekniikka - Markku Nevanranta 3

Ohjelman suoritus tietokoneessa prosessori keskusmuisti levymuisti käskykanta compile execute Editori Ohjelma Kääntäjä/Tulkki open save tiedostot Ohjelma Tiedot 9 Java-kielen tulkitseminen AJAMINEN SYÖTTÖTIEDOT ohjelma.java ohjelma.class OMA OHJELMA LAUSEKIELELLÄ KÄÄNTÄJÄ KONEKIELELLÄ OMA OHJELMA VÄLIKIELELLÄ (tavukoodi) TULKKI JVM:ssä (JRE) Editori JDK JAVAN KIRJASTOT TULOSTIEDOT 12 Ohjelmointitekniikka - Markku Nevanranta 4

Työvälineiden asennus Java SE 8 (JDK, JRE) dokumentaatio Eclipse Luna NetBeans 8.0 JCreator jgrasp JBuilder Linkit kurssin sivuilla Käyttöopetus harjoituksissa 13 Editori ja dokumentaatio Projekti, lähdekielihakemistot, package, luokka, 14 Ohjelmointitekniikka - Markku Nevanranta 5

ALGORITMINEN AJATTELU 15 Ongelman hahmottaminen ohjelmaksi PALVELU Input Output TOIMINTA Prosessi TIEDOT Muuttujat 4 8 LUVUT LUKU1 LUKU2 KESKIARVO Puoliohjelma Peräkkäin Toisto Valinta Tiedot toiminnan kuvauksesta 1. Lisää summaan annetut luvut 2. Jaa summa lukujen määrällä 6 VASTAUS VASTAUS Hahmottamisprosessi ongelmasta ratkaisuun: toiminnan ymmärtäminen + algoritmin keksiminen + tekniikan osaaminen + ohjelmointitekniikkaa 16 Ohjelmointitekniikka - Markku Nevanranta 6

Keskiarvo-vuokaavio KESKIARVO LUE LUKU LUKU >= 0 E K VASTAUS= VASTAUS+LUKU N=N+1 VASTAUS= VASTAUS / N TULOSTA VASTAUS LOPPU 17 Keskiarvo-puoliohjelma PERÄKKÄISYYS VASTAUS = 0, N = 0, LUKU LUVUT Peräkkäin Valinta Toisto L: LUE LUKU JOS LUKU < 0 MENE LOPPU VALINTA VASTAUS = VASTAUS + LUKU N = N + 1 VASTAUS MENEL LOPPU: VASTAUS=VASTAUS / N TULOSTA VASTAUS TOISTO 18 Ohjelmointitekniikka - Markku Nevanranta 7

Java-ohjelman rakenne L: PUOLIOHJELMA VASTAUS = 0, N = 0, LUKU LUE LUKU JOS LUKU < 0 MENE LOPPU JAVA-OHJELMA public class Keskiarvo { public static void main(string[] args) { double vastaus=0, luku; int n=0; VASTAUS = VASTAUS + LUKU N = N + 1 MENE L LOPPU: VASTAUS=VASTAUS / N TULOSTA VASTAUS luku = Lue.desi( ); while (luku!= 0) { vastaus = vastaus + luku; vastaus += luku; n = n + 1; n++; luku = Lue.desi( ); vastaus = vastaus / n; vastaus /= n; System.out.println( Keskiarvo on +vastaus); 19 Ohjelman laatimisen vaiheet Editori kuntoon Perspektiivit, working setit, workspacet, Projektit Lähdekoodikansiot (java) Package-kansiot Tuloskoodikansio (class) Koodin kirjoitus editorilla Kääntäminen Virheen jäljitys Välitulosteet Debuggaus Testaus Integrointi järjestelmään Käyttöönotto 20 Ohjelmointitekniikka - Markku Nevanranta 8

Luentoharjoitus 1 Minkälaisia asioita teet päivittäin a) peräkkäin b) toistuvasti c) valitsemalla Eroaako ihminen tietokoneesta? 21 Luentoharjoitus 2 Tehdään ohjelma, joka antaa käyttäjän pelata sudokua. Minkälaisia tehtäviä ja missä järjestyksessä ne suoritetaan. 22 Ohjelmointitekniikka - Markku Nevanranta 9

Luentoharjoitus 3 Muuttuja SALDO = 10 000 euroa. Muuttuja KORKO = 4 %. Muuttuja VUODET = 5 vuotta. Laadi (puoli)ohjelma, joka kertoo, kuinka paljon rahaa tilillä on VUODET-muuttujan osoittaman vuosimäärän kuluttua. KorkoWhile.java 23 Luentoharjoitus 4 Laadi radioaktiivisen aineen puoliintumisen laskeva (puoli)ohjelma siten, että ohjelma ilmoittaa, milloin radioaktiivisuuden taso on laskenut alle annetun arvon. Mitä muuttujia ohjelmassa tarvitaan? Puoliintumisaika.java 24 Ohjelmointitekniikka - Markku Nevanranta 10

JAVAN KIRJOITUSTYYLI TIETOTYYPIT OPERAATIOT http://www.oracle.com/technetwork/java/codeconv-138413.html 25 Tekstin jako riveille Sisennykset Välilyönnit Sijoittelu while (paaoma > 0) { velkamarkat = paaoma - lyhennys; if (velkamarkat <= 0) System.out.println( Laina maksettu ); else{ paaoma = velkamarkat; System.out.println( Lainaa jäljellä ); 26 Ohjelmointitekniikka - Markku Nevanranta 11

Kommentit /* Usearivisiä kommentteja voi rajata näin */ // Loppurivi tulkitaan kommentiksi lyhennys=paaoma; // Tässä kommentoin yhtä riviä /** Javadoc-ohjelma näyttää tämän dokumentoinnissa */ 27 Kommentit /******************************************************************************* Kuvaus: Ohjelma laskee annetun luvun kertoman (tehtävä 22) Tekijä: Markku Nevanranta 10.8.2012 (opiskelijanumero) Muutettu: 9.8.2013 mn Syttötietojen tarkistus lisätty Julkiset metodit: public void lueluku() kysyy luvun public int tulostaluku() tulostaa kertoman *****************************************************************************/ 28 Ohjelmointitekniikka - Markku Nevanranta 12

Tunnukset Tunnukseksi kutsutaan nimeä, jonka ohjelmoija antaa jollekin nimettävälle asialle: muuttujalle, metodille, vakiolle, luokalle, Tunnusten nimet ovat pituudeltaan rajoittamattomia merkkejä, numeroita Unicode: å, ä, ö pienet ja isot kirjaimet ovat eri merkkejä (palkka, Palkka) luokkien nimissä ei å, ä, ö merkkejä Muuttujien nimet on hyvä alkaa pienellä kirjaimella Monisanaiset muuttujien toinen, kolmas jne. sanat alkavat isoilla kirjaimilla Silmukkalaskureina käytetään lyhyitä (yksikirjaimisia) muuttujanimiä Luokkien nimet alkavat isolla kirjaimella Vakiot kirjoitetaan kokonaan isolla 29 Tunnukset int laskuri, kuukaudennumero, palkkavero; for (int i=0; i<100; i++) Luokan nimi public class Auto { Vakiot final int KKLKM = 12; 31 Ohjelmointitekniikka - Markku Nevanranta 13

Biteistä tietotyypeiksi luku=arvo+2 OHJELMA ASIAKAS string etunimi string sukunimi int luku string osoite TIEDOT Kalle Kehveli 45 Kotikuja 5 ADD R1,123 KalleKehveli45Kotikuja 5 tulkinta/koodaus? 1001100100100111 1001100100100111 32 Muuttujan rakenne Yksi kenttä: muuttuja = arvo Rakenne eli monta kenttää: muuttuja = osoite Esimerkiksi: Asetus summa = palkka; henkilö = asiakas; Vertailu summa == palkka; henkilö == asiakas; KESKUSMUISTI OHJELMA palkka Asiakas nimi kunta saldo kuukaudet[ ] 9500 KALLE VIRTANEN PORI 10000 31 28 31 30 31 30 31 31 30 31 30 31 33 Ohjelmointitekniikka - Markku Nevanranta 14

Perustietotyypit TYYPPI BITTEJÄ ARVOALUE byte 8-128 127 short 16-32768 - 32767 int 32-2147483648 - 2147483647 long 64-9223372036854775808 9223372036854775807 float 32 1.4*10-45 3.4*10 38 (7 tarkkuus) double 64 4.9*10-324 1.8*10 308 (15 tarkkuus) char 16 a \n \\ numero (Unicode koodi) boolean enum true, false {arvoluettelo 34 Tyyppimuunnokset AUTOMAATTINEN MUUNNOS int a; long b; b = a; byte 8 short 16 char 16 int 32 float 32 long 64 double 64 OHJELMOIJAN TEKEMÄ TYYPPIMUUNNOS int a; long b; a = (int) b; Järkevissä tapauksissa tehdään järkeviä katkaisuja. Järjettömissä tapauksissa vastuu on ohjelmoijalla. 35 Ohjelmointitekniikka - Markku Nevanranta 15

Luentoharjoitus 5 Mitkä tietotyypit ovat sopivia seuraaville tiedoille? Nimi Palkka Ikä Syntymäaika Puhelinnumero Tieto luottokelpoisuudesta 36 Perusoperaatiot (presedenssi ja assosiatiivisuus) [ ]. ( ) e++ e-- ++e --e +e -e! ~ new (tyyppi)e * / % + - << >> >>> < > >= <= ==!= eka = toka = 6; >> säilyttää etumerkin << ja >>> lisää nollan & ^ &&?: = += -= *= /= %= <<= >>= >>>= &= ^= = 37 Ohjelmointitekniikka - Markku Nevanranta 16

Esimerkki (operaatioita) /*Keskiarvon laskentaohjelma Markku Nevanranta 31.8.2009 */ public class Keskiarvo { public static void main(string[] args) { double vastaus=0, n=0, luku; luku = Lue.desi( ); while (luku!= 0) { vastaus += luku; //kerätään summaa n++; //lasketaan lukujen määrä luku = Lue.desi( ); vastaus /= n; System.out.println( Keskiarvo on +vastaus); 38 Esimerkki (bittioperaatiot) public class Maski { public static void main(string[] args) { final int LUKU = 1; //001 final int KIRJOITUS = 2; //010 final int SUORITUS = 4; //100 int liput = 0; liput = LUKU; //liput = 001 liput = KIRJOITUS; //liput = 011 if ((liput & KIRJOITUS) == KIRJOITUS) System.out.println( On oikeus kirjoittaa ); 40 Ohjelmointitekniikka - Markku Nevanranta 17

Lukeminen (Lue) Lukeminen voidaan tehdä monella tasolla: 1. Lue-luokkaa käyttäen Rakennetaan itse omaan tarpeeseen sopiva luokka luku = Lue.koko( Anna luku: ); Lue.koko() lukee kokonaisluvun Lue.desi() lukee desimaaliluvun Lue.rivi() lukee rivin tekstiä Lue.merkki() lukee yhden merkin Lue.totuus() lukee totuusarvon KorkoWhile.java 42 Lukeminen (Scanner) 2. Scanner-luokkaa käyttäen Käsittelee tietovirrasta tulevaa merkkijonoa import java.util.scanner; Scanner lukija = new Scanner(System.in); System.out.println( Anna luku: ); luku = lukija.nextint(); KorkoScanner.java 43 Ohjelmointitekniikka - Markku Nevanranta 18

Lukeminen (tietovirta) 3. Tietovirtoja käyttäen static BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in)); public static int kluku(){ int arvo=-1; boolean ok; do{ try{ arvo=integer.parseint(stdin.readline()); ok=true; catch (Exception e) { System.out.println("Kelvoton kokonaisluku. Anna uusi!"); ok=false; while (!ok); return arvo; 44 Tulostus System-luokan out-tietovirtaluokan metodeita* Muotoilematon System.out.println ( tulostuva teksti ja rivinvaihto ); System.out.print ( teksti ilman rivinvaihtoa ); System.out.println ( hinta on +maksu+ euroa ); System.out.println ( hinta on +(maksu+1.5*vero)+ euroa ); Muotoiltu System.out.printf( vakioteksti ja mutoilut,muuttujaluettelo); System.out.printf( hinta on %d euroa\n, maksu); System.out.printf( hinta on %5d euroa\n, maksu); System.out.printf( hinta on %.2f euroa\n, maksu*vero); System.out.printf( hinta on %10.2f euroa\n, maksu*vero); //pyöristys System.out.printf( Tässä teksti\n %s\nteksti loppui, teksti); * katso dokumentaatiota (Formatter-luokka tai System.out.printf (format string syntax)) 45 Ohjelmointitekniikka - Markku Nevanranta 19

OHJAUSRAKENTEET 47 if (ehto) else lauseet lauseet LOHKO ELI KOOTTU LAUSE IF-ehtolause if (ika>20) tulot=opintolaina; else tulot=100; if (ika>20) { tulot=opintolaina; vuokra=1000; else { tulot=100; karkkiin=30; 48 Ohjelmointitekniikka - Markku Nevanranta 20

Ehto-osa VERTAILU- OPERAATIOT LOOGISET OPERAATIOT > >= < <= ==!= && ja tai ^ xor! ei Loogiset metodit 49 Monitasoinen IF if (koulutus.equals( DI )) { if (ohjelmointitaito== k ) palkka=20000; else palkka=15000; if (koulutus.equals( DI )) if (ohjelmointitaito== k ) palkka=20000; else palkka=15000; if (koulutus.equals( DI )) { if (ohjelmointitaito== k ) palkka=20000; else palkka=15000; palkka=15000; if (koulutus.equals( DI ) && ohjelmointitaito== k ) palkka=20000; Huomaa! Ulompi if sisältää yhden lauseen ei sulkeita Vastaako valkoista tai vihreää ehtoa? 50 Ohjelmointitekniikka - Markku Nevanranta 21

IF-esimerkkejä Onko samat? if (ika<=20 && omaisuus>=1000000) if (ika>20 omaisuus<1000000) Kumpi ehto-lauseke valitsee nuoren miljonäärin? Onko jälkimmäinen sama kuin edellinen jos edessä! Kuka saa seuraavissa tapauksissa halvan pääsylipun? if (ika<15 ika>65 && opiskelija== k ) if ((ika<15 ika>65) && opiskelija== k ) Miten korjaisit lauseen siten, että nuori, vanha tai opiskelija saa halvan pääsylipun? 51 Esimerkki (ehto-operaattori) if (arvosana>0) System.out.println( Tentti on hyväksytty ); else System.out.println( Tentti on hylätty ); System.out.println( Tentti on + (arvosana>0? hyväksytty : hylätty )); 52 Ohjelmointitekniikka - Markku Nevanranta 22

switch (lauseke) { case vakio1: lauseet; break; case vakio2: case vakio3: lauseet; case vakio4: lauseet; break; default: lauseet; break; SWITCH-valintalause 53 SWITCH-esimerkki1 int kk; do{ kk=lue.koko(); switch (kk) { case 1: System.out.println( Tammikuu ); break; case 2: System.out.println( Helmikuu ); break; case 3: System.out.println( Maaliskuu ); break; case 4: System.out.println( Huhtikuu ); break; case 5: System.out.println( Toukokuu ); break; case 6: case 7: case 8: System.out.println( Kesä ); break; case 9: System.out.println( Syyskuu ); break; case 10: System.out.println( Lokakuu ); break; case 11: System.out.println( Marraskuu ); break; case 12: System.out.println( Joulukuu ); break default: System.out.println( Virheellinen kuukausinumero ); while (kk!= 0); 54 Ohjelmointitekniikka - Markku Nevanranta 23

SWITCH-esimerkki2 String kk; do{ kk=lue.rivi(); switch (kk) { case "Maaliskuu": case "Huhtikuu": case "Toukokuu": System.out.println("Kevät"); break; case "Kesäkuu": case "Heinäkuu": case "Elokuu": System.out.println("Kesä"); break; case "Syyskuu": case "Lokakuu": case "Marraskuu": System.out.println("Syksy"); break; case "Joulukuu": case "Tammikuu": case "Helmikuu": System.out.println("Talvi"); break; default: System.out.println("Virheellinen kuukausi"); while (kk.equals("")); 55 WHILE-toistolause while (jatkamisehto) toistettavat lauseet jatkamisehto suoritetaan joka toistokerran alussa ja toistettavat lauseet suoritetaan jos jatkamisehto on tosi 56 Ohjelmointitekniikka - Markku Nevanranta 24

WHILE-esimerkkejä int i=0; while (i<5) { System.out.println(i); i++; int i=0; while ( i<5) System.out.println(i++); int luku=lue.koko(); while (luku!= 0) { System.out.println(luku); luku=lue.koko(); int luku; while ((luku=lue.koko())!= 0) System.out.println(luku); 57 FOR-toistolause for (alkuasetus; jatkamisehto; etenemisaskel) toistettavat lauseet alkuasetus suoritetaan kerran ennen toistojen aloittamista jatkamisehto totuusarvoinen lauseke, joka tarkistetaan ennen jokaista toistokertaa ja jos se on tosi suoritetaan toistettavat lauseet etenemisaskel lause joka suoritetaan jokaisen toistokerran jälkeen 58 Ohjelmointitekniikka - Markku Nevanranta 25

FOR-esimerkkejä for (int i=0; i<6; i++) System.out.println(i*i); for (int i=0, j=10, k=1; i<6 && j>2; i++, j--) { System.out.println(i*j*k); k++; Onko jatkamisehto järkevä? 59 FOR-esimerkkejä for (int i=0; i<4; i++) System.out.println(taulu1[i]); taulu1 2 45 56 67 for (int i=0; i<6; i++) for (int j=0; j<4; j++) System.out.println(taulu2[i][j]); Mikä on läpikäyntijärjestys? taulu2 2 45 56 67 89 2 88 7 67 56 12 45 9 2 2 5 1 2 5 33 22 5 55 44 60 Ohjelmointitekniikka - Markku Nevanranta 26

FOREACH-tyyppinen toistolause for (tyyppi muuttuja: kokoelma) toistettavat lauseet tyyppi muuttuja kokoelma kokoelmasta poimittavan tiedon tyyppi kokoelmasta poimittava tieto kokoelma josta tietoalkiot poimitaan yksi kerrallaan ja sillä suoritetaan toistettavat lauseet 61 FOREACH-esimerkki for (int luku : taulu) System.out.println(luku); taulu 2 45 56 67 62 Ohjelmointitekniikka - Markku Nevanranta 27

DO-toistolause do toistettavat lauseet while (jatkamisehto) Miten eroaa while-lauseesta? 63 DO-esimerkki do { System.out.println( Anna luku: ); luku = Lue.koko(); System.out.println(luku); while (luku!= 0); Mitä hyötyä vastaavaan while-lauseeseen? 64 Ohjelmointitekniikka - Markku Nevanranta 28

BREAK-lause Break keskeyttää switch- tai toistolauseen suorituksen for (int i=1; i<100; i++) { if (i%5 == 0) break; System.out.println(i); 65 BREAK-lause Pelkkä break keskeyttää vain sisemmän rakenteen suorituksen for (int i=0; i<3; i++) for (int j=0; j<3; j++) { if (i == j) break; System.out.println(taulu[i][j]); Osoitteellinen break keskeyttää rakenteen, johon osoite viittaa ulompi: for (int i=1; i<9; i++) // sudokuruudukon täyttö for (int j=1; j<9; j++) if (vapaa(i,j)){ asetapuuttuvanumero(i,j); break ulompi; 66 Ohjelmointitekniikka - Markku Nevanranta 29

CONTINUE-lause Keskeytetään toiston meneillään oleva kierros ja aletaan seuraava kierros for (int i=1; i<1000; i++) { if (i%7 == 0) continue; System.out.println(i); keskeytetään ulomman silmukan meneillään oleva kierros ja aletaan seuraava kierros ulompi: for (int i = 0; i < 10; i+=2) { for (int j = 0; j < 20; j++) if (taulu[i][j] == 0) continue ulompi; System.out.println("Löytyi riviltä " + i); 67 Luentoharjoitus 6 Tulosta kaikista syöttämistäsi luvuista suurin ja pienin. Esittele Format 68 Ohjelmointitekniikka - Markku Nevanranta 30

Luentoharjoitus 7 Muunna korko-ohjelma for-silmukkaa käyttäväksi. Jäljitä ohjelman kulku debuggerilla. 69 Luentoharjoitus 8 Tee ohjelma, joka antaa halutun määrän alkulukuja* yhdestä lähtien. * Alkuluku on 1 suurempi luonnollinen luku (positiivinen kokonaisluku), joka on jaollinen vain 1:llä ja itsellään. 70 Ohjelmointitekniikka - Markku Nevanranta 31

Luentoharjoitus 9 Vuosi on karkausvuosi, jos se on jaollinen 4:llä, mutta ei sadalla. 400:lla jaolliset kuitenkin ovat karkausvuosia. Laadi vuorovaikutteinen sovellus, joka tulostaa karkausvuodet käyttäjän pyytämältä vuosilukuväliltä. 71 Luentoharjoitus 10 Tutki, paljonko sinulla on rahaa 30 vuoden päästä, jos sijoitat nyt 1000 euroa kasvuosakkeeseen ja vuosittainen tuotto on 8 prosenttia ja pankin vuosittainen hallinnointikustannus on a) 0 prosenttia b) 2 prosenttia. Kasvuosake = vuosittain tuotto lisätään pääomaan 72 Ohjelmointitekniikka - Markku Nevanranta 32

TAULUKKO 73 Taulukko on olio int[ ] jono = new int[5]; jono 0 0 0 0 0 0 1 2 3 4 74 Ohjelmointitekniikka - Markku Nevanranta 33

Moniulotteiset taulukot 0 1 2 3 4 int[ ] jono = new int[5]; 0 0 0 0 0 double[ ][ ] taulu = new double[3][5]; 0 1 2 0 1 2 3 4 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 char[ ][ ][ ] merkit = new char[3][5][4]; \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 75 Taulukon alustus int[ ] jono = new int[5]; jono[3] = 8; jono 0 0 0 8 0 0 1 2 3 4 jono int[ ] jono = {1,8,3,4,2; 1 8 3 4 2 0 1 2 3 4 76 Ohjelmointitekniikka - Markku Nevanranta 34

Taulukon alustus String[ ] nimet = { Liisa, Aki, Ville, Juha-Matti, Mia ; 0 1 2 3 4 L i i s a A k i V i l l e J u h a M a t t i M i a boolean[ ][ ] totuus = {{true,true,false, {false,true,false; true true false false true false 77 Taulukkosääntöjä Taulukon alkiot ovat samaa tyyppiä Indeksi int-tyyppinen Ensimmäisen alkion indeksi on 0 Vasta suoritusvaiheessa huomataan indeksin ylitys Rivien määrä: taulu.length Sarakkeiden määrä: taulu[3].length Taulukot alustetaan aina (olio) Taulukkomuuttuja voi osoittaa eri taulukko-olioihin kunhan ne ovat samanmuotoisia ja -tyyppisiä Taulukot eivät automaattisesti kasva suorituksen aikana, mutta ohjelmoija voi pidentää taulukkoa 78 Ohjelmointitekniikka - Markku Nevanranta 35

Taulukon läpikäynti for (int i=0; i<6; i++) for (int j=0; j<4; j++) System.out.println(taulu[i][j]); for (int i : taulu[2]) System.out.println(i); for (int[] i: taulu) for (int j: i) System.out.println(j); taulu 2 45 56 67 89 2 88 7 67 56 12 45 9 2 2 5 1 2 5 33 22 5 55 44 79 Epätasainen taulukko Tasainen taulukko int[ ][ ] taulu = new int[3][2]; int[ ][ ] taulu = {{1,2, {5,9, {3,2; 0 1 0 1 2 1 5 9 2 3 2 Epätasainen taulukko taulu int[ ][ ] taulu = new int[3][ ]; taulu[0] = new int[2]; taulu[1] = new int[3]; taulu[2] = new int[1]; 80 Ohjelmointitekniikka - Markku Nevanranta 36

Epätasaisen taulukon alustus Toimiiko molemmat? int[ ][ ] matriisi = {{1,2, {5,9,7, {3; int[ ][ ] taulu = new int[3][ ]; taulu[0] = {1,2; taulu[1] = {5,9,7; taulu[2] = {3; taulu 1 2 5 9 7 3 81 Esimerkkejä public class Taulu { public static void main(string[] args) { int[ ] jono= {3,0,7,2,9; int[ ][ ] taulu= {{2,4,6,{20,40,60; for(int i=0; i<jono.length; i++) System.out.print(jono[i]+" "); System.out.println(); for(int i=0; i<taulu.length; i++) for(int j=0; j<taulu[i].length; j++) System.out.print(taulu[i][j] + " "); 82 Ohjelmointitekniikka - Markku Nevanranta 37

Esimerkkejä int[ ] jono = new int[5]; 0 0 0 0 0 int[ ] sarja = {2,4,6,8,3; 2 4 6 8 3 sarja = jono; Mitä tapahtuu alemmalle taulukolle? Voit muuttaa tietoa toisen viitteen kautta ja muutos näkyy toisenkin viitteen kautta. 83 Javan taulukkoluokkia System.arrayCopy ArrayList Arrays aslist binarysearch equals fill Sort tostring 84 Ohjelmointitekniikka - Markku Nevanranta 38

Luentoharjoitus 11 Koskien yksiulotteista positiivisten kokonaislukujen taulukkoa tulosta (8.1) a) alustettu taulukko b) taulukon arvojen summa c) ensimmäisen nollan indeksi d) taulukon suurin arvo ja sen indeksi e) taulukon arvojen prosentuaaliset osuudet 85 Luentoharjoitus 12 Tee ohjelma, joka automaattisesti laajentaa taulukkoa, kun lisäät siihen liikaa lukuja. 86 Ohjelmointitekniikka - Markku Nevanranta 39

Luentoharjoitus 13 Tee ohjelma, joka tarkastaa antamasi lottorivin satunnaisesti luodun lottorivin kanssa. (8.6) * Math.random() antaa satunnaisluvun väliltä 0-1 87 Luentoharjoitus 14 Tutki, montako satunnaislukua * suunnilleen pitää tuottaa välillä 1-10, jotta kaikkia lukuja alkaa tulla suunnilleen sama määrä. (8.12) * Math.random() antaa satunnaisluvun väliltä 0-1 88 Ohjelmointitekniikka - Markku Nevanranta 40

Luentoharjoitus 15* Yksiulotteinen taulukko kuvaa joukko-opin joukkoa, jossa sama luku ei esiinny kahdesti. Laadi kahden joukon välille vähintään seuraavat kolme joukko-opin operaatiota, joista kukin palauttaa tulosjoukon 1. YHDISTE yhdistää joukot tulosjoukoksi. LEIKKAUS palauttaa tulosjoukon, jossa on vain yhteiset alkiot. EROTUS palauttaa tulosjoukossa vain ne ensimmäisen joukon alkiot, joita ei ole toisessa joukossa. 1) Voi käyttää tyypillisiä taulukon toimintoja: poista duplikaatit, tiivistä, lajittele,... 89 MERKKIJONO 93 Ohjelmointitekniikka - Markku Nevanranta 41

Merkkijono-olion luonti Merkkijono String lemmikki = kissa ; Merkkitaulukko char[ ] eläin = { k, o, i, r, a ; Merkkijonotaulukko String[ ] tarha = { leijona, seepra, kameli ; 94 Merkkijono metodit public int length() antaa merkkijonon pituuden String jono = kissa ; int pituus = jono.length(); // pituus=5 public boolean equals(string) palauttaa true jos merkkijonot samat do { System.out.println( Jatkatko (kyllä tai ei) ); String vastaus = Lue.rivi(); while (vastaus.equals( kyllä )); public boolean equalsignorecase(string) 95 Ohjelmointitekniikka - Markku Nevanranta 42

Merkkijono metodit public int compareto(string) Palauttaa numeron, joka ilmaisee merkkijonojen aakkosjärjestyksen: <0 verrattava merkkijono on ennen parametrimerkkijonoa == 0 merkkijonot ovat samat >0 verrattava merkkijono on parametrimerkkijonon jälkeen System.out.print( Anna eka merkkijono ); String eka = Lue.rivi(); System.out.print( Anna toka merkkijono ); String toka = Lue.rivi(); int jarjestys= eka.compareto(toka); if (jarjestys < 0) System.out.println( Eka ensin ); if (jarjestys == 0) System.out.println( Yhtäsuuret ) if (jarjestys > 0) System.out.println( Toka ensin ): 96 Merkkijono metodit public String tolowercase() Muuttaa merkkijonon pieniksi kirjaimiksi. public String touppercase() Muuttaa merkkijonon isoiksi kirjaimiksi. String lemmikki = Kissa ; lemmikki = lemmikki.tolowercase(); System.out.println(lemmikki+lemmikki.toUpperCase()); public String trim() Poistaa merkkijonon alusta ja lopusta välilyönnit. String lemmikki = Kissa ; lemmikki = lemmikki+ eläin ; System.out.println(lemmikki.trim()); 97 Ohjelmointitekniikka - Markku Nevanranta 43

Merkkijono metodit public char charat(int index) Palauttaa merkkijonon yhden merkin. Huomaa kuvaava parametrin nimi. String lemmikki = Kissa ; for (int i=0; i<lemmikki.length(); i++) System.out.println(lemmikki.charAt(i)); Mitä tekee alla olevat metodit? public int indexof(int char) public int indexof(int char, int fromindex) public int indexof(string) public int indexof(string, int fromindex) Huomaa metodin kuormittaminen. 98 Merkkijono metodit public String substring(int startind, int endind) Palauttaa merkkijonosta osamerkkijonon lähtien merkkipaikasta startind merkkiin endind-1 asti. String lemmikki= lemmikkikissa ; String suosikki=lemmikki.substring(3,8); //mikki String teksti = Hyvä? olet voittanut paljon rahaa! ; String nimi = Lue.rivi(); String kirje = teksti.substring(0,5)+nimi+teksti.substring(6); Hyvä Markku Nevanranta olet voittanut paljon rahaa! 99 Ohjelmointitekniikka - Markku Nevanranta 44

Merkit merkkijonoksi Muunna merkkijonon A-merkit a-merkeiksi. public class MerkkiMuunnos{ public static void main(string[] args){ String teksti, tulos; teksti = Lue.rivi ("Anna merkkijono "); // Merkkijono merkkitaulukoksi char[] mtaulu = teksti.tochararray(); for (int i=0; i<mtaulu.length; i++) if (mtaulu[i] == 'A') mtaulu[i] = 'a'; tulos = new String(mtaulu); System.out.println(tulos); // Toinen tapa tulos = teksti.replace('a','a');//parametrit voivat olla myös merkkijonoja System.out.println(tulos); 100 Merkkijonoista Unicode-merkistö \uxxxx Escape-esitys (esim. \n, \t, \\, \ ) Merkkijonon pituus tallessa merkkijono-oliossa Merkkien vertailu: vastaus == k Merkkijonojen vertailu: lemmikki== kissa (väärin) lemmikki.equals( kissa ) (oikein) Perustietotyyppi merkkijonoksi: numero +luku+ tekstiksi String.valueOf(luku) Merkkijono perustietotyypiksi: Integer.parseInt(mjono) // JDK 1.2 new Integer(mjono) // JDK 1.5 (Byte, Short, Integer, Long, Float, Double, Boolean, Char kääreluokissa vastaavat xvalue()- ja parsex-metodit) 101 Ohjelmointitekniikka - Markku Nevanranta 45

Merkkijonomuunnos esimerkki String luku = "123"; // Jos ei muistuta kokonaislukua syntyy keskeytys int a, b, c; // Numero tekstiksi String teksti = String.valueOf(12.34); System.out.println(teksti); // JDK 1.1 int a = Integer.valueOf(luku).intValue(); System.out.println(a); // JDK 1.2 int b = Integer.parseInt(luku); System.out.println(b); // JDK 1.5 int c = new Integer(luku); System.out.println(c); System.out.println(a+b+c); 102 StringBuilder Käytä StringBuilder-merkkijonoa jos Stringmerkkijonoa muutetaan paljon StringBufferin synkronoimaton versio Metodeja: length(), setlength(int) append(perustietotyyppi), insert(int paikka, perustietotyyppi) replace(int, int, String), delete(int, int) charat(int), setcharat(int, char) substring(int, int) tostring() reverse() 103 Ohjelmointitekniikka - Markku Nevanranta 46

StringBuilder esimerkki String kjono = "kenkä"; StringBuilder sb = new StringBuilder(kjono); sb.insert(0,"puu"); //Puukenkä sb.append("kö"); //Puukenkäkö sb.delete(4,6); //Puukkäkö sb.replace(5,8,"o"); //Puukko String jono3 = sb.tostring(); //jono3 = "Puukko" StringBuilder buf = new StringBuilder(); String jono = buf.append("puu").append(kjono).tostring(); 104 StringTokenizer Pätkii merkkijonon osajonoiksi (token). Metodeja: StringTokenizer(String) StringTokenizer(String, String delimiters) counttokens() hasmoretokens() nexttoken(), nexttoken(string delimiters) String.split() metodilla saadaan myös pätkittyä 105 Ohjelmointitekniikka - Markku Nevanranta 47

StringTokenizer esimerkki String pätkittävä = "Matti,Kalle,,Maija"; StringTokenizer st = new StringTokenizer(pätkittävä, ",", false); while ( st.hasmoretokens() ) System.out.println(st.nextToken()); st = new StringTokenizer(pätkittävä, ",", true); while ( st.hasmoretokens() ) System.out.println(st.nextToken()); Matti Kalle Maija Matti, Kalle,, Maija 106 Säännölliset lausekkeet Säännöllisten lausekkeiden (regular expression, regexp) avulla määritetään merkkijonohahmoja, joita voidaan tunnistaa merkkijonosta Hahmoa etsitään matches-metodilla, joka palauttaa true-arvon jos hahmo löytyy muuten false Merkkijono voidaan pilkkoa split-metodilla hahmoon täsmäävissä kohdissa ja pilkotut merkkijonopalaset palautetaan merkkijonotaulukkona replaceall-metodi korvaa kaikki hahmoon täsmäävät osat annetulla merkkijonolla ReplaceFirst-metodi korvaa vain ensimmäisen hahmoon täsmäävän merkkijonon annetulla merkkijonolla Pattern ja Matcher luokissa lisää metodeja 107 Ohjelmointitekniikka - Markku Nevanranta 48

Hahmon muodostaminen Yksinkertainen hahmo: mikä tahansa hakasulkeissa oleva merkki kelpaa rahayksikkö [ $ ], [ahjmprsv]aha Arvoväli: mikä tahansa arvovälillä oleva merkki kelpaa [A-E] ajokortti, arvot [1-3 7-9] Yhdiste, leikkaus ja erotus: ehto sisällytetään toiseen ehtoon [a-c[1-3]] luokat, [1-5&&[3-9]] luokat, [1-5&&[^3-9]] luokat Merkkiluokat: mikä tahansa merkki (.), numerot 0-9 (\\d), muu merkki paitsi 0-9 (\\D), kaikki tyhjämerkit (\\s), ei-tyhjä merkki (\\S), mikä tahansa numero tai merkki (\\w), \\w negaatio (\\W) Ryhmittely ja takaisinviittaus: () merkitään yhdessä käsiteltävä ryhmä, \\numero kertoo montako kertaa ryhmää pitää toistua (.)\\1 (merkki toistuu kaksi kertaa peräkkäin) ((.)\\3 )\\3 (luottokorttinumeron muodon tarkistus) Lukumäärät: esiintyy kerran (?), nolla tai useamman kerran (*), kerran tai useamman kerran (+), täsmälleen n kertaa {n, vähintään n kertaa {n,, vähintään n tai enintään m kertaa {n,m Paikkamääreet: rivin alku (^), rivin loppu ($), sanan alku tai loppu (\\b), \\b negaatio (\\B), syötteen alku (\\A), syötteen loppu (\\z) 108 Esimerkki: säännöllinen lauseke public class SaannollinenLauseke { public static void main(string[] args) { // Luottokortin tarkistus String luottokortti = "1234 5678 9012 9876"; if (luottokortti.matches("\\d{4( \\d{4){3")) System.out.println("kortti oikein"); else System.out.println("kortissa virhe"); // Päivämäärän tarkistus String pvm = "12.09.2011"; if (pvm.matches("(\\d{1,2.){2\\d{4")) System.out.println("päivämäärä oikein"); else System.out.println("päivämäärässä virhe"); // Päivämäärän pilkkominen String[] sanat = pvm.split("\\."); for (int i=0; i<sanat.length; i++) System.out.println(sanat[i]); // Osamerkkijonon tarkistus String yhteys = "Puhelinnumeroni on 0500-123456 työpuhelimeen"; System.out.println("Tekstissä "+(yhteys.matches(".*[0-9]{2,\\w\\d{4,.*")?"on puhelinnumero ":"ei ole puhelinnumeroa")); 109 Ohjelmointitekniikka - Markku Nevanranta 49