Presentasjon lastes. Vennligst vent

Presentasjon lastes. Vennligst vent

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

Liknende presentasjoner


Presentasjon om: "1 Java 6 Mer om metoder Tekster Ole Christian Lingjærde Gruppen for bioinformatikk Institutt for informatikk Universitetet i Oslo."— Utskrift av presentasjonen:

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

2 Ole Chr. Lingjærde © Institutt for informatikk23. september 2003 2 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: static returverditype metodenavn (parametre) { instruksjon 1; instruksjon 2;.... instruksjon n; } beskrivelse av hva slags output metoden gir, f.eks. void, int, double, char,... et navn som vi velger beskrivelse av hva slags input metoden skal ha - gis i form av variabel-deklarasjoner separert av komma forteller at dette er en "klasse-metode"

3 Ole Chr. Lingjærde © Institutt for informatikk23. september 2003 3 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.

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

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

6 Ole Chr. Lingjærde © Institutt for informatikk23. september 2003 6 Metode uten parametre/returverdi  Følgende metode skriver ut en ordremeny på skjermen: static void skrivMeny () { 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.

7 Ole Chr. Lingjærde © Institutt for informatikk23. september 2003 7 Metode med returverdi static double lesPositivtTall () { In tastatur = new In(); double x; do { System.out.print("Gi et positivt tall: "); x = tastatur.inDouble(); } while (x <= 0); return x; }  Merk: vi kan hvor som helst i metoden gi instruksjonen return ; 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).  Følgende metode leser et positivt tall fra terminal og returner det til kallstedet:

