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



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

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

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

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

Taulukoiden käsittely Javalla

Metodien tekeminen Javalla

Java-kielen perusteet

Java-kielen perusteet

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

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

Java-kielen perusteet

Taulukot. Jukka Harju, Jukka Juslin

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

7. Oliot ja viitteet 7.1

7. Näytölle tulostaminen 7.1

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

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

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

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

Olio-ohjelmointi Javalla

Informaatioteknologian laitos Olio-ohjelmoinnin perusteet / Salo

C-kielessä taulukko on joukko peräkkäisiä muistipaikkoja, jotka kaikki pystyvät tallettamaan samaa tyyppiä olevaa tietoa.

Sisältö Yleistä. Esittely ja luominen. Alkioiden käsittely. Kaksiulotteinen taulukko. Taulukko metodin parametrina. Taulukko ja HelloWorld-ohjelma. Ta

Listarakenne (ArrayList-luokka)

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

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

Sisällys. 7. Oliot ja viitteet. Olion luominen. Olio Java-kielessä

17. Javan omat luokat 17.1

Kompositio. Mikä komposition on? Kompositio vs. yhteyssuhde Kompositio Javalla Konstruktorit set-ja get-metodit tostring-metodi Pääohjelma

20. Javan omat luokat 20.1

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

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

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

Rajapinta (interface)

Java-kielen perusteita

Osoitin ja viittaus C++:ssa

Ohjelmointi 2 / 2010 Välikoe / 26.3

Ohjelmoinnin jatkokurssi, kurssikoe

1. Omat operaatiot 1.1

Ohjelmointi 1 / 2009 syksy Tentti / 18.12

Metodit Arvotyyppi. Metodit Arvotyyppi. Metodit Parametrit. Metodit Parametrit. Metodit Kuormittaminen. Metodit Kuormittaminen. Javan perusteet

Java kahdessa tunnissa. Jyry Suvilehto

ITKP102 Ohjelmointi 1 (6 op)

Java-kielen perusteita

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

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

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

11. Javan toistorakenteet 11.1

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

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

12. Javan toistorakenteet 12.1

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

Ohjelmoinnin perusteet Y Python

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

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

17. Javan omat luokat 17.1

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

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2

List-luokan soveltamista. Listaan lisääminen Listan läpikäynti Listasta etsiminen Listan sisällön muuttaminen Listasta poistaminen Listan kopioiminen

12. Javan toistorakenteet 12.1

Sisällys. 19. Olio-ohjelmointia Javalla. Yleistä. Olioiden esittely ja alustus

5.6. C-kielen perusteet, osa 6/8, Taulukko , pva, kuvat jma

Mikä yhteyssuhde on?

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

Taulukot, silmukat ja muut joka koodin pikku veijarit

15. Ohjelmoinnin tekniikkaa 15.1

1 Tehtävän kuvaus ja analysointi

Operaattoreiden ylikuormitus. Operaattoreiden kuormitus. Operaattoreiden kuormitus. Operaattoreista. Kuormituksesta

Harjoitus 5 (viikko 48)

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op. Tietorakenneluokkia 2: HashMap, TreeMap

11. Javan valintarakenteet 11.1

Javan perusteita. Janne Käki

16. Javan omat luokat 16.1

Metropolia ammattikorkeakoulu TI00AA : Ohjelmointi Kotitehtävät 3 opettaja: Pasi Ranne

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 )

on ohjelmoijan itse tekemä tietotyyppi, joka kuvaa käsitettä

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

19. Olio-ohjelmointia Javalla 19.1

Harjoitus 4 (viikko 47)

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

Java-kielen perusteet

Ohjelmoinnin peruskurssi Y1

Sisällys JAVA-OHJELMOINTI Osa 3: Laskennan ohjaus. Lohkolause (block) Peräkkäinen laskenta. Lohkon käyttö. Esimerkki

ITKP102 Ohjelmointi 1 (6 op)

2. Olio-ohjelmoinista lyhyesti 2.1

Metodien tekeminen Javalla

Ohjelmoinnin perusteet, kurssikoe

Ohjelmointi 1 Taulukot ja merkkijonot

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

15. Ohjelmoinnin tekniikkaa 15.1

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

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

