2016-03-26 18 views
0

So bin ich ein Quiz-Programm zu schreiben, die eine ungewisse Anzahl der Fragen in es enthält (in Java) und ich habe Probleme, die folgenden Dinge erreichen:Probleme aus der Datei laden zu Arraylist

1) Laden Quizfrage aus der Datei und in Arraylist speichern und den Zugriff auf sie (die Hilfe benötigen!) 2) richtige Antwort nicht akzeptiert - gibt mir Fehler (logische Fehler) 3) nicht alle Antwortmöglichkeiten angezeigt werden

Hier ist der Code:

import java.io.*; 
import java.util.*; 
import java.text.*; 
import java.math.*; 

public class Quiz { 

public void writeFile() { 
    Question qn = new Question(); 
    try { 
    PrintWriter out = new PrintWriter("quiz.txt"); 
    out.println(qn.Question); 
    out.println(qn.numberOfChoices); 
    qn.answerChoices = new String[qn.numberOfChoices]; 
    for (int i = 0; i < qn.numberOfChoices; i++) { 
     out.println(qn.answerChoices[i]); 
    } 
    out.println(qn.correctAnswer); 
    out.println(qn.numOfTries); 
    out.println(qn.numOfCorrectTries); 
    out.close(); 
    } catch (IOException f) { 
    System.out.println("Error."); 
    } 
    qn.getQuestion(); 
} 

public void readFile() { 
    File file = new File ("quiz.txt"); 
    boolean exists = file.exists(); 
    Quiz q = new Quiz(); 
    Question a = new Question(); 
    List<String> question = new ArrayList<String>(); 
    String[] answerChoices = a.answerChoices; 
    try { 
     if (exists == true) { 
      Scanner s = new Scanner(file); 
      a.Question = s.nextLine(); 
      a.numberOfChoices = s.nextInt(); 
      a.answerChoices = new String[a.numberOfChoices]; 
      for (int i = 0; i < a.numberOfChoices; i++) { 
       a.answerChoices[i] = s.nextLine(); 
      } 
      s.nextLine(); 
      a.correctAnswer = s.nextInt(); 
      a.numOfTries = s.nextInt(); 
      a.numOfCorrectTries = s.nextInt(); 
      a.getQuestion(); 
     } else { 
      q.writeFile(); 
     } 
    } catch (IOException e) { 
     System.out.println("File not found."); 
    } 
} 

public static void main (String[] args) { 
    Scanner in = new Scanner(System.in); 
    Quiz qz = new Quiz(); 
    Question b = new Question(); 
    int Selection; 
    List<String> question = new ArrayList<String>(); 

    System.out.println("Welcome to the Quiz Program! Good luck!"); 
    do { 
     qz.readFile(); 
     System.out.println("Your answer?: "); 
     Selection = in.nextInt(); 
     if (Selection == b.correctAnswer) { 
      b.numOfCorrectTries++; 
      b.getQuestion(); 
     } else { 
      b.getQuestion(); 
     } 
    } while (Selection < b.numberOfChoices); 
    while (Selection > b.numberOfChoices || Selection < 0) { 
     System.out.println("Error. Try again"); 
     System.out.println("Your answer?: "); 
     Selection = in.nextInt(); 
    } 
    } 
} 

und die Frage Klasse:

import java.io.*; 
import java.util.*; 
import java.text.*; 
import java.math.*; 

public class Question { 

int correctAnswer; 
int numOfTries; 
int numOfCorrectTries; 
int numberOfChoices; 
String Question; 
String[] answerChoices; 

public Question() { 

} 
public void getQuestion() { 
    System.out.println("Question: " + Question); 
    System.out.println("Answer: "); 
    for (int i = 0; i < numberOfChoices; i++) { 
     System.out.println(answerChoices[i]); 
    } 
} 

public double getPercentageRight() { 
    double percentageRight = (numOfCorrectTries/numOfTries) * 100; 
    percentageRight = Math.round(percentageRight * 100); 
    percentageRight = percentageRight/100; 
    return percentageRight; 
} 
} 