8 Ole Chr. Lingjærde © Institutt for informatikk23. september 2003 8 Fullstendig eksempel import easyIO.*; class LesPositivtTall { public static void main (String[] args) { Out skjerm = new Out(); double x = lesPositivtTall(); double y = lesPositivtTall(); skjerm.out("ln(x*y) = "); skjerm.outln(Math.log(x*y), 2); } static double lesPositivtTall () { In tastatur = new In(); double x; do { System.out.print("Gi et positivt tall: "); x = tastatur.inDouble(); } while (x <= 0); return x; } > java PositivtTall Gi et positivt tall: 3.3 Gi et positivt tall: 5.5 ln(x*y) = 2.90

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

10 Ole Chr. Lingjærde © Institutt for informatikk23. september 2003 10 Eksempel på bruk import easyIO.*; 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 = finnSum(lengde); skjerm.out("Samlet lengde: "); skjerm.outln(total, 2); } static double finnSum (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

11 Ole Chr. Lingjærde © Institutt for informatikk23. september 2003 11 Metodekall static double finnSum(double[] x) { double sum = 0.0; for (int i=0; i<x.length; i++) { sum += x[i]; } return sum; } Anta at følgende eksekveres: double total = finnSum(lengde); Metoden som kalles: double total = finnSum(lengde); total = 22.05; double[] x = lengde; double sum = 0.0; for (int i=0; i<x.length; i++) { sum += x[i]; } return sum; uttrykket finnSum(lengde) gis verdien 22.05 Eksekveringsrekkefølgen: argumentet lengde overføres

12 Ole Chr. Lingjærde © Institutt for informatikk23. september 2003 12 Bruk av referanser som parametre  I forrige eksempel var parameteren til finnSum 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 ArrayParameter { public static void main (String[] args) { int[] a = {1, 2, 3, 4}; finnDelsummer(a); System.out.println("a[3] = " + a[3]); } static void finnDelsummer(int[] x) { for (int i=1; i<x.length; i++) { x[i] += x[i-1]; }

13 Ole Chr. Lingjærde © Institutt for informatikk23. september 2003 13 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; }

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

15 Ole Chr. Lingjærde © Institutt for informatikk23. september 2003 15 Oppgave 1: hva blir utskriften? class Oppgave1 { 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 Oppgave1.java > java Oppgave1 Test programmet

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

17 Ole Chr. Lingjærde © Institutt for informatikk23. september 2003 17 Parameteren i metoden main  Vi kaller aldri direkte på metoden main (selv om det er lov) - det er Java- kjøresystemet som gjør dette når programmet starter.  De argumenter vi gir etter java ProgramNavn blir overført til parameteren String[] args når main-metoden kalles.  Eksempel: class SkrivArgumenter { 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]); } Test programmet

18 Ole Chr. Lingjærde © Institutt for informatikk23. september 2003 18 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” :  For å finne lengden (dvs antall tegn i) en tekst: int lengde = s.length(); s ”kake”

19 Ole Chr. Lingjærde © Institutt for informatikk23. september 2003 19 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: ’\u0041’ er tegnet ’A’  Noen spesialtegn har egen forkortelse:  \t tabulator  \n linjeskift  \” dobbelt anførselstegn  \’ enkelt anførselstegn  \\ bakslask

20 Ole Chr. Lingjærde © Institutt for informatikk23. september 2003 20 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

21 Ole Chr. Lingjærde © Institutt for informatikk23. september 2003 21 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

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

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

24 Ole Chr. Lingjærde © Institutt for informatikk23. september 2003 24 Konvertere mellom små og store bokstaver  Vi kan konvertere fra små til store bokstaver:  Vi kan konvertere fra store til små bokstaver:  Det finnes tilsvarende metoder for å konvertere char-verdier: NB: merk skrivemåten! String s = ”Jeg ER 18 år”; String s2 = s.toUpperCase(); // Nå er s2 tekststrengen ”JEG ER 18 ÅR” String s = ”Jeg ER 18 år”; String s2 = s.toLowerCase(); // Nå er s2 tekststrengen ”jeg er 18 år” char c = ’x’; char c2 = Character.toUpperCase(c); char c3 = Character.toLowerCase(c);

25 Ole Chr. Lingjærde © Institutt for informatikk23. september 2003 25 Eksempel 1 static String storForbokstav (String s) { String t; if (s.length() > 0) { char c = Character.toUpperCase(s.charAt(0)); t = c + s.substring(1); } else { t = ””; } return t; }  Metode som lager stor forbokstav i en tekststreng:

26 Ole Chr. Lingjærde © Institutt for informatikk23. september 2003 26 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:

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

28 Ole Chr. Lingjærde © Institutt for informatikk23. september 2003 28 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

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

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

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

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

33 Ole Chr. Lingjærde © Institutt for informatikk23. september 2003 33 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.compareTo(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"); }

34 Ole Chr. Lingjærde © Institutt for informatikk23. september 2003 34 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.indexOf(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); }

35 Ole Chr. Lingjærde © Institutt for informatikk23. september 2003 35 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.startsWith(t); if (b) { System.out.println("s starter med t"); } else { System.out.println("s starter ikke med t"); }

36 Ole Chr. Lingjærde © Institutt for informatikk23. september 2003 36 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.endsWith(t); if (b) { System.out.println("s ender med t"); } else { System.out.println("s ender ikke med t"); }

37 Ole Chr. Lingjærde © Institutt for informatikk23. september 2003 37 Fra tall til tekst og omvendt  For å konvertere fra tall til tekst:  For å konvertere fra tekst til tall: int k = Integer.parseInt(s); double x = Double.parseDouble(s); (og tilsvarende for de andre numeriske datatypene) String s1 = String.valueOf(3.14); String s2 = String.valueOf('a'); String s3 = String.valueOf(false); String s4 = "" + 3.14 String s5 = "" + 'a'; String s6 = "" + false;

38 Ole Chr. Lingjærde © Institutt for informatikk23. september 2003 38 Å 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.  StringTokenizer 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

39 Ole Chr. Lingjærde © Institutt for informatikk23. september 2003 39 Eksempel import java.util.*; import easyIO.*; class TokenizerDemo { public static void main(String [] args){ In tast = new In(); System.out.print(”Skriv en setning: ”); String linje = tast.inLine(); StringTokenizer st = new StringTokenizer(linje); while (st.hasMoreTokens()) { System.out.println(st.nextToken()); } Her importeres pakken hvor StringTokenizer ligger Her deler vi opp linja i de enkelte ordene Her plukker vi ut ett og ett ord fra oppdelingen Her sjekker vi om det er flere ord igjen å plukke ut Test programmet

40 Ole Chr. Lingjærde © Institutt for informatikk23. september 2003 40 Eksempel 2 : andre skilletegn import java.util.*; import easyIO.*; class TokenizerDemo2 { public static void main(String [] args){ In tast = new In(); System.out.print(”Skriv en setning: ”); String linje = tast.inLine(); StringTokenizer st = new StringTokenizer(linje); while (st.hasMoreTokens()) { System.out.println(st.nextToken(”,.:;”)); } Vi angir fire mulige skilletegn Test programmet


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

Liknende presentasjoner


Annonser fra Google