【问题标题】:Can you reuse if statements? Program loops to only first if loop你可以重复使用 if 语句吗?程序只循环到第一个 if 循环
【发布时间】:2016-07-06 18:53:53
【问题描述】:

这个程序是通过取 A 和 B 边的值来计算三角形的斜边。如果程序运行,它会为用户提供 4 种选择,在用户输入 A、B、 C,或Q。假设用户输入A,它允许用户输入A侧的值,它将返回4个主要选择。问题是,当用户输入 A、B、C 或 Q 时,它只是循环再次询问 A 面。以下是我目前拥有的代码。我如何使它不仅接受值A?谢谢

public class Newest_Exercise_1 {

     public static void main(String[] args) {    
         Scanner input = new Scanner(System.in);
         char letter;
         int valueOfA;
         int valueOfB;
         double hypotenuse;


         Boolean loop =true;

         letter = GettingUserInput(input);
            System.out.println("value of letter: " +letter);

         while(loop){
         if(letter=='A' || letter =='a'){
                valueOfA = InputWasA();
                System.out.println(valueOfA);
                letter = GettingUserInput(input);


         }
         if(letter=='B' || letter =='b'){
                valueOfB = InputWasB();
                System.out.println(valueOfB);
                letter = GettingUserInput(input);

         }

         if(letter=='C' || letter =='c'){
                System.out.println("made it to C");
                hypotenuse = Math.sqrt((valueOfA*valueOfA)+(valueOfB*valueOfB));
                System.out.println("Hypotenuse is: "+hypotenuse);
                letter = GettingUserInput(input);


         }
         if(letter=='Q' || letter =='q'){
                System.out.println("made it to Q");
                System.out.println("Program Closed");
                System.exit(0);
         }  
         }
     }

     public static char GettingUserInput(Scanner input){


            System.out.println("A-Enter value of side A");
            System.out.println("B-Enter value of side B");
            System.out.println("C-Calculate");
            System.out.println("Q-Quit the program");

            String s = input.next();
            System.out.println("value of s: "+s);
            char letter = s.charAt(0);

            while(letter != 'A' && letter != 'a' && letter != 'B' && letter != 'b' && letter != 'C' && letter != 'c' && letter != 'Q' && letter != 'q'){
                System.out.println("Invalid entry, Please try again");
                System.out.println("A-Enter value of side A");
                System.out.println("B-Enter value of side B");
                System.out.println("C-Calculate");
                System.out.println("Q-Quit the program");
                s = input.next();
                letter = s.charAt(0);
            }


        return letter; 
     }

     public static int InputWasA(){
         Scanner input = new Scanner(System.in);
         Boolean loop1 = true;
         int valueOfA = 0;

         while(loop1){
             try{
                 System.out.println("Enter value of side A");
                 valueOfA=input.nextInt();
                 loop1 = false;
             }
             catch(Exception e){
                 System.out.println("That was not an integer!");
                 input.next();
             }

         }
         return valueOfA;
     }

     public static int InputWasB(){
         Scanner input = new Scanner(System.in);
         Boolean loop2 = true;
         int valueOfB = 0;

         while(loop2){
             try{
                 System.out.println("Enter value of side B");
                 valueOfB=input.nextInt();
                 loop2 = false;
             }
             catch(Exception e){
                 System.out.println("That was not an integer!");
                 input.next();
             }

         }
         return valueOfB;
     }

     public static void InputWasC(){
            System.out.println("Made it to InputWasC!");
     }





}

【问题讨论】:

  • 你有什么意见?
  • 查看我的更新。它们在正确的位置初始化。但似乎他们没有被分配
  • 您需要先将 valueOfA 和 valueOfB 初始化为 0 或 -1。那么它将起作用。我已经测试过了。
  • 与您的问题不太相关,但您不需要大写boolean
  • 我要问了,InputWasA() 和 InputwasB() 的意义何在?它们有什么不同?

标签: java loops if-statement methods user-input


【解决方案1】:

你只执行一次letter = GettingUserInput(input),所以letter当然永远是同一个值。

所以:

  • 将此行移到循环开始处
  • 不要在其他任何地方重复 - 它现在在每次迭代的顶部运行
  • 并废弃loop 变量,只需使用true

使代码看起来像:

while (true) {
    letter = GettingUserInput(input);
    System.out.println("value of letter: " + letter);

    if (letter=='A' || letter =='a') {
        valueOfA = InputWasA();
        System.out.println(valueOfA);
    }

    // etc

我拒绝提出其他改进建议,只保留导致所述问题的那个,但是...

因为你的循环有:

  • 初始状态(读信)
  • 终止测试(不是“q”)
  • 迭代操作(阅读另一封信)

它是最清晰和最好的编码为for 循环。此外,为了避免所有这些双重大小写测试,GettingUserInput() 方法应该只返回小写字母,即它的最后一行应该是:

return Character.toLowerCase(letter); 

鉴于这种变化,我认为您的循环应该如下所示:

for (char letter = GettingUserInput(input); letter != 'q'; letter = GettingUserInput(input)) {
    if (letter =='a') {
        valueOfA = InputWasA();
        System.out.println(valueOfA);
     }

     if (letter =='b') {
         valueOfB = InputWasB();
         System.out.println(valueOfB);
     }

     if (letter =='c') {
         System.out.println("made it to C");
         hypotenuse = Math.sqrt((valueOfA*valueOfA)+(valueOfB*valueOfB));
         System.out.println("Hypotenuse is: "+hypotenuse);
     }
}

System.out.println("Program Closed");

注意字母 q 的代码是如何简单地跟随循环的。

【讨论】:

  • 你错过了循环内的电话,不是吗?他没有在后续调用中分配值。
  • 为什么还要打扰 true 或者让它成为循环中的第一行?在这种情况下说while( (letter = Character.toLowerCase(GettingUserInput())) != 'q') ... 会更有意义。然后您检查等于“a”、“b”或“c”的字母,执行这些操作,否则继续循环。如果是 'q' 则循环结束并结束。
  • @richard 原因是可读性;将输入读取和比较填充到一个表达式中只会混淆逻辑。还有很多其他的改进,但我认为使用while (true) 值得一提,因为它更清晰并且是一个常见的习惯用法
  • 你说得对,它的可读性不如while (true),但它更健壮,无限循环的风险更小。我不喜欢这个成语的原因是:它很懒惰,它违背了条件的目的,并且绝对需要一个仍然基于实际条件的 break 语句,仅举几例。使用while(true) 不会混淆任何它是真的while 逻辑——但是,它会混淆从循环本身结束循环背后的真实逻辑。唯一一次我认为没问题的是在等待连接的服务器中,但即便如此,您也需要一种方法来彻底退出并退出。
  • @richard 查看更新后的答案,了解我认为应该如何编码循环以及为什么
猜你喜欢
  • 1970-01-01
  • 2018-03-11
  • 1970-01-01
  • 1970-01-01
  • 2018-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多