2016-10-13 1 views
0

Чтобы быть более понятным, пожалуйста, помогите мне с menuChoice == 2.Как я могу получить этот цикл, чтобы принять положительное целое число для двух записей?

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

Что мне нужно сделать?

package finalExam; 

//this is required for JOptionPane to work 
import javax.swing.JOptionPane; 

public class Geometry { 

    public static void main(String[] args) { 


boolean valid = false; 

int menuChoice; 

do { 
     // create a menu and display it to the user 
     // then ask the user to choose an option 
     String menu = "1) Calculate the area of a circle\n" 
        + "2) Calculate the area of a rectangle\n" 
        + "3) Calculate the area of a triangle\n" 
        + "4) Quit\n" 
        + "Please enter your choice: (1, 2, 3, or 4)"; 

     menuChoice = Integer.parseInt(JOptionPane.showInputDialog(menu)); 

     if(menuChoice == 1) 
     { 
      String unknownRadius = JOptionPane.showInputDialog("What is the radius of the circle?"); 
      if(Double.parseDouble(unknownRadius) < 0){ 
       do{ 
       JOptionPane.showMessageDialog(null, "Please enter positive numbers only."); 
       unknownRadius = JOptionPane.showInputDialog("What is the radius of the circle?"); 
       } 
       while(Double.parseDouble(unknownRadius) < 0); 
       double knownRadius = Double.parseDouble(unknownRadius); 
       double circleArea = Math.pow(knownRadius, 2) * 3.14159; 
       JOptionPane.showMessageDialog(null, "The area of the circle is " + circleArea); 
      } 
      else if(Double.parseDouble(unknownRadius) > 0) { 
      double knownRadius = Double.parseDouble(unknownRadius); 
      double circleArea = Math.pow(knownRadius, 2) * 3.14159; 
      JOptionPane.showMessageDialog(null, "The area of the circle is " + circleArea); 
      valid = true; 
      } 

     } else if(menuChoice == 2){ 
      String unknownLength = JOptionPane.showInputDialog("What is the length of the rectangle?"); 
      if(Double.parseDouble(unknownLength) < 0){ 
       do{ 
        JOptionPane.showMessageDialog(null, "Please enter positive numbers only."); 
        unknownLength = JOptionPane.showInputDialog("What is the length of the rectangle?"); 
       } 
       while(Double.parseDouble(unknownLength) < 0); 
       double knownLength = Double.parseDouble(unknownLength); 
       String unknownWidth = JOptionPane.showInputDialog("What is the width of the rectangle?"); 
       if(Double.parseDouble(unknownWidth) < 0){ 
        do{ 
         JOptionPane.showMessageDialog(null, "Please enter positive numbers only."); 
         unknownWidth = JOptionPane.showInputDialog("What is the width of the rectangle?"); 
        } 
        while(Double.parseDouble(unknownWidth) < 0); 
        double knownWidth = Double.parseDouble(unknownWidth); 
        double rectangleArea = knownLength * knownWidth; 
        JOptionPane.showMessageDialog(null, "The area of the rectangle is " + rectangleArea); 
      } 
      else if(Double.parseDouble(unknownLength) > 0){ 
      knownLength = Double.parseDouble(unknownLength); 
      unknownWidth = JOptionPane.showInputDialog("What is the width of the rectangle?"); 
      if(Double.parseDouble(unknownWidth) > 0) { 
       double knownWidth = Double.parseDouble(unknownWidth); 
       double rectangleArea = knownLength * knownWidth; 
       JOptionPane.showMessageDialog(null, "The area of the rectangle is " + rectangleArea); 
       valid = true; 
      } 
      } 
      } 

     } else if(menuChoice == 3){ 
      String unknownBase = JOptionPane.showInputDialog("What is the base length of the triangle?"); 
      if(Double.parseDouble(unknownBase) > 0){ 
      double knownBase = Double.parseDouble(unknownBase); 
      String unknownHeight = JOptionPane.showInputDialog("What is the height of the triangle?"); 
      if(Double.parseDouble(unknownHeight) > 0){ 
      double knownHeight = Double.parseDouble(unknownHeight); 
      double triangleArea = (knownBase/2) * knownHeight; 
      JOptionPane.showMessageDialog(null, "The area of the triangle is " + triangleArea); 
      valid = true; 
      } 
      else { JOptionPane.showMessageDialog(null, "Please enter a positive number"); 
        JOptionPane.showInputDialog("What is the base length of the triangle?"); 
      } 
      } 
      else { JOptionPane.showMessageDialog(null, "Please enter a positive number"); 
        JOptionPane.showInputDialog("What is the height of the triangle?"); 
      } 

     }else if(menuChoice == 4){ 
      System.exit(0); 

     } else 
      JOptionPane.showMessageDialog(null, "Please select from the options given (1-4)!"); 
} 

while(!valid || menuChoice != 4); 

} 
} 
+0

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

ответ

1

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

If the length is negative then { 
    Ask for a new length until it's positive 
    Now input the width, reject negative values, do the computation, 
    and output it 
} else { // the length is positive 
    Input the width, reject negative values, do the computation, 
    and output it 
} 

Вся часть об обработке по ширине происходит дважды в коде, что делает код излишне сложным, и делает его более склонен к ошибкам, таким как получение фигурных скобок в заблуждении место (я думаю, поэтому код не ведет себя). Вы можете сделать жизнь намного проще для себя путем реорганизации кода, как это:

If the length is negative then { 
    Ask for a new length until it's positive 
} 
// When we get here, the length will be positive. It doesn't matter 
// whether we got here because the original length was positive, or whether 
// it was negative and the user entered a new value. We're going to 
// continue in the same way, either way. 
Input the width, reject negative values, do the computation, 
and output it 

(Кстати, я не знаю, что вы хотите делать, если пользователь вводит 0. Вы действительно не обработки в этом случае.)

0

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

(я даю только альтернативный код здесь, в JAVA, вы можете изменить ваш JApplet соответственно)

int a=-1,b=-1; 
a=sc.nextInt(); 
b=sc.nextInt(); 

if(a>=0 && b>=0){ 
    ... 
    //do the task 
} 

else{ 
    while(a<0 || b<0){ 

     System.out.println("negative value not allowed, enter +ve value "); 
     a=sc.nextInt(); 
     b=sc.nextInt(); 
    } 

    // while exited only if value both a and b are positive 
    //+ve value 
    //perform task  
} 
2

В строке 48 ваше заявление if(Double.parseDouble(unknownLength) < 0){ имеет соответствующую закрывающую скобу в строке 76, непосредственно перед } else if(menuChoice == 3){.

Итак, логически ваш код работает только с номером menuChoice == 2, когда вводится отрицательное число. Вместо этого вы должны закрыть if, если после первого цикла do-while цикл завершен, так как в этот момент число будет (исправлено) положительным.

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