Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  7 1757
Heisann. Jeg sitter og lager en liten quiz applet. Dette programmet er mer teknisk enn noe jeg har prøvd meg på før, så jeg trenger litt veiledning/noen hint til en god løsning. (Jeg er veldig noob på programmering!)

Jeg har rundt 60 spørsmål, og 240 svaralternativer i en tekstfil som ser sånn ut:

Kode

Q1: blablablablabla???
A1: bla
A2: blabla
A3: blablabla
A4: blablablabla

Q2: blabla... osv
Jeg har en klasse med importert Scanner. Jeg har lite erfaring med bruk av både Scanner og BufferedReader(eller hva den nå het!), så jeg vet ikke hvilken som har best til mitt formål(?).

Jeg står altså fast på det å få spørsmålene og svaralternativene fra filen inn i noen JTextArea's som jeg har klare, og å få fil-leseren til å hoppe så så mange linjer ned til neste spørsmål/svar når jeg klikker på knappene, samt å lagre en poengsum.

Jeg ønsker bare noen hint i riktig retning! Jeg liker å løse ting selv, men litt kjedelig å sløse tid på en veldig dårlig løsning mtp min manglende erfaring.
Lag et objekt som inneholder et spørsmål, og en liste med svarene.
Lag så en liste med spørsmåls-objekter

gå gjennom filen med tekst noenlunde slik:
for linje i fil:
hvis første tegn på linjen er Q:
opprett et nytt spørsmålsobjekt, og legg dette til i listen
hvis første tegn på linjen er A:
legg til teksten som svar på de siste spørsmålsobjektet i listen
hvis linjen er blank:
ikke gjør noe som helst

Etter du har iterert gjennom filen har du nå en liste med objekter, hvor hver node i listen er et spørsmål med et tilhørende sett svar.

Det jeg dog heller ville gjort var å lagre dataene på en mer fornuftig måte som gjorde at jeg slapp å parse en tekstfil hver gang applikasjonen startet. For små datamengder som dette er det nok helt greit, men om mengden spørsmål/svar øker blir det treigt i lengden. Det finnes mange måter å gjøre dette på, serializing, bruke en sqlite-database osv.
Jeg ville helle ha laget filen i XML format, og brukt en eller annen XML parser til å lese den.

Eksempel på XML fil:

Kode

<database>
	<question text="What is 2+2">
		<answer index=0 correct=0>2</answer>
		<answer index=1 correct=1>4</answer>
		<answer index=2 correct=0>5</answer>
	</question>
	<question text="what is the capital of Norway">
		[...]
	</question>
	[...]
</database>
Du trenger ikkje å sette den opp på nøyaktig samme måte, men du må lage en god struktur, slik at den er enkel å lese.

Til å lese filen kan du bruke f.eks JAXP

Wikipeida - Java API for XML Processing

Jeg er ikkje noe Java programmerer selv, så det kan finnes bedre alternativer enn JAXP til å lese XML filen i Java.
Sitat av gotejds Vis innlegg
Heisann. Jeg sitter og lager en liten quiz applet. Dette programmet er mer teknisk enn noe jeg har prøvd meg på før, så jeg trenger litt veiledning/noen hint til en god løsning. (Jeg er veldig noob på programmering!)

Jeg har rundt 60 spørsmål, og 240 svaralternativer i en tekstfil som ser sånn ut:

Kode

Q1: blablablablabla???
A1: bla
A2: blabla
A3: blablabla
A4: blablablabla

Q2: blabla... osv
Jeg har en klasse med importert Scanner. Jeg har lite erfaring med bruk av både Scanner og BufferedReader(eller hva den nå het!), så jeg vet ikke hvilken som har best til mitt formål(?).

Jeg står altså fast på det å få spørsmålene og svaralternativene fra filen inn i noen JTextArea's som jeg har klare, og å få fil-leseren til å hoppe så så mange linjer ned til neste spørsmål/svar når jeg klikker på knappene, samt å lagre en poengsum.

Jeg ønsker bare noen hint i riktig retning! Jeg liker å løse ting selv, men litt kjedelig å sløse tid på en veldig dårlig løsning mtp min manglende erfaring.
Vis hele sitatet...
Du kan i utgangspunktet bruke både Scanner og BufferedReader, men for parsing av tekstfiler linje for linje ville jeg brukt BR, ellers er fremgangsmåten moridin postet fin å bruke. XML/SQLite/etc. er bedre å tenke på i seriøse programmer med større datamengder, men er nok unødvendig i ditt tilfelle.

Kode

// Opprett spørsmålsliste
try(BufferedReader br = new BufferedReader(new FileReader(file))) 
{
    String line = null;
    while ((line = br.readLine()) != null) 
    {
        // Hvis linje starter med Qx: 
            // opprett spørsmål og legg i listen.
        // Hvis linje starter med Ax:
            // legg til svar i sist opprettede spørsmål
        // Ellers gjør ingenting.
    }
}
Sist endret av Butterfly; 5. mars 2014 kl. 17:30.
Trådstarter
Dette funket fint, takk skal dere ha. Det har dog oppstått et nytt problem. Er litt usikker på om jeg skal lage en ny tråd på det. Men jeg bare skriver det her og håper på det beste jeg.