QUIZ.TXT:

How many licks does it take to get to the tootsie roll center of a 
tootsie pop? 
4 
one 
two 
three 
four 
2 
14 
5 
What is your name? 
3 
Arthur, King of the Britons 
Sir Lancelot the Brave 
Sir Robin the Not-Quite-So-Brave-As-Sir Lancelot 
0 
14 
6 
Who's on first? 
5 
What 
Why 
Because 
Who 
I don't know 
3 
14 
7 
Which of the following is a terror of the fire swamp? 
4 
Lightning sand 
Flame spurt 
R.O.U.S. 
All of the above 
3 
14 
4 
Who is the all-time greatest pilot? 
6 
Manfred von Richthofen 
Chuck Yeager 
Hiraku Sulu 
Luke Skywalker 
Kara Thrace 
Charles Lindbergh 
4 
14 
9 
+0

Erhalten Sie irgendwelche Fehler, wenn dieser Code ausgeführt wird? –

+0

Ich bekomme keine Runtime oder Compiler Fehler für jetzt. Es zeigt nur nicht alle Optionen an, wenn ich die Frage lade. es gibt mir auch Fehler, wenn ich die richtige Antwort gebe. also im Wesentlichen ein logischer Fehler. – ABY

+0

Können Sie eine Beispieldatei 'quiz.txt' hinzufügen? – apicellaj

Antwort

1

Einige Fragen:

Ihre List<String> question = new ArrayList<String>(); sollte stattdessen so etwas wie List<Question> questionBank = new ArrayList<Question>(); sein, da alles als String halten (anstelle eines Frage-Objekt) wäre wesentlich unordentlicher. Der Name questionBank ist auch beschreibender als question beim Lesen des Codes. Ich würde auch empfehlen, die questionBank als eine Klassenvariable, so dass es leicht zugänglich in Ihrer Quiz Klasse ist.

Sie fügen die Fragen nie zu Ihrer ArrayList hinzu, aber ich vermute, dass Sie das bereits wissen, und es war nur niedrige Priorität bei der Behebung der anderen Probleme.

Ihre Question Klasse ist auch ein bisschen unkonventionell. Ein besserer Weg, es zu strukturieren könnte wie folgt sein:

public class Question { 

    private int correctAnswer; 
    private int numOfTries; 
    private int numOfCorrectTries; 
    private String question; 
    private String[] answerChoices; 

    public Question(String question, String[] answerChoices, 
      int correctAnswer, int numOfTries, int numOfCorrectTries) { 
     this.question = question; 
     this.answerChoices = answerChoices; 
     this.correctAnswer = correctAnswer; 
     this.numOfTries = numOfTries; 
     this.numOfCorrectTries = numOfCorrectTries; 
    } 

    public void getQuestion() { 
      System.out.println("Question: " + question); 
      System.out.println("Answer: "); 
      for (int i = 0; i < answerChoices.length; i++) { 
       System.out.println(answerChoices[i]); 
      } 
    } 

    public double getPercentageRight() { 
     double percentageRight = (numOfCorrectTries/numOfTries) * 100; 
     percentageRight = Math.round(percentageRight * 100); 
     percentageRight = percentageRight/100; 
     return percentageRight; 
    } 

} 

ich die Variable für numberOfChoices entfernt, da diese die gleiche wie answerChoices.length ist. Ich habe auch Ihre Question in question umbenannt, da Variablen in Java normalerweise camelCase folgen. Ich bin mir nicht sicher, wofür die anderen Methoden sind oder wie sie die Ausgabe anzeigen sollen, also habe ich sie meistens in Ruhe gelassen.

Zum Lesen in eine Datei denke ich, dass Sie etwas Ähnliches tun können, was Sie haben, aber ich poste den Code, der dem neuen Konstruktor für die Klasse Question entspricht.

