// Løsningsforslag til eksamen høsten 2005 oppgave 2 VHC, BK og GS import static javax.swing.JOptionPane.*; // ekstra pga. klientprogram OPPGAVE A) class Tale { private String innledning; private String hoveddel; private String avslutning; public Tale(String startInnledning, String startHoveddel, String startAvslutning) { innledning = startInnledning; hoveddel = startHoveddel; avslutning = startAvslutning; } public String finnInnledning() { return innledning; } public String finnHoveddel() { return hoveddel; } public String finnAvslutning() { return avslutning; } OPPGAVE B) public String toString() { return innledning + hoveddel + avslutning; } OPPGAVE C) public void lagNyTale(Tale annenTale) { hoveddel = hoveddel + annenTale.finnHoveddel(); avslutning = annenTale.finnAvslutning(); } OPPGAVE D) public int finnAntallForekomster(String ord) { String talen = toString(); int antallForekomster = 0; int posisjon = -1; // pga. da starter letingen på posisjon 0 i løkka do { posisjon = talen.indexOf(ord, posisjon + 1); // vi leter fra forrige posisjon pluss en antallForekomster++; } while (posisjon != -1); antallForekomster--; // har telt opp en for mye i løkka return antallForekomster; } OPPGAVE E) public boolean erBortgjemt(String ord) { // undersøker om tegnene i ord forekommer i talen i opprinnelig rekkefølge String talen = toString(); int posisjon = 0; // vi skal lete i talen f.o.m. denne posisjonen boolean tegnFinnes = true; int i = 0; while (tegnFinnes && i < ord.length()) { // vi går gjennom ordet tegn for tegn char tegn = ord.charAt(i); int nyPosisjon = talen.indexOf(tegn, posisjon); if (nyPosisjon == -1) tegnFinnes = false; if (nyPosisjon == posisjon) posisjon = nyPosisjon + 1; // pga. samme tegn gjentas i ord else posisjon = nyPosisjon; i++; } return tegnFinnes; } } // Tale // EKSTRA KLASSE FOR TESTFORMÅL SOM DET IKEK ER SPURT ETTER I OPPGAVEN: class TaleTest { public static void main(String[] args) { int flereTaler = NO_OPTION; do { String innledning = showInputDialog("Oppgi talens innledning"); String hoveddel = showInputDialog("Oppgi talens hoveddel"); String avslutning = showInputDialog("Oppgi talens avslutning"); Tale talen = new Tale(innledning, hoveddel, avslutning); showMessageDialog(null, "Hele talen: " + talen); String inngrepLest = showInputDialog("Antall inngrep på talen?"); int inngrep = Integer.parseInt(inngrepLest); for (int i = 0; i < inngrep; i++) { String forekommer = showInputDialog("Hva kan forekomme? " + talen); showMessageDialog(null, forekommer + " forekommer " + talen.finnAntallForekomster(forekommer)); String bortgjemt = showInputDialog("Hva kan være bortgjemt?" + talen); if (talen.erBortgjemt(bortgjemt)) showMessageDialog(null, bortgjemt + " er bortgjemt"); else showMessageDialog(null, bortgjemt + " er ikke bortgjemt"); talen.erstattÅInnledningsvis(); showMessageDialog(null, "Erstattet å med aa: " + talen); } flereTaler = showConfirmDialog(null, "Flere taler?", "Taleprogrammet", YES_NO_OPTION); } while (flereTaler == YES_OPTION); } } // TaleTest Løsningsforslag til eksamen høsten 2005 oppgave 1 VHC 4. desember 2005 OPPGAVE A) Siden && har høyere prioritet enn ||, skal uttrykket leses slik: a < 9 || (b < a / b && a + b == 13 && a * b < 42) a er lik 10 og b er lik 3. Venstre operand i ||-uttrykket: 10 < 9: false Høyre operand i ||-uttrykket: 3 < 10 / 3, altså 3 < 3: false 10 + 3 == 13: true 10 * 3 < 42: true så da har vi (false && true) && true, altså false && true, altså false. Siden både venstre og høyre operand er false, blir hele ||-uttrykket false. OPPGAVE B) i får verdien 27 / 5, altså 5. j får verdien 27 % 5, altså 2. svar får da verdien 5 / 2 + 27 / 5 altså 2 + 5, altså 7. Så utskriften blir: Svar: 7 OPPGAVE C) En komposisjon er en en-del-av-sammenheng der livet til delen er uløselig knyttet til det objektet den er en del av. Eksempel fra læreboka delkapittel 8.2, det viktigste er: class Navn { ... } class Student { private Navn navn; ... public Student(String startFornavn, String startEtternavn,...) { navn = new Navn(startFornavn, startEtternavn); ... } public String finnFornavn() { return navn.finnFornavn(); } public String settFornavn(String nyttFornavn) { navn.settFornavn(nyttFornavn); } ... tilsvarende for etternavn... } Navn-objektet opprettes inni Student-objektet og administreres derfra. Klienter får ikke tilgang til Navn-objektet. De kan riktignok få tak i fornavnet og etternavnet, men kan ikke endre dem siden strenger er immutable.