Java 6 Mer om metoder Tekster Ole Christian

  • Slides: 40
Download presentation
Java 6 Mer om metoder Tekster Ole Christian Lingjærde Gruppen for bioinformatikk Institutt for

Java 6 Mer om metoder Tekster Ole Christian Lingjærde Gruppen for bioinformatikk Institutt for informatikk Universitetet i Oslo 1

Repetisjon: metoder § Java-programmene så langt i kurset består av en enkelt klasse, og

Repetisjon: metoder § Java-programmene så langt i kurset består av en enkelt klasse, og i klassen kan det befinne seg en eller flere metoder (en av disse må hete main). § De metodene vi ser på så langt i kurset har følgende form: forteller at dette er en "klasse-metode" beskrivelse av hva slags output metoden gir, f. eks. void, int, double, char, . . . static returverditype metodenavn (parametre) { instruksjon 1; et navn som vi velger instruksjon 2; . . beskrivelse av hva slags input instruksjon n; metoden skal ha - gis i form av variabel-deklarasjoner separert } av komma Ole Chr. Lingjærde © Institutt for informatikk 23. september 2003 2

Levetiden til parametre og variable § Vi kan ha tre typer variable i en

Levetiden til parametre og variable § Vi kan ha tre typer variable i en metode: § Klassevariable (og objektvariable): dette er variable som er deklarert på klassenivå, utenfor metoden. § Lokale variable: dette er variable som deklareres inni metoden. Disse er definert fra og med der deklarasjonen gjøres og til slutten av blokken de er deklarert i. § Parametre: dette er variable som deklareres i hodet på metoden. Disse er definert i hele metodekroppen. § Viktig: ved gjentatte kall på en metode er det et nytt sett med lokale variable og parametre som lages hver gang. Ole Chr. Lingjærde © Institutt for informatikk 23. september 2003 3