Sisällys. 17. Ohjelmoinnin tekniikkaa. Aritmetiikkaa toisin merkiten. for-lause lyhemmin

14. Poikkeukset 14.1

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

Ohjelmoinnin perusteet Y Python

9. Periytyminen Javassa 9.1

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

13. Loogiset operaatiot 13.1

4. Olio-ohjelmoinista lyhyesti 4.1

Transkriptio:

5 Taulukot Tämän osan sisältö Taulukon esittely ja luonti Taulukon alustaminen Taulukon koko Taulukon käsittely indeksointi peräkkäiskäsittely hajakäsittely harva taulukko Taulukon järjestäminen Kaksiulotteinen taulukko Lue kirjasta s. 84-96 Ohjelmoinnin perusteet / Auvo Häkkinen / S 5 - Ohjelmoinnin perusteet / Auvo Häkkinen / S 5 - Luokalla on opiskelijaa ja halutaan tallentaa kunkin opiskelijan kokeesta saama pistemäärä. Surkea kyhäelmä Esitellään kaksikymmentä muuttujaa int pisteet, pisteet,, pisteet; pisteet = Oma.lueInt(); pisteet = Oma.lueInt(); pisteet = Oma.lueInt();. Parempi yritys Määritellään ja luodaan taulukko nimeltään pisteet Yhdellä muuttujan esittelyllä saadaan käyttöön "muuttujaa" Yksittäiset pistemuuttujat nimetään nyt pisteet[], pisteet[], Käytetään for-toistolausetta taulukon käsittelyssä int[] pisteet = new int[]; for (int i= ; i <=; i++) { Tuossakin on vielä paha virhe Taulukossa toki lokeroa, mutta Javan taulukon alkioiden numerointi alkaa nollasta Tässä ei käytetä lainkaan lokeroa! Ei hyvä! enhän minäkään jaksanut noita kaikkia kirjoittaa :-), eikä Javassa ole -operaatiota! int[] pisteet = new int[]; for (int i= ; i < ; i++) { tai int[] pisteet = new int[]; for (int i= ; i <= ; i++) { Ohjelmoinnin perusteet / Auvo Häkkinen / S 5-3 Ohjelmoinnin perusteet / Auvo Häkkinen / S 5-4 Taulukon esittely ja luonti Taulukko on muuttuja, jonka sisältönä useita keskenään samantyyppisiä alkioita Taulukon alkion tyyppi määrätään taulukkomuuttujan esittelyn yhteydessä. Esittely on muotoa Tavallisimmin alkiontyyppi taulukonnimi[]; käytetään tätä tai esitysmuotoa alkiontyyppi[] taulukonnimi; Esittely ei vielä kiinnitä taulukon alkioiden lukumäärää Alkioiden lukumäärä kerrotaan taulukkoa luotaessa new-operaatiolla Taulukko on olio-ohjelmoinnin olio, joka täytyy erikseen luoda int[] luvut; luvut = new int[]; // esittele // luo int[] luvut = new int[]; // esittele ja luo Taulukon alustaminen Taulukon alkiot alustuvat luonnin yhteydessä nollarvoihin numeerisilla (esim. int ja double) alkioilla nolla merkkityypin (char) alkioilla \u boolean-tyypin alkioilla false String-tyypin alkioilla null Taulukon voi myös alustaa itse luonnin yhteydessä Tällöin ei saa käyttää lainkaan new-kutsua Kääntäjä osaa selvittää taulukon koon Sijoitus tällä tavalla sallittu vain taulukon esittelyn yhteydessä double[] osat = new double[]; int[] luvut = {,, 3, 4, 5, 6, 7, 8, 9, ; osat luvut 3 4 5 6 7 8 9.......... 3 4 5 6 7 8 9 3 4 5 6 7 8 9 Ohjelmoinnin perusteet / Auvo Häkkinen / S 5-5 Ohjelmoinnin perusteet / Auvo Häkkinen / S 5-6 Taulukon koko Jokaiseen taulukko-olioon liittyy muuttuja length ilmaisee taulukon koon ohjelmoija ei voi muuttaa sen arvoa Huom: ei ole metodi, kuten String-luokan length() Käyttö muodossa taulukonnimi.length int[] luvut = {,,3,4,5,6,7,8,9,; System.out.println( Lukuja on + luvut.length + kpl. ); for (int i=; i < luvut.length ; i++) { System.out.println(luvut[i]); Taulukon käsittely Ylläoleva for-lauseen muoto yleinen käsiteltäessä kaikki alkiot käytä aina sitä, vaikka tietäisitkin alkioiden lukumäärän toimii vaikka taulukon kokoa joskus muutettaisiin, joten ohjelman oikeellisuus helpompi säilyttää Ohjelmoinnin perusteet / Auvo Häkkinen / S 5-7 Ohjelmoinnin perusteet / Auvo Häkkinen / S 5-8

Indeksointi Taulukon yksittäisiin alkioihin viitataan taulukon nimen ja indeksin avulla taulukonnimi[indeksi] Indeksin arvona kokonaisluku, joka ilmaisee alkion etäisyyden taulukon alusta ensimmäisen lokeron indeksi on siten nolla viimeisen lokeron indeksi on taulukonnimi.length- Indeksinä voi olla mitä tahansa minkä arvon (kokonaisluku) voi laskea suoritusaikana muuttuja, vakio, aritmeettinen lauseke, metodin palauttama arvo Yksittäiselle alkiolle voi käyttää niitä operaatioita, jotka ovat sallittuja ko. tyypille final int LKM = ; int[] luvut = new int[lkm];; Varottava, ettei indeksi liian iso! luvut[] = ; luvut[3] = LKM * luvut[]; luvut[+i] = 58; Ohjelmoinnin perusteet / Auvo Häkkinen / S 5-9 Alkioiden kopiointia Esim. a[] = a[]; kokonaislukuarvo taulukon a lokerosta lokeroon b[] = a[]; alkion kopiointi taulukosta toiseen taulukkoon Jos kaikki taulukon alkiot on kopioitava toiseen taulukkoon, se on tehtävä aina toistolauseella, alkio kerrallaan (for-lause) for (int i=; i < a.length ; i++) { b[i] = a[i] Taulukot ovat olioita, joten sijoituksen b = a jälkeen a ja b viittaavat täsmälleen samaan taulukkoon Jos taulukon alkiot ovat olioita (esim. String), alkion kopioinnin jälkeen molemmat alkiot viittaavat täsmälleen samaan olioon a[] = "merkkijono"; b[] = a[]; // sisältää viitteen olioon // kopioi se viite Ohjelmoinnin perusteet / Auvo Häkkinen / S 5 - Peräkkäiskäsittely Tavallisimmin taulukon alkiot käsitellään järjestyksessä alkaen indeksistä nolla Ohjelma lukee taulukkoon lukuja ja tulostaa taulukon sisällön public class Taulukko{ int[] taulukko = new int[]; /* Taulukon täyttö */ for (int i=; i < taulukko.length; i++) { System.out.print("Anna luku: "); taulukko[i] = Oma.lueInt(); /* Alkioiden tulostaminen yksitellen */ for (int i=; i < taulukko.length; i++) { System.out.println(taulukko[i]); Kirja s. 87 Etsintä taulukosta Etsi nimeä taulukosta peräkkäishaulla jos löytyy, palauta alkion indeksi, muuten palauta - public static int etsi(string[] nimet, String nimi){ boolean löytyi = false; int ind = ; while (! löytyi && ind < nimet.length) if (nimet[ind] == nimi) löytyi = true; else ind++; if (! löytyi) ind = -; return ind; public static int etsi(string[] nimet, String nimi){ for (int i=; i < nimet.length; i++) if (nimet[i] == nimi) return i; return -; return()-lauseen käyttö heti, kun paluuarvo on tiedossa, on suositeltava tapa! Ohjelmoinnin perusteet / Auvo Häkkinen / S 5-6 - for-each rakenne Taulukon kaikkien alkioiden peräkkäiskäsittelyä varten for-each rakenne for (alkiontyyppi muuttuja : taulukonnimi){ lauseet; Lauseessa esitelty toistomuuttuja saa kullakin toistokierroksella arvokseen taulukon yhden alkion arvon Taulukkoon talletettujen merkkijonojen tulostus String[] taulukko = new String[]; for (String x : taulukko) { System.out.println(x); Sijoitus for-each-muuttujaan ei tietenkään vie arvoa taulukkoon! Ei näin! for (String x : taulukko) { x = Oma.lueInt(); Satunnaisluku Usein ohjelmissa tarvitaan satunnaisesti valittuja lukuja Satunnaislukuja voi tuottaa tarkoitusta varten toteutetuilla satunnaislukugeneraattoreilla Javan Math.random()-niminen metodi palauttaa arvonaan double-tyyppisen luvun arvo: <= x <. Kun tarvitaan satunnaisia kokonaislukuja osaväliltä [a, b], paluuarvo skaalataan osavälille ja tuloksen tyyppi muutetaan (katkaistaan) kokonaisluvuksi tyyppimuunnos (cast) tehdään laittamalla lausekkeen eteen suluissa uusi tulostyyppi int x; x = a + (int)(math.random()*(b-a+)); Pienin sallittu arvo Arvoalueen koko Ohjelmoinnin perusteet / Auvo Häkkinen / S 5-3 Ohjelmoinnin perusteet / Auvo Häkkinen / S 5-4 Noppaa heitetään kertaa Halutaan silmäluku väliltä -6 public class Noppa { int[] noppa = new int[]; // luo ja nollaa taulukko // Heitä noppaa kertaa, tulokset taulukkoon for (int i=; i < noppa.length; i++){ noppa[i] = + (int)(math.random()*6); // Tulosta taulukon sisältö for (int i=; i < noppa.length; i++){ Kirja s. 89 Hajakäsittely Mihin tahansa taulukon alkioon pääsee käsiksi muista alkioista riippumatta suoraan indeksoimalla Esim. x = noppa[4]; Kuinka tasaisesti jakautuneita satunnaislukuja random() tuottaa? Kokeillaan ja raportoidaan tuloksista Suorita N kpl toistoja Kerää talteen Math.random()-metodin tuottamien lukujen lukumäärätiedot Kokoa esiintymiskertoja kuvaavat laskurit taulukoksi esim. alkiossa 6 pidetään kirjaa siitä montako kertaa numero 6 esiintynyt // Tulostus toisella tavalla for (int silmäluku : noppa){ System.out.print(" " + silmäluku); Ohjelmoinnin perusteet / Auvo Häkkinen / S 5-5 Ohjelmoinnin perusteet / Auvo Häkkinen / S 5-6

public class Satunnaislukutesti{ vrt. kirja s. 9 final int MAX = ; int[] lkm = new int[max]; // lukumäärälaskurit, oletuksena nollattu int toistot; // toistojen lkm int x; // arvottu satunnaisluku System.out.print("Anna toistojen lkm: "); toistot = Oma.lueInt(); System.out.println ("Hetkinen."); // arvo luku väliltä - (MAX-), ja kasvata sen laskuria for (int i=; i <= toistot; i++) { x = (int)(math.random()*max); System.out.print(x + " "); lkm[x] = lkm[x] + ; System.out.println(); Tässäkin sopisi käyttää lkm.length // tulosta laskureiden arvot for (int i=; i < MAX; i++) { System.out.println (i + " : " + lkm[i]); 3 4 5 6 7 8 9 49 4 53 57 54 63 56 37 34 48 Anna toistojen lkm: Hetkinen. 6 9 8 6 3 : 49 : 4 : 53 3 : 57 4 : 54 5 : 63 6 : 56 7 : 5 8 : 53 9 : 49 : 4 : 49 : 58 3 : 44 4 : 59 5 : 5 6 : 5 7 : 37 8 : 34 9 : 48 Harva taulukko Taulukon kaikki alkiot eivät ole käytössä vrt. matematiikan harva matriisi Esimerkiksi lottoruudukon kaikkia ruutuja ei ruksata Tehtävänä arpoa satunnaisesti 7 lottonumeroa ja 3 lisänumeroa Math.random() voi tuottaa saman luvun useita kertoja Tarkistettava, että luku ei tule arvotuksi kuin korkeintaan kerran Tarkistusta varten apurakenne, harva taulukko Ohjelmoinnin perusteet / Auvo Häkkinen / S 5-7 Ohjelmoinnin perusteet / Auvo Häkkinen / S 5-8 Tietorakenne public class Lotto { final static int TYHJÄ = ; final static int LOTTONUMERO=; final static int LISÄNUMERO=; int[] lotto = new int[4]; // luo ja nollaa taulukko // taulukon kooksi valitaan 4 // nollapaikalle ei ole tällä kertaa käyttöä // arvoilla -39 indeksointi on suoraviivaista int x; // arvottava luku -39 Vrt. kirja s. 9 3 4 5 6 7 8 9 3 3 33 34 35 36 37 38 39 Jos lotto[x] ==, numeroa x ei ole arvottu riviin Jos lotto[x] ==, numero x on arvottu varsinaiseksi lottonumeroksi Jos lotto[x] ==, numero on arvottu lisänumeroksi Arvo 7 varsinaista numeroa for (int i=; i <= 7; i++) { // Arvo 7 numeroa x = + (int)(math.random()*39); // väliltä -39 while (lotto[x]!= TYHJÄ); // jos jo arvottu, arvo uusi // kun löytyi numero, jota ei vielä ole arvottu, // sijoita taulukkoon arvotun luvun osoittamaan lokeroon lotto[x] = LOTTONUMERO; Arvo 3 lisänumeroa for (int i=; i<=3; i++) { // Arvo 3 lisänumeroa x = + (int)(math.random()*39); while (lotto[x]!=tyhjä); lotto[x] = LISÄNUMERO; Sama kuin x = (int)math.ceil(math.random()*39) kattofunktio eli ylöspäin pyöristys Ohjelmoinnin perusteet / Auvo Häkkinen / S 5-9 Ohjelmoinnin perusteet / Auvo Häkkinen / S 5 - Tulosta arvottu rivi System.out.println("Kierroksen oikea lottorivi on"); for (int i=; i<=39; i++) { if (lotto[i]==lottonumero) { System.out.print(" " + i); System.out.println("\nLisänumerot ovat"); for (int i=; i<=39; i++) { if (lotto[i]==lisänumero) { System.out.print(" " + i); Samankaltaisuus? Mitkä osat sopisi toteuttaa metodeina? arvo(lotto, LOTTONUMERO); arvo(lotto, LISÄNUMERO); tulosta(lotto, LOTTONUMERO); tulosta(lotto, LISÄNUMERO); do-while vs. while Edellä käytettiin do-while-rakennetta lottonumeron arpomiseen Tässä do-while sopii paremmin kuin while, sillä jokainen lottonumero vaatii vähintään yhden arpomisen for (int i=; i <= 7; i++) { // Arvo 7 numeroa x = + (int)(math.random()*39); // väliltä -39 while (lotto[x]!= TYHJÄ); // jos jo arvottu, arvo uusi for (int i=; i <= 7; i++) { x = + (int)(math.random()*39); while (lotto[x]!= TYHJÄ) { x = + (int)(math.random()*39); Ohjelmoinnin perusteet / Auvo Häkkinen / S 5 - Ohjelmoinnin perusteet / Auvo Häkkinen / S 5 - Taulukko parametrina Arvoparametri Parametreja kutsutaan arvoparametreiksi tai viiteparametreiksi sen mukaan välitetäänkö niistä metodille arvo vai viite olioon Alkeistietotyyppien parametrista välitetään metodille aina arvo todellisen parametrin arvo kopioidaan muodollisen parametrin arvoksi parametri on metodin paikallinen muuttuja, ja olemassa vain ko. metodissa vaikka muodollista parametria muutettaisiin metodissa, se ei vaikuta todelliseen parametriin public class MuodollinenVsTodellinen { kirja s. 9 public static int kasvata(int luku) { luku++; return luku; int x = ; int z; z = kasvata(x); System.out.println("z=" + z); // Tulostuu paluuarvo System.out.println("x=" + x); // Tulostuu alkuperäinen z= x= Ohjelmoinnin perusteet / Auvo Häkkinen / S 5-3 Ohjelmoinnin perusteet / Auvo Häkkinen / S 6-4

Viiteparametri Taulukkoparametrista (olio) välitetään metodille viite vain todellisen parametrin muistiosoite (sijainti) kopioidaan muodollisen parametrin alkuarvoksi viiteparametriin tehdyt muutokset kohdistuvat suoraan todelliseen parametriin metodi käsittelee siis suoraan prametrina annettua alkuperäistä taulukkoa muutokset säilyvät metodista poistumisen jälkeen public class TaulukkoParametrina { kirja s. 9 public static void taytataulukko(int[] tau) { for (int i = ; i < tau.length; i++) tau[i]=i; public static void tulostataulukko(int[] taulukko) { for (int i = ; i < taulukko.length; i++) System.out.println(taulukko[i]); int[] taulu = new int[5]; taytataulukko(taulu); tulostataulukko(taulu); 3 4 Kaikki muutkin oliot välitetään metodeille viiteparametreina tämä on oleellista, kun siirrytään olio-ohjelmointiin String-parametri Koska String-tyyppi ei ole alkeistyyppi vaan oliotyyppi, merkkijonoparametristakin välitetään metodille aina viite Onko siis merkkijonoa mahdollista muuttaa metodissa? Vastaus on EI! String-oliot ovat Javassa vakioita, eli niihin ei voi suoraan kohdistaa muutoksia Jos merkkijonoon yrittää tehdä muutoksia, järjestelmä luo aina uuden merkkijono-olion, jossa muutos näkyy public class StringMuutos { kirja s. public static String muuta(string s) { s = s.replace('i','a'); return s; String nimi = "Martti"; String uusinimi; uusinimi = muuta(nimi); System.out.println(nimi + " " + uusinimi); Martti Martta Ohjelmoinnin perusteet / Auvo Häkkinen / S 6-5 Ohjelmoinnin perusteet / Auvo Häkkinen / S 6-6 Paluuarvosta Metodilla voi useita parametreja, mutta vain täsmälleen yksi paluuarvo käytännössä parametreja harvoin enemmän kuin Metodin paluuarvon tyyppi voi olla joko alkeistietotyyppi tai oliotyyppi (eli viite olioon) Metodi voi esimerkiksi palauttaa luomansa taulukon tai merkkijonon koska se on olio, ja siten vain yksi viite tilanvaraukseen public class OlioPaluuarvona { public static int[] annataulukko (int koko, int alkuarvo) { int[] taulu = new int[koko]; // luo taulukko for (int i = ; i < koko; i++) { // täytä taulukko taulu[i] = alkuarvo; return taulu; // palauta sijaintitieto kutsujalle, jää olemaan myös kutsun jälkeen int[] t = annataulukko(5, ); // koko 5 ; kaikkiin lokeroihin TaulukkoParametrina.tulostaTaulukko(t); // ed. sivulla kirja s. Taulukon järjestäminen Ohjelmoinnin perusteet / Auvo Häkkinen / S 6-7 Ohjelmoinnin perusteet / Auvo Häkkinen / S 5-8 Taulukon järjestäminen Ks. Java 7 API Arrays Usein tarvetta saada taulukon sisältö haluttuun järjestykseen Halutaan esim. tulostaa alkioiden arvot pienimmästä suurimpaan Tällöin taulukon sisältö pitää ennen tulostusta järjestää suuruusjärjestykseen Yksinkertaista tyyppiä olevan taulukon järjestämiseen on metodi java.util.arrays.sort(taulukko) Kuormitettu, joten kääntäjä valitsee oikean metodin parametrin tyypin perusteella Esim. merkkijonoja vertaillaan eri tavalla kuin kokonaislukuja Jokaisen ohjelmoijan syytä osata ohjelmoida itse ainakin yksi muu tapa järjestää taulukko Tapoja ja menetelmiä on useita Vaihtelevat tilantarpeen ja suoritusajan suhteen Arpanoppaa heitetään kertaa Tulokset esitetään pienimmästä suurimpaan public class Noppa { int[] noppa = new int[]; // luo ja nollaa taulukko // heitä noppaa kertaa ja vie tulos taulukkoon noppa[i] = + (int)(math.random()*6); // Järjestä taulukon sisältö java.util.arrays.sort(noppa); // Tulosta taulukon sisältö kirja s. 93 Ohjelmoinnin perusteet / Auvo Häkkinen / S 5-9 Ohjelmoinnin perusteet / Auvo Häkkinen / S 5-3 Esim: Oma järjestämismetodi public class NoppienJärjestäminen{ private static void järjestä(int[] taulu){ int jemma; for (int i=; i < taulu.length-; i++) for (int j=i+; j < taulu.length; j++) if (taulu[i] > taulu[j]) { jemma = taulu[i]; taulu[i] = taulu[j]; taulu[j] = jemma; int[] noppa = new int[]; noppa[i] = + (int)(math.random()*6); järjestä(noppa); Esittele apumuuttujat toistosilmukoiden ulkopuolella Huomaa: sisäkkäiset toistot Tämä algoritmi tunnetaan nimellä vaihtojärjestäminen Simuloi joutessais tämän algoritmin toimintaa piirtelemällä! Taulukko taulukossa Ohjelmoinnin perusteet / Auvo Häkkinen / S 5-3 Ohjelmoinnin perusteet / Auvo Häkkinen / S 5-3

Kaksiulotteinen taulukko Taulukon alkiona voi olla myös taulukko -> moniulotteinen taulukko Yksiulotteisesta taulukosta käytetään usein nimitystä vektori, ja kaksiulotteisesta nimitystä matriisi Seuraavassa esimerkissä on kaksiulotteinen taulukko, johon sijoitetaan lukujen - kertotaulun arvoja Esimerkiksi kertotaulu[3][3] = 3*3; kertotaulu[3][4] = 3*4; 3 4 5 6 7 8 9 3 9 Ohjelmoinnin perusteet / Auvo Häkkinen / S 5-33 Kaksiulotteinen taulukko Myös useampiulotteisen taulukon voi alustaa vakioarvoilla esittelynsä yhteydessä int [][] luvut = { {,, 3, 4, {5, 6, 7, 8, {9,,, ; Kukin taulukon alkio on siis taulukko Näin monta taulukkoriviä for (int i=; i<luvut.length; i++) { for (int j=; j<luvut[i].length; j++) { System.out.print(luvut[i][j] + ); System.out.println(); 4 5 6 7 8 9 Mikä rivi Mikä sarake 3 3 4 5 6 7 8 9 Näin monta alkiota tällä rivillä public class KertotauluUlotteinenTaulukko { Vrt. kirja s. 94 public static void main(string args[]) { int[][] kertotaulu = new int[][]; // Luo ja nollaa for (int i=; i<=; i++) { // Täytä jokainen rivi for (int j=; j<=; j++) { // Täytä yhden rivin alkiot kertotaulu[i][j] = i * j; for (int i=; i<=; i++) { for (int j=; j<=; j++) { System.out.printf( %d,kertotaulu[i][j]); System.out.println("\n"); 3 4 5 6 7 8 9 4 6 8 4 6 8 3 6 9 5 8 4 7 3 4 8 6 4 8 3 36 4 5 5 5 3 35 4 45 5 6 8 4 3 36 4 48 54 6 7 4 8 35 4 49 56 63 7 8 6 4 3 4 48 56 64 7 8 9 8 7 36 45 54 63 7 8 9 3 4 5 6 7 8 9 Ohjelmoinnin perusteet / Auvo Häkkinen / S 5-34 Yhteenveto Taulukko on kokoelma arvoja, joilla on sama tyyppi alkion tyyppi määrätään taulukkomuuttujan esittelyssä Taulukon koko määrätään taulukkoa luotaessa new -operaatiolla alkiot alustettu luotaessa nolla-arvolla taulukon koko on muuttujassa taulukonnimi.length Taulukon voi alustaa omilla arvoilla esittelyn yhteydessä tällöin ei saa käyttää new-operaatiota Yksittäiseen alkioon viitataan indeksoimalla taulukkomuuttujaa ensimmäisen alkion indeksi eli etäisyys on viimeisen alkion indeksi on taulukonnimi.length- indeksinä voi käyttää lauseketta, jonka arvon voi laskea Taulukon alkiolle sallittu kaikki ne operaatiot, mitä samaa tyyppiä oleville tavallisille muuttujillekin Ohjelmoinnin perusteet / Auvo Häkkinen / S 5-35 Ohjelmoinnin perusteet / Auvo Häkkinen / S 5-36 System.exit() Seuraavaksi kurssi Ohjelmoinnin jatko (Java) Ohjelmoinnin perusteet / Auvo Häkkinen / S 6-37