Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: La til oppgave 3

...

Expand
titleDel 2 - Klasser (30%)

 I denne oppgaven skal du implementere klasser og metoder for en quiz, altså sekvenser med spørsmål og svar. Et eksempel på spørsmål og svar-sekvens er vist under.

 Et eksempel på spørsmål og svar-sekvens er vist under. Som eksemplet viser, så kan det kan være ulike typer svar og en kan ha svar-alternativer.

Code Block
Hva heter hovedstaden i Norge?
 Oslo


Hva slags ost er månen laget av? 1. Camembert 2. Roquefort 3. Brie
 2

Hvor høy er Galdhøpiggen? 1. 2469 2. 2471
 2

Feil, prøv igjen!
 2469


Er Java gøy?
 ja

 Du skal implementere én klasse for spørsmål og tilhørende svar kalt Question og én klasse for quiz-en kalt Quiz. Oppgaven videreføres i resten av oppgavesettet, så det kan være greit å lese gjennom alle delene før du begynner å jobbe med din løsning.

Oppgave a)

Du skal først implementere Question-klassen. Klassen skal støtte spørsmål, svar og eventuelle svar-alternativer, som alle er tekster. Definer felt for disse og skriv en (eller flere) konstruktør(er) som initialiserer dem. Merk at et spørsmål ha et svar, men trenger ikke ha svar-alternativer. Utløs unntak for tilfeller som du synes er relevante.

Expand
titleLF

String-typen brukes for tekst uten formattering. Siden det er flere svar-alternativer, så lagrer vi dem i en ArrayList<String>. Siden vi siden trenger å kunne slå opp svar-alternativer med indeks, så deklareres feltet som List<String>. Vi viser her et alternativ med to konstruktører, den andre med varargs, men det holder med én.

Code Block
themeEclipse
languagejava
 	private String question;
	private String answer;
	private List<String> options;
	public Question(String question, String answer, Collection<String> options) {
		this.question = question;
		this.answer = answer;
		if (! options.contains(answer)) {
			throw new IllegalArgumentException("Svaret er ikke et av alternativene!");
		}
		this.options = new ArrayList<String>();
		if (options != null) {
			this.options.addAll(options);
		}
	}
	public Question(String question, String answer, String... options) {
		this(question, answer, Arrays.asList(options));
	}

 Oppgave b)

 Lag følgende metoder i Question-klassen for å stille spørsmål og sjekke svar:

  • askQuestion(PrintStream): stiller spørsmålet ved å skrive tekst til PrintStream-argumentet. Eventuelle svar-alternativer skal også skrives ut. Nummerer alternativene fra 1 og utover, så det er lettere å skrive inn nummeret som svar.

  • checkAnswer(String answer): sjekker svaret angitt som argument og returnerer true om det er riktig, og false ellers. Dersom spørsmålet har svar-alternativer, så skal det både være lov å skrive svaret og angi nummeret på svar-alternativet (fortsatt som en String). Ta høyde for tilfellet hvor et spørsmål har et tall som riktig svar og har svar-alternativer, slik som i Galdhøpiggen-spørsmålet i eksemplet.

Expand
titleLF

 

 Her får en vist at en kan enkel gjennomgang av liste. Det er viktig å få med seg poenget med at nummereringen starter på 1, mens indekser (om de brukes) i lista starter på 0.

NB: Her var det dessverre mange som ble forvirret av at det ikke var oppgitt noe parameternavn bak PrintStream-typen og heller ikke skjønte at PrintStream fungerte som System.out (som er en PrintStream). Likevel, de burde skjønt at de kunne bruke print/println iht. vedlagte dokumentasjon.

Code Block
themeEclipse
languagejava
 

 

 

 

 

 Oppgave c)

 

Expand
titleLF
 

 Oppgave d)

 

Expand
titleLF
 

 Oppgave e)

 
