IN-OO1-EVU Dag 3. Stein Gjessing. Kapittel 4: I/O, if og unntak (exceptions) Kapittel 5: While, switch, mer I/O Kapittel 6: Mengder av objekter

Like dokumenter
Stein Gjessing 11. nov IN-OO1-EVU Dag 3. Stein Gjessing

Litt om pakker og mest om data inn og ut

INF1010 våren 2019 Onsdag 30. januar. Mer om unntak i Java (med litt repetisjon av I/O først)

INF1010 våren 2017 Onsdag 25. januar. Litt om unntak i Java

INF1010 våren 2018 tirsdag 23. januar

Oversikt. Array indeks utenfor sine grenser. Feil i programmet hva skjer?

Stein Gjessing, Institutt for informatikk, Universitetet i Oslo

INF1010 våren Arv og subklasser del 1 (pluss litt I/O og unntaksbehandling)

Hittil har programmene kommunisert med omverden via tastatur og skjerm Ønskelig at data kan leve fra en kjøring til neste

Inf1010 Våren Feilsituasjoner og unntak i Java. Stein Gjessing, Institutt for informatikk, Universitetet i Oslo

INF1010 våren Generalisering -spesialisering Gjenbruk av klasser. Ved arv. Klasse-hierarkier. Stein Gjessing.

Å lese tall fra en fil, klassen Scanner

UNIVERSITETET I OSLO

INF1010 våren Arv og subklasser del 1 pluss (hvis vi har tid) litt om Unntak, IO og Scanner-klassen

Oversikt. Feil i programmet hva skjer? Array indeks utenfor sine grenser. Inf1010 Våren Feilsituasjoner og unntak i Java

Inf1010 Våren Feilsituasjoner og unntak i Java. Stein Gjessing, Institutt for informatikk, Universitetet i Oslo

Oversikt. Feil i programmet hva skjer? Array indeks utenfor sine grenser. Inf1010 Våren Feilsituasjoner og unntak i Java

Repetisjon. INF gruppe 13

Inf1010 Våren Feilsituasjoner og unntak i Java. Stein Gjessing, Institutt for informatikk, Universitetet i Oslo

INF Uke 10. Ukesoppgaver oktober 2012

INF 1010, vår 2005 Løsningsforslag uke 11

INF1000 EKSTRATILBUD. Stoff fra uke 1-5 (6) 3. oktober 2012 Siri Moe Jensen

import java.io.*; import java.util.*; import javagently.text;

Uke 5, 27. januar Arv og subklasser del I. Stein Gjessing Institutt for informatikk

Lese fra fil. INF1000 : Forelesning 5. Eksempel. De vanligste lesemetodene. Metoder:

IN1010 våren januar. Objektorientering i Java

INF1010 våren 2010 Torsdag 4. februar. Arv og subklasser del I. Emneoversikt subklasser (2 uker) Hva er en subklasse? Eksempel: Universitetsregister

TOD063 Datastrukturer og algoritmer

2 Om statiske variable/konstanter og statiske metoder.

INF1010 våren Arv og subklasser - del 2

3 emner i dag! INF1000 Uke 5. Objekter og pekere. null. Litt om objekter, pekere og null Filer og easyio Litt mer om tekster

IN Notat om I/O i Java

Oblig 4Hybelhus litt mer tips enn i oppgaven

INF Notat om I/O i Java

INF1010 våren januar. Objektorientering i Java

Innhold uke 4. INF 1000 høsten 2011 Uke 4: 13. september. Deklarasjon av peker og opprettelse av arrayobjektet. Representasjon av array i Java

OBJEKTER SOM EN PROGRAMMERINGS-TEKNIKK

INF1000: Forelesning 6. Klasser og objekter del 1

INF1000: Forelesning 7

Oppgave 1. Oppgave 2. Oppgave 3. Prøveeksamen i INF1000. Ole Christian og Arne. 23. november 2004

Ta inn og ut av 2D-array. Java 6. Liste over ulike verdier i 2D-array. Det ferdige programmet. Vi skal lage et program som illustrerer hvordan man

INF1000 Behandling av tekster

INF1000 (Uke 4) Mer om forgreninger, While-løkker

INF1000: Forelesning 7. Konstruktører Static

INF1000-SIKT - Notat om I/O i Java

Prøveeksamen i INF1000. Ole Christian og Arne. 23. november 2004

I dag INF1000 (Uke 4) Mer om forgreninger, While-løkker. Tre måter å lese fra terminal. Tre måter å lese fra terminal.

I dag INF1000 (Uke 4) Mer om forgreninger, While-løkker. Tre måter å lese fra terminal. Repetisjon. Mer om forgrening While-løkker

Oppgave 1. INF1000 Uke 13. Oppgave 2. Oppgave 3. Er dette lovlige deklarasjoner (når de foretas inni en metode)? JA NEI

Leksjon 7. Filer og unntak

