Algoritmer og datastrukturer E Løkker i Java

Like dokumenter
Algoritmer og datastrukturer Kapittel 3 - Delkapittel 3.1

Algoritmer og datastrukturer Eksamen 22. februar 2011

Dagens forelesning. Husk prøveeksamen Fredag 15/3-13 kl 12 i R1. Iterator-teknikken. Eksempel med bruk av Iterator og Iterable-grensesnittene

Algoritmer og datastrukturer A.1 BitInputStream

Algoritmer og datastrukturer Eksamen

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister

Algoritmer og datastrukturer Eksamen

Algoritmer og datastrukturer Kapittel 4 - Delkapittel 4.3

Algoritmer og datastrukturer Vedlegg A.2 BitOutputStream

TOD063 Datastrukturer og algoritmer

UNIVERSITETET I OSLO

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister Videre

1- og 2-veis Innkapsling Java Stabel Kø Prio-kø Iterator. Enveis- og toveislister Innkapsling («boxing») (Big Java 6.8.5)

Algoritmer og datastrukturer Kapittel 9 - Delkapittel 9.1

1- og 2-veis Innkapsling Java Stabel Kø Prio-kø Iterator. Enveis- og toveislister Innkapsling («boxing») (Big Java 6.8.5)

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

PG4200 Algoritmer og datastrukturer Forelesning 5 Implementasjon av lister

Algoritmer og datastrukturer Kapittel 4 - Delkapittel 4.4

UNIVERSITETET I OSLO

Forkurs INF1010. Dag 3. Andreas Færøvig Olsen Eivind Storm Aarnæs

Algoritmer og datastrukturer A.1 Filbehandling på bit-nivå

Oppsummering del 2. Læringsmål Viktigste Java-elementer Eksamen Til sist. Læringsmål Hovedpunkter Tilbakemelding Eksamen. IN1010 uke 17 våren 2019

Lenkelister, iteratorer, indre klasser. Repetisjonskurs våren 2018 kristijb

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

UNIVERSITETET I OSLO

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

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

Forkurs INF1010. Dag 3. Andreas Færøvig Olsen Gard Inge Rosvold Institutt for Informatikk, 15.

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

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

Algoritmer og datastrukturer Kapittel 1 - Delkapittel 1.8

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

Algoritmer og datastrukturer Løsningsforslag

Læringsmål for forelesningen

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.

BOKMÅL Side 1 av 7. KONTINUASJONSEKSAMEN I FAG TDT4100 Objektorientert programmering / IT1104 Programmering, videregående kurs

Algoritmer og datastrukturer Løsningsforslag

Hva er en liste? Hvert element har en forgjenger, unntatt første element i listen. Hvert element har en etterfølger, unntatt siste element i listen

C# (.Net) Tema: Loops (Løkker) Leksjon 7 Kap 18

Algoritmer og datastrukturer Eksamen

Liste som abstrakt konsept/datatype

PG4200 Algoritmer og datastrukturer Lab 1. 8.januar I dag skal vi undersøke en rekke velkjente databeholdere i Java:

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

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

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

Post-it spørsmål fra timen (Arv og subklasser)

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

D Feilhåndtering og unntaksklasser

INF1000 : Forelesning 3

UNIVERSITETET I OSLO

INF1010, 21. februar Om å gå gjennom egne beholdere (iteratorer) Stein Gjessing Inst. for Informatikk Universitetet i Oslo

Algoritmer og datastrukturer Eksamen

Løsningsforslag ukeoppg. 9: okt (INF Høst 2011)

Hva er en liste? Hvert element har en forgjenger, unntatt første element i listen. Hvert element har en etterfølger, unntatt siste element i listen

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

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

UNIVERSITETET I OSLO

TDT4100 Objektorientert programmering

Algoritmer og datastrukturer Kapittel 9 - Delkapittel 9.2

Programmering i C++ Løsningsforslag Eksamen høsten 2005

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

Algoritmer og datastrukturer Kapittel 2 - Delkapittel 2.2

INF1010 LISTER. Listeelementer og listeoperasjoner. Foran. Bak

EKSAMENSFORSIDE Skriftlig eksamen med tilsyn

UNIVERSITETET I OSLO

Algoritmer og datastrukturer Løsningsforslag

Algoritmer og datastrukturer Eksamen

UNIVERSITETET I OSLO

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

INF1010, 23. februar Parametriserte klasser Om å gå gjennom egne beholdere (subklasser og grensesnitt 3)

Løse reelle problemer

Forelesning inf Java 3

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

Algoritmer og datastrukturer Kapittel 5 - Delkapittel 5.1

UNIVERSITETET I OSLO

INF1000 oppgaver til uke 38 (17 sep 23 sep)

Ole Christian Lingjærde, 12. september 2013

Forelesning inf Java 4

UNIVERSITETET I OSLO