private void addQuestions() { 
    File quizText = new File("quiz.txt"); 
    try { 
     Scanner fileIn = new Scanner(quizText); 
     while (fileIn.hasNextLine()) { 
      String question = fileIn.nextLine(); 
      int numberOfAnswers = fileIn.nextInt(); 
      fileIn.nextLine(); 
      String[] answers = new String[numberOfAnswers]; 
      for (int i = 0; i < numberOfAnswers; i++) { 
       answers[i] = fileIn.nextLine(); 
      } 
      int correctAnswer = fileIn.nextInt(); 
      int numOfTries = fileIn.nextInt(); 
      int numOfCorrectTries = fileIn.nextInt(); 
      fileIn.nextLine(); 
      Question nextQuestion = 
       new Question(question, answers, correctAnswer, numOfTries, numOfCorrectTries); 
      questionBank.add(nextQuestion); 
     } 
     fileIn.close(); 
    } catch (IOException e){ 
     e.printStackTrace(); 
     System.out.println("File Not Found."); 
     return; 
    } 
} 

Ich habe auch die Variablen privat, aber Sie können einen benutzerdefinierten Getter erstellen für sie, um sie zu verhindern, dass (und/oder geändert) direkt zugegriffen wird, von außen. Mit diesem Code konnte ich eine Fragenbank mit allen fünf Fragen erstellen und die richtige Antwort zusammen mit allen möglichen Entscheidungen anzeigen, so dass sie hoffentlich in die richtige Richtung weist.

+0

Ich benutze Liste questionBank = neue Liste questionBank, aber es gibt ein Argument Mismatch, wie würde ich dieses Problem lösen? Und außerdem lade ich die Fragen aus einer Datei erfolgreich und ihre Antwortmöglichkeiten und Zeug, aber ich bin mir nicht sicher, wie man sie in der ArrayList speichert und/oder auf sie von der ArrayList zugreift. Ich frage mich, wie man das erfolgreich macht – ABY

+0

Da Sie eine ArrayList wollen, sollten Sie es wie folgt initialisieren: Liste questionBank = new ArrayList <>(); 'Und ich empfehle dringend, es zu einer Klassenvariablen zu machen 'addQuestions()' Methode. Mit der oben beschriebenen Methode werden die 'Question'-Objekte in der' ArrayList' gespeichert. Wenn Sie auf die Informationen aus der Klasse "Question" zugreifen möchten, müssen Sie Methoden innerhalb dieser Klasse erstellen. – apicellaj

+0

Ich tat, aber was wäre, wenn ich das in meine Quiz-Klasse statt in meine Question-Klasse einfügen wollte? – ABY

0

Ich habe Sie Quiz Klasse. In meinem Beispiel werden alle oben genannten Fragen beantwortet. Ich werde sie einzeln erklären.

