Loop Statement Logic - PullRequest
       29

Loop Statement Logic

2 голосов
/ 08 марта 2012

Я пытался закодировать эту программу часами, поэтому, пожалуйста, держите меня в покое.Я даже разбил циклы по отдельности, но как только я собрал все воедино, он не работает так, как мне нужно.

Итак, позвольте мне разбить то, что мне нужно, чтобы каждый цикл делал, и затем какой у меня выходполучение:

1) Первый цикл, который мне нужно использовать, это do / while.В этом цикле пользователю предлагается ввести слово.Если пользователь вводит неправильное слово, он получает сообщение об ошибке:

Invalid!Попробуйте снова!Осталось 2 попытки!

Неверно!Попробуйте снова!Осталось 1 попытка!

Извините!У вас больше нет попыток!

Этот вывод работает до тех пор, пока каждый раз вводится неправильное слово, но если правильное слово вводится после 1 неудачной попытки, оно по-прежнему применяет сообщение об ошибке

2) В моем втором цикле (для цикла) пользователю предлагается ввести "3 * 8 =". Эта часть цикла работает нормально, если все 3 раза введено неправильное числоили если 24 вводится при любой попытке.

Проблема заключается в цикле после ввода 24.Вывод следующий:

Спасибо, бла-бла.Мы позвоним вам по номеру 5555555555, если вы выиграли. 3 * 8 = Там, где 3 * 8 не должно отображаться.Я понимаю, что могу войти в перерыв;после этого утверждения, но в инструкциях конкретно сказано, что я не могу использовать команду прерывания.

Правильный вывод должен выглядеть так: Спасибо, бла-бла.Мы позвоним вам по номеру 5555555555, если вы выиграете.

public static void main(String[] args)
{
    Scanner input = new Scanner(System.in);

    int attempt = 2;
    int answer = 24;
    long phoneNumber = 0;
    String firstName = "";
    String lastName = "";
    String wordOfTheDay = "";

    System.out.printf("Enter the word of the day:  ");
    wordOfTheDay = input.nextLine();

    if(wordOfTheDay.equals("tired"))
    {
        for( attempt = 2; attempt >= 0; --attempt)
        {
            System.out.print(" 3 * 8 = ");
            answer = input.nextInt();
            input.nextLine();

            if( answer == 24)
            {
                System.out.printf( "Please enter your first name, last name, and phone number (no dashes or spaces)\n"                              +"in a drawing for an all-expenses-paid vacation in the Bahamas: " );

                firstName = input.next();
                lastName = input.next();
                phoneNumber = input.nextLong();

                System.out.printf(
                    "Thank you %s %s. We'll call you at %d if you're a winner.",
                    firstName,
                    lastName,
                    + phoneNumber);
            }

            else if( answer != 24)
            {
                if(attempt!=0)
                {
                    System.out.printf( "Invalid! Try Again! %d attempt(s) left!\n ", attempt);
                    continue;
                }
                else
                {
                    System.out.print( "Sorry!  You have no more attempts left!" );
                }
            }
        }
    }
    else
    {
        do
        {
            System.out.printf( "Invalid! Try Again! %d attempt(s) left!\n ", attempt);
            --attempt;
            System.out.printf("Enter the word of the day:  ");
            wordOfTheDay = input.nextLine();
        } while (attempt >= 1);

        if( attempt == 0)
        {
            System.out.print( "Sorry!  You have no more attempts left!" );
        }
    }
}

Надеюсь, я достаточно ясно дал понять.

Напомним, мне нужно исправить проблему с моим do /, не давая мне ввести правильное слово после неудачной попытки.

Кроме того, мне нужно избавиться от 3 * 8= появляется после того, как пользователи вводят правильный ввод.

Спасибо!

Ответы [ 8 ]

2 голосов
/ 08 марта 2012

Попробуйте разбить все это на очень маленькие функции, которые выполняют одну конкретную вещь каждая.Например, у вас может быть функция, которая просто проверяет, является ли слово правильным, возвращает 0, если оно есть, или количество попыток, если это не так.

private int checkWord(String correctWord, String wordToCheck, int attempts)
{
    if(wordToCheck.equals(correctWord))
    {
        return 0;
    }
    return attempts;
}

Затем можно выполнитьфункция, которая принимает пользовательский ввод и вызывает эту функцию для проверки указанного ввода.Затем он может вывести сообщение об ошибке в зависимости от кода возврата предыдущей функции.Затем функция возвращает код, который сообщает функции над ней ситуацию.

public int checkWordVerbose(String question, String correctWord, int attempts)
{
    if(attempts <= 3)
    {
        Scanner scan = new Scanner(System.in);
        System.out.print(question);
        String input = scan.nextLine();
        int failureCode = checkWord(correctWord, input, attempts);

        if(failureCode == 0)
        {
            return 0;
        } 
        else
        {
            System.out.println("Invalid! Attempts left: " + (3 - failureCode));
            return 1;
        }
    }
    else
    {
        System.out.println("Sorry! You have no more attempts left!\n");
        return 2;
    }
}

