INF Uke 10. Løsningsforslag ukesoppgaver oktober 2012

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

INF Uke 10. Løsningsforslag ukeoppgaver oktober 2012

INF Uke 10. Ukesoppgaver oktober 2012

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

! " ##$ % 4 2, &/ ( & +, )-. &* &/ ),* 0, 1 1 ( &/ 2& &, & &/ &,, &/" 2 &/ 2 ) *

( & ( &/ 2& , )-. &* &/ ),* 0, &/ 2 ) *

INF1000 (Uke 12) Sortering

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

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

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

Løsningsforslag til eksamen i INF1000 våren 2006

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

UNIVERSITETET I OSLO

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

INF Løsning på seminaropppgaver til uke 8

INF1000: Forelesning 6. Klasser og objekter del 1

Uke 8 - Oppramstyper, HashMap og Innstikksortering, litt javadoc. 17. oktober 2013, Arne Maus Inst. for informatikk, UiO

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

UNIVERSITETET I OSLO

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

Oppramstyper, HashMap og Innstikksortering, litt. 6. oktober 2009, Arne Maus Inst. for informatikk, UiO

OBJEKTER SOM EN PROGRAMMERINGS-TEKNIKK

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

Løsningsforslag, inf101, våren 2001

Repetisjon. INF gruppe 13

UNIVERSITETET I OSLO

Innhold. INF1000 Høst Unified Modeling Language (UML) Unified Modeling Language (UML)

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

INF1010 Sortering. Marit Nybakken 1. mars 2004

INF Forelesning 10. Eksempler på Hashmap Oppramstyper Innstikksortering Javadoc

Oblig 4Hybelhus litt mer tips enn i oppgaven

Gjennomgang av en tenkt eksamensoppgave

INF1000 (Uke 15) Eksamen V 04

INF1000 (Uke 15) Eksamen V 04

