Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Expand
titleDel 2 - Typer (10%)

 Anta følgende klasser, grensesnitt og metoder:
- Klasse A deklarerer metoden A methodA().
- Grensesnittet G deklarerer metoden G methodG(A) .
- Klasse B arver fra A, implementerer G og deklarerer metoden B methodB(A).
- Klasse C implementerer G og deklarerer metoden C methodC(G).

Oppgave a)

 Hvilke av følgende deklarasjoner/initialiseringer vil gi feil i editoren/ved kompilering:
A a = new B();

B b = new A();

G g1 = new A(), g2 = new B(), g3 = new C();

Expand
titleLF

Her ble det (dessverre) ikke spurt om noen forklaring, så det er nok å angi hvilke som er feil.

B b = new A() er ulovlig, siden en A ikke er en B

G g1 = new A()er ulovlig, siden en A ikke implementerer G

Det gis 2 poeng på oppgaven: 1 poeng dersom en har rett på linje 1 og 2 sammen og 1 poeng dersom en har rett på linje 3, dvs. at den første er feil og de to andre korrekte.

Oppgave b)

Anta i det følgende at variablene a, b og c er deklarert til å være av klassene A, B og C. Hvilke av følgende uttrykk vil gi feil i editoren/ved kompilering og hvorfor:

a.methodA() == c.methodC(a)
b.methodA().toString()

b.methodG(new B())

((G) a).methodG(a)

((B) a).methodG(b)

((C) a).methodG(a)

Expand
titleLF

c.methodC(a) er ulovlig, siden en A ikke (nødvendigvis) er en G

 ((C) a).methodG(a) er ulovlig, siden en A ikke også kan være en C

Det gis 4 poeng: 1 poeng for hver av de fire første linjene og 1 poeng om svaret er riktig for de to siste linjene.

Lenke til løsningskode: A.java, B.java, C.java, G.java og Main.java

 

Expand
titleDel 3 - Klasser (35%)

For å kunne stave ord over en dårlig kommunikasjonslinje er det vanlig å bruke et ord-basert alfabet, hvor første bokstav i ordet tilsvarer bokstaven som sies. Nato har standardisert dette i sitt fonetiske alfabet, som begynner med ”alfa”, ”bravo”, ”charlie”, ”delta”, ”echo”, ”foxtrot”. Dersom ordet ”java” staves med dette alfabetet blir det ”juliet alfa viktor alfa”.

Du skal implementere en klasse RadioAlphabet for å konvertere bokstaver og ord vha. denne teknikken. Du velger selv hvordan alfabetet representeres, f.eks. kan en String, String-tabell, List eller Map brukes for å representere alfabetet. Merk at det kan være lurt å lese gjennom hele oppgaven og ta en titt på oppgave 5, før du velger mellom en av disse og evt. andre alternativer.

Oppgave a)

Først skal du implementere én konstruktør og to metoder, som følger:

  • Konstruktøren skal ta inn ordene i alfabetet som en String og en String som inneholder skilletegnet. Merk at ordene trenger ikke være i alfabetisk rekkefølge, fordi første bokstav i ordet avgjør hvilken bokstav det tilsvarer. F.eks. skal new RadioAlphabet(”alfa-bravo-delta-charlie”, ”-”) gi et objekt som kan oversette bokstavene ’a’-’d’ med Nato-alfabetet. Alfabetet skal kun kunne inneholde ord for bokstaver (altså ikke tall og skilletegn).

  • Metoden String convert(char) skal returnere ordet som tilsvarer bokstaven som gis som parameter, eller null dersom bokstaven ikke kan oversettes. F.eks. skal convert(’a’) returnere ”alfa” og convert(’!’) skal returnere null.

  • Metoden String convert(String) skal returnere sekvensen av ord (med mellomrom mellom) i en String som tilsvarer ordet som gis som parameter. Bokstaver som ikke kan oversettes skal ignoreres. F.eks. skal convert(”*abba*”) returnere ”alfa bravo bravo alfa”.

Expand
titleLF

