Я пишу программу на Java, которая предназначена для воспроизведения версии 20 вопросов с пользователем на основе их ввода - PullRequest
0 голосов
/ 21 февраля 2019

Для этого я использую множество вложенных операторов if / else.

У меня есть три основных ветви (живое животное, живое растение, неживое существо), и у каждого из них есть несколько ветвей.Делая это как 60 разных решений.

У меня много проблем с тем, чтобы заставить его взаимодействовать и контролировать все операторы if / else.У меня пока нет большого кода для этого из-за необходимости перезапуска, но в настоящее время я нахожусь на:

System.out.println("Think of Something");
System.out.println("Is it a living animal, living plant, or non-living thing? ");
String user = get.nextLine();

if (user.equals("living animal")); { 
    //starts animal tree
    System.out.println("Does it have feathers, fur, or neither?");
    String user2 = get.nextLine();

    if (user2.equals("feathers")); {
        System.out.println("is it bigger than a soccer ball?");
    }
} else if (user2.equals("fur")); {
    System.out.println("is it domesticated?");
    // end animal tree
} else if (user.equals("living plant")); { 
    // start plant tree
    System.out.println("is it a tree?");
    }
} // end method
} //end program

Ответы [ 3 ]

0 голосов
/ 21 февраля 2019

В качестве примера того, как можно решить сложную проблему.Это не значит быть готовой к использованию программой для запуска из коробки.

Ее задача - ответить на вопрос, как упростить вещи, когда «возникают большие проблемы, заставляя их взаимодействовать, и контролировать всезаявления if / else. "Стратегия для таких случаев, если хотите.

Также я немного переусердствовал для демонстрации.На практике вы делаете то, что кажется удобным.Кроме того: я сделал все статичным для простоты - во взрослом приложении вы наверняка вместо этого будете использовать экземпляры.

Шаг 1: Вы начинаете с очень простого фрейма класса.Простота является ключевым.Не вкладывайте в это много.Просто набросайте то, что, как вы знаете, вы хотите, чтобы он делал:

public class TwentyQuestions{       
   static void mainQuestioning(){
        System.out.println("Is it a living animal, living plant, or non-living thing? ");
        String  user = get.nextLine();
        switch(user){
            case "living animal" :
                askLivingAnimalQuestions();
            break;
            case "living plant":
                askLivingPlantQuestions();
            break;
            case "non-living":
                askNoneLivingQuestions();
            break;
            default:
                handleWrongInput();
        }
    }     
 }

Конечно, эта вещь не скомпилируется, поскольку детали до сих пор не реализованы (некоторые методы отсутствуют) - Но обратите внимание, как проблема имеетупростили много (без вложенных если), и, скорее всего, вы можете сразу увидеть, что он должен делать.Проще говоря, это ключ к успеху.

Шаг 2: Теперь вы можете легко создавать методы, которые вы набросали до сих пор.Давайте сделаем это:

public class TwentyQuestions{
   static void handleWrongInput(){
      System.err.println("I am no longer playing with you as you don't answer my question properly");
      System.exit(1);
   }
   static void askLivingAnimalQuestions(){
       System.out.println("Does it have feathers, fur, or neither?");
       String  user = get.nextLine();
       switch(user){
          case "feathers":
              askLivinAnimalWithFeathersQuestions();
          break;
          case  "fur":
               askLivinAnimalWithFurQuestions();
          break;
          default:
              handleWrongInput();
       }
   }
   static void askLivingPlantQuestions(){
       System.out.println("is it a tree?");
       String  user = get.nextLine();
       if("yes".equals(user)){
           System.out.println("So its a tree!");
           return;
       }
   }
   static void  askNoneLivingQuestions(){
     System.out.println("WhateverNoneLivingQuestion ?");
       String  user = get.nextLine();
       switch(user){
         //add possible responses here.
         default:
            handleWrongInput(); 
       }
   }

   static void mainQuestioning(){
        System.out.println("Is it a living animal, living plant, or non-living thing? ");
        String  user = get.nextLine();
        switch(user){
            case "living animal" :
                askLivingAnimalQuestions();
            break;
            case "living plant":
                askLivingPlantQuestions();
            break;
            case "non-living":
                askNoneLivingQuestions();
            break;
            default:
                handleWrongInput();
        }
    }     
 }

Теперь я решил проблему еще больше.Но он все равно / снова не скомпилируется, потому что отсутствуют методы для животных с мехом и животных с перьями.

Шаг 3: Реализуйте их также:

public class TwentyQuestions{
   static void handleWrongInput(){
      System.err.println("I am no longer playing with you if you don't answer my question properly");
      System.exit(1);
   }
   static void  askLivinAnimalWithFeathersQuestions(){
      System.out.println("is it bigger than a soccer ball?");
      String  user = get.nextLine();
      //don't know how you want to continue;
      //....
   }
   static void askLivinAnimalWithFurQuestions(){
       System.out.println("is it domesticated?");
       String  user = get.nextLine();
      //don't know how you want to continue;
      //.... 
   } 
   static void askLivingAnimalQuestions(){
       System.out.println("Does it have feathers, fur, or neither?");
       String  user = get.nextLine();
       switch(user){
          case "feathers":
              askLivinAnimalWithFeathersQuestions();
          break;
          case  "fur":
               askLivinAnimalWithFurQuestions();
          break;
          default:
              handleWrongInput();
       }
   }
   static void askLivingPlantQuestions(){
       System.out.println("is it a tree?");
       String  user = get.nextLine();
       if("yes".equals(user)){
           System.out.println("So its a tree!");
           return;
       }
   }
   static void  askNoneLivingQuestions(){
     System.out.println("WhateverNoneLivingQuestion ?");
       String  user = get.nextLine();
       switch(user){
         //add possible responses here.
         default:
            handleWrongInput(); 
       }
   }

