BufferedReader跳过测试/测验的问题

时间:2013-11-20 04:47:19

标签: java bufferedreader

好吧,所以我正在为我的老师(不是我的计算机科学老师)承担这个小小的个人项目,我正在尝试从一个相当大的问题列表中进行测试。到目前为止,我已经能够在第一个问题中阅读,问答案,并告诉他们是否正确。唯一的问题是,它一遍又一遍地重复同样的问题。

可悲的是,我很难过如何检查程序以查看问题是否得到了解答。我最初的想法是从问题文件中选择“QUESTION#”,将数字分开,将其解析为整数,然后以某种方式使BufferedReader跳过该问题。

这是quizTest:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.Scanner;

public class quizTest {
    public static void main (String[] args) throws IOException{

        BufferedReader reader = null;
        reader = new BufferedReader(new FileReader("C:/Users/Kevin/Desktop/eclipse/WorkspaceCompTIA.ActualTests.220-802.v2012-11-05.by.Caitto.txt/"));

        String line, userAnswer;
        int i = 0;

        Scanner scan = new Scanner(System.in);

        String questionNum = "";
        String question = "", choiceA = "", choiceB = "", choiceC = "", choiceD = "", answer = "";

        while((line = reader.readLine()) != null){

            if(line.contains("?")){
                question = line;
            }

            if(line.contains("A.")){
                choiceA = line;
            }

            if(line.contains("B.")){
                choiceB = line;
            }

            if(line.contains("C.")){
                choiceC = line;
            }

            if(line.contains("D.")){
                choiceD = line;
            }

            if(line.contains("Correct Answer: ")){
                String[] a = line.split(": ");
                answer = a[1];
            }
        }




        while(i < 274){

            quizClass run = new quizClass(i, question, choiceA, choiceB, choiceC, choiceD, answer);

            System.out.print(questionNum);
            System.out.println(run.getQuestion());
            System.out.println();
            System.out.println(run.getChoiceA());
            System.out.println(run.getChoiceB());
            System.out.println(run.getChoiceC());
            System.out.println(run.getChoiceD());
            System.out.println();

            System.out.print("Your Answer: ");
            System.out.println();
            userAnswer = scan.next();

            if(userAnswer.equalsIgnoreCase(answer)){
                System.out.println("Correct!");
                i++;
            }
        }

        if(i == 274){
            reader.close();
            scan.close();
        }
    }
}

这是quizClass:

public class quizClass {

    private String question, answer, choiceA, choiceB, choiceC, choiceD;
    private int questionNum;

    public quizClass(int questionNum, String question, String choiceA, String choiceB,              String choiceC, String choiceD, String answer){
        this.question = question;
        this.answer = answer;
        this.choiceA = choiceA;
        this.choiceB = choiceB;
        this.choiceC = choiceC;
        this.choiceD = choiceD;
    }

    public String getQuestion(){
        return question;
    }

    public String getAnswer(){
        return answer;
    }

    public String getChoiceA(){
        return choiceA;
    }

    public String getChoiceB(){
        return choiceB;
    }

    public String getChoiceC(){
        return choiceC;
    }

    public String getChoiceD(){
        return choiceD;
    }

    public int getQuestionNum(){
        return questionNum;
    }


}

最后这里是问题文件的格式:

http://puu.sh/5nJhS.png enter image description here

编辑:

所以在摆弄它之后,我已经设法让它现在正常工作(我确信有更好的方法可以解决它,但这种方式有效,所以我很高兴:P):

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.Scanner;