Наконец, вы можете создать функцию, которая просто содержит цикл и содержит логику для поддержания этого цикла:

public int checkWord(String correctWord)
{
    int failureCode = 1;
    int attempts = 1;
    do
    {
        failureCode = checkWordVerbose("Enter the word of the day: ", correctWord, attempts);
        attempts++;
    } while(failureCode == 1);
    return failureCode;
}

Затем на главном все, что вам нужно сделать, это проверить, вернул ли checkWord(String correctWord) 0. Повторите то же самое для другой проверки (или вы можете даже использовать некоторые из тех же функций), выполняя другуюесли внутри первого, например:

if(checkWord("tired") == 0)
{
    if(checkMath("24") == 0)
    {
        // Success!
    }
}
2 голосов
/ 08 марта 2012

Я думаю, вы пытаетесь это сделать.!

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {

        Scanner input = new Scanner(System.in);

        int answer = 0;
        long phoneNumber = 0;
        String firstName = "";
        String lastName = "";
        String wordOfTheDay = "";

        int mainMenuAttempt = 3;
        do {
            System.out.printf("Enter the word of the day:  ");
            wordOfTheDay = input.nextLine();

            if (wordOfTheDay.equals("tired")) {

                int answerAttempt = 3;
                do {
                    System.out.print(" 3 * 8 = ");
                    answer = input.nextInt();
                    input.nextLine();
                    answerAttempt--;

                    if (answer != 24 && answerAttempt >0)
                        System.out.printf(
                                "Invalid! Try Again! %d attempt(s) left!\n ",
                                answerAttempt);

                } while (answerAttempt >0 && answerAttempt < 3 && answer != 24);

                if (answer == 24) {
                    System.out
                            .printf("Please enter your first name, last name, and phone number (no dashes or spaces)\n"
                                    + "in a drawing for an all-expenses-paid vacation in the Bahamas: ");

                    firstName = input.next();
                    lastName = input.next();
                    phoneNumber = input.nextLong();

                    System.out
                            .printf("Thank you %s %s. We'll call you at %d if you're a winner.",
                                    firstName, lastName, +phoneNumber);
                }

            }

            mainMenuAttempt--;

        } while (mainMenuAttempt >0 && mainMenuAttempt < 3 && !wordOfTheDay.equals("tired") && answer!=24);
        System.exit(0);
    }
}
1 голос
/ 08 марта 2012

Обычно вы используете оператор break, но, поскольку вам не разрешено, настройка attempt = -1 будет иметь тот же эффект:

if( answer == 24)
{
    ...
    attempt = -1; // An ugly 'break'
}

РЕДАКТИРОВАТЬ:

Переместить do { } while(); до if проверка:

    // These two lines of code are no longer required.
    //System.out.printf("Enter the word of the day:  ");
    //wordOfTheDay = input.nextLine();

    do
    {
        System.out.printf("Enter the word of the day:  ");
        wordOfTheDay = input.nextLine();

        if(!wordOfTheDay.equals("tired"))
        {
            System.out.printf(
                "Invalid! Try Again! %d attempt(s) left!\n ", --attempt);
        }
        else
        {
            attempt = 0; // Another ugly 'break'
        }
    } while (attempt >= 1);


    if(wordOfTheDay.equals("tired"))
    {
    }
    // Remove else branch as not required.
1 голос
/ 08 марта 2012

Если я что-то не упустил, вы ждете первого ввода, и если он не верен, вы идете в цикле do-while и затем никогда больше не проверяете правильность ввода.

Вы должны переместить if внутри цикла do-while:

public static void main(String[] args) {

    Scanner input = new Scanner(System.in);

    int attempt = 2;
    int answer = 24;
    long phoneNumber = 0;
    String firstName = "";
    String lastName = "";
    String wordOfTheDay = "";

    System.out.printf("Enter the word of the day:  ");
    wordOfTheDay = input.nextLine();
    do {
        if (wordOfTheDay.equals("tired")) {

            for (attempt = 2; attempt >= 0; --attempt) {
                System.out.print(" 3 * 8 = ");
                answer = input.nextInt();
                input.nextLine();

                if (answer == 24) {
                    System.out
                            .printf("Please enter your first name, last name, and phone number (no dashes or spaces)\n"
                                    + "in a drawing for an all-expenses-paid vacation in the Bahamas: ");

                    firstName = input.next();
                    lastName = input.next();
                    phoneNumber = input.nextLong();

                    System.out
                            .printf("Thank you %s %s. We'll call you at %d if you're a winner.",
                                    firstName, lastName, +phoneNumber);
                }

                else if (answer != 24) {

                    if (attempt != 0) {

                        System.out
                                .printf("Invalid! Try Again! %d attempt(s) left!\n ",
                                        attempt);
                        continue;
                    } else {

                        System.out
                                .print("Sorry!  You have no more attempts left!");
                    }
                }

            }

        } else {

            System.out.printf("Invalid! Try Again! %d attempt(s) left!\n ",
                    attempt);
            System.out.printf("Enter the word of the day:  ");
            wordOfTheDay = input.nextLine();
            if (!wordOfTheDay.equals("tired")) --attempt;

        }

    } while (attempt >= 1);

    if (attempt == 0) {

        System.out.print("Sorry!  You have no more attempts left!");
    }

    System.exit(0);

}
0 голосов
/ 08 марта 2012