   static void mainQuestioning(){
        System.out.println("Is it a living animal, living plant, or non-living thing? ");
        String  user = get.nextLine();
        switch(user){
            case "living animal" :
                askLivingAnimalQuestions();
            break;
            case "living plant":
                askLivingPlantQuestions();
            break;
            case "non-living":
                askNoneLivingQuestions();
            break;
            default:
                handleWrongInput();
        }
    }     
 }

Обратите внимание, как исчезли все ваши вложенные if / else, которые вызвали у вас проблемы.

финиш: Теперь, если вы дополнительно реализуете пропущенный опрос и добавляете сканер "get", который инициализируется в главном (аргументы String []), вы должны быть там.Это должно быть легко сейчас.

Хорошо .. Это, вероятно, дает вам много методов для 20 вложенных вопросов: это связано с количеством возможных вариантов.Вы должны разобраться со многими случаями вопросов и ответов.Нельзя обойти это.Лучше иметь их чисто в своем собственном, выделенном месте, чем разбрасываться где-нибудь (вы убираете и расставляете все по местам - количество дел / вопросов, которые вам приходится решать, остается неизменным).

Однако у взрослыхПриложение вы можете поместить все ваши вопросы и ответы в структуру данных, как дерево.При этом вы можете избежать огромного количества методов и использовать вместо этого некоторые обобщенные методы, которые просто обходят дерево ....

[Также вы можете просто создавать временные методы, которые ничего не делают ("заглушки")для вещей, которые вам нужны, но еще не реализованы, чтобы компилировать их во время разработки.]

Ниже приведен пример полного класса, который компилирует и выполняет опрос до тех пор, пока он реализован:

import java.util.Scanner;

/**
 *
 * @author Kai
 */
public class TwentyQuestions {

    static Scanner get = new Scanner(System.in);

    static void handleWrongInput() {
        System.err.println("I am no longer playing with you if you don't answer my question properly");
        System.exit(1);
    }

    static void askLivinAnimalWithFeathersQuestions() {
        System.out.println("is it bigger than a soccer ball?");
        String user = get.nextLine();
        //don't know how you want to continue;
        //....
    }

    static void askLivinAnimalWithFurQuestions() {
        System.out.println("is it domesticated?");
        String user = get.nextLine();
        //don't know how you want to continue;
        //.... 
    }

    static void askLivingAnimalQuestions() {
        System.out.println("Does it have feathers, fur, or neither?");
        String user = get.nextLine();
        switch (user) {
            case "feathers":
                askLivinAnimalWithFeathersQuestions();
                break;
            case "fur":
                askLivinAnimalWithFurQuestions();
                break;
            default:
                handleWrongInput();
        }
    }

    static void askLivingPlantQuestions() {
        System.out.println("is it a tree?");
        String user = get.nextLine();
        if ("yes".equals(user)) {
            System.out.println("So its a tree!");
            return;
        }
    }

    static void askNoneLivingQuestions() {
        System.out.println("WhateverNoneLivingQuestion ?");
        String user = get.nextLine();
        switch (user) {
            //add possible responses here.
            default:
                handleWrongInput();
        }
    }

    static void mainQuestioning() {
        System.out.println("Is it a living animal, living plant, or non-living thing? ");
        String user = get.nextLine();
        switch (user) {
            case "living animal":
                askLivingAnimalQuestions();
                break;
            case "living plant":
                askLivingPlantQuestions();
                break;
            case "non-living":
                askNoneLivingQuestions();
                break;
            default:
                handleWrongInput();
        }
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        mainQuestioning();
    }

}

пример выполнения:

Is it a living animal, living plant, or non-living thing? 
living animal
Does it have feathers, fur, or neither?
fur
is it domesticated?
yes
BUILD SUCCESSFUL (total time: 30 seconds)
0 голосов
/ 21 февраля 2019

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

System.out.println("Think of Something");
System.out.println("Is it a living animal, living plant, or non-living thing? ");
String user = get.nextLine();
// start method
if (user.equals("living animal")); { //starts animal tree

  System.out.println("Does it have feathers, fur, or neither?");
  String user2 = get.nextLine();

  if (user2.equals("feathers")); {

    System.out.println("is it bigger than a soccer ball?");

  } else if (user2.equals("fur")); {

    System.out.println("is it domesticated?");

  }

} else if (user.equals("living plant")); { //starts plant tree

  System.out.println("is it a tree?");

} // end method
0 голосов
/ 21 февраля 2019

Вы пишете свои операторы if с этим синтаксисом:

if (user2.equals("feathers"));
{
    System.out.println("is it bigger than a soccer ball?");
}

Однако тело блока if всегда будет выполняться, поскольку у вас есть точка с запятой, которая завершает оператор преждевременно:

if (user2.equals("feathers")); // <-- The semicolon here finishes the if statement, which means the if statement does nothing
{
    System.out.println("is it bigger than a soccer ball?"); // <-- This line is ran no matter what the if statement was
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...