// 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.