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



Like dokumenter
INF1000 Uke 3. Innlesning fra terminal. Uttrykk og presedens. Oversikt. Litt repetisjon Blokker og forgreininger

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

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

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

Oversikt. INF1000 Uke 4. Logisk uttrykk Beregne uttrykk. Eksempel (Feil sist) Logisk uttrykk. Litt repetisjon En feil i forrige forelesning

Forelesning inf Java 3

Body Mass Index (BMI) INF1000 : Forelesning 3. Ferdig program (forts.) Ferdig program

INF1000 : Forelesning 3

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

INF1000 høst Forelesning 2: Innlesning fra terminal Boolean-variable if-setninger Løkker Litt mer om heltall: divisjon og modulo Arrayer

Praktisk informasjon. Repetisjon: While-løkker. I dag. INF1000 (Uke 5) Mer om løkker, arrayer og metoder. Oblig 2 er lagt ut

Praktisk informasjon. I dag. Repetisjon: While-løkker. INF1000 (Uke 5) Mer om løkker, arrayer og metoder

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

Eksempel: Body Mass Index (BMI)

Blokker. Uke 4, INF 1000, 13 sept Løkker og arrayer. Eksempel. Deklarasjoner inne i blokker. Institutt for Informatikk Universitet i Oslo

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

Forelesning inf Java 3

Oversikt. INF1000 Uke 3. Repetisjon Program. Repetisjon Program. Litt repetisjon Program Variabler og Uttrykk Presedens Matematiske funksjoner

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

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

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

Java 4. Mer om easyio Mer om forgreninger Løkker. 7. september 2004

Oversikt. INF1000 Forelesning 6. Variable Deklarasjon. Variabel en plass i lageret int radius;

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

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

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

INF1000 : Forelesning 4

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

INF 1000 høsten 2011 Uke september

INF1000 undervisningen INF 1000 høsten 2011 Uke september

INF 1000 høsten 2011 Uke 3 6. september

Innhold uke 3. INF 1000 høsten 2011 Uke 3 6. september. Uttrykk. Variabel: En plass i hukommelsen

Mer om arrayer Metoder

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

I dag. Rep: Oppsummering - variabler. Rep: Datatyper. INF1000 (Uke 3) Mer om uttrykk, terminal I/O, forgreninger

INF1000 : Forelesning 2

Fullstendige programeksempler. INF1000 : Forelesning 2. Eksempel 1. Eksempel 2. Vi skal nå se på endel programeksempler.

Ole Christian Lingjærde, 12. september 2013

Forelesning inf Java 4

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.

Oversikt. INF1000 Uke 5. Hva er for-løkker - repetisjon. Spørsmål forrige uke. Svar på spm. fra forrige uke. Litt mer om arrayer.

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

INF1000 oppgaver til uke 38 (17 sep 23 sep)

Ukeoppgaver INF1000: 12. feb 16. feb

Mer om uttrykk, terminal I/O, forgreninger. Grunnkurs i programmering Institutt for Informatikk Universitet i Oslo

Java 3. Litt om Java-teknologien. Fortsette innføringen i språket Java Idag: variable, uttrykk, lese fra terminal, forgreninger. 31.

Forelesning inf Java 5

løsningsforslag-uke5.txt

Forelesning inf Java 5

Java. Java 3. Ulike varianter for ulike behov

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

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

Oversikt. INF1000 Uke 1 time 2. Repetisjon - Introduksjon. Repetisjon - Program

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

INF1000 : Forelesning 2

INF1000. Marit Nybakken 10. februar 2004

Blokker og metoder INF1000 (Uke 6) Metoder

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

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

Når du løser oppgaver. INF1000 : Forelesning 3. Eksempel: Celcius og Fahrenheit. Hvilke data beskriver problemet?

De numeriske datatypene. INF1000 : Forelesning 2. Sannhetsverdier. Desimaltall. int og double er eksempler på numeriske datatyper

Kort om meg. INF1000 Uke 2. Oversikt. Repetisjon - Introduksjon