Oppgave01.java class Bongo { 2 public static void main(string[] args){ 3 int[][][]bongo = new int[2][3][4]; 4 5 // SVAR: 24 6 } 7 } 8

Gjennomgang av en tenkt eksamensoppgave

INF1000 Prøveeksamen Oppgave 7 og 9

UNIVERSITETET I OSLO

(! )! #!! *#+,$&!! &#$

3 #$ *#+,$&!! &#$ (! )! #! 6 &#)%#. / 5$ #%#.67 / "## #&! %# # & #!!& %&$ # $!!!!# $#

UNIVERSITETET I OSLO

INF1000 Forelesning 9. Hashmap Eksempel: Flyreservasjon

UNIVERSITETET I OSLO

HashMap. INF1000 Forelesning 9. Ulike versjoner i Java 1.4 (gammel) og Java 1.5/1.6 av HashMap. Objekter lagres med en søkenøkkel

Lenkelister. Lister og køer. Kopi av utvalgte sider fra forelesningen.

Eksamen høsten 2003 Den store bøygen i INF1000 er de obligatoriske oppgavene.

UNIVERSITETET I OSLO

1. Finn klassene (hvilke objekter er det i problemet) 1. Dataene som beskriver problemet (hvilke objekter har vi og hvor mange klasser er det?

INF1000 (Uke 14) Resten av eksamen H03 + del av V05

Forelesning inf Java 5

Forelesning inf Java 5

INF1000: noen avsluttende ord

Kapittel 9: Sortering og søking Kort versjon

INF1000: Forelesning 7

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

UNIVERSITETET I OSLO

IN1010 våren januar. Objektorientering i Java

Oblig 3 tips litt mer tips enn i oppgaven

UNIVERSITETET I OSLO

INF1000 HashMap. Marit Nybakken 2. november 2003

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

Løsningsforslag INF desember 2007

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

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

INF1000: Forelesning 7. Konstruktører Static

UNIVERSITETET I OSLO

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

Eksamen i emnet INF100 Grunnkurs i programmering (Programmering I) og i emnet INF100-F Objektorientert programmering i Java I Løsningsforslag

Eksamen i emnet INF100 Grunnkurs i programmering (Programmering I) Løsningsforslag

Oppgave 1 - Kortsvarsoppgave. INF1000 eksamen V05. Oppgave 1 (c) Oppgave 1 (b) Svar: a = 9, b=10

Hva er en metode. Hva skjer når vi kaller en metode

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

Kapittel 8: Sortering og søking

Oblig 3 to versjoner. INF Forelesning 8: Objekter, klasser og pekere. Verden består av mange objekter: noen ganske like, andre ulike

UNIVERSITETET I OSLO

Generelt om oblig 3. Oppgaveteksten kort sammendrag. Deloppgaver/menyvalg 15/03/2010. INF1000 Forelesning 9

OPPGAVE 1 OBLIGATORISKE OPPGAVER (OBLIG 1) (1) Uten å selv implementere og kjøre koden under, hva skriver koden ut til konsollen?

UNIVERSITETET I OSLO

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

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

TOD063 Datastrukturer og algoritmer

Kapittel 9: Sortering og søking Kort versjon

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister

Læreboken på 45 minutter

Kapittel 9: Sortering og søking Kort versjon

UNIVERSITETET I OSLO

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

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

TDT4100 Objektorientert programmering

6108 Programmering i Java. Leksjon 5. Tabeller. Roy M. Istad 2015

INF1000 oppgaver til uke 38 (17 sep 23 sep)

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

PRØVEEKSAMEN (rettet versjon 27/11)

Objekter. Uke 8 - Objekter, klasser og pekere. Verden består av mange objekter, noen ganske like, noen ulike. Klasser og objekter i verden

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.

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Transkript:

INF1000 - Uke 10 Løsningsforslag ukesoppgaver 10 24. oktober 2012 Løsningsforlag Oppgave 1 Array vs. HashMap a) Følgende program viser et enkelt banksystem med en array kontoer[], og metoder for å finne en konto vha. navn til eieren og vha. kontonummer. Skriv om programmet slik at det bruker en HashMap i stedet for arrayen kontoer[]. I første omgang lager vi én HashMap, med personnavn som nøkkel og et Kontoobjekt som verdi, deklarert slik: HashMap<String, Konto> kontofranavn = new HashMap<String, Konto>(); Hvilke fordeler og ulemper får vi av å bruke HashMap her? Hva kan variabelen antkontoer erstattes med i programmet? (Anta foreløpig at personnavnene er unike og at hver person bare kan ha én konto i banken.) class Konto { int nr; // kontonummer String navn; // eier int saldo; Konto(int nr, String navn, int saldo) { this.nr = nr; this.navn = navn; this.saldo = saldo; void settinn(int innskudd) { saldo = saldo + innskudd; class Bank { Konto[] kontoer = new Konto[1000]; int antkontoer = 0; public static void main(string[] args) { Bank b = new Bank(); 1

Bank() { åpnenyttkonto(530010, "Nils", 4000); åpnenyttkonto(720020, "Elin", 8000); åpnenyttkonto(910030, "Tina", 9000); Konto k = finnkontofranavn("elin"); System.out.println("Elins kontonr: " + k.nr + ", saldo: " + k.saldo); k = finnkontofranr(530010); System.out.println("Kontonr. " + k.nr + " tilhører " + k.navn); void åpnenyttkonto(int nr, String navn, int saldo) { Konto k = new Konto(nr, navn, saldo); kontoer[antkontoer] = k; antkontoer++; Konto finnkontofranavn(string navn) { for (int i = 0; i < antkontoer; i++) { if (kontoer[i].navn.equals(navn)) { return kontoer[i]; return null; Konto finnkontofranr(int kontonr) { for (int i = 0; i < antkontoer; i++) { if (kontoer[i].nr == kontonr) { return kontoer[i]; return null; Elins kontonr: 720020, saldo: 8000 Kontonr. 530010 tilhører Nils Løsningsforslag import java.util.*; class Konto { int nr; // kontonummer String navn; // eier int saldo; Konto(int nr, String navn, int saldo) { this.nr = nr; this.navn = navn; 2

this.saldo = saldo; void settinn(int innskudd) { saldo = saldo + innskudd; class Bank2 { HashMap <String, Konto> kontofranavn = new HashMap <String, Konto>(); HashMap <String, Konto> kontoer = new HashMap <String, Konto>(); public static void main(string[] args) { Bank2 b = new Bank2(); Bank2() { åpnenyttkonto(530010, "Nils", 4000); åpnenyttkonto(720020, "Elin", 8000); åpnenyttkonto(910030, "Tina", 9000); Konto k = finnkontofranavn("elin"); System.out.println("Elins kontonr: " + k.nr + ", saldo: " + k.saldo); k = finnkontofranr(530010); System.out.println("Kontonr. " + k.nr + " tilhører " + k.navn); System.out.println("Antall kontoer: " + kontoer.size()); avsluttkonto(k); System.out.println("Fins kontoen nå?: " + kontoer.containsvalue(k)); System.out.println("Antall kontoer nå: " + kontoer.size()); void åpnenyttkonto(int nr, String navn, int saldo) { Konto k = new Konto(nr, navn, saldo); kontofranavn.put(navn, k); kontoer.put("" + nr, k); Konto finnkontofranavn(string navn) { return kontofranavn.get(navn); Konto finnkontofranr(int kontonr) { return kontoer.get("" + kontonr); void avsluttkonto(konto k) { kontofranavn.remove("" + k.nr); kontoer.remove("" + k.nr); 3

Elins kontonr: 720020, saldo: 8000 Kontonr. 530010 tilhører Nils Antall kontoer: 3 Fins kontoen nå?: false Antall kontoer nå: 2 b) Lag en HashMap til, kalt kontoer, hvor du bruker som nøkkel kontonummeret konvertert til String, og fortsatt Konto-objektene som verdi. Vis at metoden finnkontofranr() blir enklere nå. Videre tenk deg at vi skal ha en metode for å fjerne en konto. Følgende kode viser hvordan det kan gjøres med arrayer. Hvor mange programsetninger trengs det når vi bruker én HashMap i stedet? Og med to? void avsluttkonto(konto k) { // Fjerner en konto ved å finne indeksen til kontoen i arrayen // kontoer[] og flytte alle kontoene med høyere indeks en plass ned. boolean funnet = false; for (int i = 0; i < antkontoer &&!funnet; i++) { if (kontoer[i] == k) { funnet = true; for (int j = i; j < antkontoer - 1; j++) { kontoer[j] = kontoer[j + 1]; antkontoer--; Løsningsforslag Se del a). c) Disse oppgavene har begrensningen at personnavnene må være unike og at hver person bare kan ha én konto i banken. Hvordan ville man unngått disse begrensninger i et mer avansert system? Hvilke fordeler og ulemper ser du av å bruke HashMap-er i stedet for 2D-arryaer i Oblig 3? (foreslå mulige nøkkel/verdi-kombinasjoner). Hint: Se avsnitt 9.11 på side 191 i læreboka for forskjellene mellom arrayer og HashMap-er. Løsningsforlag I store systemer passer det bedre å ha personnummer som nøkkel eller noe annet som er unikt for hver verdi, i stedet for navn alene. Verdi kan være et Person-objekt, som i sin tur kan ha en objektvariabel av type HashMap som refererer til alle kontoene for personen. Hvis programmet trenger å finne personer ut fra navn så kan man likevel bruke navn som nøkkel i en tilleggs- HashMap, som f.eks. kan ha som verdi en HashMap over personene med det navnet. Arrayer passer best å bruke når maks. antall elementer er kjent på forhånd, når vi trenger en gitt rekkefølge på dataene, og når indeksene er numeriske. 4

HashMap er bedre når maks. antall elementer er ukjent, eller man trenger å slå opp i dataene vha. "indeksersom er noe annet enn tall (f.eks. tekster), og når rekkefølgen på dataene ikke er avgjørende. Med HashMap må dataene være objekter (pekere), ikke primitive typer, men det finnes objekt-typer for alle de primitive: Integer, Double, Character, Boolean. I Oblig 3 er det mest naturlig å bruke arrayer, men man kan også bruke Hash- Map: da kan f.eks. hele hybelnavnet være nøkkel. Man trenger likevel lett tilgang til etasje- og rom-nr. så disse kan evt. legges til som objektvariabler i Hybel. En annen fremgangsmåte er å ha Etasje som egen klasse og da kan denne ha en array (eller HashMap) med hyblene i etasjen. Oppgave 3 Innstikksortering av kontoer: Ta utgangspunkt i følgende program (som sorterer en heltalls-array og en Stringarray); og lag en metode som sorterer arrayen kontoer[] fra oppgave nr. 2 (a) ovenfor alfabetisk på personnavn. Etter et kall på metoden skal f.eks. kontoer[0] være Elins konto, kontoer[1] Nils sin, osv. Metoden skal ha to innparametre: Konto[] kontoer, og int antkontoer; og skal kunne sortere et vilkårlig antall kontoer. Utvid programmet i nr. 2 (a) med et kall på metoden for å sjekke at den fungerer. class Innstikksort { /** Sorterer en heltallsarray. */ public static void sorter(int[] a) { for (int k = 0 ; k < a.length - 1; k++) { if (a[k] > a[k + 1]) { // a[k + 1] står på feil plass, ta den ut: int tmp = a[k + 1]; int i = k; // Skyv a[i] mot høyre ett hakk til vi finner // riktig plass til tmp: while (i >= 0 && a[i] > tmp) { a[i + 1] = a[i]; i--; // Sett tmp inn på riktig plass: a[i + 1] = tmp; /** Sorterer en String-array. Dette er en redigert utgave av metoden ovenfor som jobber med String-array i stedet for int-array. */ public static void sorter(string[] a) { for (int k = 0 ; k < a.length - 1; k++) { if (a[k].compareto(a[k + 1]) > 0 ) { String tmp = a[k + 1]; 5

int i = k; while (i >= 0 && (a[i].compareto(tmp) > 0)) { a[i + 1] = a[i]; i--; a[i + 1] = tmp; /** Test av innstikksortering */ class TestInnstikksort { public static void main(string[] args) { int[] a = { 3, 12, 8, 1, 10 ; Innstikksort.sorter(a); for (int i = 0; i < a.length; i++) { System.out.println("a[" + i + "] = " + a[i]); String[] navn = { "Ola", "Kari", "Arne", "Eli" ; Innstikksort.sorter(navn); for (int i = 0; i < navn.length; i++) { System.out.println("navn[" + i + "] = " + navn[i]); a[0] = 1 a[1] = 3 a[2] = 8 a[3] = 10 a[4] = 12 navn[0] = Arne navn[1] = Eli navn[2] = Kari navn[3] = Ola Løsningsforslag /** Sorterer en Konto-array: Koden er basert på sorter(string[] a) men * erstatter a[] med enten kontoer[] eller kontoer[].navn avhengig av om * man trenger objektet eller sorteringsnavn. a.length -> antkontoer */ public static void sorter(konto[] kontoer, int antkontoer) { for (int k = 0 ; k < antkontoer - 1; k++) { if (kontoer[k].navn.compareto(kontoer[k + 1].navn) > 0 ) { Konto tmp = kontoer[k + 1]; int i = k; while (i >= 0 && (kontoer[i].navn.compareto(tmp.navn) > 0)) { kontoer[i + 1] = kontoer[i]; i--; 6

kontoer[i + 1] = tmp; Legger også til følgende testkode på slutten av konstruktøren til Bank: // Kontosortering: System.out.println("Sorterer kontoene på navn..."); sorter(kontoer, antkontoer); for (int i = 0; i < antkontoer; i++) { System.out.println("kontoer[" + i + "].navn = " + kontoer[i].navn + ", saldo: " + kontoer[i].saldo); Sorterer kontoene på navn... kontoer[0].navn = Elin, saldo: 8000 kontoer[1].navn = Nils, saldo: 4000 kontoer[2].navn = Tina, saldo: 9000 7