Algoritmer og datastrukturer Kapittel 3 - Delkapittel 3.3

Programmering Høst 2017

løsningsforslag-uke5.txt

Løsningsforslag Test 2

INF1010. grensesni-et Comparable<T> grensesni-et Iterable<T> rekursjon

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

EKSAMEN 6108/6108N PROGRAMMERING I JAVA Alt trykt og skriftlig materiale.

UNIVERSITETET I OSLO

INF1000 (Uke 15) Eksamen V 04

INF1000 (Uke 15) Eksamen V 04

UNIVERSITETET I OSLO

AlgDat 10. Forelesning 2. Gunnar Misund

UNIVERSITETET I OSLO

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

Forelesning inf Java 4

Læringsmål for forelesningen

class Book { String title; } class Dictionary extends Book { int wordcount; } class CartoonAlbum extends Book { int stripcount; }

Leksjon 3. Kontrollstrukturer

Algoritmer og datastrukturer Kapittel 2 - Delkapittel 2.1

Transkript:

Vedlegg E Løkker i Java Side 1 av 6 Algoritmer og datastrukturer E Løkker i Java E Løkker i Java E.1 For-løkker En for-løkke består av de fire delene initialisering, betingelse, oppdatering og kropp (eng: body). Et typisk eksempel er en for-løkke som traverserer en tabell a: for (int i = 0; i < a.length; i++) en Programkode E.1 a) Her er initialiseringen gitt ved int i = 0, betingelsen er i < a.length og oppdateringen i++. Det som står i blokken innrammet av krøllparentesene, er for-løkkens kropp. Den består normalt av en eller flere programsetninger. En generell for-løkke ser slik ut: for (<initialisering>; <betingelse>; <oppdatering>) en Programkode E.1 b) I flg. eksempel brukes en for-løkke til å travsere en generisk liste ved hjelp av en iterator. La f.eks. listens generiske parametertype være String: for (Iterator<String> i = liste.iterator(); i.hasnext(); ) String s = i.next(); // øvrige programsetninger Programkode E.1 c) Hvis kroppen har kun én setning, trengs ingen blokk, dvs. innramming av krøllparenteser: for (int i = 0; i < a.length; i++) <programsetning>; Det er lurt å ha en blokk selv med kun én setning. Da er blokken klar hvis det senere trengs flere setninger. Ellers er det fort gjort at en ny setning havner utenfor for-løkken. Noen liker å ha alt på én linje hvis det er kun en kort setning. Da droppes blokken. Variabelen som initialiseres kalles generelt en «tellevariabel» (eng: counter). En står helt fritt til å velge navn på den, men hvis for-løkken arbeider i en tabell, brukes ofte navn som i, j, k, m og n. Det kommer nok av at de samme bokstavene brukes i summeformler i matematikk. Bokstaven l brukes vanligvis ikke siden den i mange tegnsett ligner for mye på sifferet 1.

Vedlegg E Løkker i Java Side 2 av 6 Det kan være situasjoner der en trenger flere «tellevariabler». Da må det være komma mellom dem og ikke semikolon. I flg. eksempel kopieres innholdet av tabellen a over i tabellen b, men i motsatt rekkefølge: int[] a = 1,2,3,4,5; int[] b = new int[a.length]; // like lang som a for (int i = 0, j = b.length - 1; i < a.length; i++, j--) b[j] = a[i]; // kopierer fra a til b System.out.println(Arrays.toString(b)); // Utskrift: [5, 4, 3, 2, 1] Programkode E.1 d) Rekkevidden (eng: scope) til en «tellevariabel» er for-løkkens blokk. I noen situasjoner kan det være gunstig å bryte av (break) en for-løkke når noe spesielt inntreffer. Hvis vi da oppretter tellevariabelen foran for-løkken, vil vi kunne få tak i dens verdi etterpå: int i = 0; for ( ; i < a.length; i++) // programsetninger if <et eller annet> break; // Nå kan vi få tak i verdien til i Programkode E.1 e) Dette betyr at en eller flere av for-løkkens deler kan være tomme, dvs. ingen kode. Det mest ekstreme er at hverken initialiseringen, betingelsen eller oppdateringen har kode: for ( ; ; ) Denne konstruksjonen omtales som en «evig løkke». Det er situasjoner der det er gunstig å sette i gang en løkke på denne måten. Men da må det finnes kode blant programsetningene i kroppen som gjør at løkken garantert brytes på et eller annet tidspunkt. For-løkker er så vanlige at de fleste utviklingsverktøy har maler (eng: templates) for dem. Hvis en bruker NetBeans, har en tabell med navn tabell og trenger en for-løkke som skal arbeide i den, kan en først skrive fori og så trykke tabulator-tasten. Da kommer dette: for (int i = 0; i < tabell.length; i++) int j = tabell[i]; I Eclipse kan en skrive for og så trykke CTRL+mellomrom. Da kommer det tilbud om flere maler. Velges for - iterate over array, kommer dette:

