Presentasjon lastes. Vennligst vent

Presentasjon lastes. Vennligst vent

Programmering i Java versjon august 2004 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else.

Liknende presentasjoner


Presentasjon om: "Programmering i Java versjon august 2004 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else."— Utskrift av presentasjonen:

1 Programmering i Java versjon august 2004 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 7 Tabeller Datastrukturen tabellside 2-4 Å kopiere en tabellside 5-7 Klassen Manedside 8 Sorteringside 9-11 Tabell som argumentside 12 Søkingside Klassen java.util.Arraysside 15 Bruk av online API-dok.side Todimensjonale tabellerside Mer enn to dimensjonerside Utvidet for-løkkeside En tabell av referanser, eksempel strengerside Tabell av referansetype som medlem i en klasseside 28 Sortering av objekterside 29-31

2 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 7, side 2 Behov for datastrukturen tabell •En datastruktur er en samling data lagret i primærminnet under ett navn. •Et objekt er en datastruktur. •En tabell er en datastruktur som kan brukes dersom alle dataene tilhører samme datatype. •Eksempel: Nedbøren som faller hver dag i en måned. •Hvordan deklarere objektvariablene? private String mndNavn; private int nedbør1; private int nedbør2; private int nedbør3; private int nedbør4;..... private int nedbør31; Maned mndNavn: String nedbør[28..31]: int finnMaksimum finnAntTørreDager finnGjSnitt

3 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 7, side 3 Datastrukturen tabell •Vi deklarerer en tabell: –int[] mars = new int[31]; int[ ] mars = new int[31]; mars 0010 [0] [1] [2] [3] [27] [28] [29] [30] indeks lengde

4 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 7, side 4 Å bruke en tabell •Vi kan få tak i hvert enkelt element ved indeksering: –mars[0] = 20; –mars[15] = 30; –int sum = mars[0] + mars[1] + mars[2]; •Tabellens lengde er gitt av uttrykket mars.length. •Første element har alltid indeks 0, siste element indeks (length-1). •Bruk av ugyldig indeks kaster unntaket ArrayIndexOutOfBoundsException. •Dersom vi er usikre, må vi bruke en if-setning der vi kontrollerer indeksen før vi bruker den: –if (indeks >= 0 && indeks < mars.length) tall = mars[indeks]; •Summerer all nedbør i mars: int sumMars = 0; for (int i = 0; i < mars.length; i++) sumMars += mars[i]; •Vi kan initiere en tabell samtidig med deklarasjonen: –int[] enUke = {4, 5, 6, 7, 1, 2, 3}; // lengden blir 7 •Dersom en tabell ikke initieres på denne måten, får alle elementene verdien 0. Gjør alle oppgavene side 243

5 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 7, side 5 Å kopiere en tabell •Hva med å bruke tilordningstegnet? •Fungerer ikke …vi får to referanser til samme tabell. int[] tab1 = {1, 4, 6, -2}; int[] tab2 = {7, 14, -6, 0}; tab1 tab2 Etter setningen: tab2 = tab1; tab1 tab2

6 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 7, side 6 Må kopiere en tabell element for element Gjør oppgave 1 side 245. int[] tab1 = {1, 4, 6, -2}; int[] tab2 = {7, 14, -6, 0}; tab1 tab tab1 tab2 Kopierer element for element: for (int i = 0; i < tab1.length; i++) { tab1[i] = tab2[i]; } Før kopiering: Etter kopiering :

7 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 7, side 7 Vi kan bruke System.arraycopy() til å kopiere tabeller int[] tab1 = {1, 4, 6, -2}; int[] tab2 = {7, 14, -6, 0}; tab1 tab2 Etter setningen: System.arraycopy(tab1, 1, tab2, 2, 2); tab1 tab2 [0] [1] [2] [3]

8 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 7, side 8 Klassen Maned Vis programliste 7.2 side 246ff. Gjør oppgave 1 og 2 side 249. Maned mndNavn: String nedbør[28..31]: int finnMaksimum finnMinimum finnGjSnitt

