Løsningsforslag Videregående programmering, eksamen desember 2010

Like dokumenter
HØGSKOLEN I SØR-TRØNDELAG

LO191D/LC191D Videregående programmering

LO191D/LC191D Videregående programmering eksamen des. 2009

LC191D/LO191D Videregående programmering mai 2010

Løsning på småoppgaver etter hvert underkapittel, kapittel 13 18

6108 Programmering i Java. Leksjon 8. GUI: Grafisk brukergrensesnitt. Del 2: Roy M. Istad 2015

HØGSKOLEN I SØR-TRØNDELAG Avdeling for informatikk og e-læring AITeL

INF1010 Grafisk brukergrensesni3 med Swing og awt del 1 INF1010

import javax.swing.*; import java.awt.*;

INF1010 våren 2006 Uke 19: 9. mai 2006 Et større eksempel: Solitaire (kabal)

HØGSKOLEN I SØR-TRØNDELAG

Løsning på småoppgaver etter hvert underkapittel. kap

EKSAMEN. TILLATTE HJELPEMIDLER: Alle trykte og skrevne. INNFØRING MED PENN, evt. trykkblyant som gir gjennomslag

Løsningsforslag til eksamen i INF1000 våren 2006

Grafisk Brukergrensesnitt

LO191D/LC191D Videregående programmering Løsningsforslag eksamen mai Oppgave 1

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

OPPGAVE 5b og 8b Java Kode

Eksamen INF1010 V2009 Del B prøveeksamen V2010 Vekt 60 %

Del 3: Evaluere uttrykk

Repitisjonskurs. Arv, Subklasser og Grensesnitt

TDT4100 Objektorientert programmering

Konstruktører. Bruk av konstruktører når vi opererer med "enkle" klasser er ganske ukomplisert. Når vi skriver. skjer følgende:

Kapittel 7: Mer om arv

Kapittel 9: Sortering og søking Kort versjon

INF Våren Li' repe$sjon om Tråder og GUI. Stein Gjessing, Ins$tu' for informa$kk, Universitetet i Oslo. Ins$tu' for informa$kk

En klasse som arver, eller selv deklarerer en abstrakt metode, må deklareres som abstrakt.

Leksjon 7. Filer og unntak

INF1010. Grafisk brukergrensesni. med Swing og awt del 2. INF Grafisk brukergrensesni4 II

Gjennomgang av eksamen H99

INF1010. Grensesnittet Comparable<T>

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

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

UNIVERSITETET I OSLO

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

INF1010 Eksamenstips. Løsningsforslag prøveeksamen del 1.

UNIVERSITETET I OSLO

UNIVERSITETET I BERGEN Det matematisk-naturvitenskapelige fakultet

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

INF1010 Arv. Marit Nybakken 2. februar 2004

INF1010 våren Arv og subklasser - del 2

INF1010 våren Arv og subklasser - del 2

INF Løsning på seminaropppgaver til uke 8

Kapittel 15: Grafiske brukergrensesnitt. Del II

Sensur-veiledning INF1000 h 2013 (fasit) am - 6. des. 2013

TDT4100 Objektorientert programmering

Gjøre noe i hele treet = kalle på samme metode i alle objekten. Java datastruktur Klassestruktur

LC191D Videregående programmering Høgskolen i Sør-Trøndelag, Avdeling for informatikk og e-læring. Else Lervik, januar 2012.

INF1010 våren 2008 Uke 4, 22. januar Arv og subklasser

Løsning på småoppgaver etter hvert underkapittel. kap

4. mars 2008 Grafisk brukergrensesnitt med Swing og awt Litt Modell Utsyn - Kontroll Del I. Stein Gjessing Inst for Informatikk Univ.

Les gjennom hele oppgavesettet før du begynner å besvare deloppgavene.

IN 211 Programmeringsspråk. Java. på 20 enkle ark. spesielt for de som kan. Simula. (og gjerne litt C) Ark 1 av 20

Kapittel 6: Arv. Redigert av: Khalid Azim Mughal

HØGSKOLEN I SØR-TRØNDELAG