Løsningsforslag ukeoppg. 3: sep (INF Høst 2011)

INF Uke 10. Ukesoppgaver oktober 2012

Repetisjon Program. INF1000 Uke 2. Repetisjon Program Prosedyren main Alt inne i klasser. Repetisjon Variable og uttrykk

Eksamensrelevant repetisjonsstoff. Deklarasjoner og variabeltyper. Konstanter

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

INF1000: Forelesning 4. Mer om arrayer Metoder

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

Repetisjon INF 1000 våren 2006

Forelesning inf Java 2

UNIVERSITETET I OSLO

Forelesning inf Java 2

Forelesning inf Java 2

Oversikt. INF1000 Uke 2. Repetisjon - Program. Repetisjon - Introduksjon

MER OM ARRAYER. INF1000: Forelesning 4. Anta at vi ønsker å lagre en liste med navnene på alle INF1000-studentene:

Java. INF1000- uke 3. Ulike varianter for ulike behov

Løsningsforslag ukeoppg. 4: sep (INF Høst 2011)

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

INF1000 (Uke 6) Mer om metoder, tekster

Rep: Metoder. INF1000 (Uke 6) Mer om metoder, tekster. Rep: Metoder. 3 typer variable: Klassevariable. Java-programmene så langt i kurset:

Programmering Høst 2017

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

UNIVERSITETET I OSLO

Oversikt. INF1000 Uke 3. Underveisevaluering. Spørsmål

Uke 8 Eksamenseksempler + Ilan Villanger om studiestrategier. 11. okt Siri Moe Jensen Inst. for informatikk, UiO

UNIVERSITETET I OSLO

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

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

Inf1000 uke 5 18.sept. 2007

INF1000 (Uke 6) Mer om metoder, tekster

Ukeoppgaver 2: sep (INF Høst 2010)

Orakeltjeneste på Abel Hjelp til Obligatorisk oppgave 2. INF1000 (Uke 6) Mer om metoder, tekster. Rep: Metoder. Rep: Metoder

Grunnkurs i objektorientert programmering Hjelpehefte for studenter som tar INF101,

Feilmeldinger, brukerinput og kontrollflyt

UNIVERSITETET I OSLO

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

Transkript:

Oversikt INF1000 Uke 4 Forgreininger, løkker og arrayer Litt repetisjon Blokker og forgreininger if-setninger if-else-setninger switch-setninger Løkker while-løkker do-while-løkker for-løkker Arrayer Opprette, skrive, lese og lete i Flere dimensjoner 1 2 Uttrykk og presedens Innlesning fra terminal De fleste uttrykk er korte og enkle int a = b; String s = t + u; Dersom det er den minste tvil, bruk parenteser double d = y + (20 * z); Dere vil gjøre det bra på eksamen selv om dere ikke kan hver minste detalj om uttrykk og presedens Innlesning fra terminal kan gjøres på flere måter i Java I INF1000 bruker vi pakken easyio Du må da skrive i toppen av programmet: import easyio*; Inne i klassen skriver vi følgende før vi kan starte innlesning: In tastatur = new In(); Så kan vi lese inn fra terminal (=tastatur), feks et heltall: int radius; Systemoutprint( Oppgi radiusen: ); radius = tastaturinint(); 3 4