Det enkleste er å bruke List/ArrayList eller en Map/HashMap, siden disse har dynamisk størrelse. En Map gir kanskje aller enklest kode (litt mer kompleks konstruktør), men her vises en løsning som bruker List. Lista inneholder kun alfabet-ordene og koden utnytter at første bokstav i ordet er nettopp bokstaven som ordet er oversettelsen av.

Det gis 4 poeng for en fornuftig datarepresentasjon og helhetlig bruk av den, 2 for konstruktøren, 1 for hver av converts og convert(char) og 2 for convert(String). Det trekkes poeng dersom kode gjentas, f.eks. for finne posisjonen til et ord i tabellen/lista.

Split bør være kjent og gir en enklere konstruktør. Arrays.asList er mindre kjent, så en løkke for å legge til ord er greit. Merk hvordan pos-metoden, som finner hvor ordet for en bokstav er, brukes av flere av de andre metodene. I convert-metoden kan man bruke String +=, StringBuilder.append eller StringBuffer.append. Merk at det kreves egen logikk for å unngå unødvendige blanke tegn, foran inni eller i slutten av String’en. Siden en bokstav ikke nødvendigvis kan oversettes, er det ikke nok å sjekke indeksen for å avgjøre om det skal legges inn mellomrom. Her løses det delvis med en if, delvis med String.trim.

Code Block
public class RadioAlphabet {
	
	private List<String> alphabet;
	
	public RadioAlphabet(String alphabet, String separator) {
		this.alphabet = new ArrayList<String>(Arrays.asList(alphabet.split(separator)));
	}
	private int pos(char c) {
		for (int i = 0; i < alphabet.size(); i++) {
			if (alphabet.get(i).charAt(0) == c) {
				return i;
			}
		}
		return -1;
	}
	
	public boolean converts(char c) {
		return pos(c) >= 0;
	}
	
	public String convert(char c) {
		int pos = pos(c);
		return pos >= 0 ? alphabet.get(pos) : null;
	}
	
	public String convert(String word) {
		StringBuffer /* or StringBuilder */ buffer = new StringBuffer();
		for (int i = 0; i < word.length(); i++) {
			String converted = convert(word.charAt(i));
			if (converted != null) {
				buffer.append(converted);
				buffer.append(' ');
			}
		}
		return buffer.toString().trim();
	}
}
Oppgave b)

Hvorfor kan ikke disse metodene være deklarert med static-modifikatoren?

Expand
titleLF
 Med static-modifikatoren vil metodene ikke kunne referere til et bestemt RadioAlphabet-objekt. En kan for så vidt gjøre alfabetet static også, men da vil en bare kunne ha ett globalt alfabet.
Oppgave c)

Hva kalles det når metoder i samme klasse (som convert-metodene) har samme navn? Hva er regelen for å skille dem fra hverandre/velge mellom dem, når de brukes/kalles?

Expand
titleLF

At metoder i en klasse kan ha samme navn kalles ”overloading”. For å avgjøre hvilken som skal kalles, brukes de deklarerte typene til argumentene (ikke returverdien). Merk at dette er noe annet enn polymorfi, som handler om at subklasser kan ha ulike implementasjoner av metoder definert i en felles superklasse.

Oppgave d)

Utvid klassen med metodene setWord(String) som endrer ordet som brukes for en bestemt bokstav (første bokstav i ordet), og removeWord(char) som fjerner ordet for en bestemt bokstav fra alfabetet. Merk at setWord skal kun kunne endre ordet for en bokstav som allerede finnes i alfabetet.

Expand
titleLF

 Her brukes pos-metoden som også ble brukt av convert(char). Merk at setWord ikke skal legge inn et nytt ord, kun erstatte et eksistererende.

Code Block
themeEclipse
languagejava
 public void setWord(String word) {
	int pos = pos(word.charAt(0));
	if (pos >= 0) {
		alphabet.set(pos, word);
	}
}
public void removeWord(char c) {
	int pos = pos(c);
	if (pos >= 0) {
		alphabet.remove(pos);
	}
}

Det gis 5 poeng for riktige løsninger. Det trekkes 1 poeng dersom setWord legger til ord. Det trekkes poeng dersom kode gjentas, f.eks. for finne posisjonen til et ord i tabellen/lista.

...