Laste ned presentasjonen
Presentasjon lastes. Vennligst vent
PublisertRune Johannessen Endret for 8 år siden
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
Liknende presentasjoner
© 2023 SlidePlayer.no Inc.
All rights reserved.