Vedlegg E Løkker i Java Side 3 av 6 for (int i = 0; i < tabell.length; i++) Netbeans og Eclipse har flere maler enn dette for for-løkker. E.2 For-alle-løkker En for-alle-løkke (eng: for-each loop) brukes til å traversere en hel datastruktur. Det gjelder: tabeller datastrukturer som er Iterable En generell for-alle-løkke ser slik ut: for (<datatype> <navn> : <objekt>) // programsetninger Dette kan vi lese slik: for alle verdier navn av typen datatype fra objekt osv. Her må objekt være en tabell av den gitte typen eller en instans av en generisk klasse som er Iterable. Eksempel med en tabell: int[] a = 1,2,3,4,5,6,7,8,9,10; for (int k : a) System.out.print(k + " "); // Utskrift: 1 2 3 4 5 6 7 8 9 10 Eksempel med en liste: Programkode E.2 a) List<Character> liste = new LinkedList<>(); liste.add('a'); liste.add('b'); liste.add('c'); for (Character c : liste) System.out.print(c + " "); // Utskrift: A B C Programkode E.2 b) LinkedList er Iterable siden LinkedList implementerer List, den arver (eng: extends) Collection og Collection arver Iterable. Alle disse tre er grensesnitt (eng: interface). Når en klasse er Iterable har den garantert metoden iterator(), dvs. en metode som returnerer en Iterator. Det er den som brukes implisitt i for-alle løkken. Java har mange Iterable-klasser. F.eks. flg. fra java.util: ArrayDeque, ArrayList, HashSet, LinkedHashSet, LinkedList, PriorityQueue, Stack, TreeSet og Vector. Eksempel med tabell og mengde (eng: set):

Vedlegg E Løkker i Java Side 4 av 6 int[] a = 5,9,2,4,7,10,8,1,3,6; Set<Integer> s = new TreeSet<>(); for (int k : a) s.add(k); for (int k : s) System.out.print(k + " "); // en tabell // en mengde (TreeSet) // fra tabell til mengde // skriver ut // Utskrift: 1 2 3 4 5 6 7 8 9 10 Programkode E.2 c) E.3 While-løkker En while-løkke har en betingelse og en kropp (eng: body) og ser generelt slik ut: while (<betingelse>) While-løkken går så lenge som betingelsen er oppfylt. Alt vi kan få til med en for-løkke kan vi få til med en while-løkke, og omvendt. Programkode E.1 a) viser en for-løkke som traverserer en tabell. Dette løses slik ved hjelp av en while-løkke: int i = 0; while (i < a.length) i++; Programkode E.3 a) Som nevnt i Avsnitt E.1, kan det av og til være gunstig å sette i gang en «evig løkke». Da må selvfølgelig løkkens «kropp» inneholde kode som gjør at løkken før eller senere brytes (break eller return). En «evig» while-løkke lages slik: while (true) Ved fil-lesing brukes ofte en while-løkke. I flg. eksempel finner vi antall linjer på en tekstfil: FileReader fil = new FileReader("fil.txt"); try (BufferedReader inn = new BufferedReader(fil)) String s; // skal romme en linje fra filen int antall = 0; while ((s = inn.readline())!= null) antall++;

Vedlegg E Løkker i Java Side 5 av 6 inn.close(); // variabelen antall inneholder nå antall linjer på filen Programkode E.3 b) Konstruksjonen over er litt spesiell. Det er linje!= null som er betingelsen, men det utføres en innlesing før den testes. Dette kunne vært løst slik med en for-løkke: int antall = 0; for (String s = inn.readline(); s!= null; s = inn.readline()) antall++; E.4 Do-while-løkker I både for-løkker og while-løkker sjekkes betingelsen før programsetningene i løkkens kropp utføres. I noen situasjoner kan det være aktuelt å utføre setningene én gang før betingelsen sjekkes. En do-while-løkke er laget for det formålet. En slik løkke består av en kropp (eng: body) og en betingelse og ser generelt slik ut: do while (<betingelse>); I Programkode E.3 b) brukte vi en while-løkke til å telle opp antall linjer på en tekstfil. Dette kan også løses ved en do-while-løkke. Legg merke til at variabelen antall nå blir initiert til -1. Det kommer av at setningen antall++ blir utført én gang selv om filen ikke skulle ha noen linjer, dvs. den er tom. FileReader fil = new FileReader("fil.txt"); try (BufferedReader inn = new BufferedReader(fil)) String s; // skal romme en linje fra filen int antall = -1; do s = inn.readline(); antall++; while (s!= null); inn.close(); // variabelen antall inneholder nå antall linjer på filen Programkode E.4 a)

Copyright Ulf Uttersrud, 2017. All rights reserved. Vedlegg E Løkker i Java Side 6 av 6