public class QuizTest {
public static void main (String[] args) throws IOException{

    String question = "";
    String choiceA = "";
    String choiceB = "";
    String choiceC = "";
    String choiceD = "";
    String answer = "";
    String line;
    String userAnswer;
    int i = 0;
    BufferedReader reader = null;           

        reader = new BufferedReader(new FileReader("C:/Users/Kevin/Desktop/eclipse/Workspace/CompTIA.ActualTests.220-802.v2012-11-05.by.Caitto.txt/"));
        Scanner scan = new Scanner(System.in);

        QuizClass run = new QuizClass(i, question, choiceA, choiceB, choiceC, choiceD, answer);

        while((line = reader.readLine()) != null){

            //Finds the question
            if(line.contains("?")){
                run.question = line;
                System.out.println(run.getQuestion() + "\n");
            }

            //Finds answer "A"
            if(line.contains("A.")){
                run.choiceA = line;
                System.out.println(run.getChoiceA());
            }

            //Finds answer "B"
            if(line.contains("B.")){
                run.choiceB = line;
                System.out.println(run.getChoiceB());
            }

            //Finds answer "C"
            if(line.contains("C.")){
                run.choiceC = line; 
                System.out.println(run.getChoiceC());
            }
            //Finds answer "D"
            if(line.contains("D.")){
                run.choiceD = line;
                System.out.println(run.getChoiceD() + "\n");
            }

            //Finds the correct answer for the question
            if(line.contains("Correct Answer: ")){
                String[] a = line.split(": ");
                answer = a[1];
                run.answer = answer;

                System.out.print("Your Answer: ");
                userAnswer = scan.next();

                    //Checks if the user's input matches the correct answer from the file
                    if(userAnswer.equalsIgnoreCase(answer)){
                        System.out.println("Correct!\n");
                        i++;
                    } 

                    //Checks if the user's input doesn't match the correct answer from the file
                    else if (!userAnswer.equalsIgnoreCase(answer)) {
                        System.out.println("Wrong, the correct answer was: " + run.getAnswer());
                        i++;
                    }

            }


        }

                if(i == 274){
                    reader.close();
                    scan.close();
                }
}
}

2 个答案:

答案 0 :(得分:3)

您正在读取初始while循环中的整个文件并写入变量。因此,为了简化,程序将读取

A. NETSTAT

并将choiceA设置为“A. NETSTAT”。然后它将继续循环,直到它看到

A. Windows XP

然后将choiceA更新为“A. Windows XP”。

最后,它会像你的程序只读最后一个问题。

你应该如何解决这个问题?我的第一个想法是用XML编码你的问题,从中加载一组问题。这是一个不那么笨重的解决方案,但需要更多的基础设施。

如果你想保持目前的设置,你应该有两个循环:一个外循环运行直到达到EOF,一个内循环直到“正确答案”行。

额外提示/评论:

  • 添加一个toString()方法QuizClass(注意标准Java命名方案 - 总是captialize),如下所示:

    public toString() {
      System.out.print(questionNum);
      System.out.println(question);
      System.out.println();
      System.out.println(choiceA);
      System.out.println(choiceB);
      System.out.println(choiceC);
      System.out.println(choiceD);
      System.out.println();
    }
    

然后使用

在main中调用它
System.out.print(run);
    你的QuizClass类中的
  • answer变量什么都不做。您改为在主类中使用另一个变量userAnswer。为什么呢?

  • 什么是274?不要使用没有任何意义的魔法数字。您正在使用的类中可能定义了一个更具信息性的常量。

答案 1 :(得分:0)

我知道,你的答案变量在多行变量声明的长行中一直向右声明 - 请不要这样做。空白是便宜的,所以使用它(但不要过度使用它并牺牲可读性) - 给每个变量自己的行。

至于你的问题,你有两个while循环,在一个,你读入你的数据,但丢弃它,在第二个你尝试使用数据,但不能,因为它已被丢弃。

要解决这个问题,你可以只使用一个while循环,而不是两个。在那个while循环中,读入你的问题数据并对其进行操作,然后循环到下一个。如果你必须使用两个循环,那么你需要先从文件中读入时填充quizClass(ArrayList<quizClass>)的ArrayList,然后在第二个循环中使用for循环,而不是一个while循环(因为您将知道ArrayList的大小),并使用ArrayList第二个循环中保存的quizClass对象来询问您的questino并获得您的答案。