Eksamensoppgave i IFUD1025 Programmering i Java

UNIVERSITETET I OSLO

INF Uke 10. Ukesoppgaver oktober 2012

Eks 1: Binærtre Binærtretraversering Eks 2: Binærtre og stakk

UNIVERSITETET I OSLO

Algoritmer og datastrukturer Kapittel 11 - Delkapittel 11.2

. Ved sensur vl1 ahe bokstaverte deloppgaver (a, b, c,...) telle like mye.

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

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

Vi lærte sist å lage vinduer. Om å lage et vindu. GUI (Graphical User Interface)-programmering. Inf GUI - del 2

Objektorientert design av kode. Refaktorering.

Kapittel 9: Sortering og søking Kort versjon

INF1010, 22. mai Prøveeksamen (Eksamen 12. juni 2012) Stein Gjessing Inst. for Informatikk Universitetet i Oslo

Løsningsforslag eksamen in105, våren 2000

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Løsningsforslag, inf101, våren 2001

Om Grafiske Bruker-Grensesnitt (GUI) Hvordan gjør vi det: To måter. GUI (Graphical User Interface)-programmering

ANTDAGER = 358; I Ifra nyttår 08 til 08 1ed julaften

INF2440 Prøveeksamen, løsningsforslag, 20 mai Arne Maus PSE, Inst. for informatikk

< T extends Comparable<T> > Indre klasser mm. «Det du bør ha hørt om før oblig 4»

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

Eksamensoppgave Vår 2012 Ordinær eksamen Bokmål. Videregående programmering. Eksamensdato: Studium/klasse: 2. klasse

Kapittel 8: Sortering og søking INF100

Kapittel 8: Sortering og søking

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

Oppsummering. Kort gjennomgang av klasser etc ved å løse halvparten av eksamen Klasser. Datastrukturer. Interface Subklasser Klasseparametre

Eksamensoppgave i IFUD1025 Programmering i Java

NB!!! Veldig korte svar er gitt her. Disse burde det vært skrevet mer på ved en eksamen..

Obligatorisk oppgave 4: Lege/Resept

Algoritmer og datastrukturer Kapittel 3 - Delkapittel 3.1

Eksamensoppgave i IFUD1025 Programmering i Java og IINI4013 Programmering i Java

Videregående programmering 6

EKSAMEN I FAG TDT4100 Objekt-orientert programmering. Fredag 3. juni 2005 KL

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

HØGSKOLEN I SØR-TRØNDELAG

Eksamensrelevant repetisjonsstoff. Deklarasjoner og variabeltyper. Konstanter

Antall sider (inkl. forsiden): 7. Alle trykte og håndskrevne

Kapittel 9: Sortering og søking Kort versjon

IN1010 våren 2018 Tirsdag 15. mai. Repetisjon av subklasser og tråder. Stein Gjessing Institutt for informatikk Universitetet i Oslo

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

EKSAMEN OBJEKTORIENTERT PROGRAMMERING Alle trykte og skrevne. Java API dokumentasjon er tilgjengelig lokalt på hver maskin.

Dagens tema: Mer av det dere trenger til del 1

INF1010 våren Arv og subklasser del 1

Transkript:

Løsningsforslag Videregående programmering, eksamen desember 2010 Oppgave 1a public Prosjekt(int prosjnr, String prosjnavn, ArrayList<PersonTime> persontimer) { this.prosjnr = prosjnr; this.prosjnavn = prosjnavn; for (PersonTime p : persontimer) { this.persontimer.add(new PersonTime(p)); // dyp kopiering for å beskytte PersonTime-objektene Utvidelse, klassen PersonTime: public PersonTime(PersonTime original) { // kopikonstruktør, oppgave 1a (side 403-404) this(original.pers); anttimer = original.anttimer; Oppgave 1b public String tostring() { java.util.formatter f = new java.util.formatter(); String res = "Prosjekt: " + prosjnr + " " + prosjnavn + " med deltakere:\n"; f.format("%s", res); for (PersonTime pt : persontimer) { f.format("%s, antall timer: %.1f\n", pt.getperson().tostring(), pt.getanttimer()); return f.tostring(); Oppgave 1c public boolean equals(object detandre) { // Like hvis prosjnr og/eller navn likt. if (!(detandre instanceof Prosjekt)) { return false; if (this == detandre) { return true; Prosjekt p = (Prosjekt) detandre; return (prosjnr == p.prosjnr prosjnavn.equalsignorecase(p.prosjnavn)); 1

Oppgave 1d public double finntimekostnader(double faktor) { double sum = 0.0; for (PersonTime pt : persontimer) { sum += pt.getperson().gettimelønn() * pt.getanttimer(); return sum * faktor; Oppgave 2a public Person[] hentpersoner() { Person[] ptabell = new Person[personer.size()]; for (int i = 0; i < ptabell.length; i++) { ptabell[i] = personer.get(i); return ptabell; Svar på spørsmålet: Vi trenger ikke bruke dyp kopiering her. Grunnen er at Person er en immutabel klasse. Oppgave 2b public boolean registrernyttprosjekt(prosjekt nyttprosjekt) { if (prosjekter.indexof(nyttprosjekt) >= 0) { // her blir equals()-metoden fra oppg 1c brukt return false; else { prosjekter.add(nyttprosjekt); return true; Oppgave 2c public double finntotaletimekostnader(double faktor) { double total = 0.0; for (Prosjekt p : prosjekter) { total += p.finntimekostnader(faktor); return total; Oppgave 3 GUI-konstruktøren ser i sin helhet slik ut: public GUI(Register reg) { this.reg = reg; setdefaultcloseoperation(jframe.exit_on_close); 2

settitle("registrer nytt prosjekt"); setlayout(new BorderLayout()); add(new FeltInput(), BorderLayout.NORTH); liste = new JList(reg.hentPersoner()); JScrollPane personliste = new JScrollPane(liste); JViewport jvp = new JViewport(); jvp.setview(new JLabel("Velg personer fra listen.")); personliste.setcolumnheader(jvp); liste.setselectionmode( ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); // (dette er defaultverdien) add(personliste, BorderLayout.CENTER); knapp.addactionlistener(new Knappelytter()); add(knapp, BorderLayout.SOUTH); pack(); Metoden actionperformed() ser slik ut: public void actionperformed(actionevent hendelse) { int pid = 0; try { pid = Integer.parseInt(idFelt.getText()); catch (NumberFormatException e) { showmessagedialog(null, "Du skrev inn " + idfelt.gettext() + " som prosjektnr. Du må skrive inn et heltall."); return; String navn = navnefelt.gettext().trim(); if (navn.equals("")) { showmessagedialog(null, "Navnefeltet må fylles ut."); return; ArrayList<PersonTime> personliste = opprettpersontimeliste(); Prosjekt nyttprosjekt = new Prosjekt(pId, navn, personliste); if (reg.registrernyttprosjekt(nyttprosjekt)) { showmessagedialog(null, "Prosjekt registrert."); System.out.println("Prosjekt registrert: " + nyttprosjekt.tostring()); else { showmessagedialog(null, "Prosjekt med dette nr og/eller navn er registrert fra før."); 3

private ArrayList<PersonTime> opprettpersontimeliste() { Object[] valgtepersoner = liste.getselectedvalues(); ArrayList<PersonTime> personliste = new ArrayList<PersonTime>(); for (int i = 0; i < valgtepersoner.length; i++) { Person valgt = (Person) valgtepersoner[i]; personliste.add(new PersonTime(valgt)); return personliste; Oppgave 4 Vi løse oppgaven ved å definere en standardutgave av metoden finntimekostnader() i klassen Prosjekt (alternativt kan en lage denne metoden abstrakt, eventuelt kan en la finnfaktor() være polymorf i stedet for finntimekostnader()) : double sum = 0.0; for (PersonTime pt : persontimer) { sum += pt.getperson().gettimelønn() * pt.getanttimer(); return sum; Så følger de tre subklassene: class InternProsjekt extends Prosjekt { public static final double FAKTOR_INTERN_PROSJEKT = 1.4; public InternProsjekt(int prosjnr, String prosjnavn, ArrayList<PersonTime> persontimer) { super(prosjnr, prosjnavn, persontimer); return super.finntimekostnader() * FAKTOR_INTERN_PROSJEKT; class OffentligProsjekt extends Prosjekt { // Beslutningstabell for å bestemme timekostnader, se metoden finnkostnadprtime () public static final int[] GRENSER = {3, 5; public static final double[] TIMEKOSTNAD = {500.0, 600.0, 700.0; 4

public OffentligProsjekt(int prosjnr, String prosjnavn, ArrayList<PersonTime> persontimer) { super(prosjnr, prosjnavn, persontimer); double sum = 0.0; for (PersonTime pt : getpersontimer()) { sum += pt.getanttimer() * finnkostnadprtime(pt.getperson().finnkategori()); return sum; public static double finnkostnadprtime(int kategori) { for (int i = 0; i < GRENSER.length; i++) { if (kategori < GRENSER[i]) { return TIMEKOSTNAD[i]; return TIMEKOSTNAD[GRENSER.length]; class OrdinærtProsjekt extends Prosjekt { private final double faktor; public OrdinærtProsjekt(int prosjnr, String prosjnavn, ArrayList<PersonTime>persontimer, double faktor) { super(prosjnr, prosjnavn, persontimer); this.faktor = faktor; return super.finntimekostnader() * faktor; Endringer i klassen Prosjekt: Se begynnelsen av oppgaven. Endringer i klassen Register: Ingen faktor i løsningen til oppgave 1c: public double finntotaletimekostnader() { double total = 0.0; for (Prosjekt p : prosjekter) { total += p.finntimekostnader(); return total; 5

Revidert GUI: FeltInput (som før) ProsjektTypeValg Prosjektdata Nye objektvariabler i klassen GUI: private JRadioButton ordinærtprosjekt = new JRadioButton("Ordinært prosjekt", true); private JRadioButton internprosjekt = new JRadioButton("Internt prosjekt", false); private JRadioButton offentligprosjekt = new JRadioButton("Offentlig prosjekt", false); To nye paneler (se figuren): public class ProsjektTypeValg extends JPanel { public ProsjektTypeValg() { setlayout(new FlowLayout()); ButtonGroup typeprosjektgruppe = new ButtonGroup(); typeprosjektgruppe.add(ordinærtprosjekt); typeprosjektgruppe.add(internprosjekt); typeprosjektgruppe.add(offentligprosjekt); add(ordinærtprosjekt); add(internprosjekt); add(offentligprosjekt); public class Prosjektdata extends JPanel { public Prosjektdata() { setlayout(new BorderLayout()); add(new FeltInput(), BorderLayout.NORTH); add(new ProsjektTypeValg(), BorderLayout.SOUTH); Det er Prosjektdata som nå brukes i GUI-konstruktøren: add(new Prosjektdata(), BorderLayout.NORTH); I actionperformed() må vi ta hensyn til hvilken type prosjektobjekt som skal lages: 6

Før: Prosjekt nyttprosjekt = new Prosjekt(pId, navn, personliste); Nå: Prosjekt nyttprosjekt = opprettprosjektobjekt(pid, navn, personliste); Her bruker vi en metode som oppretter prosjekt av riktig type: private Prosjekt opprettprosjektobjekt(int pid, String navn, ArrayList<PersonTime> personliste) { if (ordinærtprosjekt.isselected()) { double faktor = // bruker metode fra side 496 i boka mittbibliotek.dataleser.lesdesimaltall("ordinært prosjekt er valgt. " + "\noppgi faktor for påslag ved beregning av prosjektkostnader: "); return new OrdinærtProsjekt(pId, navn, personliste, faktor); else if (internprosjekt.isselected()) { return new InternProsjekt(pId, navn, personliste); else if (offentligprosjekt.isselected()) { return new OffentligProsjekt(pId, navn, personliste); return null; // skal ikke kunne komme hit, pga at en av radioknappene alltid må være valgt 7