好吧,所以我正在为我的老师(不是我的计算机科学老师)承担这个小小的个人项目,我正在尝试从一个相当大的问题列表中进行测试。到目前为止,我已经能够在第一个问题中阅读,问答案,并告诉他们是否正确。唯一的问题是,它一遍又一遍地重复同样的问题。
可悲的是,我很难过如何检查程序以查看问题是否得到了解答。我最初的想法是从问题文件中选择“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;
}
}
最后这里是问题文件的格式:
编辑:
所以在摆弄它之后,我已经设法让它现在正常工作(我确信有更好的方法可以解决它,但这种方式有效,所以我很高兴: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();
}
}
}
答案 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);
answer变量什么都不做。您改为在主类中使用另一个变量userAnswer。为什么呢?
什么是274?不要使用没有任何意义的魔法数字。您正在使用的类中可能定义了一个更具信息性的常量。
答案 1 :(得分:0)
我知道,你的答案变量在多行变量声明的长行中一直向右声明 - 请不要这样做。空白是便宜的,所以使用它(但不要过度使用它并牺牲可读性) - 给每个变量自己的行。
至于你的问题,你有两个while循环,在一个,你读入你的数据,但丢弃它,在第二个你尝试使用数据,但不能,因为它已被丢弃。
要解决这个问题,你可以只使用一个while循环,而不是两个。在那个while循环中,读入你的问题数据并对其进行操作,然后循环到下一个。如果你必须使用两个循环,那么你需要先从文件中读入时填充quizClass(ArrayList<quizClass>
)的ArrayList,然后在第二个循环中使用for
循环,而不是一个while
循环(因为您将知道ArrayList的大小),并使用ArrayList第二个循环中保存的quizClass对象来询问您的questino并获得您的答案。