public class Quiz { 

List<Question> question = new ArrayList<Question>(); 

public void writeFile() { 
    Question qn = new Question(); 
    try { 
     PrintWriter out = new PrintWriter("quiz.txt"); 
     out.println(qn.Question); 
     out.println(qn.numberOfChoices); 
     qn.answerChoices = new String[qn.numberOfChoices]; 
     for (int i = 0; i < qn.numberOfChoices; i++) { 
      out.println(qn.answerChoices[i]); 
     } 
     out.println(qn.correctAnswer); 
     out.println(qn.numOfTries); 
     out.println(qn.numOfCorrectTries); 
     out.close(); 
    } catch (IOException f) { 
     System.out.println("Error."); 
    } 
    qn.getQuestion(); 
} 

public void readFile() { 
    File file = new File("quiz.txt"); 
    boolean exists = file.exists(); 
    Quiz q = new Quiz(); 
    Question a = new Question(); 
    String[] answerChoices; 
    try { 
     if (exists == true) { 
      Scanner s = new Scanner(file); 
      String line = ""; 
      while (s.hasNextLine()) { 
       line = s.nextLine(); 
       if (line.startsWith("---")) { 
        a = new Question(); 
        a.Question = line.substring(4); 
       } else if (line.startsWith("choices : ")) { 
        a.numberOfChoices = Integer.parseInt(line.substring(10).trim()); 
        a.answerChoices = new String[a.numberOfChoices]; 
        for (int i = 0; i < a.numberOfChoices; i++) { 
         a.answerChoices[i] = s.nextLine(); 
        } 
       } else if (line.startsWith("correct answer : ")) { 
        a.correctAnswer = Integer.parseInt(line.substring(17).trim()); 

       } else if (line.startsWith("No of Tries : ")) { 
        a.numOfTries = Integer.parseInt(line.substring(14).trim()); 

       } else if (line.startsWith("No of correct Tries : ")) { 
        a.numOfCorrectTries = Integer.parseInt(line.substring(22).trim()); 
        question.add(a); 
       } 
      } 
     } else { 
      q.writeFile(); 
     } 
    } catch (IOException e) { 
     System.out.println("File not found."); 
    } 
} 

public static void main(String[] args) { 
    Quiz qz = new Quiz(); 
    qz.readFile(); 
    Question b = new Question(); 
    int selection; 

    //real program starts here 
    System.out.println("Welcome to the Quiz Program! Good luck!"); 
    System.out.println("****************************************"); 

    b = qz.question.get(2); // you can implement how your questions are taken from list of questions 
    b.getQuestion(); 
    Scanner in = new Scanner(System.in); 
    System.out.print("Your answer?: "); 
    selection = in.nextInt(); 

    if (selection == b.correctAnswer) { 
     b.numOfCorrectTries++; 
     System.out.println("Correct answer"); 

    } else { 
     System.out.println("Incorrect answer"); 
    } 
} 

} 

1) Laden Quizfrage aus der Datei und in Arraylist speichern und den Zugriff auf (Hilfe braucht!)

Statt

List<String> question = new ArrayList<String>(); 

Verwendung unten als Klassenvariable verwenden. So können Sie sie in Ihrer Klasse zugreifen überall

List<Question> question = new ArrayList<Question>(); 

2) richtige Antwort nicht akzeptiert - gibt mir Fehler (logische Fehler)

Logik im Hauptblock korrigiert wird.

3) nicht alle Antwortmöglichkeiten angezeigt werden

Re-hast du readfile() -Methode. Um jedoch mit dieser Logik Erfolg zu haben, müssen Sie Ihre quiz.txt wie unten beschrieben neu erstellen.

--- How many licks does it take to get to the tootsie roll center of a tootsie pop? 
choices : 4 
one 
two 
three 
four 
correct answer : 2 
No of Tries : 14 
No of correct Tries : 5 
--- What is your name? 
choices : 3 
Arthur, King of the Britons 
Sir Lancelot the Brave 
Sir Robin the Not-Quite-So-Brave-As-Sir Lancelot 
correct answer : 0 
No of Tries : 14 
No of correct Tries : 6 
--- Who's on first? 
choices : 5 
What 
Why 
Because 
Who 
I don't know 
correct answer : 3 
No of Tries : 14 
No of correct Tries : 7 
--- Which of the following is a terror of the fire swamp? 
choices : 4 
Lightning sand 
Flame spurt 
R.O.U.S. 
All of the above 
correct answer : 3 
No of Tries : 14 
No of correct Tries : 4 
--- Who is the all-time greatest pilot? 
choices : 6 
Manfred von Richthofen 
Chuck Yeager 
Hiraku Sulu 
Luke Skywalker 
Kara Thrace 
Charles Lindbergh 
correct answer : 4 
No of Tries : 14 
No of correct Tries : 9 

Hinweis: Auswahl der Frage basiert auf

b = qz.question.get(2); 

in der main(). Um ein Fragenpapier basierend auf zufällig ausgewählten Fragen zu erstellen, können Sie eine separate Methode erstellen und Fragen von dieser Methode abfragen. Siehe Math.random() weiter.

Auch besser eine XML-Datei anstelle von TXT für diese Art von Anwendungen zu erstellen. Google für "Java und XML"

Ich hoffe, dies hilft.

Verwandte Themen