Fikk til slutt fil-leseren til å virke, spørsmålet og svaralternativene blir printet inn i tekstområdene der de skal være når jeg trykker "Start Quiz" knappen. Når fil-leseren kommer til en blank linje, har jeg lagt inn et midlertidig "wait()" metodekall. Det er jo her jeg vil at programmet skal vente på at brukeren skal velge svaret sitt, og at fil-leseren skal hoppe til neste linje og begynne på neste spørsmål når en "Neste-spørsmål"-knapp blir trykket på. Til det skal jeg visstnok bruke "notify()" metodekallet, men da får jeg bare noen merkelige errors så langt. Men det er ikke poenget mitt her.

Spørsmålet mitt er ikke nødvendigvis hvordan jeg skal få dette til å virke, men heller om jeg i det hele tatt tenker i riktig bane? Er det tull å prøve seg på denne wait() metoden, eller finnes det andre måter å få programmet til å vente? Finnes det noen helt klart bedre alternativer? Dere kan jo se hvordan det ser ut:

Først av alt, tekstfilen min ser nå slik ut, så jeg kan bruke charAt() for å sjekke om svaret er riktig når jeg kommer så langt at jeg skal begynne å telle poenger.
Eks:

Kode

Q1: Hva er 100+100?
A1: 100
A2: 200
A3: 300
A4: 400
C = 2

Q2: blabla?
A1: .......osv
Og til koden:

Kode

	String line = null;
	
	public void readFile() {
		try(BufferedReader br = new BufferedReader(new FileReader("C:/Users/ALI/workspace/DotaQuiz/src/D2TQ.txt"))){
			char ch;
			char nn;
			char sc; // skal lese en linje for å se om svaret er riktig
			while((line = br.readLine()) != null){
				ch = line.charAt(0);
				nn = line.charAt(1);
				sc = line.charAt(4);
				
				if(ch=='Q'){
					qquestionArea.append(line.substring(3));
				} else if(nn=='1') {
					answerAlts[0].append(line.substring(3));
				} else if(nn=='2') {
					answerAlts[1].append(line.substring(3));
				} else if(nn=='3') {
					answerAlts[2].append(line.substring(3));
				} else if(nn=='4') {
					answerAlts[3].append(line.substring(3));
				} else if(sc=='C') {
					continue; 		//Midlertidig
				} else if(nn==' '){
					br.wait();          //Midlertidig
				} else {
					System.exit(0); 	//Midlertidig
				}
			}
		} catch(IOException | InterruptedException e) {
			printErrorMessage();
			
		}
	}
Ser forresten en klar feil på linjen med "(sc=='C')". Uansett.

Apropos det med objekter er jeg ganske blank, samme med arv. Har en stor jobb å gjøre der.
Sist endret av ali88; 6. mars 2014 kl. 15:13. Grunn: Automatisk sammenslåing med etterfølgende innlegg.
Tror du bør revurdere metoden du løser problemet på, lønner seg å lese inn alle spørsmålene og svarene med en gang. Hvis du har kommet så langt at du skal begynne å lese inn fra fil, håndtere events ol. bør du så absolutt gjøre deg kjent med klasser og objekter (arv kan vente litt, ikke nødvendig i første omgang).

Et superenkelt spørsmåls-objekt kan se slik ut:

Kode

	private class Question
	{
		private String question;
		private String answer;
		
		public Question(String question)
		{
			this.question = question;
		}
		
		public void setAnswer(String answer)
		{
			this.answer = answer;
		}
	}
Gir lite mening å kun ha ett svar, men du kan bruke dette som et utgangspunkt.

Opprett spørmålene når du leser inn tekstfilen og legg de i f.eks en arraylist;

Kode

ArrayList<Question> spm = new ArrayList<>();
Question q1 = new Question("Hvordan går det?");
spm.add(q1);
q1.setAnswer("Bare bra, takk.");
Trådstarter
Er helt enig med deg. Det er best å lære seg det grunnleggende først. Blir bare så gira på å få et resultat.

Takk for hjelpa, kp til deg.
tl;dr: å kalle wait() vil fryse GUI'en din i tillegg til innlesningen fra fil.

For å svare på spørsmålet ditt angående wait() og notify(), disse er metoder som har med "concurrent"-progammering å gjøre og brukes hvis du har flere tråder som må samarbeide. wait() stopper hele programmet hvis du kun har èn tråd gående, den må dessuten brukes i en metode som er "synchronized" dvs. at kun én tråd av gangen har tilgang til den. Anbefaler at du venter en stund med å sette deg inn i tråder o.l..