1. Finn klassene (hvilke objekter er det i problemet) 1. Dataene som beskriver problemet (hvilke objekter har vi og hvor mange klasser er det?

Fra Python til Java. En introduksjon til programmeringsspråkenes verden. Dag Langmyhr

Forelesning inf Java 4

i=0 Repetisjon: arrayer Forelesning inf Java 4 Repetisjon: nesting av løkker Repetisjon: nesting av løkker 0*0 0*2 0*3 0*1 0*4

UNIVERSITETET I OSLO

Løsningsforslag ukeoppg. 6: 28. sep - 4. okt (INF Høst 2011)

Tre måter å lese fra terminal. Java 4. Eksempel. Formatert utskrift til skjerm

Oversikt. INF1000 Uke 6. Objekter, pekere og null. Lese og skrive fra/til fil. Litt om objekter, pekere og null Filer og easyio. Litt mer om tekster

INF1000 : Forelesning 4

Dagens forelesning. Java 13. Rollefordeling (variant 1) Rollefordeling (variant 2) Design av større programmer : fordeling av roller.

Forelesningsquiz. Forelesning inf Java 5. Sett dere to (eller tre) sammen og besvar de fire spørsmålene på utdelt ark. Tid: 15 min.

Jentetreff INF1000 Debugging i Java

INF1000 (Uke 5) Mer om løkker, arrayer og metoder

2 Om statiske variable/konstanter og statiske metoder.

i=0 i=1 Repetisjon: nesting av løkker INF1000 : Forelesning 4 Repetisjon: nesting av løkker Repetisjon: nesting av løkker j=0 j=1 j=2 j=3 j=4

Forkurs INF1010. Dag 3. Andreas Færøvig Olsen Gard Inge Rosvold Institutt for Informatikk, 15.

IN1010. Fra Python til Java. En introduksjon til programmeringsspråkenes verden Dag Langmyhr

Ole Christian Lingjærde, 12. september 2013

Forelesning inf Java 5

Forelesning inf Java 4

Forelesning inf Java 5

INF 1000 høsten 2011 Uke september

Videregående programmering 6

INF Uke 10. Løsningsforslag ukesoppgaver oktober 2012

Løsningsforslag Test 2

Spørsmål fra forrige forelesning. INF1000 Forelesning 7. Oppførselen til inword()/inint()/etc. Operator-presedens i Java

UNIVERSITETET I OSLO

Hva er verdien til variabelen j etter at følgende kode er utført? int i, j; i = 5; j = 10; while ( i < j ) { i = i + 2; j = j - 1; }

INF1000 undervisningen INF 1000 høsten 2011 Uke september

INF1010, 22. mai Prøveeksamen (Eksamen 12. juni 2012) Stein Gjessing Inst. for Informatikk Universitetet i Oslo

UNIVERSITETET I OSLO

INF1010 våren Arv og subklasser del I

IN1010. Fra Python til Java. En introduksjon til programmeringsspråkenes verden Dag Langmyhr

INF2100. Oppgaver 26. september til 1. oktober 2007

Eksempel: Body Mass Index (BMI) Forelesning inf Java 3. Ferdig program (første del) Ferdig program (siste del)

INF1000 : Forelesning 5

LITT OM OPPLEGGET. INF1000 EKSTRATILBUD Stoff fra uke September 2012 Siri Moe Jensen EKSEMPLER

Forkurs INF1010. Dag 3. Andreas Færøvig Olsen Eivind Storm Aarnæs

INF1000: Forelesning 11. Oppgave 2. Oppgave 1. Husk å melde deg på prøveeksamen i INF1000! Ole Christian Lingjærde 7.november 2006

Løsningsforslag ukeoppg. 9: okt (INF Høst 2011)

INF1010 våren 2008 Uke 4, 22. januar Arv og subklasser

Forkurs INF1010. Dag 1. Andreas Færøvig Olsen Tuva Kristine Thoresen

"Nelsons kaffebutikk"

Kort repetisjon av doble (nestede) løkker Mer om 1D-arrayer Introduksjon til 2D-arrayer Metoder

Hvis en person har inntekt < , så betaler han 10% skatt på alt, og ellers betaler han 10% skatt på de første og 30% på resten.

Hvis en person har inntekt < , så betaler han 10% skatt på alt, og ellers betaler han 10% skatt på de første og 30% på resten.

HØGSKOLEN I SØR-TRØNDELAG

EKSAMEN I INF244: OBJEKTORIENTERT PROGRAMVAREUTVIKLING I BACHELORSTUDIET I IT OG INFORMASJONSSYSTEMER BACHELORSTUDIET I IT OG ENTREPRENØRSKAP

(MVC - Model, View, Control)

Seminaroppgaver IN1010, uke 2

Transkript:

IN-OO1-EVU Dag 3 Stein Gjessing Litt repetisjon Kapittel 4: I/O, if og unntak (exceptions) Kapittel 5: While, switch, mer I/O Kapittel 6: Mengder av objekter Kapittel 7: Tekster Materiale også lånt av Arne Maus og Jens Kaasbøll Stein Gjessing, Universitetet i Oslo 1

class Skog {. class Tree {. Tree totalenquiries 0 Skog main() Tree gran; noofenquiries 0 Tree furu; Tree bjerk;... System.out.println("Antall forespørsler " + gran.noofenquiries + " " + furu.noofenquiries + " " + bjerk.noofenquiries);... noofenquiries 0 enquiry() noofenquiries ++; totalenquiries ++; noofenquiries 0 enquiry() noofenquiries ++; totalenquiries ++; enquiry() noofenquiries ++; totalenquiries ++; Stein Gjessing, Universitetet i Oslo 2

class Skog main class Tree totalenquiries 0 Skog-objekt gran furu noofenquiries 0 enquiry() noofenquiries bjerk 0 noofenquiries ++; totalenquiries ++; Skog < Her gjør vi det som før ble gjort i main > noofenquiries 0 enquiry() noofenquiries ++; totalenquiries ++; enquiry() noofenquiries ++; totalenquiries ++; Stein Gjessing, Universitetet i Oslo 3

Abstraksjon (og innkapsling) BilData-objekt public void lesfrafil (BufferedReader in) public void skrivtilfil (PrintWriter out) public Bil finnbil (String bilnummer) public void lagrebil (Bil bilen) Sort boks Men dette er stort sett bare syntaksen til metodene (grensesnittet). Hva med semantikken (betydningen av kallene)? Stein Gjessing, Universitetet i Oslo 4

Innkapsling (og abstraksjon) Information hiding (jfr databaser) public void lesfrafil (BufferedReader in) public void skrivtilfil (PrintWriter out) Den første prototypen kan inneholde en meget enkel eller ingen datastruktur public Bil finnbil (String bilnummer) public void lagrebil (Bil bilen) Datastrukturen kan stadig forenkles/ forbedres/ optimaliseres BilData-objekt Stein Gjessing, Universitetet i Oslo 5

Objektorientering Klasser og objekter generelle typer og enkeltforekomster informasjonsskjuling, grensesnitt til systemet Pekere dynamiske datastrukturer uttrykke forhold/forbindelse mellom objekter Arv / subklasser generalisering og spesialisering, klassifisering, deling av kode forholdet mellom klasser Virtuelle metoder - polymorfi redefinering av operasjoner utsatt definering av operasjoner Stein Gjessing, Universitetet i Oslo 6

Hvordan finne klassene Kandidater til klasser: Håndfaste ting, andre (del)systemer Mennesker, roller Substantiver generelt Organisasjoner Hendelser, transaksjoner Steder Stein Gjessing, Universitetet i Oslo 7

Objekt-egenskaper Et objekt har: Tilstand (verdi på data / variable) Handlinger (ved kall på metoder) Identitet (ett objekt er alltid unikt, forskjellig fra alle andre objekter) (((( identiteten er ofte adressen det er lagret på i RAM)))) Et objekt har intet navn Stein Gjessing, Universitetet i Oslo 8

Klasser og objekters ansvar En klasse skal representere en type av ting, en type logisk enhet, et begrep Et objekt representerer ikke bare passivt en slik 'ting' man har også ansvar / tilbyr tjenester (via metoder) overfor andre objekter. Objektet er en tjener (peer to peer vs. klient/tjener) Et objekt samarbeider ofte med andre objekter (av egen eller andre klasser) når det skal utføre en tjeneste. Dvs. objektet kaller metoder i andre objekter for å løse (deler) av oppgaven. Kalles ofte delegering. En klasse kan selv definere alle sine egenskaper/sitt ansvar, eller arve deler av det. Stein Gjessing, Universitetet i Oslo 9

Eksempel public class Konto { // ett objekt representerer en bank-konto long kontonr, saldo; String eier ; Konto( int knr, String s) { kontonr = knr; eier = s; saldo = 0; public void settinn(int beløp) { saldo = saldo + beløp; public void taut(int beløp) { saldo = saldo - beløp; public void overfør(int beløp, Konto konto2) { taut(beløp); konto2.settinn(beløp); ; public int kontonummer ( ); { return kontonr; Stein Gjessing, Universitetet i Oslo 10

Konto Konto objekt long kontonr, saldo; String eier; Konto( int knr, String s) public void settinn(int beløp) public void taut(int beløp) public void overfør(int beløp, Konto konto2) public int kontonummer ( ); Stein Gjessing, Universitetet i Oslo 11

Kapittel 4 Stein Gjessing Data inn fra tastaturet import java.io.*;. BufferedReader mininn = new BufferedReader (new InputStreamReader (System.in)); Hovedklasse main mininn BufferedReader En metode som leser fra tastaturet må ha besvergelsen throws IOException foran seg (etter overskriften). F.eks.: String readline() public static void main (String [ ] args) throws IOException {.......... For å lese en linje fra tastaturet: String streng; streng = mininn.readline ( ); Ferdiglaget metode som henter data inn fra tastatur Stein Gjessing, Universitetet i Oslo 12

import java.io.*; class Greetings // side 97 { public static void main (String [] args) throws IOException { BufferedReader mininn = new BufferedReader (new InputStreamReader(System.in)); Greetings main mininn navn BufferedReader String readline() System.out.println("What is your name?"); String navn = mininn.readline ( ); System.out.println("Bonjour " + navn + ); Dette objektet leser fra tastaturet snidil:>javac Greetings.java snidil:>java Greetings What is your name? Stein Gjessing Bonjour Stein Gjessing snidil:> String 11 konstruktører 47 metoder pluss plass til å lagre en streng (en tekst) Stein Gjessing Et objekt av klassen String Stein Gjessing, Universitetet i Oslo 13

Om å lese tall import java.io.*; BufferedReader main mininn BufferedReader mininn = new BufferedReader (new InputStreamreader (System.in)); // Bruk: String readline() double tall; tall = Double.valueOf(minInn.readLine().trim()).doubleValue(); Dette objektet leser fra tastaturet Double er en klasse som inneholder mye verktøy som behandler kommatall av typen double. ( Dette har ingen ting med innlesing å gjøre. ) Det finnes andre klasser som bl.a. heter Character, Integer, Long og Boolean og som inneholder metoder for å ta seg av hhv. tegn, heltall (int og long) og logiske verdier. Se i pakken java.lang Double Double valueof ( ) double doublevalue( ) Stein Gjessing, Universitetet i Oslo 14

En enkel måte å lese tall på i Java uten Bishops Text-klasse import java.io.*; BufferedReader mininn = new BufferedReader (new InputStreamreader (System.in)); int tall; String linje; tall linje = mininn.readline(); // HVIS LINJEN BARE INNEHOLDER ET TALL: tall = Integer.parseInt(linje); linje Integer String 11 konstruktører, 47 metoder pluss plass til å lagre en streng (en tekst) int parseint ( ) 137 Et objekt av klassen String Stein Gjessing, Universitetet i Oslo 15

Enkel måte å lese tall - class Text For å gjøre lesing og skriving enklere har Judy Bishop laget en class Text som bl.a. behandler innlesing og utskrift fra tastatur/skjerm. Da kan du si: Text BufferedReader open (...) double readdouble (...) BufferedReader mininn = Text.open(System.in); String streng; streng = Text.readString (mininn); int readint (...) char readchar (...) Mange av egenskapene til klassen Text står på side 98: String readstring (...) class Text { public BufferedReader open (. ) {.. public double readdouble (BufferedReader in) {. public int readint (BufferedReader in) {. public char readchar (BufferedReader in) {. public String readstring (...) {.. Klassen Text leser tekstbiter (engelsk: items) eller tall som er adskilt med blank, tabulator eller komma. Stein Gjessing, Universitetet i Oslo 16

import java.io.*; import javagently.text; Text BufferedReader open (...) String readstring (...) Greetings main mininn navn BufferedReader class Sum { public static void main (String [] args) throws IOException { String readline() BufferedReader mininn = Text.open(System.in); System.out.println("What is your name?"); String navn = Text.readString(minInn); System.out.println("Bonjour " + name ); snidil:>javac Greetings.java snidil:>java Greetings What is your name? Stein Gjessing Bonjour Stein snidil:> String 11 konstruktører, 47 metoder pluss plass til å lagre en streng (en tekst) Stein Dette objektet leser fra tastaturet Et objekt av klassen String Stein Gjessing, Universitetet i Oslo 17

Text BufferedReader open (...) main tastatur int readint (...) SumTast BufferedReader tel import java.io.*; import javagently.text; void prompt (...) sum nyttall class SumTast { public static void main (String [ ] args) throws IOException { BufferedReader tastatur = Text.open(System.in); int nyttall = 1; int sum = 0; Text.prompt( Tast inn noen tall, avslutt med 0: ); for (int tel = 0; nyttall!= 0 ; tel ++) { nyttall = Text.readInt(tastatur); sum += nyttall; System. out.println( Du skrev + tel + tall. ); System. out. println( Summen av disse tallene er: + sum); Dette objektet leser fra tastaturet Utføring av dette programmet etter et en feil er rettet opp: snidil: >javac SumTast.java snidil: >java SumTast Tast inn noen tall, avslutt med 0: 34 23 23 34 56 78 362 0 Du skrev 8 tall. Summen av disse tallene er: 610 snidil: java> Stein Gjessing, Universitetet i Oslo 18

Lesing og skriving på filer (platelager) Prosessor f.eks. Pentium Primærlager (Random Access Memory) System-bus (ledninger) Platelager (Disk) I/O-bus f.eks. PCI Nettverksforbindelse Stein Gjessing, Universitetet i Oslo 19

Innlesing fra fil: Først må vi lage en forbindelse med filen, det gjør vi med enten filinn BufferedReader BufferedReader filinn = new BufferedReader (new FileReader ( minfil.txt )); Dette objektet leser fra filen minfil.txt eller: BufferedReader filinn = Text.open( minfil.txt ); Nå kan vi bruke filen på samme måte som vi leste data fra tastaturet: minfil.txt 123.54 Forelesning double dtall; String tekst; dtall = Text.readDouble(filInn); tekst dtall tekst = Text.readString(filInn); Et objekt av klassen String Stein Gjessing, Universitetet i Oslo 20

Innlesing fra fil import java.io.*; import javagently.text; Text SumFil BufferedReader open (...) main filinn int readint (...) tall class SumFil { public static void main (String [] args) throws IOException { int resultat = 0, tall; resultat BufferedReader Dette objektet leser fra filen minfil.txt BufferedReader filinn = Text.open( minfil.txt ); for (int tel = 1; tel<= 15 ; tel + +) { tall = Text.readInt(filInn); resultat += tall ; System.out.println( Summen er + resultat); snidil: java>javac SumFil.java snidil: java>java SumFil Summen er 8812083 snidil: java> Filen minfil.txt (laget f.eks. med emacs) 1256 345 245 345 1234 5576 43321 098098 8584 7588 3450 87544 9876 4332 8540289 Stein Gjessing, Universitetet i Oslo 21

import java.io.*; import javagently.text; Text BufferedReader open (...) int readint (...) class SumFil2 { public static void main (String [] args) throws IOException { int resultat = 0, tall, antall; Greetings2 main filinn antall tall resultat Objekt av klassen BufferedReader som knytter forbindelse til filen BufferedReader filinn = Text.open( lengdefil.txt ); antall = Text.readInt(filInn) ; for (int tel = 1; tel<= antall ; tel ++) { tall = Text.readInt(filInn); resultat += tall ; System.out.println( Summen er + resultat); snidil: >javac SumFil2.java snidil: >java SumFil2 Summen er 8812083 snidil: > lengdefil.txt 15 1256 345 245 345 1234 5576 43321 098098 8584 7588 3450 87544 9876 4332 8540289 Stein Gjessing, Universitetet i Oslo 22

Oppgave. Vi skal lage et bilregister. Vi deler oppgaven i to: kontroll og kontakt med brukeren, og selve datastrukturen som tar seg av lagring av alle bil-dataene Her har vi kontakt med bruker Her lagres alle bildataene beomnyeordre kall lesfrafil, lagnybil mm. lesfrafil. kall lesfrafil i datastrukt.. lesfrafil Les alle biler fra fil skrivtilfil skrivtilfil. kall skrivtilfil i datastrukt.. lagnybil. kall lagnybil i datastrukt.. Skriv alle biler til fil lagnybil Lag en ny bil Stein Gjessing, Universitetet i Oslo 23

Oppgave, 15 minutter: Programmer disse tre klassene med lesfrafil metodene (untatt Legg objektet på plass i mengden av alle biler ) objekt av class Bilreg objekt av class BilData objekter av class Bil lesfrafil Be bruker om filnavn Opprett kontakt med filen Kall datastrukturens lesfrafil Lukk filen lesfrafil Les data om meg fra fil ZKLOH (mer på filen) {Lag et bilobjekt Kall lesfrafil i dette objektet Legg objektet på plass i mengden av alle biler lesfrafil lesfrafil Les data om meg fra fil Stein Gjessing, Universitetet i Oslo 24

Utskrift til fil PrintWriter filutstrom = new PrintWriter (new FileWriter ( minutfil.txt )); Greetings2 main filut PrintWriter eller: PrintWriter filut = Text.create( minutfil.txt ); void println() // Utskrift skjer som til skjerm: filut.println( utskrift + 17 ): Dette objektet skriverpå filen minutfil.txt For at innholdet på den nye filen skal bevares må vi til slutt si: minutfil.txt filut.close( ); dtall Se eksempel side 105 i Bishop. Stein Gjessing, Universitetet i Oslo 25

import java.io.*; import javagently.*; class InnUt { Utskrift til fil - eksempel public static void main (String [] args) throws IOException { String tekst1, tekst2; BufferedReader mininn = new BufferedReader (new InputStreamReader(System.in)); PrintWriter filut = Text.create( minutfil.txt ); snidil: java>java InnUt Fornavn: Per Etteranavn: Petersen Gatenavn: Solhellinga Gatenummer: 123 Postnummer: 4990 Poststed: Søndeled Data er skrevet på filen "minutfil.txt" snidil: java> Text.prompt( Fornavn: ); tekst1= Text.readString(minInn); Text.prompt( Etteranavn: ); tekst2= Text.readString(minInn); filut.println( Navn: + tekst1 + + tekst2); Text.prompt( Gatenavn: ); tekst1= Text.readString(minInn); Text.prompt( Gatenummer: ); tekst2= Text.readString(minInn); filut.println( Adresse: + tekst1 + + tekst2); Text.prompt( Postnummer: ); tekst1= Text.readString(minInn); Text.prompt( Poststed: ); tekst2= Text.readString(minInn); filut.println( Poststed: + tekst1 + + tekst2); filut.close( ); System. out.println( Data er skrevet på filen \ minutfil.txt\ ); minutfil.txt Navn: Per Petersen Adresse: Solhellinga 123 Poststed: 4990 Søndeled Stein Gjessing, Universitetet i Oslo 26 filut Dette objektet skriver på filen minutfil.txt

Valg (med if-else) if ( ORJLVNXWWU\NN) VHWQLQJ else VHWQLQJ Her utfører datamaskinen enten VHWQLQJ eller VHWQLQJ, IKKE begge to. Altså et valg mellom å gjøre EN av setningene EN gang. if (jeg føler meg dårlig) {bli i senga else {gå på på jobb Bare hvis VHWQLQJ eller VHWQLQJ består av flere setninger må vi sette klammeparenteser rundt (som rett over). Setninger inne i klammeparenteser kaller vi en blokk. if ( ORJLVNXWWU\NN) { VHWQLQJHU else { VHWQLQJHU Vi kan også skrive bare if ( ORJLVNXWWU\NN) VHWQLQJ eller: if ( ORJLVNXWWU\NN) { VHWQLQJHU I disse tilfellene utføres enten VHWQLQJHU eller ingenting. Stein Gjessing, Universitetet i Oslo 27

Fem løsrevne eksempler: tel nytall int tel, sum = 0; double gjennomsnitt; int nyttall, boolean fortsett = true; int highest, number; int tall, possum = 0, negsum = 0; navn: fortsett type: boolean if (tel > 0) gjennomsnitt = sum / tel; else gjennomsnitt = 0; tall if (nyttall == 0) fortsett = false; else sum += nyttall; if (number > highest) highest = number; if ( tall > 0) { possum += tall ; System. out.println ( tallet var positivt ); else { negsum += tall ; System. out.println ( tallet var negativt ); if (tall > 0) { possum += tall ; System. out.println ( tallet var positivt ); else if (tall < 0 ) { negsum += tall ; System. out.println ( tallet var negativt ); else // tallet er null System. out.println ( tallet telles ikke ); Se side 109 og øvelsen ifb. Summation3-programmet Les også øverste halvdel av side 110. Stein Gjessing, Universitetet i Oslo 28

Program som finner gjennomsnittet av tall som brukeren skriver på tastaturet import java.io.*; import javagently.*; Text SumTast BufferedReader open (...) main tastatur String readint (...) void prompt (...) tel sum BufferedReader class SumTast nyttall public static void main (String [] args) throws IOException { gjennomsnitt BufferedReader tastatur = Text.open(System.in); int nyttall = 1, tel, sum = 0; double gjennomsnitt; Text.prompt( Tast inn noen tall, avslutt med 0: ); for (tel = 0; nyttall!= 0 ; tel ++) { nyttall = Text.readInt(tastatur); sum += nyttall; tel - -; if (tel > 0) gjennomsnitt = (double) sum / tel; else gjennomsnitt = 0; System. out.println( Du skrev + tel + tall. ); System. out. println( Gjennomsnitt av disse tallene er: + gjennomsnitt ); Dette objektet leser fra tastaturet Stein Gjessing, Universitetet i Oslo 29

Her er en variant av det samme programmet. Se på de små forskjellene. Legg spesielt merke til hvordan vi bruker en logisk variabel til å kontrollere når vi skal stoppe (terminere) repetisjonen: import java.io.*; import javagently.*; snidil: >javac SumTast2.java class SumTast2 { snidil: >java SumTast2 Tast inn noen tall, avslutt med 0: public static void main (String [] args) 45 34 throws IOException { 23 34 456 0 BufferedReader tastatur = Text.open(System.in); Du skrev 5 tall. int nyttall, sum = 0; double gjennomsnitt; Gjennomsnitt av disse tallene er: 118.4 int tel; boolean fortsett = true; snidil: > Text.prompt( Tast inn noen tall, avslutt med 0: ); for ( tel = -1; fortsett ; tel ++) { nyttall = Text.readInt(tastatur); if (nyttall == 0) fortsett = false; else sum += nyttall; if (tel > 0) gjennomsnitt = (double) sum / tel; else gjennomsnitt = 0; System. out.println( Du skrev + tel + tall. ); System. out. println( Gjennomsnitt av disse tallene er: + gjennomsnitt ); navn: fortsett type: boolean Stein Gjessing, Universitetet i Oslo 30

import java.io.*; import javagently.*; highest number class HighestValue { public static void main(string[] args) throws IOException { BufferedReader in = Text.open(System.in); System.out.println("***** Finding the highest number *****"); Text.prompt("How many numbers (1 or more)?"); int n = Text.readInt(in); System.out.println("Type them in"); Text.prompt("1>"); int highest = Text.readInt(in); int number; for (int i = 2; i <= n; i++) { Text.prompt( i + > ); number = Text.readInt(in); if (number > highest) highest = number; // slutt for System.out.println("That's enough, thanks"); System.out.println("The highest number was +highest); // slutt main // slutt hovedklasse Variablen highest inneholder høyeste verdi til nå snidil: >javac HighestValue.java snidil: >java HighestValue ***** Finding the highest number ***** How many numbers (1 or more)? 4 Type them in 1> 234 2> 6321 3> fem Error in number, try again. 5 4> 2463 That's enough, thanks The highest number was 6321 snidil: > Stein Gjessing, Universitetet i Oslo 31

import java.io.*; // side 108, meget lett modifisert. Sammenlign! import javagently.*; class Summation3 { public static void main(string[] args) throws IOException { BufferedReader in = Text.open(System.in); int count; double total = 0; double postotal = 0; double negtotal = 0; double number; Text.prompt("How many numbers?"); count = Text.readInt(in); for (int i = 1; i <= count; i++) { Text.prompt(i+">"); number = Text.readDouble(in); total = total + number; if (number > 0) { postotal += number; System.out.println ( Tallet var positivt ); else { negtotal += number; System.out.println ( Tallet var negativt ); // end if // end for number Øvelse: Rett programmet slik at det ikke skriver at null er et negativt (eller et positivt) tall snidil: >javac Summation3.java snidil: >java Summation3 How many numbers? 6 1> 34 Tallet var positivt 2> 56 Tallet var positivt 3> -2 Tallet var negativt 4> 0 Tallet var negativt 5> 34 Tallet var positivt 6> -23 Tallet var negativt That s enough, thanks. The total is 99.0 The positive total is 124.0 The negative total is -25.0 snidil: > System.out.println("That's enough, thanks."); System.out.println("The total is + total); System.out.println("The positive total is +postotal); System.out.println("The negative total is +negtotal); // end main // end class Stein Gjessing, Universitetet i Oslo 32

Oppgave, 15 minutter: Programmer disse tre klassene med skrivtilfil metodene (untatt flere biler og Hent neste objekt ) objekt av class Bilreg objekt av class BilData objekter av class Bil skrivtilfil Be bruker om filnavn Opprett kontakt med filen Kall datastrukturens skrivtilfil Lukk filen skrivtilfil skrivtilfil Skriv data om meg selv på fil ZKLOH (flere biler) { Hent neste objekt Kall skrivtilfil i dette objektet skrivtilfil Skriv data om meg selv på fil Stein Gjessing, Universitetet i Oslo 33

Introduksjon til unntaksbehandling Vi har allerede sett at de unntakene som kan oppstå, og som programmet ikke vil behandle, de må programmet kaste videre (til Javas kjøresystem): public static void main(string[] args) throws IOException { BufferedReader filinn = Text.open( minfil.txt );. For eksempel hvis filen ikke finnes (her tok jeg bare å skiftet ut filanevnet minfil.txt med navnet minfil2.txt i programmet SumFil): snidil: >javac SumFil.java snidil: >java SumFil java.io.filenotfoundexception: minfil2.txt at java.lang.throwable.<init>(compiled Code) at java.lang.exception.<init>(compiled Code) at java.io.ioexception.<init>(compiled Code) at java.io.filenotfoundexception.<init>(compiled Code) at java.io.fileinputstream.<init>(compiled Code) at java.io.filereader.<init>(compiled Code) at javagently.text.open(compiled Code) at SumFil.main(Compiled Code) snidil: > Stein Gjessing, Universitetet i Oslo 34

Eksempel fra Judy Bishops Text-klasse: package javagently; Integer import java.io.*; import java.util.*; import java.text.*; public class Text {.. public static int readint (BufferedReader in) throws IOException { if (T==null) refresh(in); while (true) { try { return Integer.parseInt(T.nextToken()); catch (NumberFormatException e2) { System.out.println("Error in number, try again."); // end class Text parseint <og så hvis feil:> throw new NumberFormatException( );... Stein Gjessing, Universitetet i Oslo 35

Skisse av unntaksbehandling A try { B A kaller B B oppdager en feil: throw new Untaksklasse ( ) ; catch (Untaksklasse unt) { < Unntaksbehandling. Dette hoppes over når intet unormalt har hendt > < her fortsetter vanligvis programmet både etter normal utføring og etter behandling av Figur 4.6 eventuelle unntak > Normal retur fra B til A Untaksklasse er en forhåndsdeklarert subklasse av klassen Exception. Stein Gjessing, Universitetet i Oslo 36

import java.io.*; import javagently.*; Eksempel side 120, lett modifisert class Olympics { public static void main(string[] args) throws IOException { System.out.println("** Olympic medals **"); System.out.println(); BufferedReader in = Text.open(System.in); BufferedReader fin = null; String filename = null; boolean fortsett = true; while ( fortsett ) { // i boka: for ( ; ; ) try { System.out.print("What file for the + medals statistics?"); filename = Text.readString(in); fin = Text.open(filename); // Success, so break out of the loop fortsett = false; // i boka: break; catch (FileNotFoundException e) { System.out.println(filename+ " does not exist."); System.out.println("Try again"); String country; int gold, silver, bronze, total, all = 0; System.out.println("\nCountry\t\tGold\tSilver + \tbronze\ttotal"); try { while ( true ) { // i boka: for ( ; ; ) country = Text.readString(fin); gold = Text.readInt(fin); silver = Text.readInt(fin); bronze = Text.readInt(fin); total = gold + silver + bronze; System.out.print(country); if (country.length() < 8) System.out.print("\t"); System.out.println("\t"+gold+"\t"+silver+ "\t"+bronze+ "\t"+total); all += total; catch (EOFException e) { System.out.println(all+" medals won."); Stein Gjessing, Universitetet i Oslo 37

I Olympics -programmet legger vi merke til hvordan den første try-catch-setningen ligger inne i løkka, mens den andre try-catch-setning ligger utenfor løkka (løkka ligger inne i try-setningen). Når det skjer en feil i det første tilfellet (vi får et filnavn som ikke finnes), skal vi bare fortsette repetisjonen for å be om et nytt filnavn. Får vi derimot et riktig filnavn må repetisjonen avsluttes. I boka gjøres det med setningen break; Denne setningen avslutter den omliggende repetisjons-setning (for og whilesetning, samt switch-setning som vi går igjennom senere). Jeg har valgt å avslutte repetisjonen ved hjelp av en boolsk variabel isteden. Når det skjer en feil inne i den siste løkka (filen er slutt), avsluttes repetisjonen og programmet går ut og behandler unntaket utenfor repetisjonen. Det er greit, for da er også programmet ferdig med å lese filen, og alt som står igjen er å skrive ut resultater. Stein Gjessing, Universitetet i Oslo 38

Unntak - oppsummering Brukes til å fange feil - eller uvanlige situasjoner Metoden må si fra hvilke feil-typer som kan oppstå inni seg og som den kaster:...main(...) throws IOException Når en slik feilsituasjon oppstår: Lages det et objekt Det sendes til den metoden hvor feilen oppstod Vi må ikke (men kan) behandle feil av typen: RunTimeException Artimetriske feil andre normale feil under utregninger Error Grusomme systemfeil vi ikke kan gjøre noe særlig med Behandler vi LNNHslike feil, avsluttes programmet Stein Gjessing, Universitetet i Oslo 39

Unntak - oppsummering, forts. Alle de feil vi kan behandle er av typen Exception (eller subklasser av denne) Flere måter å behandle unntak/avbrudd: 1) Ignorere dem hvis de er av typen RunTime eller Error kommer de, terminerer programmet 2) Kaste dem videre SXEOLFVWDWLFYRLGPDLQWKURZV,2([FHSWLRQ programmet terminerer Stein Gjessing, Universitetet i Oslo 40

Unntak - oppsummering, forts. 3) Ta imot dem / fange dem: try{... farlig kode. catch ( Exception e) {... gjør noe fornuftig fordi feil har oppstått.. 4) Ta imot dem, gjøre noe og så kaste dem videre: try{... farlig kode. catch ( Exception e) {... gjør noe fornuftig fordi feil har oppstått.. throw e; Stein Gjessing, Universitetet i Oslo 41

Feil - divisjon med 0 import java.io.*; public class TryTest { public static void main ( String [ ] args) { int i=1; for (int j=0; j < 5; j++) try{ i = 10/j; System.out.println("Det gikk OK, i:" + i + ", j:" + j); // end TryTest catch (Exception e) { System.out.println("Feil i uttrykk: "+ e.getmessage()); e.printstacktrace(); VQLGLO>@MDYD7U\7HVW )HLOLXWWU\NNE\]HUR MDYDODQJ$ULWKPHWLF([FHSWLRQE\]HUR DW7U\7HVWPDLQ&RPSLOHG&RGH 'HWJLNN2.LM 'HWJLNN2.LM 'HWJLNN2.LM 'HWJLNN2.LM Stein Gjessing, Universitetet i Oslo 42

Oppgave (10 minutter) a) Modifiser lesfrafil i brukergrensesnittet slik at brukeren får en mulighet til å skrive nytt filnavn om filen ikke finnes. b) Modifiser lesfrafil i bilene slik at innlesingen stopper når det ikke er mer igjen på filen. Stein Gjessing, Universitetet i Oslo 43

Om pakker En pakke er en samling (Java)filer som ligger i en katalog. Katalogens navn er pakkens navn, og alle.java-filene må starte med: package <katalognavn>; Hver fil kan gjerne inneholde flere klasser, men hver fil kan bare ha en klasse som er synlig utenfra (public). Navnet på den synlige klassen må også være navnet på filen. De andre klassene på filen er bare hjelpeklasser for filens hovedklasse. Fra en fil til en annen i samme pakke kan man imidlertid få tak i alle klasser, metoder og variable (untatt når disse er deklarert private). En pakke må ligge i stien (path - classpath) som Java-systemet leter i for å finne pakker som skal brukes (importeres) inn i programmet ditt. En enkel måte å få Java til å finne en pakke du lager er å legge den samme sted som programmet ditt (Java-filen din). Stein Gjessing, Universitetet i Oslo 44

0HURPSDNNHU snidil: java>mkdir myutilities snidil: java>cd myutilities/ snidil: myutilities>copy ~in105/javapakker/myutilities/*.java. snidil: myutilities>ls -l -rw------- 1 steing 1392 Feb 15 14:16 Dates.java -rw------- 1 steing 626 Feb 15 14:16 FileMan.java -rw------- 1 steing 1800 Feb 15 14:16 List.java -rw------- 1 steing 696 Feb 15 14:16 Sort.java -rw------- 1 steing 95 Feb 15 14:16 Sortable.java snidil: myutilities> NDWDORJHQ P\XWLOLWLHV Filen Dates.java package myutilities; Filen FileMan.java package myutilities; Filen Sortable.java package myutilities; class Dates { class FileMan { interface Sortable { open ( ). Stein Gjessing, Universitetet i Oslo 45

package myutilities; import java.io.*; import javagently.*; public class FileMan { public FileMan () { ; public class Text {..... public static BufferedReader open (String filename) throws FileNotFoundException { return new BufferedReader (new FileReader (filename));.... public static BufferedReader open ( ) throws IOException { BufferedReader in = Text.open(System.in); String filename = ""; I Java-biblioteket: for (int count = 0; count < 5; count ++) { try { filename = Text.readString(in); return Text.open(filename); catch (FileNotFoundException e) { System.out.println(filename+" does not exist."); if (count < 4) System.out.println("Try again"); // slutt på for-løkka om class FileReader Konstruktør: public FileReader(String filename) throws FileNotFoundException throw new FileNotFoundException (); Stein Gjessing, Universitetet i Oslo 46

import java.io.*; import javagently.*; import myutilities.*; public class Olympics2 { public static void main(string[] args) throws IOException { System.out.println("** Olympic medals **"); System.out.println(); try { System.out.print("What file for the + medals statistics?"); BufferedReader fin = FileMan.open(); String country; int gold, silver, bronze, total, all = 0; System.out.println("\nCountry\t + \tgold\tsilver\tbronze\ttotal"); try { while (true) { country = Text.readString(fin); gold = Text.readInt(fin); silver = Text.readInt(fin); bronze = Text.readInt(fin); total = gold + silver + bronze; System.out.print(country); if (country.length() < 8) System.out.print("\t"); System.out.println("\t"+gold+"\t"+silver+ "\t"+bronze+ "\t"+total); all += total; // slutt while (true) // slutt innerste try catch (EOFException e) { System.out.println(all+" medals won."); // slutt innerste catch // slutt ytterste try catch (FileNotFoundException e) { System.out.println ("Check the file name + and run the program again."); // slutt ytterste catch // slutt main // slutt klasse Stein Gjessing, Universitetet i Oslo 47

While-løkker ZKLOHEHWLQJHOVH ^VHWQLQJHU ` *MHQWDVHWQLQJHUVnOHQJHEHWLQJHOVHHUVDQQ JM UHVHOOHUIOHUHJDQJHUHNV while ( i > 0 ) ^L 7H[WUHDG,QWLQQ 6\VWHPRXWSULQWOQ³,QQWDVWHW L `

Do-while-løkker GR ^VHWQLQJHU; `ZKLOH EHWLQJHOVH *M UVHWQLQJHU WHVWVnRPEHWLQJHOVHHUVDQQKYLVVDQQJMHQWDVHWQLQJHU JMHQWDKHOWWLOEHWLQJHOVHHUXVDQQ VHWQLQJHUJM UHVHOOHUIOHUHJDQJHUHNV int i = 1 do ^6\VWHPRXWSULQWOQ³HUSRWHQVHU L L L `while ( i < 100000000 );V Stein Gjessing, Universitetet i Oslo 49

Switch brukes til å velge mellom et lite antall muligheter (ikke bare to muligheter som med if-testen) kan teste på heltall og verdien av et tegn (character) Har setninger for de ulike case ene + at ingen av dem slår til (default) Stein Gjessing, Universitetet i Oslo 50

Switch VZLWFKLQWHOOHUFKDUUHJQHXWWU\NN^ FDVHYHUGL 6HWQLQJHU EUHDN FDVHYHUGL 6HWQLQJHU EUHDN FDVHYHUGL N 6HWQLQJHU N EUHDN GHIDXOW6HWQLQJHU G ` Stein Gjessing, Universitetet i Oslo 51

import java.io.*; import javagently.*; // class Text Test på tegn (store og små) public class Switch { public static void main ( String [ ] args) throws IOException { BufferedReader inn = Text.open(System.in); char svar; System.out.print("Gi tegn (j/n): "); svar = Text.readChar(inn); // end Switch switch (svar) { case j : case J : System.out.println("Du svarte JA"); break; case n : case N : System.out.println("Du svarte NEI") ; break; default: System.out.println("Du svarte FEIL") ; break; Stein Gjessing, Universitetet i Oslo 52

Oppgave - 10 minutter Lag metoden beomordre som leser nye ordre til bilregisteret og kaller de riktige metodene (- list alle biler, - sett inn ny bil, - avslutt) Stein Gjessing, Universitetet i Oslo 53

Kap 6.2 Flere-dimensjonale tabeller, matriser Vi kan lage tabeller av tabeller, og dermed få to-dimensjonale tabeller, som figuren. double [ ] [ ] minmatrise; minmatrise = new double [5] [4]; navn: minmatrise type: double [ ] [ ] 0 1 2 3 4 0 1 2 3 Vi kan nå omtale hver enkelt variabel, for eksempel minmatrise [3] [2] Legg merke til at den første indeksen går nedover (på denne figuren), den andre indeksen går bortover. I mange tilfeller lønner det seg å variere den som går bortover (den siste, den som følger samme endimensjonale tabell) fortest. Dette er fordi variablene i en endimensjonal tabell ligger tett inntil hverandre. Stein Gjessing, Universitetet i Oslo 54

Mangedimensjonale tabeller Vi kan også lage tabeller av tabeller av tabeller, og så videre i så mange dimensjoner vi vil: char [ ] linje; linje = new char [80]; linje[39] er det 39. tegnet på linjen char [ ] [ ] side; side = new char [60] [80]; side[13] [39] er det 39. tegnet på den 13. linjen char [ ] [ ] [ ] bok; bok = new char [250] [60] [80]; bok[222] [13] [39] er det 39. tegnet på den 13. linjen på den 222. siden char [ ] [ ] [ ] [ ] bokhylle; bokhylle = new char [400] [250] [60] [80]; bokhylle [380] [222] [13] [39] er det 39. tegnet på den 13. linjen på den 222. siden i den 380. boken char [ ] [ ] [ ] [ ] [ ] bibliotek; bibliotek = new char [20] [400] [250] [60] [80]; bibliotek [17 ] [380] [222] [13] [39] er det 39. tegnet på den 13. linjen på den 222. siden i den 380. boken i den 17. bokhyllen mjollnir: >java TestBok java.lang.outofmemoryerror at TestBok.main(Compiled Code) mjollnir: > mjollnir: >java TestBok java.lang.arrayindexoutofboundsexception: 38 at TestBok.main(Compiled Code) mjollnir: > Stein Gjessing, Universitetet i Oslo 55

import java.io.*; import minutilities.*; import javagently.*; class Explore { public static void main(string[] args) throws IOException { System.out.println("******* Savanna Exploration Inc. *****"); System.out.print("Where is the gold map? "); BufferedReader fin; try { fin = FileMan.open(); catch (FileNotFoundException e) { fin = Text.open("gold.dat"); System.out.println("Using my own test map gold.dat"); System.out.println("We shall find gold!\n"); Gold mine = new Gold(8,8); mine.readin(fin); mine.assess(); mine.print(); / / slutt main // slutt Explore mine Datastruktur for 8 x 8 felt readin assess print Stein Gjessing, Universitetet i Oslo 56

class Gold import java.io.*; import javagently.*; rowmax colmax public class Gold { static int rowmax, colmax; Konstruktør: Gold (int r, int c) char [ ] [ ] map; double [ ] [ ] data; static final char blank = ; static final char cover = * ; data public Gold(int r, int c) { rowmax = r; colmax = c; data = new double[rowmax][colmax]; map = new char[rowmax][colmax]; map readin assess print Stein Gjessing, Universitetet i Oslo 57

public void readin(bufferedreader in) throws IOException { for (int i = 0; i < rowmax; i++) for (int j = 0; j < colmax; j++) data[i][j] = Text.readDouble(in); public void assess( ) { double point, average; for (int i = 0; i < rowmax; i++) for (int j = 0; j < colmax; j++) map[i][j] = blank; for (int i = 1; i < rowmax-1; i++) for (int j = 1; j < colmax-1; j++) { point = data[i][j]; average = (data[i-1][j] + data[i+1][j] + data[i][j-1] + data[i][j+1]) / 4; if (point > average) map[i][j] = cover; // slutt assess class Gold forts. og en datafil 21 21 22 30 40 21 34 45 21 22 23 30 45 21 37 40 22 23 24 45 46 47 38 39 22 23 24 35 46 47 38 38 23 24 25 36 46 49 37 36 23 24 25 37 39 48 36 35 23 24 25 25 26 25 26 25 23 25 26 27 28 29 30 31 Stein Gjessing, Universitetet i Oslo 58

public void print() { System.out.println("Map of possible boundaries of the gold reef"); System.out.println("==============================="); System.out.println(); System.out.print(" "); for (int j = 0; j < colmax; j++) System.out.print(j + " "); System.out.println(); for (int i = 0; i < rowmax; i++) { System.out.print(i + " "); for (int j = 0; j < colmax; j++) System.out.print(map[i][j]+" "); System.out.println(); System.out.println("Good luck prospecting!"); // slutt print // slutt class Gold class Gold forts. og en kjøring mjollnir: >java Explore ******* Savanna Exploration Inc. ***** Where is the gold map? gold.dat We shall find gold! Map of possible boundaries of the gold reef =============================== 0 1 2 3 4 5 6 7 0 1 * * 2 * * * * 3 * * 4 * * * * 5 * * 6 7 Good luck prospecting! mjollnir: > Stein Gjessing, Universitetet i Oslo 59

6.4 Om å lagre og finne igjen objekter Mengder av objekter (side 185 Envelopes er helt feilplassert her) Stein Gjessing, Universitetet i Oslo 60

Repetisjon: Mange objekter 0 Anta at class Person finnes: Person [ ] persontabell; persontabell = new Person [30]; navn: persontabell type: Person [ ] 1 2 3 4 for (int ind=0; ind <= 29; ind++) persontabell[ind] = new Person( ); 28 29 persontabell 0 1 2 3 4 28 29 Stein Gjessing, Universitetet i Oslo 61

Tabell (array) av student-objekter name John Botha tabell marks i name Mary Brown ind marks funnet s null null null name Jean Barkhuizen marks En Vector kan også brukes null null Stein Gjessing, Universitetet i Oslo 62

class Student (lett modifisert fra side 187) import java.io.*; import javagently.*; class Student { et objekt av klassen Students name marks Mary Brown static final int nmarks = 6; static final int [ ] weights = { 5, 10, 5, 15, 15, 50 ; String name; int [ ] marks = new int[nmarks]; void setmarks(bufferedreader in) throws IOException { for (int i = 0; i < nmarks; i++) marks[i] = Text.readInt(in); // slutt setmarks void setname(bufferedreader in) throws IOException { name = Text.readString(in) + +Text.readString(in); // slutt setname int calculatefinal () { int finalmark = 0; for (int i = 0; i < nmarks; i++) finalmark += marks[i] * weights[i]; finalmark = finalmark/100; return(finalmark); // slutt calculatefinal // slutt class Student Stein Gjessing, Universitetet i Oslo 63

class Student nmarks 6 weights 5 10 5 15 15 50 et objekt av klassen Student name marks Mary Brown setmarks setname calclulatefinal Stein Gjessing, Universitetet i Oslo 64

import java.io.*; import java.util.*; import javagently.*; class MarkerA { public static void main(string[] args) throws IOException { BufferedReader fin = Text.open("marks.dat"); BufferedReader in = Text.open(System.in); Student [ ] table = new Student [20]; Student student; for (int i = 0; i < 10; i++) { student = new Student(); student.setname(fin); student.setmarks(fin); table[i] = student; System.out.println("In the table"); for (int i = 0; table[i]!= null; i++) { student = table[i]; System.out.println(student.name); while (true) { try { System.out.print("Whose mark would + you like to know? "); String s = Text.readString(in)+ + Text.readString(in); int ind = 0; boolean funnet = false; while (! funnet & table[ind]!= null) if ( s.equals( table[ind].name )) { System.out.println(table[ind]. calculatefinal()); funnet = true; else ind ++; if (!funnet) System.out.println("Sorry, try again"); catch (EOFException exp) { break; // slutt while (true) // slutt main // slutt MarkerA Stein Gjessing, Universitetet i Oslo 65

Mengder av objekter Vi har sett at en tabell (array) med pekere, for eksempel til student-objekter, kan brukes til å lagre (og finne igjen) slike objekter. Men vi ønsker oss noe bedre. Vi ønsker oss en mengde : sett inn et objekt ta ut et objekt Datastruktur som tar vare på alle lagrede objekter: finn et objekt rams opp alle objektene Vi trenger en måte å identifisere objekter på. Til hvert objekt som skal lagres lager vi en nøkkel, en tekst, som er unik for dette objektet. Stein Gjessing, Universitetet i Oslo 66

Mer om å lagre og gjenfinne objekter I Javas ferdiglagde bibliotek er det en klasse som tar seg av alt dette for oss. Denne klassen heter Hashtable. Når vi lagrer et objekt må vi samtidig oppgi en nøkkel (engelsk: key), som vanligvis er en tekst (String). Hvorfor navnet Hash-tabell? Svar: Når et objekt skal lagres regnes det ut et heltall ut fra nøkkel-teksten, og Hashtable lagrer objektet ( og nøkkelen) basert på dette heltallet. Den funksjonen som regner ut et tall fra en tekst kaller vi en hash-funksjon. (Kanskje er heltallet en indeks i en tabell (array), men dette er implementasjonsdetaljer som vi ikke behøver bry oss om (en av fordelene ved objektorientering)). Hvis vi ønsker å få listet opp alle objektene som vi har lagret, kan vi ikke bruke bare Hashtable. Da må vi i tillegg bruke Enumeration. Dette er ikke en klasse men en Interface. Foreløpig er ikke denne forskjellen viktig, men legg merke til at vi IKKE bare kan si QHZ <Interface-navn>. Stein Gjessing, Universitetet i Oslo 67

Prinsippet bak en hash -tabell /DJUHRJV NHNULWHULXPQ NNHO (tekst) 'HWVRPODJUHV(student-objekter) Mary Brown Mary Brown Carol Steele Carol Steele Stein Gjessing, Universitetet i Oslo 68

Metodene i en hash-tabell hashtabell Hashtable hashtabell = new Hashtable( ); void put (Object nøkkel, Object obj) Object get (Object nøkkel) void remove (Object nøkkel) boolean containskey (Object nøkkel) boolean contains (Object obj) Men husk at datastrukturen er hemmelig Stein Gjessing, Universitetet i Oslo 69

Prinsippet bak en enumeration (oppramsing) For å få fatt i alle objektene i en hashtabell i rekkefølge, lager vi en egen oppramsing av alle nøklene i hashtabellen. Så bruker vi metoden nextelement mange ganger for å få fatt i alle nøklene i rekkefølge. Vi lager en ny oppramsingsobjekt med: Enumeration opprams = hashtabell.keys ( ); (OHPHQWHQH (har f.eks. vært nøkler i en hash-tabell) Vi bruker et oppramsingsobjekt ca. slik: while (opprams.hasmoreelements( ) ) { s = opprams.nextelement( ); obj = hashtabell.get(s); opprams Mary Brown Object nextelement ( ) Carol Steele boolean hasmoreelements ( ) Stein Gjessing, Universitetet i Oslo 70

Om class Object Datastrukturen i Hashtable vet ikke hva slags objekter som skal lagres, så alle pekere er deklarert som pekere til objekter av klassen Object, f.eks: Object peker; class Object er en klasse som alle andre klasser arver egenskapene til. Hvis vi deklarerer en peker til et object av class Object, kan denne pekeren peke på alle slags objekter: Object enpeker; enpeker = new Student(); class Object navn: enpeker class Student type: peker til Object Mary Brown Stein Gjessing, Universitetet i Oslo 71

Mer om class Object og klasse-konvertering Vi må konvertere (engelsk: casting) fra Object til Student for å få lov til å snakke om egenskapene til studentobjektet; class Object Object enpeker; Student studpeker: enpeker = new Student(); studpeker = (Student) enpeker; studpeker.name = Mary Brown ; navn: enpeker navn: studpeker type: peker til Object type: peker til Student class Student Mary Brown Stein Gjessing, Universitetet i Oslo 72

import ; class Marker { class Marker (modifisert fra side 188) (glem programmet på side 188) public static void main(string[] args) throws IOException { BufferedReader fin = Text.open("marks.dat"); BufferedReader in = Text.open(System.in); Hashtable table = new Hashtable( ); Student stud; String name; for (int i = 0; i < 10; i++) { stud = new Student(); stud.setname(fin); stud.setmarks(fin); table.put(stud.name, stud); // slutt for med innlesing av alle fra fil System.out.println("In the table"); Enumeration e = table.keys (); while ( e.hasmoreelements() ) { name = (String) e.nextelement(); stud = (Student) table.get(name); System.out.println(stud.name); // slutt for med utskrift av alle while (true) { try { System.out.print("Whose mark would + you like to know? "); String s = Text.readString(in)+" +Text.readString(in); if (table.containskey(s)) { stud = (Student) table.get(s); System.out.println(stud.calculateFinal()); else { System.out.println("Sorry, try again."); catch (EOFException exp) { break; // slutt while (true) med spørsmål om navn // slutt main // slutt class Marker Stein Gjessing, Universitetet i Oslo 73

Oppgave - 20 minutter Lag det fullstendige bilregister-programmet Stein Gjessing, Universitetet i Oslo 74

class Bil { String regnummer, merke; double vekt; boolean lesfrafil (BufferedReader in) throws IOException{ try { regnummer = Text.readString(in); merke = Text.readString (in); vekt = Text.readDouble(in); return true; catch (EOFException e) {return (false); // slutt lesfrafil void lesfratastatur(bufferedreader in) throws IOException { Text.prompt(" Registreringsnummer :"); regnummer = Text.readString(in); Text.prompt(" Bilmerke :"); merke = Text.readString (in); Text.prompt(" Vekt :"); vekt = Text.readDouble(in); // slutt lesfratastatur void skrivtilfil(printwriter out) throws IOException { out.println(regnummer); out.println(merke); out.println(vekt); void skrivskjerm() { System.out.print(" Registreringsnummer: + regnummer ); System.out.print(" Bilmerke: " + merke); System.out.println(" Bilens vekt: " + vekt); // slutt class Bil Stein Gjessing, Universitetet i Oslo 75

class BilData { Hashtable bilsamling = new Hashtable(); public void lesfrafil (BufferedReader fin) throws IOException { boolean flerebiler = true; while (flerebiler) { Bil nybil = new Bil(); flerebiler = nybil.lesfrafil(fin); if (flerebiler) bilsamling.put (nybil.regnummer, nybil); // slutt while // slutt lesfrafil public void skrivtilfil (PrintWriter out) throws IOException { Bil nestebil; Enumeration e = bilsamling.keys(); while (e.hasmoreelements()) { String name = (String)e.nextElement(); nestebil= (Bil) bilsamling.get(name); nestebil.skrivtilfil(out); // slutt skrivtilfil public void lagnybil (BufferedReader in) throws IOException { Bil nybil = new Bil(); nybil.lesfratastatur(in); bilsamling.put (nybil.regnummer, nybil); // slutt lagnybil public void listbiler(){ Bil nestebil; System.out.println(); System.out.println("Alle bilene i registeret:"); Enumeration e = bilsamling.keys(); while (e.hasmoreelements()) { String name = (String)e.nextElement(); nestebil= (Bil) bilsamling.get(name); nestebil.skrivskjerm(); System.out.println(); // slutt Bilreg Stein Gjessing, Universitetet i Oslo 76

class Bilreg { BilData bildatastruktur; public static void main(string[] args) throws IOException { new Bilreg(); // slutt main Bilreg ( ) throws IOException { bildatastruktur = new BilData(); BufferedReader in = Text.open(System.in); System.out.println("Bilregistrering"); Text.prompt ("Skal du lese biler fra fil: J eller N: "); char c = lesjaellernei(in); if (c == J ) lesfrafil( ); System.out.println("Data er lest fra fil"); System.out.println( ); System.out.println ("Registrering av nye biler kan foretas"); beomordre(in); skrivtilfil(in); System.out.println ("Registreringsprogram avsluttes"); System.out.println(); // slutt Bilreg konstruktør public void beomordre (BufferedReader in) throws IOException { boolean slutt = false; while (!slutt) { System.out.println ("Ett av tre alternativer: "); System.out.println (" B: Vil du registrere flere biler?"); System.out.println (" L: Vil du liste alle registrert biler?"); System.out.println (" S: Vil du savslutte programmet? "); Text.prompt ("Oppgi valg (B, L eller S):"); char s = lesbls(in); if (s == S ) slutt = true; else if (s == B ) bildatastruktur.lagnybil(in); else bildatastruktur.listbiler(); // slutt while // slutt beomnyeordre Stein Gjessing, Universitetet i Oslo 77

public void lesfrafil () throws IOException { public void skrivtilfil (BufferedReader in) throws IOException { System.out.print ("På hvilken fil er bilene: "); BufferedReader fin; try { fin = FileMan.open(); catch (FileNotFoundException e) { System.out.println ("Fant ingen bil-fil"); throw new IOException(); bildatastruktur.lesfrafil(fin); fin.close ( ); // slutt lesfrafil System.out.println(); Text.prompt ("På hvilken fil skal vi skrive bilene: "); String s = Text.readString(in); PrintWriter out = Text.create (s); bildatastruktur.skrivtilfil(out); out.close ( ); System.out.println(); System.out.println("Data er skrevet til fil"); System.out.println(); // slutt skrivtilfil Stein Gjessing, Universitetet i Oslo 78

private static char lesbls(bufferedreader in) throws IOException{ char c = Text.readChar(in) ; while (!(c == b c == l c == s c == B c == L c == S )) { Text.prompt("Svar bare B, L eller S: "); c = Text.readChar(in) ; if (c == b c == B ) return B ; else if (c == l c == L ) return L ; else return S ; private static char lesjaellernei(bufferedreader in) throws IOException{ char c = Text.readChar(in) ; while (!(c == n c == N c == j c == J )) { Text.prompt("Svar bare J eller N: "); c = Text.readChar(in) ; if (c == j c == J ) return J ; else return N ; // slutt lesjaellernei Stein Gjessing, Universitetet i Oslo 79

Kap 7: Tekster (class String), tekstbehandling og litt annet Vi kaller det tekster, strenger og tekststrenger om hverandre String navn; navn = Stein Gjessing Den fulle og hele sannhet er noe omtrent slik: navn String Men vanligvis tegner og tenker vi ikke mer komplisert enn slik: navn Objekt av klassen String Stein Gjessing Objekt av klassen String 11 konstruktører 47 metoder pluss plass til å lagre en streng Stein Gjessing Stein Gjessing, Universitetet i Oslo 80

Tekst-streng-konstanter. Det viktigste tekstobjektet (String-objektet) er det som skrives mellom doble gåseøyne, for eksempel slik: Dette er en streng Når vi deklarerer: String navn får vi en peker som ikke peker på noe: navn null Så kan vi sette den til å peke på et konstant-tekst-objekt, slik: navn= Dette er en tekststreng navn Dette er en tekststreng Men husk: Alle streng-objekter er konstante, dvs. de kan ikke forandres. Stein Gjessing, Universitetet i Oslo 81

Konstruktører i klassen String Vi kan lage en streng: - fra en annen streng, - fra en array med tegn - fra en StringBuffer (og etter at de er laget, kan de altså ikke forandres) class String String ( ); String ( String strengpeker); String (char[] tegntabellpeker); String (char[] tegntabellpeker, int forskyvning, int antall); String ( StringBuffer bufferpeker); Stein Gjessing, Universitetet i Oslo 82

Objekt-metoder i klassen String Objekt-metodene i klassen String observerer teksten som er lagret. Det er ikke lov å forandre teksten (Da må du bruke TekstBuffer) objekt av class String Skjult datastruktur som lagrer teksten: Dette er en tekststreng char charat (int indeks); Tegnet på plass indeks i teksten int compareto (String s); Sammenligner s med teksten, returnerer -1, 0 eller 1 boolean equals (String s); Returnerer true bare hvis de to strengende er like int indexof (String s, int fra); Leter etter strengen s fom. plassen fra, og returnerer med den funnede indeks (eller -1); int length ( ); Gir lengden av teksten String substring (int start, int slutt); Gir subteksten fom. start til (ikke med) slutt String trim (); Gir en tekst der blanke i begge ender er fjernet char[ ] tochararray (); Lager en tegn-tabell av teksten Stein Gjessing, Universitetet i Oslo 83