public void askQuestion(PrintStream out) {
	out.print(question);
	if (options.size() > 0) {
		out.println("Alternativer:");
		int num = 1;
		for (String option : options) {
			out.println(num + ". " + option);
			num++;
		}
	}
}

Her er det viktig at en både får sjekket svaret som indeks i evt. svar-alternativer og som direkte svar. Dette krever riktig kontrollstruktur, inkludert håndtering av evt. unntak. Det er riktignok litt fiklete, så det trekkes ikke mye om det ikke blir helt riktig.

Code Block
themeEclipse
languagejava
public boolean checkAnswer(String answer) {
	if (options.size() > 0) {
		try {
			int num = Integer.valueOf(answer);
			if (this.answer.equals(options.get(num - 1))) {
				return true;
			}
		} catch (IndexOutOfBoundsException e) {
		} catch (NumberFormatException e) {
		}
	}
	return this.answer.equals(answer);
}

 Oppgave c)

 Det er ofte et skjønnspørsmål om en trenger get- og set-metoder og evt. andre metoder for å lese og endre tilstanden i et objekt. Begrunn hvilke slike metoder som trengs (om noen) i Question-klassen og implementer dem.

Expand
titleLF

Generelt er det en fordel å redusere settet med metoder, siden det gir frihet til å endre klasse siden. Når felt initaliseres i en konstruktør, så trengs som oftest ikke set-metoder. Her trenger en heller ikke get-metoder, siden metodene som stiller spørsmål og sjekker svar utgjør et komplett API for klassen.

 Oppgave d)

Quiz-klassen representerer en sekvens med spørsmål. Skriv kode for klassen med metoder for å:

  •   legge til Question-objekter

  •   stille spørsmål med utskrift til skjerm (System.out) og lese inn svar fra tastaturet (System.in) helt til det er svart riktig på hvert spørsmål, omtrent som vist i eksemplet i innledningen.

Expand
titleLF

 Siden det var mange som ikke skjønte (visste) at System.out er en PrintStream, så må en nesten godta litt kreative svar ifm. kallet til askQuestion i run()-metoden.

Code Block
themeEclipse
languagejava
private Collection<Question> questions = new ArrayList<Question>();
public void addQuestion(Question question) {
	questions.add(question);
}
public void run() {
	Scanner scanner = new Scanner(System.in);
	for (Question question : questions) {
		question.askQuestion(System.out);
		while (scanner.hasNextLine()) {
			String answer = scanner.nextLine();
			if (question.checkAnswer(answer)) {
				break;
			}
			System.out.println("Feil, prøv igjen!");
			question.askQuestion(System.out);
		}
	}
	scanner.close();
}

 Oppgave e)

 Skriv nødvendige metoder for å kunne kjøre Quiz-klassen (med noen eksempelspørsmål) som et hovedprogram iht. reglene som Java har for dette. Når man kjører Quiz-klassen, skal altså brukeren bli stilt spørsmålene og få anledning til å svare, omtrent som vist i eksemplet i innledningen.

Expand
titleLF
 
Code Block
 Oppgave f)
theme
 expand
Eclipse
language
titleLF
java
public void init() {
	addQuestion(new Question("Hva heter hovedstaden i Norge?", "Oslo"));
	addQuestion(new Question("Hva slags ost er månen laget av?", "Roquefort", "Camembert", "Roquefort", "Brie"));
	addQuestion(new Question("Hvor høy er Galdhøpiggen?", "2469", "2469", "2471"));
	addQuestion(new Question("Er Java gøy?", "ja"));
}
public static void main(String[] args) {
	Quiz quiz = new Quiz();
	quiz.init();
	quiz.run();
}
 
Expand
titleDel 3 - <tema> (xx%)

 Oppgave a)

 

Expand
titleLF

 

 Oppgave b)

 

Expand
titleLF
 

 Oppgave c)

 

Expand
titleLF
 

 Oppgave d)

 

Expand
titleLF
 

 Oppgave e)

 

Expand
titleLF
 

 Oppgave f)

 

Expand
titleLF
 

...