INF1000 (Uke 6) Mer om metoder, tekster

Like dokumenter
Blokker og metoder INF1000 (Uke 6) Metoder

Forelesning inf Java 5

Forelesning inf Java 5

En klasse er noe - en metode gjør noe (! / # <= (! * +!! ",-' %. "- -/ %.!#) )! " 0'%! * *$! "1-)) '' % '. 22!'( 7/ /! * 2 2! "*"% 8"%% 9 - -!

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

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

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

Eksamensrelevant repetisjonsstoff. Deklarasjoner og variabeltyper. Konstanter

Java 6. Eksempel med to-dimensjonal array Filbehandling Tekster

Mer om arrayer Metoder

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

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

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

Repetisjon INF 1000 våren 2006

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

for (int i=0; i<3; i++) { for (int j=0; j<5; j++) { System.out.print(i*j); System.out.println();

Mål for INF1000. Repetisjon INF 1000 våren Representasjon av data. Programvareutvikling - oversikt

INF1000 Behandling av tekster

INF1000: Forelesning 4. Mer om arrayer Metoder

INF1000 (Uke 15) Eksamen V 04

INF1000 (Uke 15) Eksamen V 04

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

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

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

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Litt mer om uttrykk: ++ og -- INF1000 : Forelesning 4. Oppgave. Blokker. 0 udefinert udefinert. Alternativ 2 Postfiks-operator

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

INF1000 undervisningen INF 1000 høsten 2011 Uke september

UNIVERSITETET I OSLO

Forelesning inf Java 4

Gjennomgang prøveeksamen oppgave 1, 2, 4, 5, 7

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

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

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

INF1000 Metoder. Marit Nybakken 16. februar 2004

UNIVERSITETET I OSLO

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

Innlesning fra tastatur med easyio. INF1000 høst Vi må først skrive i toppen av programmet: import easyio.*;

Repetisjon: operatorene ++ og -- Java 5. Nøtt. Oppgave 1 (fra forrige gang) 0 udefinert udefinert. Alternativ 1 Prefiks-operator

Løse reelle problemer

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

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

Leksjon 6. Objekt. Evt. importsetninger. public class Klasse { Konstruktør. Objektmetoder. Innkapsling (private): set-og get-metoder

INF Uke 10. Ukesoppgaver oktober 2012

Inf1000 (Uke 10) HashMap og ArrayList

UNIVERSITETET I OSLO

De neste ukene. INF1000 Uke 12. Prøveeksamen. Nå - Prøveeksamen. Forelesning om IT og samfunn neste uke (13/11).

Beskrivelse av programmeringsspråket Compila15 INF Kompilatorteknikk Våren 2015

Eksempel: Body Mass Index (BMI)

INF1000 Uke 4. Innlesning fra terminal. Uttrykk og presedens. Oversikt

INF 1000 Prøveeksamen. 23. november Ole Christian og Arne. Oppgave 1 (10 poeng) Er disse programsetningene lovlige i Java? Oppgave 2 (10 poeng)

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; }

2 Om statiske variable/konstanter og statiske metoder.

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

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

Løse reelle problemer

Oblig4 - forklaringer. Arne og Ole Christian

Transkript:

INF1000 (Uke 6) Mer om metoder, tekster Grunnkurs i programmering Institutt for Informatikk Universitetet i Oslo Anja Bråthen Kristoffersen og Are Magnus Bruaset

Rep: Metoder Java-programmene så langt i kurset: består av en enkelt klasse i klassen kan det befinne seg en eller flere metoder (en av disse må hete main) 14-02-2005 2

Rep: Metoder 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; instruksjon 2; instruksjon n; Et navn som du velger Beskrivelse av hva slags input metoden skal ha - gis i form av variabel-deklarasjoner separert av komma 14-02-2005 3

3 typer variable: Klassevariable Klassevariable Lokale variable Parametere 14-02-2005 4

Klassevariable Variable som er deklarert på klassenivå, utenfor metoden (Også objektvariable) 14-02-2005 5

Lokale variable Variable som deklareres inne i en metode Slike variable er definert fra og med der deklarasjonen gjøres og til slutten av blokken de er deklarert i 14-02-2005 6

Parametere Variable som deklareres i hodet på metoden Slike variable er definert i hele metodekroppen 14-02-2005 7

Viktig detalj Ved gjentatte kall på en metode lages det et nytt sett med lokale variable og parametere hver gang 14-02-2005 8

Eksempel class Variabeltyper { static int tid = 0; // Klassevariabel public static void main (String[] args) { int intervall = 3; // Lokal variabel øktid(intervall); øktid(intervall); static void øktid (int t) { tid += t; System.out.println(tid); // Parameter 14-02-2005 9

Metode uten parametere og returverdi Følgende metode skriver ut en ordremeny på skjermen: static void skrivmeny () { System.out.println( Velg: ); System.out.println( -------------------- ); System.out.println( 1 Cappuccino ); System.out.println( 2 Cafe Latte ); System.out.println( 3 Americano ); System.out.println( 4 Espresso ); System.out.println( -------------------- ); 14-02-2005 10

Parametere og argumenter class Eksempel { public static void main (String[] args) { minmetode(3.14, 365); Argumenter static void minmetode (double x, int y) {... Parametere Merk: et annet navn for argumenter er aktuelle parametere, og et annet navn for parametere er formelle parametere 14-02-2005 11

Metode med returverdi Følgende metode leser et positivt tall fra terminal og returner det til kallstedet: 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: instruksjonen return <uttrykk>; 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) 14-02-2005 12

Fullstendig eksempel import easyio.*; class LesPositivtTall { public static void main (String[] args) { Out skjerm = new Out(); double x = lespositivttall(); double y = lespositivttall(); System.out.print("Du har lest inn x = " + x); System.out.print(" og y = " + y +, ln(x*y) = ") skjerm.outln(math.log(x*y), 2); //avslutter main 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; //her blir x returnert til der metoden kalles fra //avslutter lespositivttall //avslutter LesPositivetTall 14-02-2005 13

Metode med parameter og returverdi Følgende metode finner summen av elementene i en array av typen double: static double finnsum (double[] x) { double sum = 0.0; for (int i=0; i<x.length; i++) { sum += x[i]; return sum; 14-02-2005 14

Metodekall Anta at følgende eksekveres: double total = finnsum(lengde); Metoden som kalles: static double finnsum(double[] x) { double sum = 0.0; for (int i=0; i<x.length; i++) { sum += x[i]; return sum; 14-02-2005 15

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); //her slutter main static double finnsum (double[] x) { double sum = 0.0; for (int i=0; i<x.length; i++) { sum += x[i]; return sum; //her returneres sum til der metoden er kalt fra. //her avsluttes metoden finnsum //her avsluttes klassen Lengde 14-02-2005 16

Rekkefølge i eksekvering double total = finnsum(lengde); Argumentet lengde overføres til variabelen x i metoden finnsum Uttrykket finnsum(lengde) gis verdien 22.05 double[] x = lengde; double sum = 0.0; for (int i=0; i<x.length; i++) { sum += x[i]; return sum; total = 22.05; 14-02-2005 17

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 til høyre 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]; 14-02-2005 18

Overlasting av metoder Et eksempel static int sum (int x, int y) { return x + y; static double sum (double x, double y) { return x + y; 14-02-2005 19

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 parametere eller metodene har ulik type på noen av parametrene, og slik at Java alltid klarer å finne en entydig match 14-02-2005 20

Eksempel Overlasting: static int skrivut(double x, int y) {... static int skrivut(double x, double y) {... Her kan vi f.eks. ha kallet skrivut(2,7) - da velges første metode 14-02-2005 21

Eksempel Overlasting: static int skrivut(double x, int y) {... static int skrivut(int x, double y) {... Her får vi kompilatorfeil hvis vi forsøker kallet skrivut(2,7)! 14-02-2005 22

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 14-02-2005 23

Eksempel (main) 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]); //her avsluttes main //her avsluttes SkrivArgumenter 14-02-2005 24

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"); 14-02-2005 25

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; 14-02-2005 26

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 14-02-2005 27

Tekster og klassen String En String-variabel (f.eks. String s) er en referanse til et slikt objekt Resultatet av å utføre String s = kake : s kake For å finne lengden (dvs antall tegn i) en tekst: int lengde = s.length(); 14-02-2005 28

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) 14-02-2005 29

Eksempel 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 14-02-2005 30

Unicode-tegn i Java 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 14-02-2005 31

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 14-02-2005 32

Teste om to tekster er like 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 14-02-2005 33

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"); 14-02-2005 34

De enkelte tegnene i en streng Tegnene i en tekststreng har posisjoner indeksert fra 0 og oppover 0 1 2 3 k a k e Vi kan få tak i tegnet i en bestemt posisjon: String s = kake ; char c = s.charat(1); // Nå er c == a 14-02-2005 35

De enkelte tegnene i en streng 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 14-02-2005 36

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 0 1 2 3 4 P a r i s s.substring(1,4) 14-02-2005 37

Deler av en tekststreng Generelt: s.substring(index1, index2) 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 s1 = s.substring(6); // Nå er s1 tekststrengen er hovedstaden i Frankrike 14-02-2005 38

Konvertere mellom små og store bokstaver Vi kan konvertere fra små til store bokstaver: String s = Jeg ER 18 år ; String s2 = s.touppercase(); // Nå er s2 tekststrengen JEG ER 18 ÅR Vi kan konvertere fra store til små bokstaver: String s = Jeg ER 18 år ; String s2 = s.tolowercase(); // Nå er s2 tekststrengen jeg er 18 år Det finnes tilsvarende metoder for å konvertere char-verdier: char c = x ; char c2 = Character.toUpperCase(c); char c3 = Character.toLowerCase(c); NB: merk skrivemåten! 14-02-2005 39

Eksempel 1 Metode som lager stor forbokstav i en tekststreng: 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; 14-02-2005 40

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); 14-02-2005 41

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 til" + t + " i " + s + " er " + k); 14-02-2005 42

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); 14-02-2005 43

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); 14-02-2005 44

Fra tall til tekst og omvendt For å konvertere fra tall til tekst: 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; For å konvertere fra tekst til tall: int k = Integer.parseInt(s); double x = Double.parseDouble(s); //(og tilsvarende for de andre numeriske datatypene) 14-02-2005 45

Å finne enkeltord 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 14-02-2005 46

StringTokenizer Standard skilletegn er mellomrom, tabulator, carriage return og linjeskift (såkalte blanke tegn) Vi kan velge andre skilletegn om ønskelig jeg har 20 kroner tokens 14-02-2005 47

Eksempel import java.util.*; import easyio.*; Her importeres pakken hvor StringTokenizer ligger Her sjekker vi om det er flere ord igjen å plukke ut 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); Her deler vi opp linja i de enkelte ordene while (st.hasmoretokens()) { System.out.println(st.nextToken()); Her plukker vi ut ett og ett ord fra oppdelingen

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