Eksempel import easyio*; Vi importerer pakken easyio class LesFraTerminal { In tast = new In(); Systemoutprint("Skriv et heltall: "); int k = tastinint(); Vi oppretter en verktøykasse for lesing fra terminal og lager en variabel tast som blir vårt håndtak til denne verktøykassen I verktøykassen ligger det bla en metode for å lese et heltall fra terminalen Resultat javac LesFraTerminaljava java LesFraTerminal Skriv et heltall: 123 Du skrev: 123 Systemoutprintln("Du skrev: " + k); 5 6 Sammenlikning String Sammenlikning String En String er ikke en basistype, men et objekt Mer om objekter siden Vi må bruke en egen funksjon for å sammenlikne en String med en annen class SammenlikneTekst { public static void main (String[] args) { String ikkenoe; String noe = "noe"; boolean ersann = "noe"equals(noe); Er en String et objekt? boolean erikkesann ="noeannet"equals(noe); enstringequals(enannenstring); //boolean girfeil1 = noeequals(ikkenoe); For eksempel "ja"equals(svar); //boolean girfeil2 = ikkenoeequals("noeannet"); Systemoutprintln("erSann=" + ersann); Systemoutprintln("erIkkeSann=" + erikkesann); 7 8

Blokker Skop Lovlig eksempel En programblokk er en samling med programsetninger omsluttet av krøllparenteser Setningene i main-metoden ligger for eksempel inne i en blokk Blokker kan nøstes inne i hverandre, slik at vi kan ha blokker inne i blokker En variabel som er deklarert inne i en blokk er kun definert ( synlig ) fra stedet den er deklarert til slutten av blokken Vi kaller det skopet til variabelen class SkopLovlig { public static void main(string args[]){ int k = 15; { int n = 10; Systemoutprintln(k + n); // Her er ikke n definert Systemoutprintln(k); 9 10 Skop Ikke lovlig eksempel class SkopIkkeLovlig { public static void main(string args[]){ int k = 15; { int n = 10; int k = 200; // Ikke lov // k er allerede // definert Skop Ikke lovlig eksempel javac SkopIkkeLovligjava SkopIkkeLovligjava:6: k is already defined in main(javalangstring[]) int k = 200; // Ikke lov ^ 1 error 11 12

Programmer med forgreninger En svært nyttig programmeringsteknikk er å bruke forgreninger, dvs forskjellige instruksjoner utføres i ulike situasjoner Vi kan få til dette med en if-setning (pseudokode): if (logisk uttrykk) { <setninger> else { <setninger> et uttrykk som enten er true eller false, feks x < y Den første blokken (og bare den) blir utført hvis det logiske uttrykket er sant (true) Den andre blokken (og bare den) blir utført hvis det logiske uttrykket er usant (false) Eksempel: if (x > 0) { Systemoutprintln("Tallet er positivt"); else { Systemoutprintln("Tallet er ikke positivt"); 13 Varianter av if-setninger else-delen kan utelates: if (pris > 1500) {Systemoutprintln( For dyrt ); Klammene også (hvis vi bare har én setning) if (pris > 1500) Systemoutprintln( For dyrt ); Vi kan legge if-setninger inni if-setninger: if (lønn < 400000) { if (ferieuker < 8) { Systemoutprintln( Ikke søk på jobben ); Vi kan lage sammensatte if-setninger: if (a < 10) { // a ikke er positivt heltall Systemoutprintln( Ett siffer ); else if (a < 100) { Systemoutprintln( To siffer ); else { Systemoutprintln( Mer enn to siffer ); 14 Flytdiagram Flytdiagram implementert Programstart Les inn et tall til variabelen a Er a mindre enn 5? Nei Ja Skriv ut Tallet er mindre enn 5 import easyio*; class LesTall { public static void main(string args[]){ In tastatur = new In(); int a = tastaturinint(); if(a<5){ Systemoutprintln( "Tallet er mindre enn 5"); Programslutt 15 16

Eksempel: Body Mass Index Hvordan løse oppgaver Oppgave: Body Mass Index (BMI) er et mål som kan regnes ut fra høyden og vekten til en person Ifølge verdens helseorganisasjon (WHO) 1 : BMI Under 185 185 249 250 299 300 eller høyere Vektstatus Undervekt Normal vekt Overvekt Fedme Vi skal lage et program som beregner BMI ut fra høyde og vekt og gir melding om hvilken vektstatus (se tabellen) det tilsvarer 1 Bestem programmets oppførsel sett utenfra: 1 Hva skal være inndata (input) til programmet? 2 Hvordan skal programmet få tak i inndataene? 3 Hva skal være utdata (output) fra programmet? 4 Hvordan skal utdataene presenteres for brukeren? 2 Avgjør hvordan du skal transformere inndata til utdata: 1 Hvordan skal inn- og utdata representeres (lagres) i programmet? 2 Reduser transformasjonen inndata -> utdata til en sekvens av trinn hvor hvert trinn gjør en enkel ting med dataene og hvor hvert trinn er enkelt å programmere 3 Skriv programkode (og test løsningen) 1 Se http://wwwwhoint/hpr/nph/docs/gs_obesitypdf 17 18 Inndata og utdata Inndata: Personens høyde (i m) Personens vekt (i kg) Leses fra terminal Utdata: BMI Skrives ut på skjerm, sammen med en av beskjedene Undervekt (hvis BMI <= 184) Normal vekt (hvis 185 <= BMI <= 249) Overvekt (hvis 250 <= BMI <= 299) Fedme (hvis BMI >= 300) Transformere inndata til utdata Vi må kjenne formelen for å regne ut BMI La vekt = personens vekt i kg hoyde = personens høyde i m Da er BMI = vekt / (hoyde*hoyde) 19 20

Ferdig program import easyio*; class BodyMassIndex { public static void main (String[] args) { In tast = new In(); Systemoutprint("Vekt (i kg): "); double vekt = tastindouble(); Systemoutprint("Høyde (i cm): "); double høyde = tastindouble()/100; double bmi = vekt / (høyde * høyde); Systemoutprintln("BMI = " + bmi); Alternativ til if-else: switch En sammensetning av flere if-setninger kan i noen tilfeller erstattes med en switch-setning: switch (uttrykk) { case verdi1: <instruksjoner> break; if (bmi <= 184) { case verdin: Systemoutprintln("Vektstatus: undervekt"); <instruksjoner> else if (bmi <= 249) { Systemoutprintln("Vektstatus: normalvekt"); break; else if (bmi <= 299) { default: Systemoutprintln("Vektstatus: overvekt"); <instruksjoner> else { Systemoutprintln("Vektstatus: fedme"); 21 22 Alternativ til if-else switch Eksempel <uttrykk> må være av typene int, byte, short eller char Verdiene <verdi 1>, <verdi 2>, <verdi n> må være konstanter Konstanter er verdier som ikke kan endres Altså kan de ikke være variabler eller uttrykk Uttrykket regnes ut og utførelsen fortsetter ved den verdien som er lik resultatet Det letes etter et treff ovenfra og nedover Når det finnes et treff utføres setningene frem til break; Etter break er man ferdig med switch-setningen Vær obs på at dersom det ikke står break vil utførelsen fortsette gjennom neste case Bruk alltid(?) break med mindre det finnes en virkelig god grunn Dersom det ikke finnes noen match vil setningene etter default utføres Dersom man forsøker å bruke samme verdi flere ganger gir det kompileringsfeil class BrukAvSwitch { char c = 'x'; switch(c) { case 'a': Systemoutprintln("Tegnet var en a"); break; case 'b': Systemoutprintln("Tegnet var en b"); break; default : Systemoutprintln( "Tegnet var ikke a eller b"); 23 24

Oppgave 1 Hva skriver programmet ut? Oppgave 1 class IfTest { double x = -05; double y = 05; if (1/2 > 0) { Systemoutprintln("A"); if ((int) x == (int) y) { Systemoutprintln("B"); if (x < y) { if (x < 0) { if (y < 0) { Systemoutprintln("C"); else { Systemoutprintln("D"); 25 javac IfTestjava java IfTest B 26 Oppgave 3 Hva skriver programmet ut hvis input er 2? Hva skriver programmet ut hvis input er 4? import easyio*; class SwitchFallThrough { In skrivher = new In(); int x = skrivherinint(); switch(x) { case 1: Systemoutprintln("Tallet er lik 1"); case 2: Systemoutprintln("Tallet er mindre eller lik 2"); case 3: Systemoutprintln("Tallet er mindre eller lik 3"); // Denne gjør at default ikke utføres etter 3 break; default : Systemoutprintln("Tallet er mindre enn 3"); while-løkker Vi kan utføre en blokk med setninger flere ganger ved hjelp av en while-løkke while (<logisk uttrykk>) { <setning 1;> <setning 2;> <setning n;> Hvis det logiske uttrykket er sant, utføres setningene i whileløkka Dette gjentas inntil det logiske uttrykket er usant Da avsluttes løkka 28

Eksempel Kjøring class SkrivLinjer { int k = 1; while (k <= 5) { Systemoutprintln( "Nå har k verdien " + k); k = k + 1; Systemoutprintln("Nå er k lik " + k); java SkrivLinjer Nå har k verdien 1 Nå har k verdien 2 Nå har k verdien 3 Nå har k verdien 4 Nå har k verdien 5 Nå er k lik 6 29 30 Oppgave 4 Hva skriver programmet ut? class LokkeTest { int k = 3; while (k > 0) { Systemoutprint("Nå er k = "); Systemoutprintln(k); k = k - 1; Kompilering og kjøring javac LokkeTestjava java LokkeTest Nå er k = 3 Nå er k = 2 Nå er k = 1 31 32

Oppgave 5 Kompilering og kjøring Hva skriver programmet ut? class WhileIJ { int i = 1; int j = 6; while (i < j) { Systemoutprintln("i = " + i); Systemoutprintln("j = " + j); Systemoutprintln(); i = i + 1; j = j - 1; Systemoutprintln("i = " + i); Systemoutprintln("j = " + j); 33 javac WhileIJjava java WhileIJ i = 1 j = 6 i = 2 j = 5 i = 3 j = 4 i = 4 j = 3 34 Eksempel Innlesning med sjekk Oppgave 5 Lag et program som leser et heltall mellom 1 og 100 fra terminal Hvis det innleste tallet ikke ligger i det lovlige intervallet, skal programmet be om nytt tall Program Innlesning med sjekk import easyio*; class LesVerdiSjekk { public static void main (String[] args) { In tast = new In(); Systemoutprint("Oppgi verdi (1,2,,100): "); int verdi = tastinint(); Dette gjentas inntil brukeren skriver et lovlig tall Skriv til slutt ut en tekst som inneholder tallet 35 while (! (verdi >= 1 && verdi <= 100)) { Systemoutprintln("Ulovlig verdi!"); Systemoutprint("Prøv igjen: "); verdi = tastinint(); Systemoutprintln("Du oppga verdien " + verdi); 36

Kompilering og kjøring java LesVerdiSjekk Oppgi verdi (1,2,,100): 101 Ulovlig verdi! Prøv igjen: 0 Ulovlig verdi! Prøv igjen: 3 Du oppga verdien 3 37 Evig løkke Dersom testen i while-løkka aldri blir usann (false), vil utførelsen av while-løkka aldri stoppe Dette kalles en evig løkke To eksempler: class EvigLokkeOpplagt { while (true) { Systemoutprintln(""); class EvigLokkeIkkeSaOpplagt { int i = 1, j = 2; while (i < j) { Systemoutprintln("Nå er i < j (i=" + i + ", j=" + j + ")"); i++; j++; Evig løkke - Kjøring Den kan stoppes med Ctrl+C java EvigLokkeOpplagt java EvigLokkeIkkeSaOpplagt Nå er i < j (i=82155, j=82156) Nå er i < j (i=82156, j=82157) Nå er i < j (i=82157, j=82158) Nå er i < j (i=82158, j=82159) Nå er i < j (i=82159, j=82160) Nå er i < j (i=82160, j=82161) Nå er i < j (i=82161, j=82162) Nå er i < j (i=82162, j=82163) Nå er i < j (i=82163, j=82164) Variant av while do-while Formen på en do-while løkke: do { <setning 1;> <setning 2;> <setning n;> while (<logisk uttrykk>); Noen foretrekker denne fremfor while-løkker når løkke-innmaten alltid skal utføres minst en gang 39 40

for-løkker En annen måte å få utført en instruksjon (eller blokk) mange ganger er ved hjelp av en for-løkke: for (<initialisering>; <betingelse>; <oppdatering>){ <setning 1;> <setning 2;> <setning n;> Eksempel på for-løkke Initialisering class ForLokkeHvordan { for( int i=0; i<5; i++) { Oppdatering Systemoutprintln("Nå er i " + i); Betingelse java ForLokkeHvordan Nå er i 0 Nå er i 1 Nå er i 2 Nå er i 3 Nå er i 4 41 Hvordan for-løkka virker Kommer til for-løkka int i=0 class ForLokkeHvordan { for( int i=0; i<5; i++) { Systemoutprintln("Nå er i " + i); Nesting av løkker Det er ofte behov for å neste løkke-setninger inne i hverandre og vi kommer til å se mange eksempler på det etter hvert Man må passe på å bruke forskjellig tellevariabel i de forskjellige løkkene I eksemplet er i og j brukt i++ (?) i <= antall Sann Usann Systemoutprintln("Nå er i " + i); Fortsetter etter for-løkka 43 class NestetForLokke { for( int i=1; i<=10; i++) { for( int j=1; j<=10; j++) { int produkt = i * j; Systemoutprintln(i + "*" + j +"=" + produkt); 44

Arrayer Hittil har vi sett på variable som kan holde en enkelt verdi: en int-variabel har plass til ett heltall en String-variabel har plass til en enkelt tekststreng osv Arrayer er "variable" som kan holde på mange verdier: en int-array har plass til mange heltall en String-array har plass til mange tekststrenger osv Verdiene som ligger i en array har hver sin posisjon (= indeks): 0, 1, 2,, N-1 hvor N = lengden til arrayen En array x med lengde 4 kan tegnes slik: 0: 1: 2: 3: Hver av disse boksene har plass til én verdi 45 Deklarere og opprette arrayer Deklarere en array (gi den et navn): <datatype>[] arraynavn; Opprette en array (sette av plass i hukommelsen): arraynavn = new <datatype>[k]; Deklarere og opprette i en operasjon: <datatype>[] arraynavn = new <datatype>[k]; Eksempler: int[] a = new int[10]; double[] x = new double[100]; String[] s = new String[1000]; 46 Verdiene i en array Eksempel på bruk av arrayer Anta at vi har deklarert og opprettet følgende array: int[] tlf = new int[600]; For å få tak i de enkelte verdiene i arrayen: tlf[0], tlf[1], tlf[2],, tlf[599] Anta at vi ønsker å lagre navn, adresse og telefonnr for de som følger et bestemt kurs med maksimalt 600 studenter String[] navn = new String[600]; String[] adresse = new String[600]; int[] tlf = new int[600]; Resultatet kan visualiseres (tegnes) slik navn adresse tlf For å få tak i lengden på arrayen: tlflength // NB: ingen parenteser til slutt 47 0: 1: 2: 599: 0: 1: 2: 599: 0: 1: 2: 599: 48

Eksempel: lese og skrive ut Automatisk initialisering av arrayer Program som leser data om et antall personer fra input import easyio*; class LesInnPersoner { In tast = new In(); String[] navn = new String[3]; for (int i=0; i<navnlength; i++) { Systemoutprint("Navn: "); navn[i] = tastinline(); for (int i=0; i<navnlength; i++) { Systemoutprintln(navn[i]); Leser ut verdi Oppretter array Legger inn verdi Bruker lengden i betingelsen 49 Når en array blir opprettet, blir den automatisk initialisert (dvs verdiene er ikke udefinerte når arrayen er opprettet) int[] k = new int[100]; // Nå er alle k[i] == 0 double[] x = new double[100]; // Nå er alle x[i] == 00 boolean[] b = new boolean[100]; // Nå er alle b[i] == false char[] c = new char[100]; // Nå er alle c[i] == '\u0000 String[] s = new String[100]; // Nå er alle s[i] == null Merk: String-arrayer initialiseres med den spesielle verdien null Dette er ikke en tekststreng og må ikke blandes sammen med en tom tekst: For å kunne bruke verdien s[i] til noe fornuftig må du først sørge for å gi s[i] en tekststreng-verdi, feks s[i] = Per ; eller s[i] = ; Generelt, når vi bruker new, får vi null-fylt det vi lager med new (mye mer bruk av new senere) 50 Egendefinert initialisering av en array Eksempel Finne den yngste Det er ikke alltid den automatiske initialiseringen av en array gir det vi ønsker Vi kan da initialisere arrayen med våre egne verdier, slik som i disse eksemplene: int[] primtall = {2, 3, 5, 7, 11, 13; double[] halve = {00, 05, 10, 15, 20; String[] ukedager = { Mandag, Tirsdag, Onsdag, Torsdag, Fredag, Lørdag, Søndag ; import easyio*; class FinnDenYngste { In tast = new In(); Systemoutprint( "Hvor mange personer? "); int antall = tastinint(); String[] navn = new String[antall]; int[] alder = new int[antall]; for (int i=0; i<antall; i++) { Systemoutprint("Navn: "); navn[i] = tastinline(); Systemoutprint("Alder: "); alder[i] = tastinint(); Leser inn navn og alder i disse 51 // 52

Eksempel fortsetter // int minste = alder[0]; int minpos = 0; Skal hele tiden legge den minste her Starter med den første Posisjonen til den minste i arrayen for (int i=1; i<antall; i++) { if (alder[i] < minste) { minste = alder[i]; minpos = i; Sjekker om vi har funnet en som er mindre og oppdaterer i så fall verdiene Systemoutprintln("Den yngste er " + navn[minpos] + " som er " + minste + " år"); Eksempel Finne den yngste javac FinnDenYngstejava java FinnDenYngste Hvor mange personer? 2 Navn: Arild Alder: 40 Navn: Arne Alder: 60 Den yngste er Arild som er 40 år 54 En array-variabel er en adresse (en peker) Når vi deklarerer en array så refererer arraynavnet ikke til selve verdiene i arrayen, men til adressen (i lageret) hvor verdiene ligger lagret Resultatet etter at vi har utført int[] primtall = {2, 3, 5, 7, 11, 13; kan visualiseres slik: 0 1 2 3 4 5 primtall Oppgave Hva skriver programmet ut? class ToArrayer { int[] x = new int[5]; int[] y = x; for (int i=0; i<xlength; i++) { x[i] = 10 + i; for (int i=0; i < ylength; i++) { Systemoutprintln(y[i]); 55 56

Resultat javac ToArrayerjava java ToArrayer 10 11 12 13 14 Etter å ha utført instruksjonen int[] x = new int[10]; int[] y = x; Hva skjedde? så er situasjonen denne: x x y 0 1 2 9 0 1 2 9 Kopiering av arrayer Vi kan ikke lage en kopi av en array x ved å skrive int[] y = x; siden dette bare medfører at adressen til arrayen legges inn i y Skal vi lage en kopi, må vi først opprette en array til (feks y), og så kopiere over verdiene en for en: 2 dimensjonale arrayer (2D) Vi kan også deklarere todimensjonale (og høyeredimensjonale) arrayer Eksempel: String[][] oljefelter = new String[15][25]; double[] y = new double[xlength]; for (int i=0; i<xlength; i++) { y[i] = x[i]; 59 60

To-dimensjonale (2D) arrayer - slik tenker vi oss det - og slik er det int[][] soltimer = new int[12][31]; gir følgende: soltimer oljefelter 30 Eksempel: String[][] eier = new String[15][25]; Resultat (slik vi tenker det) : eier Flerdimensjonale arrayer 0 1 2 3 4 30 24 Eksempler på lovlige operasjoner: eier[3][4] = Petrol A/S ; int antallrader = eierlength; // 15 int antallkolonner = eier[0]length; // 25 0 1 2 3 4 5 6 7 8 9 10 14 11