#java #while-loop
#java #while-цикл
Вопрос:
Я чувствую, что почти справился с кодом, но проблема в том, что в цикле while мне не разрешено использовать операторы break и continue для этой программы. Предполагается, что в первом выходном тесте будет 14 вопросов, в которых вы получите 12 правильных и 2 неправильных ответа, что даст вам 86%. Что касается второго теста, вы получаете отличную оценку, в то время как в последнем тесте вам нужно задать 20 вопросов, что является максимальным количеством вопросов, 4 из первых 8 вопросов правильно и 4 из первых 8 неправильно, а затем следующие 12 правильно, что дает вам 80% кода ниже:
package proj3;
import java.util.Scanner;
public class Project4App {
public static void main(String[] args) {
Scanner scnr = new Scanner(System.in);
int correctNum = 0;
int wrongNum = 0;
double percent = 0;
int subNumCorrect = 0;
int subNumWrong = 0;
int addNumCorrect = 0;
int addNumWrong = 0;
int totalQuestions = 0;
while(!(correctNum == 10 amp;amp; totalQuestions == 10) amp;amp; !(percent >= 85.0 amp;amp; totalQuestions >= 10) amp;amp; (totalQuestions != 20)) {
Question Quest = new Question();
System.out.println("What is the result?" "n" Quest.toString());
int userInt = scnr.nextInt();
if((Quest.getOperator() == ' ') amp;amp; (userInt == Quest.determineAnswer())) {
addNumCorrect = 1;
}
else if(Quest.getOperator() == ' ' amp;amp; (userInt != Quest.determineAnswer())) {
addNumWrong = 1;
}
if((Quest.getOperator() == '-') amp;amp; (userInt == Quest.determineAnswer())) {
subNumCorrect = 1;
}
else if((Quest.getOperator() == '-') amp;amp; (userInt != Quest.determineAnswer())) {
subNumWrong = 1;
}
if(userInt == Quest.determineAnswer()){
correctNum = 1;
System.out.println("Congratulations, you got it correct!");
}
else if (userInt != Quest.determineAnswer()){
wrongNum = 1;
System.out.println("The correct answer for " Quest.toString() " is " Quest.determineAnswer());
}
totalQuestions ;
percent = Math.round((double)(correctNum * 100) / (totalQuestions));
}
System.out.println("nProgress Report: " "nAddition:nYou got " addNumCorrect " correct and " addNumWrong " incorrect.");
System.out.println("Progress Report: " "nSubtraction:nYou got " subNumCorrect " correct and " subNumWrong " incorrect.");
System.out.println("The percent correct: " percent "%");
scnr.close();
}
}
Комментарии:
1. Поместите свой код в раздел кода в вашем вопросе, а не в виде изображения.
2. i.stack.imgur.com/4UFVN.png
3. Пожалуйста, разместите свой код здесь как код, а не как ссылку на изображение. И, пожалуйста, используйте interpunction, ваш вопрос очень трудно прочитать.
4. @PaulWhelan добавил код извините, я впервые публикую здесь
5. Не нужно сожалеть, мы все постоянно учимся. Получайте удовольствие от stackoverflow это отличный ресурс для обучения.
Ответ №1:
Я думаю, что это в значительной степени делает то, что вы хотите. Некоторые счетчики не были изменены, как предполагалось. Отчасти это связано с тем, что в вашем основном методе сложно понять, что происходит (слишком много информации). Я извлек функциональность из меньших, более четко определенных методов.
У вас было много логики, эффективно говорящей, что вы хотите, чтобы пользователь достиг 85%, ответив по крайней мере на 10 вопросов, и остановился, когда задано 20 вопросов. Вы могли бы разложить это условие на метод, возвращающий a boolean
isGameComplete(totalQuestions)
, и поместить это в while
выражение условия.
Я взял на себя смелость реализовать класс вопросов на основе функциональности, которая, по моему мнению, достигает цели.
Значение correctPercent
было округлено до int, что сделало невозможным значение == до 85,5%, скажем. Я преобразовал это в double
so, если вы получаете больше, чем 85%
, скажем 85.25%
, игра завершается успешно.
Возможно, я добавил еще что-то, что я пытался прокомментировать в строке, если это важно. Надеюсь, это то, что вам было нужно.
Если это когда-нибудь станет слишком сложным для понимания, извлечение небольших фрагментов кода в хорошо именованные методы (даже длинные) очень помогает, поскольку снижает вашу умственную нагрузку.
class Project4App {
static final Scanner scanner = new Scanner(System.in);
static int correctNum = 0;
static int wrongNum = 0;
static int subNumCorrect = 0;
static int subNumWrong = 0;
static int addNumCorrect = 0;
static int addNumWrong = 0;
static int totalQuestions = 0;
static double percentCorrect = 0;
public static void main(String[] args) {
/**
* answer at least 9/10 questions correctly (to get 85%)
*/
while (percentCorrect < 85.0 amp;amp; totalQuestions >= 10 amp;amp; totalQuestions <= 20) {
Question question = new Question();
int userInt = getUsersAnswer(question);
boolean isCorrect = question.determineAnswer(userInt);
updateStatistics(question, isCorrect);
printResults(); // can remove this/comment this out - added to help with debugging
}
System.out.println();
System.out.println("------------ Game Complete! ------------");
printResults();
}
private static void printResults() {
System.out.println("nProgress Report: " "nAddition:nYou got " addNumCorrect " correct and " addNumWrong " incorrect.");
System.out.println("Progress Report: " "nSubtraction:nYou got " subNumCorrect " correct and " subNumWrong " incorrect.");
System.out.println("The percent correct: (" (addNumCorrect subNumCorrect) "/" totalQuestions ") " percentCorrect "%");
System.out.println("The percent wrong: (" (addNumWrong subNumWrong) "/" totalQuestions ") " (100 - percentCorrect) "%");
}
private static int getUsersAnswer(Question question) {
System.out.println("What is the result?" "n" question.toString());
int userInt = scanner.nextInt();
return userInt;
}
public static void updateStatistics(Question question, boolean isCorrect){
if (question.getOperator() == ' ') {
if (isCorrect) {
addNumCorrect ;
correctNum ; // newly added (wasn't updated)
} else {
addNumWrong ;
wrongNum ; // newly added - unused variable originall
}
} else { // operator is '-'
if (isCorrect) {
subNumCorrect ;
correctNum ; // newly added (wasn't updated)
} else {
subNumWrong ;
wrongNum ; // newly added - unused variable originall
}
}
totalQuestions ; // newly added
percentCorrect = (correctNum * 100) / totalQuestions;
}
}
class Question {
private static final int UPPER_LIMIT_ON_RANDOM_NUMBERS = 20;
private static final Random random = new Random();
private final int number1;
private final int number2;
private final char operator;
public Question() {
operator = Math.random()>0.5 ? ' ' : '-';
number1 = random.nextInt(UPPER_LIMIT_ON_RANDOM_NUMBERS); // NOTE THE SUBTRACTION NUMBER COULD BE NEGATIVE IF number2
number2 = random.nextInt(UPPER_LIMIT_ON_RANDOM_NUMBERS); // IS GREATER THAN number1.
}
public char getOperator() {
return operator;
}
public boolean determineAnswer(int userAnswer) {
switch (operator) {
case ' ':
return userAnswer == (number1 number2);
case '-':
return userAnswer == (number1 - number2);
}
return false; // shouldn't end up here - would be better to throw an unchecked exception and crash the program - new RuntimeException()
}
@Override
public String toString() {
return number1 " " operator " " number2;
}
}
Вывод:
------------ Game Complete! ------------
Progress Report:
Addition:
You got 7 correct and 0 incorrect.
Progress Report:
Subtraction:
You got 2 correct and 1 incorrect.
The percent correct: (9/10) 90.0%
The percent wrong: (1/10) 10.0%