Eksempel class Variabeltyper { static int tid = 0; // Klassevariabel public static void

Eksempel class Variabeltyper { static int tid = 0; // Klassevariabel public static void main (String[] args) { intervall = 3; // Lokal variabel øk. Tid(intervall); } static void øk. Tid (int t) { tid += t; System. out. println(tid); } // Parameter } Ole Chr. Lingjærde © Institutt for informatikk 23. september 2003 4

Parametre og argumenter class Eksempel { public static void main (String[] args) { min.

Parametre og argumenter class Eksempel { public static void main (String[] args) { min. Metode(3. 14, 365); } Argumenter } static void min. Metode (double x, int y) {. . . } Parametre Merk: et annet navn for argumenter er aktuelle parametre, og et annet navn for parametre er formelle parametre. Ole Chr. Lingjærde © Institutt for informatikk 23. september 2003 5

Metode uten parametre/returverdi § Følgende metode skriver ut en ordremeny på skjermen: static void

Metode uten parametre/returverdi § Følgende metode skriver ut en ordremeny på skjermen: static void skriv. Meny () { System. out. println(”Lovlige kommandoer: ”); System. out. println(”----------”); System. out. println(” 1 Registrer ny student”); System. out. println(” 2 Søk etter student”); System. out. println(” 3 Lag liste”); System. out. println(” 4 Avslutt”); System. out. println(”----------”); } § Merk: vi kan hvor som helst i metoden gi instruksjonen return; som avslutter utførelsen av metoden og returnerer eksekveringen til kallstedet. Ole Chr. Lingjærde © Institutt for informatikk 23. september 2003 6

Metode med returverdi § Følgende metode leser et positivt tall fra terminal og returner

Metode med returverdi § Følgende metode leser et positivt tall fra terminal og returner det til kallstedet: static double les. Positivt. Tall () { In tastatur = new In(); double x; do { System. out. print("Gi et positivt tall: "); x = tastatur. in. Double(); } while (x <= 0); } § return x; Merk: vi kan hvor som helst i metoden gi instruksjonen return <uttrykk>; som avslutter utførelsen av metoden og returnerer til kallstedet med verdien til det angitte uttrykket (verdien må være av typen double i dette tilfellet). Ole Chr. Lingjærde © Institutt for informatikk 23. september 2003 7

Fullstendig eksempel import easy. IO. *; class Les. Positivt. Tall { public static void

Fullstendig eksempel import easy. IO. *; class Les. Positivt. Tall { public static void main (String[] args) { Out skjerm = new Out(); double x = les. Positivt. Tall(); double y = les. Positivt. Tall(); skjerm. out("ln(x*y) = "); skjerm. outln(Math. log(x*y), 2); } static double les. Positivt. Tall () { In tastatur = new In(); double x; do { System. out. print("Gi et positivt tall: "); x = tastatur. in. Double(); } while (x <= 0); } return x; } Ole Chr. Lingjærde © Institutt for informatikk > java Positivt. Tall Gi et positivt tall: 3. 3 Gi et positivt tall: 5. 5 ln(x*y) = 2. 90 23. september 2003 8

Metode med parameter og returverdi § Følgende metode finner summen av elementene i en

Metode med parameter og returverdi § Følgende metode finner summen av elementene i en double-array: static double finn. Sum (double[] x) { double sum = 0. 0; for (int i=0; i<x. length; i++) { sum += x[i]; } return sum; } Ole Chr. Lingjærde © Institutt for informatikk 23. september 2003 9

Eksempel på bruk import easy. IO. *; class Lengde { public static void main

Eksempel på bruk import easy. IO. *; class Lengde { public static void main (String[] args) { Out skjerm = new Out(); double[] lengde = {2. 3, 5. 22, 3. 6, 2. 33, 8. 6}; double total = finn. Sum(lengde); skjerm. out("Samlet lengde: "); skjerm. outln(total, 2); } static double finn. Sum (double[] x) { double sum = 0. 0; for (int i=0; i<x. length; i++) { sum += x[i]; } return sum; } > java Lengde } Samlet lengde: 22. 05 Ole Chr. Lingjærde © Institutt for informatikk 23. september 2003 10

Metodekall Anta at følgende eksekveres: double total = finn. Sum(lengde); Eksekveringsrekkefølgen: double total =

Metodekall Anta at følgende eksekveres: double total = finn. Sum(lengde); Eksekveringsrekkefølgen: double total = finn. Sum(lengde); Metoden som kalles: static double finn. Sum(double[] x) { double sum = 0. 0; for (int i=0; i<x. length; i++) { sum += x[i]; } return sum; } argum e overfø ntet lengde res double[] x = lengde; double sum = 0. 0; for (int i=0; i<x. length; i++) { sum += x[i]; ngde) e l ( m u S t finn } uttrykke 5 0. 2 2 en return sum; gis verdi total = 22. 05; Ole Chr. Lingjærde © Institutt for informatikk 23. september 2003 11

Bruk av referanser som parametre § I forrige eksempel var parameteren til finn. Sum

Bruk av referanser som parametre § I forrige eksempel var parameteren til finn. Sum en arrayreferanse. § Det lages ikke noen kopi av arrayobjektet når metoden kalles, så endringer som gjøres på arrayen inni metoden blir synlige utenfor metoden. Hva skriver programmet under ut? class Array. Parameter { public static void main (String[] args) { int[] a = {1, 2, 3, 4}; finn. Delsummer(a); System. out. println("a[3] = " + a[3]); } static void finn. Delsummer(int[] x) { for (int i=1; i<x. length; i++) { x[i] += x[i-1]; } } } Ole Chr. Lingjærde © Institutt for informatikk 23. september 2003 12

Overlasting av metoder § Flere metoder kan deklareres med samme metodenavn, forutsatt at Java

Overlasting av metoder § Flere metoder kan deklareres med samme metodenavn, forutsatt at Java klarer å avgjøre hvilken metode som skal kalles. Krav: § metodene har ulikt antall parametre eller § metodene har ulik type på noen av parametrene, og slik at Java alltid klarer å finne en entydig match § Metoden (eller metodenavnet) sies da å være overlastet, og de ulike metodene med samme navn kan ha ulik returtype. § Eksempel: static int sum (int x, int x) { return x + y; } static double sum (double x, double y) { return x + y; } Ole Chr. Lingjærde © Institutt for informatikk 23. september 2003 13

Eksempler § Overlasting: static int skriv. Ut(double x, int y) {. . . }

Eksempler § Overlasting: static int skriv. Ut(double x, int y) {. . . } static int skriv. Ut(double x, double y) {. . . } Her kan vi f. eks. ha kallet skriv. Ut(2, 7) - da velges første metode § Overlasting: static int skriv. Ut(double x, int y) {. . . } static int skriv. Ut(int x, double y) {. . . } Her får vi kompilatorfeil hvis vi forsøker kallet skriv. Ut(2, 7) ! Ole Chr. Lingjærde © Institutt for informatikk 23. september 2003 14

Oppgave 1: hva blir utskriften? class Oppgave 1 { public static void main (String[]

Oppgave 1: hva blir utskriften? class Oppgave 1 { public static void main (String[] args) { System. out. println("Metode: main"); b(); } static void a() { System. out. println("Metode: a"); } static void b() { a(); System. out. println("Metode: b"); } > javac Oppgave 1. java > java Oppgave 1 } Test programmet Ole Chr. Lingjærde © Institutt for informatikk 23. september 2003 15

Oppgave 2: hva blir utskriften? class Oppgave 2 { public static void main (String[]

Oppgave 2: hva blir utskriften? class Oppgave 2 { public static void main (String[] args) { int x = 1; while (g(x) > 0) { System. out. println(x++); } } > javac Oppgave 2. java > java Oppgave 2 static int g (int x) { return 5 -x; } } Test programmet Ole Chr. Lingjærde © Institutt for informatikk 23. september 2003 16

Parameteren i metoden main § Vi kaller aldri direkte på metoden main (selv om

Parameteren i metoden main § Vi kaller aldri direkte på metoden main (selv om det er lov) - det er Javakjøresystemet som gjør dette når programmet starter. § De argumenter vi gir etter java Program. Navn blir overført til parameteren String[] args når main-metoden kalles. § Eksempel: class Skriv. Argumenter { public static void main (String[] args) { if (args. length == 0) { System. out. println("Ingen argumenter"); } for (int i=0; i<args. length; i++) { System. out. print("Argument nr " + (i+1) + " var: "); System. out. println(args[i]); } } } Ole Chr. Lingjærde © Institutt for informatikk 23. september 2003 Test programmet 17

Tekster og klassen String § En tekststreng er en sekvens av tegn (null, en

Tekster og klassen String § En tekststreng er en sekvens av tegn (null, en eller flere), f. eks. ”” ”*” ”Kristina” § Hver tekststreng vi lager er et objekt av typen String § En String-variabel (f. eks. String s) er en referanse til et slikt objekt § Resultatet av å utføre String s = ”kake” : ”kake” s § For å finne lengden (dvs antall tegn i) en tekst: int lengde = s. length(); Ole Chr. Lingjærde © Institutt for informatikk 23. september 2003 18

Bruk av spesialtegn § Både i char-uttrykk og String-uttrykk kan vi ha mange ulike

Bruk av spesialtegn § Både i char-uttrykk og String-uttrykk kan vi ha mange ulike typer tegn § Alle Unicode-tegn er tillatt § Unicode er en standard som tillater tusenvis av tegn (ulike varianter fins; den som støttes av Java tillater 65536 ulike tegn) § Alle tegnene kan angis som ’uxxxx’ hvor hver x er en av 0, 1, 2, . . . , 9, A, B, C, D, E, F Eksempel: ’u 0041’ er tegnet ’A’ § Noen spesialtegn har egen forkortelse: § § § t n ” ’ \ tabulator linjeskift dobbelt anførselstegn enkelt anførselstegn bakslask Ole Chr. Lingjærde © Institutt for informatikk 23. september 2003 19

Konkatenering § Operatoren + har flere betydninger i Java: § mellom to tall: addisjon

Konkatenering § Operatoren + har flere betydninger i Java: § mellom to tall: addisjon § mellom to tekster : tekstkonkatenering § mellom tekst og annen type : tekstkonkatenering § Eksempel på overlasting av metode § Husk at uttrykk i Java beregnes fra venstre mot høyre: class Konkatenering { public static void main (String[] args) { System. out. println(”Sum: ” + 2 + 3); System. out. println(1 + 2 + 3 + ” ” + 1 + 2 + 3); } >java Konkatenering } Sum: 23 6 123 Ole Chr. Lingjærde © Institutt for informatikk 23. september 2003 20

Teste om to tekster er like § For å teste om to tekststrenger er

Teste om to tekster er like § For å teste om to tekststrenger er like, brukes equals: // Anta at s og t er tekstvariable (og at s ikke har verdien null) if (s. equals(t)) { System. out. println("Tekstene er like"); } else { System. out. println("Teksten er forskjellige"); } § Bruk av == virker av og til, men ikke alltid: String s = "abc"; String t = "def"; System. out. println((s+t) == (s+t)); // Setningen over skriver ut false Ole Chr. Lingjærde © Institutt for informatikk 23. september 2003 21

De enkelte tegnene i en tekststreng § Tegnene i en tekststreng har posisjoner indeksert

De enkelte tegnene i en tekststreng § Tegnene i en tekststreng har posisjoner indeksert fra 0 og oppover 0 1 2 ’k’ ’a’ ’k’ 3 ’e’ § Vi kan få tak i tegnet i en bestemt posisjon: String s = ”kake”; char c = s. char. At(1); // Nå er c == ’a’ § Vi kan erstatte alle forekomster av et tegn med et annet tegn: String s 1 = ”kake”; String s 2 = s 1. replace(’k’, ’r’); // Nå er s 2 en referanse til tekststrengen ”rare” Ole Chr. Lingjærde © Institutt for informatikk 23. september 2003 22

Deler av en tekststreng § Vi kan trekke ut en del av en tekststreng:

Deler av en tekststreng § Vi kan trekke ut en del av en tekststreng: String s = ”Paris”; String s 1 = s. substring(1, 4); // Nå er s 1 tekststrengen ”ari” § Generelt: 0 1 ’P’ ’a’ 2 3 4 ’r’ ’i’ ’s’ s. substring(1, 4) s. substring(index 1, index 2) Første posisjon som skal være med Første posisjon som ikke skal være med § Siste del av en tekststreng: String s = ”Paris er hovedstaden i Frankrike”; String s 1 = s. substring(6); // Nå er s 1 tekststrengen ”er hovedstaden i Frankrike” Ole Chr. Lingjærde © Institutt for informatikk 23. september 2003 23

Konvertere mellom små og store bokstaver § Vi kan konvertere fra små til store

Konvertere mellom små og store bokstaver § Vi kan konvertere fra små til store bokstaver: String s = ”Jeg ER 18 år”; String s 2 = s. to. Upper. Case(); // Nå er s 2 tekststrengen ”JEG ER 18 ÅR” § Vi kan konvertere fra store til små bokstaver: String s = ”Jeg ER 18 år”; String s 2 = s. to. Lower. Case(); // Nå er s 2 tekststrengen ”jeg er 18 år” § Det finnes tilsvarende metoder for å konvertere char-verdier: char c = ’x’; char c 2 = Character. to. Upper. Case(c); char c 3 = Character. to. Lower. Case(c); NB: merk skrivemåten! Ole Chr. Lingjærde © Institutt for informatikk 23. september 2003 24

Eksempel 1 § Metode som lager stor forbokstav i en tekststreng: static String stor.

Eksempel 1 § Metode som lager stor forbokstav i en tekststreng: static String stor. Forbokstav (String s) { String t; if (s. length() > 0) { char c = Character. to. Upper. Case(s. char. At(0)); t = c + s. substring(1); } else { t = ””; } return t; } Ole Chr. Lingjærde © Institutt for informatikk 23. september 2003 25

Eksempel 2 § Lag et program som leser en linje med tekst fra terminal

Eksempel 2 § Lag et program som leser en linje med tekst fra terminal og som skriver ut setningen baklengs (dvs med tegnene i omvendt rekkefølge) på skjermen: Ole Chr. Lingjærde © Institutt for informatikk 23. september 2003 26

Eksempel 2 forts. Ole Chr. Lingjærde © Institutt for informatikk 23. september 2003 27

Eksempel 2 forts. Ole Chr. Lingjærde © Institutt for informatikk 23. september 2003 27

Eksempel: et oversetterprogram § Lag et program som § først lager en ordliste ved

Eksempel: et oversetterprogram § Lag et program som § først lager en ordliste ved å lese inn norske ord og oversettelsen til engelsk § deretter leser en setning på norsk § deretter ”oversetter” setningen til engelsk ved å bytte ut norske ord med sin oversettelse når det finnes i ordlisten (ellers beholdes det norske ordet). § gjentar de to siste trinnene over § Eksempel på bruk: > java Oversetter Legg inn i ordliste: kanin rabbit Legg inn i ordliste: er is Legg inn i ordliste: en a Legg inn i ordliste: det it Legg inn i ordliste: AVSLUTT Ord som skal oversettes: det er en kanin Oversettelse: it is a rabbit Ole Chr. Lingjærde © Institutt for informatikk 23. september 2003 28

Eksempel forts. Ole Chr. Lingjærde © Institutt for informatikk 23. september 2003 29

Eksempel forts. Ole Chr. Lingjærde © Institutt for informatikk 23. september 2003 29

Eksempel forts. Ole Chr. Lingjærde © Institutt for informatikk 23. september 2003 30

Eksempel forts. Ole Chr. Lingjærde © Institutt for informatikk 23. september 2003 30

Eksempel forts. Ole Chr. Lingjærde © Institutt for informatikk 23. september 2003 31

Eksempel forts. Ole Chr. Lingjærde © Institutt for informatikk 23. september 2003 31

Eksempel forts. Ole Chr. Lingjærde © Institutt for informatikk 23. september 2003 32

Eksempel forts. Ole Chr. Lingjærde © Institutt for informatikk 23. september 2003 32

Alfabetisk ordning § Anta at s og t er tekstvariable (og at s ikke

Alfabetisk ordning § Anta at s og t er tekstvariable (og at s ikke har verdien null) § Er s foran t i alfabetet? int k = s. compare. To(t); if (k < 0) { System. out. println("s er alfabetisk foran t"); } else if (k == 0) { System. out. println("s og t er like"); } else { System. out. println("s er alfabetisk bak t"); } Ole Chr. Lingjærde © Institutt for informatikk 23. september 2003 33

Inneholder en tekst en annen? § Anta at s og t er tekstvariable (og

Inneholder en tekst en annen? § Anta at s og t er tekstvariable (og at s ikke har verdien null) § Inneholder s teksten t? int k = s. index. Of(t); if (k < 0) { System. out. println("s inneholder ikke t"); } else { System. out. println("s inneholder t"); System. out. println("Posisjon i s: " + k); } Ole Chr. Lingjærde © Institutt for informatikk 23. september 2003 34

Starter en tekst med en annen? § Anta at s og t er tekstvariable

Starter en tekst med en annen? § Anta at s og t er tekstvariable (og at s ikke har verdien null) § Starter s med teksten t? boolean b = s. starts. With(t); if (b) { System. out. println("s starter med t"); } else { System. out. println("s starter ikke med t"); } Ole Chr. Lingjærde © Institutt for informatikk 23. september 2003 35

Slutter en tekst med en annen? § Anta at s og t er tekstvariable

Slutter en tekst med en annen? § Anta at s og t er tekstvariable (og at s ikke har verdien null) § Slutter s med teksten t? boolean b = s. ends. With(t); if (b) { System. out. println("s ender med t"); } else { System. out. println("s ender ikke med t"); } Ole Chr. Lingjærde © Institutt for informatikk 23. september 2003 36

Fra tall til tekst og omvendt § For å konvertere fra tall til tekst:

Fra tall til tekst og omvendt § For å konvertere fra tall til tekst: String s 1 = String. value. Of(3. 14); String s 2 = String. value. Of('a'); String s 3 = String. value. Of(false); String s 4 = "" + 3. 14 String s 5 = "" + 'a'; String s 6 = "" + false; § For å konvertere fra tekst til tall: int k = Integer. parse. Int(s); double x = Double. parse. Double(s); (og tilsvarende for de andre numeriske datatypene) Ole Chr. Lingjærde © Institutt for informatikk 23. september 2003 37

Å finne de enkelte ordene i en tekst § Av og til ønsker vi

Å finne de enkelte ordene i en tekst § Av og til ønsker vi å kunne bryte opp en tekst i de enkelte ordene (”tokens”), der ordene er separert av spesielle skilletegn. § String. Tokenizer er et verktøy som kan brukes til dette. § Standard skilletegn er mellomrom, tabulator, carriage return og linjeskift (såkalte blanke tegn). § Vi kan velge andre skilletegn om vi ønsker. jeg har 20 kroner tokens Ole Chr. Lingjærde © Institutt for informatikk 23. september 2003 38

Eksempel Her importeres pakken hvor String. Tokenizer ligger import java. util. *; import easy.

Eksempel Her importeres pakken hvor String. Tokenizer ligger import java. util. *; import easy. IO. *; class Tokenizer. Demo { Her deler vi opp linja i de public static void main(String [] args){ enkelte ordene In tast = new In(); System. out. print(”Skriv en setning: ”); String linje = tast. in. Line(); String. Tokenizer st = new String. Tokenizer(linje); } } while (st. has. More. Tokens()) { System. out. println(st. next. Token()); } Her plukker vi ut ett og ett ord fra oppdelingen Her sjekker vi om det er flere ord igjen å plukke ut Ole Chr. Lingjærde © Institutt for informatikk Test programmet 23. september 2003 39

Eksempel 2 : andre skilletegn import java. util. *; import easy. IO. *; class

Eksempel 2 : andre skilletegn import java. util. *; import easy. IO. *; class Tokenizer. Demo 2 { public static void main(String [] args){ In tast = new In(); System. out. print(”Skriv en setning: ”); String linje = tast. in. Line(); String. Tokenizer st = new String. Tokenizer(linje); } } while (st. has. More. Tokens()) { System. out. println(st. next. Token(”, . : ; ”)); } Vi angir fire mulige skilletegn Ole Chr. Lingjærde © Institutt for informatikk 23. september 2003 Test programmet 40