Java-программа, которая учит ребенка простому сложению и вычитанию

#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%