9 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 7, side 9 Sortering ved utvelgelse for (start = 0; start < tabell.length; start++) { finn indeksen til minste element i området mellom indeksene start og tabell.length - 1 bytt om minste element med elementet på plass start } før start etter første runde ferdig Eksempler: •rangering av deltakerne i en konkurranse •sortering av navn til en telefonliste •ordning av kommuner etter prisen på kommunale tjenester

10 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 7, side 10 Metoden sorterHeltallstabell - en klassemetode /* * Sorter.java E.L * */ package mittBibliotek; public class Sorter { public static void sorterHeltallstabell(int[] tabell) { for (int start = 0; start < tabell.length; start++) { int hittilMinst = start; for (int i = start + 1; i < tabell.length; i++) { if (tabell[i] < tabell[hittilMinst]) hittilMinst = i; } int hjelp = tabell[hittilMinst]; tabell[hittilMinst] = tabell[start]; tabell[start] = hjelp; } /* En annen sorteringsmetode ligger også i denne klassen. Se kapittel 9. */ }

11 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 7, side 11 Eksempel på bruk av metoden Sorter() import mittBibliotek.*; class TestSorter { public static void main(String[] args) { int[] test = {3, 4, -5, 13, 10, 0, 8, -2, 22, 15, 11, 9, 17}; Sorter.sorterHeltallstabell(test); // klassenavnet foran metode-navnet System.out.println("Sortert tabell: "); for (int i = 0; i < test.length; i++) System.out.print(test[i] + " "); System.out.println(); } Hvis vi ønsker å sortere desimaltall, må vi lage en egen metode for denne datatypen. Sortering av objekter (for eksempel strenger) krever spesiell omtanke, se senere.

12 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 7, side 12 Tabell som argument •Tabellnavnet er en referanse. •En tabell som argument betyr at vi sender over en referanse til tabellen, og metoden jobber med de samme tabellelementene som klienten: Gjør oppgave 3 side test klient tabell sorterHeltallstabell Metodekall: Sorter.sorterHeltallstabell(test); Ved kallet skjer følgende bak kulissene: int[] tabell sorterHeltallstabell = test klient

13 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 7, side 13 Søking •Å søke i en tabell betyr å finne det eller de elementene som tilfredsstiller bestemte kriterier. •Eksempel: Vi oppgir en verdi og finner indeksen til ett eller alle elementene som er lik denne verdien. •Må ta hensyn til at det vi leter etter, kanskje ikke finnes i det hele tatt. •Eksempler på søk i programliste 7.2 (side 246ff.): –finnAntTørreDager() –finnDgMaks()

14 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 7, side 14 Å programmere søk etter en bestemt verdi •Finner indeksen til en dag med en bestemt nedbørmengde: public int finnDag(int verdi) { for (int i = 0; i < nedbør.length; i++) { if (nedbør[i] == verdi) return i; // verdi funnet } return -1; // verdi ikke funnet } •Dersom vi ikke skal returnere verdien: int dagNr = 0; while (dagNr < nedbør.length && nedbør[dagNr] != verdi) dagNr++; if (dagNr < nedbør.length) {...gjør det som skal gjøres hvis verdien er funnet... } else {...gjør det som skal gjøres hvis verdien ikke er funnet... } Kontrollerer indeksen før den brukes! (utnytter at Java bruker teknikken ”forkortet beregning” ved utregning av logiske uttrykk) Gjør oppgave 1 side 254.

15 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 7, side 15 Klassen java.util.Arrays •Tilbyr klassemetoder for å håndtere tabeller •I metodehodene nedenfor er datatype en primitiv datatype •Sortering –static void sort(datatype[] tab) –static void sort(datatype[] tab, int fraIndeks, int tilIndeks) •Søking, forutsetter at tabellen er sortert på forhånd –static int binarySearch(datatype[] tab, datatype søkeverdi) Vis programliste 7.4 side 255f.

16 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 7, side 16 Bruk av online API-dokumentasjonen …skal finne flere metoder i klassen java.util.Arrays…. klikk! jdk1.5/docs/

17 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 7, side 17...online dokumentasjonen, forts… oversikt over klassene oversikt over pakkene

18 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 7, side 18 …og her fant vi klassen Arrays… Gjør oppgave 1 side 258.

19 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 7, side 19 Behov for en todimensjonal tabell •Salgsdata for hver dag i et år (52 uker, 5 dager pr uke) kan framstilles på følgende måte: dag 0dag 1dag 2dag 3dag 4 uke uke uke uke 3 uke 4 uke uke 51 Oppgave: Hvilke tjenester bør et objekt som inneholder denne informasjonen, tilby sine klienter?

20 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 7, side 20 En todimensjonal tabell •En todimensjonal tabell har linjer og kolonner. •Hver linje er å betrakte som en endimensjonal tabell med følgende navn: salg[0], salg[1], salg[2], salg[3]. •Eksempler: –salg[1][3] = 400; –int salget = salg[0][4]; –int sum = salg[3][0] + salg[3][1]; Vis programliste 7.5 side 260ff salg[0] salg[1] salg[2] salg[3] salg[1][3] salg[3][4] int[ ][ ] salg = new int[4][5]; // 4 uker, 5 dager pr. uke Gjør oppgave 1 og 2 side

21 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 7, side 21 Mer enn to dimensjoner •Skal registrere salgsdata pr selger: dag nr uke nr selger nr 0 selger nr 1 selger nr 2 int[][][] salg = new int[3][4][5] antSelgere antUker antDager salg[2][2][4] salg[0][0][0]

22 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 7, side 22 Behandling av den tre-dimensjonale tabellen salg •Hvor mye har selgeren med indeks selgernr solgt for i uken med indeks ukenr? int sum = 0; for (int i = 0; i < salg[selgernr][ukenr].length; i++) { sum += salg[selgernr][ukenr][i]; } •Hvor mye har selgeren med indeks selgernr solgt for totalt? int sum = 0; for (int ukenr = 0; ukenr < salg[selgernr].length; ukenr++) { for (int dagnr = 0; dagnr < salg[selgernr][ukenr].length; dagnr++) { sum += salg[selgernr][ukenr][dagnr]; } •Hva er totalsalget? int sum = 0; for (int selgernr = 0; selgernr < salg.length; selgernr++) { for (int ukenr = 0; ukenr < salg[selgernr].length; ukenr++) { for (int dagnr = 0; dagnr < salg[selgernr][ukenr].length; dagnr++) { sum += salg[selgernr][ukenr][dagnr]; }

23 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 7, side 23 Utvidet for-løkke int total = 0; for (int i = 0; i < dager.length; i++) { total += dager[i]; } int total = 0; for (int dag : dager) { total += dag; } int total = 0; for (int dag : dager) total += dag;... for hvert element dag i tabellen dager... Utvidet for-løkke er hensiktsmessig å bruke hvis vi skal hente ut alle elementene i en tabell. Dersom vi skal gå gjennom bare en del av en tabell, eller vi trenger indeksen, er det bedre å bruke en vanlig for-løkke. Vi må også bruke vanlig for-løkke dersom vi skal forandre elementene i tabellen.

24 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 7, side 24 Utvidet for-løkke, forts. int sum = 0; for (int[] uke : salg) { for (int dag : uke) { sum += dag; } int sum = 0; for (int uke = 0; uke < salg.length; uke++) { for (int dag = 0; dag < salg[uke].length; dag++) { sum += salg[uke][dag]; } Todimensjonale tabeller Ukedag[] alleDager = Ukedag.values(); for (Ukedag dag : alleDager) System.out.println(dag); Ukedag[] alleDager = Ukedag.values(); for (int i = 0; i < alleDager.length; i++) { System.out.println(alleDager[i]); } Enum-typer enum Ukedag { mandag, tirsdag, onsdag, torsdag, fredag, lørdag, søndag } for (Ukedag dag : Ukedag.values()) System.out.println(dag); Gjør oppgavene side 275.

25 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 7, side 25 En tabell av referanser, eksempel strenger –Hvert enkelt element i tabellen består av en referanse til String: •String[] navneliste = new String[4]; –Dette er en tabell av referanser. Hver enkelt av disse referansene må vi sette til å peke til objekter av klassen String: •navneliste[0] = new String(”Anne”); •navneliste[1] = ”Berit”; // kortform går bra –Objektet kan også være retur fra en metode som lager et String-objekt: •navneliste[2] = = JOptionPane.showInputDialog("Skriv et navn: "); •navneliste[3] = navneliste[0].toUpperCase(); –Kan også skrive: •String[] navneliste = {”Anne”, ”Berit”, ”Åge”, ”ANNE”}; navneliste AnneBeritÅgeANNE Gjennomgå programliste 7.8 side

26 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 7, side 26 Å kopiere en tabell av referanser fører ikke til at objektene kopieres navneliste AnneBeritÅgeANNE navnelisteKopi String[] navnelisteKopi = new String[4]; for (int i = 0; i < navneliste.length; i++) { navnelisteKopi[i] = navneliste[i]; }

27 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 7, side 27 Forskjeller mellom tabeller av primitive datatyper og tabeller av referansetyper •En tabell av en primitiv datatype: –Elementene i tabellen inneholder dataverdiene. –Dataverdiene kopieres dersom tabellen kopieres element for element. –Elementene kan sammenlignes ved å bruke sammenligningsoperatorene. –Elementene initieres til 0 (ev. false) dersom ikke andre verdier gis i deklareringen av tabellen. •En tabell av en referansetype: –Elementene i tabellen inneholder ikke objektene, men referanser til objektene. –Dersom tabellen kopieres element for element, blir bare referansene kopiert, ikke objektene. Element med samme indeks i begge tabellene peker til det samme objektet. –Med unntak av lik (==) og ikke lik (!=) kan vi ikke bruke sammenligningsoperatorer på referanser. Operatorene lik og ikke lik sammenligner innholdet i referansene, ikke i objektene som referansene peker til. –Elementene initieres til null, dersom ikke andre verdier gis i deklareringen av tabellen. Dersom vi prøver å bruke et tabellelement som ikke refererer til noe objekt, kastes NullPointerException. Gjør oppgavene 1-3 side

28 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 7, side 28 Tabell av referansetype som medlem i klasse Gjennomgå programliste 7.9, side , se spesielt metoden sorterFag() (neste side)

29 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 7, side 29 Sortering av objekter public void sorterFag() { for (int start = 0; start < antFag; start++) { int hittilMinst = start; for (int i = start + 1; i < antFag; i++) { String denneFagkode = fagene[i].finnFagkode(); String hittilMinstFagkode = fagene[hittilMinst].finnFagkode(); if (denneFagkode.compareToIgnoreCase(hittilMinstFagkode) < 0) hittilMinst = i; } Fag hjelp = fagene[hittilMinst]; fagene[hittilMinst] = fagene[start]; fagene[start] = hjelp; } class Fag { private String fagkode; // entydig private String fagnavn; private int antSp; class Fagkatalog { private Fag[] fagene; private int antFag; Sorterer fag-objektene etter fagkode. bytter om innholdet i referansene, objektene ligger i ro

30 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 7, side 30 Bytter om innholdet i to referanser fagene LV172D LV195D LV191D LV193D Trinn 1: hjelp = fagene[hittilMinst] 1 start hjelp fagene Trinn 2: fagene[hittilMinst] = fagene[start] hjelp 2 hittilMinst LV172D LV195D LV191D LV193D fagene hjelp LV172D LV193D Trinn 3: fagene[start] = hjelp LV191D LV195D Vi bytter om rekkefølgen på referansene. Objektene ligger i ro. At sirklene er tegnet under hverandre betyr ikke at de ligger etter hverandre i primærminnet.

31 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 7, side 31 Flerdimensjonale tabeller er lite brukt i objektorientert programmering •Vi trenger å bruke flerdimensjonale tabeller dersom vi skal behandle dataene i flere dimensjoner. •Ellers lager vi heller tabeller av objekter, der hvert objekt inneholder en tabell med tilleggsinformasjon knyttet direkte til tabellen. januar februar mars desember 1995 januar februar mars desember 1996 januar februar mars desember 1997 statistikk


Laste ned ppt "Programmering i Java versjon august 2004 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else."

Liknende presentasjoner


Annonser fra Google