UNIVERSITETET I BERGEN Det matematisk-naturvitenskapelige fakultet Eksamen i emnet INF101/INF101-F - Programmering 2 Tirsdag 27. September 2011, kl. 09-14 Bokmål Tillatte hjelpemidler: alle skrevne og trykte. Antall sider (inkludert vedlegg): 10. Les gjennom og skaff deg oversikt over hele eksamensettet før du begynner å løse det. Når du løser oppgavene kan du benytte resultater fra oppgaver og deloppgaver du ikke har lykkes i å løse. Prosentsatsene ved hver oppgave angir omtrentlig vekt ved sensur. Deloppgaver til en oppgave kan være ulikt vektet. I kodevedleggene er detaljer utelatt fra implementasjonen når disse ikke er relevante. Vedlagte klasser og kontrakter kan gå over flere sider. Oppgave 1 (5%) Skriv noen korte punkter om hvilke innvirkninger tester og testdrevet utvikling har på utviklingsprosessen. Oppgave 2 (40%) Vedlagt kode: IAktivitetsLagrer.java, EnkelFilAktivitetsLagrer.java, TestEnkelFilAktivitetsLagrer.java, Dato.java og Aktivitet.java. Den vedlagte koden er en del av en kalender hvor brukeren kan legge inn aktiviteter. Kontrakten IAktivitetsLagrer definerer metoder for å lagre og hente frem kalenderaktiviteter. EnkelFilAktivitetsLagrer implementerer kontrakten og håndterer lagring av aktiviteter, testet av TestEnkelFilAktivitetsLagrer. (a) Implementér tester for metoden hentaktiviteter(dato dag). Du bør ha minst tre tester, se TestEnkelFilAktivitetsLagrer.java for bruk av Dato og Aktivitet). Du trenger ikke ta hensyn til alle måter metoden kan feile på. (b) I hvilke sammenhenger (generelt sett) er det fornuftig å bruke en kontrakt? Skriv noen få linjer. Foreslå metoder for kontrakten IKalenderVisning som skal sørge for at aktiviteter kan vises til brukeren. Du trenger ikke ta hensyn til om brukeren skal gi input til systemet (feks å opprette nye aktiviteter eller fjerne dem). Kravene til systemet er å kunne se hvilke dager som har aktiviteter, hvilke aktiviteter som finnes for en gitt dag og å kunne se alle detaljer om en aktivitet. (c) Implementer metoden void lagreaktiviteterserialiserttilfil(string filnavn) ved å bruke objektserialisering. Metoden lagrer tilstanden til EnkelFilAktivitetsLagrerobjekter. Du kan bruke metoden writeutf() i ObjectOutputStream for å lagre strenger. (d) Implementér metoden void lesinnserialiserteaktiviteter(string filnavn). side 1 av 10
INF101(F) 27. September 2011 Bokmål (e) Hvilke fordeler og ulemper kan du se ved å bruke objektserialisering fremfor å skrive/lese tekstrepresentasjoner av objektene? Diskutér kort. Oppgave 3 (25%) Se vedlagt kode Aktivitet.java og Dato.java. Listen over aktiviteter i EnkelFilAktivitetsLagrer.java skal være sortert på dato og så på tidspunkt slik at den eldste datoen med det tidligste tidspunktet er sortert først i listen (posisjon 0), og avtalen lengst frem i tid og senest på dagen er sortert på siste posisjon i listen. For å få dette til må både Aktivitet og Dato implementere Comparable-kontrakten på følgende måte: public class Aktivitet implements Comparable<Aktivitet> { public class Dato implements Comparable<Dato> { (a) Implementér metoden(e) i klassene Aktivitet og Dato som trengs for å oppfylle Comparable-kontrakten. (b) Metoden settinnnyaktivitet(aktivitet aktivitet) i EnkelFilAktivitetsLagrer.java skal finne riktig plassering med en effektiv algoritme. Du skal implementere binærsøk for å finne riktig plassering for den nye aktiviteten i listen over aktiviteter, samt sette inn aktiviteten på riktig posisjon. Oppgave 4 (10%) Se vedlagt kode for klassene Person, Ansatt og Student. (a) Hva er effekten av å kjøre følgende kodebit? Kommentér kort styrker, svakheter og eventuelle feil ved koden, samt eventuelle endringer du kunne tenke deg å gjøre. Tenk for eksempel på følgende: hvilken hentpersoninfo()-metode vil kjøres? Hvilken skrivoppsummering()-metode vil kjøres? public Person tildelrolle(string rolle, String navn) { private Person p; if (rolle == STUDENT) { p = new Student(navn, null); p.hentstudieoppmelding(); else { p = new Ansatt(navn, null); p.hentpersoninfo(); p.skrivoppsummering(); (b) Skriv konstruktørene til Student(String navn, ArrayList<Fag> fag) og Ansatt(String navn, Stilling stilling). side 2 av 10
INF101(F) 27. September 2011 Bokmål Oppgave 5 (20%) Se vedlagt kode TekstHendelse.java. Skriv tester for og implementér metoden avgjoerkommando() som avgjør hvilken kommando som skal utføres og kaller riktig metode i henhold til input fra bruker (dette er et hendelsesorientert program med tekstgrensesnitt). Du trenger ikke ta hensyn til hvordan input mottas eller valideres, i testene kan du bruke metoden setvalgt(int i). Gyldig input fra bruker er tallene 1, 2, eller 3, hvor 3 avslutter programmet. All annen input skal gi et unntak. Testene skal vise (på enklest mulig måte) at riktig del av metoden kjører, samt at feilhåndteringen er korrekt. Lykke til. Siv Midtun Hollup side 3 av 10
Vedlegg - oppgave 2 public interface IAktivitetsLagrer { * Henter alle aktiviteter for en gitt dag. * @param dag * @return En liste av aktiviteter, tom hvis dagen ikke har noen aktiviteter public ArrayList<Aktivitet> hentaktiviteter(dato dag); * Lagrer en ny aktivitet. * @param aktivitet * @throws LagringsException * - hvis aktiviteten ikke kunne lagres public int lagreaktivitet(aktivitet aktivitet) throws LagringsException; * Henter en bestemt aktivitet. * @param aktivitetsid * @return Aktiviteten returneres. * @throws LagringsException * - hvis aktivitetsid-en ikke matcher en aktivitet public Aktivitet hentaktivitet(int aktivitetsid) throws LagringsException; * Sletter en bestemt aktivitet. * @param aktivitetsid * @throws LagringsException * - dersom aktivitetsid ikke matcher noen aktiviteter * - dersom slettingen feiler public void slettaktivitet(int aktivitetsid) throws LagringsException; * Oppdaterer en gitt aktivitet med ny informasjon. * @param aktivitet * @throws LagringsException * - dersom aktiviteten finnes ikke i systemet * - dersom aktiteten ikke kunne oppdateres public void oppdateraktivitet(aktivitet aktivitet) throws LagringsException; side 4 av 10
public class EnkelFilAktivitetsLagrer implements IAktivitetsLagrer { private String kalendernavn; ArrayList<Aktivitet> aktiviteter; private int runningid; public EnkelFilAktivitetsLagrer(String kalendernavn) { this.kalendernavn = kalendernavn; this.aktiviteter = new ArrayList<Aktivitet>(); this.runningid = 0; public ArrayList<Aktivitet> hentaktiviteter(dato dag) { ArrayList<Aktivitet> riktigdag = new ArrayList<Aktivitet>(); for (Aktivitet aktivitet : this.aktiviteter) { if (aktivitet.getdag().equals(dag)) { riktigdag.add(aktivitet); return riktigdag; public int lagreaktivitet(aktivitet aktivitet) throws LagringsException { aktivitet.setid(runningid); aktiviteter.add(aktivitet); return this.runningid++; public Aktivitet hentaktivitet(int aktivitetsid) throws LagringsException { public void slettaktivitet(int aktivitetsid) throws LagringsException { public void oppdateraktivitet(aktivitet aktivitet) throws LagringsException { public void lagreaktiviteterserialiserttilfil(string filnavn) { public void lesinnserialiserteaktiviteter(string filnavn) { side 5 av 10
import java.util.arraylist; import junit.framework.testcase; public class TestEnkelFilAktivitetsLagrer extends TestCase { private EnkelFilAktivitetsLagrer lagrer; protected void setup() { lagrer = new EnkelFilAktivitetsLagrer("JobbKalender"); public void testaktivitetkanlagres() { int id = lagrer.lagreaktivitet(new Aktivitet("kodesesjon", "1400", 2.0, new Dato(6, 5, 2011))); assertequals("kodesesjon", lagrer.hentaktivitet(id).gettittel()); side 6 av 10
Vedlegg oppgave 2 og 3 public class Dato implements Comparable<Dato> { private int aar; private int maaned; private int dag; * Oppretter en dato * @param dag * @param maaned * @param aar public Dato(int dag, int maaned, int aar) { this.aar = aar; this.maaned = maaned; this.dag = dag; * @return the aar public int getaar() { return aar; * @return the maaned public int getmaaned() { return maaned; * @return the dag public int getdag() { return dag; side 7 av 10
public class Aktivitet implements Comparable<Aktivitet> { private String tittel; private String starttid; private double lengdeitimer; private Dato dag; private int id; * Oppretter en fersk aktivitet * * @param tittel * @param starttid * @param lengdeitimer * @param dag public Aktivitet(String tittel, String starttid, double lengdeitimer, Dato dag) { this.tittel = tittel; this.starttid = starttid; this.lengdeitimer = lengdeitimer; this.dag = dag; * Oppretter en aktivitet med en gitt id, brukes kun for å gjenopprette * aktiviteter. * * @param id * @param tittel * @param starttid * @param lengde * @param dato public Aktivitet(int id, String tittel, String starttid, double lengde, Dato dato) { this.id = id; this.tittel = tittel; this.starttid = starttid; this.lengdeitimer = lengde; this.dag = dato; side 8 av 10
Vedlegg - oppgave 4 public abstract class Person { String navn; String gateadresse; int id; public Person(String navn) { this.id = hentnyid(); this.navn = navn; private int hentnyid() { public void hentpersoninfo() { public String skrivoppsummering() { return navn + "\n" + gateadresse + "\n"; public class Ansatt extends Person { private Stilling stillingstype; public String skrivoppusmmering() { return navn + "\n" + gateadresse + "\nstilling: " + stillingstype.tostring(); public class Student extends Person { private ArrayList<Fag> fag; public void hentstudieoppmelding() { public String skrivoppsummering() { return navn + "\n" + gateadresse + "\nantall fag dette semesteret: " + fag.size(); side 9 av 10
Vedlegg oppgave 5 public class TekstHendelse { private int valgt = 0; public void hentvalgfrabruker() { // henter variable valgt med informasjon fra brukergrensesnitt public void setvalgt(int verdi) { this.valgt = verdi; public int avgjoerkommando() throws RuntimeException { private void utfoerkommando1() { private void utfoerkommando2() { side 10 av 10