Вам лучше использовать разрыв, чтобы выпрыгнуть из цикла. В противном случае цикл продолжится, выведите «3 * 8 =» и дождитесь ввода. Если вы не хотите использовать перерыв, сделайте попытку = -1 также имеет смысл.

if( answer == 24)
         {
            System.out.printf( "Please enter your first name, last name, and phone number (no dashes or spaces)\n"                              +"in a drawing for an all-expenses-paid vacation in the Bahamas: " );

        firstName = input.next();
        lastName = input.next();
        phoneNumber = input.nextLong();
        attempt = -1;
        System.out.printf( "Thank you %s %s. We'll call you at %d if you're a winner.", firstName, lastName,                                + phoneNumber);

         }
0 голосов
/ 08 марта 2012

этот код неполон, но у него есть тот идеал, который вам нужен.попробуйте,

boolean firstTry = true;логическое keepLooping = true;

do
    {
    if(!firstTry){
            System.out.printf( "Invalid! Try Again! %d attempt(s) left!\n ", attempt);
    }

        System.out.printf("Enter the word of the day:  ");
        wordOfTheDay = input.nextLine();
    if(wordOfTheDay.equals("hey!")){
        keepLooping = false;
    }
    --attempt;
    } while (attempt >= 1 && keepLooping);
0 голосов
/ 08 марта 2012

Ну, очевидно, вы должны разорвать внешний цикл.

Когда у вас есть правильный ответ (то есть 'answer == 24') в блоке if, установите для некоторой логической переменной 'haveAnswer' значение 'true' (которая инициализируется как 'false' и проверьте внешний цикл перед 'System .out.print ("3 * 8 ="); 'for' if (haveAnswer) {break;} '

 enter code here`public static void main(String[] args)
 {

 Scanner input = new Scanner(System.in);

int attempt = 2;
int answer = 24;
long phoneNumber = 0;
String firstName = "";
String lastName = "";
String wordOfTheDay = "";


System.out.printf("Enter the word of the day:  ");
wordOfTheDay = input.nextLine();

if(wordOfTheDay.equals("tired"))
{
    boolean haveAnswer = false;
    for( attempt = 2; attempt >= 0; --attempt)
      {
        if (haveAnswer)
            break;
        System.out.print(" 3 * 8 = ");
        answer = input.nextInt();
        input.nextLine();

      if( answer == 24)
         {
            System.out.printf( "Please enter your first name, last name, and phone number (no dashes or spaces)\n"                              +"in a drawing for an all-expenses-paid vacation in the Bahamas: " );

        firstName = input.next();
        lastName = input.next();
        phoneNumber = input.nextLong();

        System.out.printf( "Thank you %s %s. We'll call you at %d if you're a winner.", firstName, lastName,                                + phoneNumber);

          haveAnswer = true;
          break;
         }

        else if( answer != 24)
        {

            if(attempt!=0)
            {

                System.out.printf( "Invalid! Try Again! %d attempt(s) left!\n ", attempt);
                    continue;
            }
            else
            {

                System.out.print( "Sorry!  You have no more attempts left!" );
            }
       }

     }

}
else
{
do
{

    System.out.printf( "Invalid! Try Again! %d attempt(s) left!\n ", attempt);
    --attempt;
    System.out.printf("Enter the word of the day:  ");
    wordOfTheDay = input.nextLine();
} while (attempt >= 1);


  if( attempt == 0)
  {

     System.out.print( "Sorry!  You have no more attempts left!" );
  }
}

System.exit(0);

}
}
0 голосов
/ 08 марта 2012

Когда вы получите правильный результат, вам нужно выйти из цикла. это делается с помощью оператора break:

if( answer == 24)
{
    System.out.printf( "Please enter your first name, last name, and phone number (no dashes or spaces)\n" +"in a drawing for an all-expenses-paid vacation in the Bahamas: " );
    firstName = input.next();
    lastName = input.next();
    phoneNumber = input.nextLong();
    System.out.printf( "Thank you %s %s. We'll call you at %d if you're a winner.", firstName, lastName,                                + phoneNumber);
    break;
    // that's the break statement
}
...