2015-07-20 97 views
0

我正在开发一个程序,该程序将为用户提供一个菜单,允许他们选择一个选项,然后根据菜单选择要求不同的数字进行计算。我已经开始了这个程序的基本概述,但是我需要帮助获得循环的实现和工作。Java - 菜单循环和数学计算

这里是我到目前为止的代码:

import java.util.Scanner; 

public class LB04Alexander { 

public static void main(String[] args) { 
    Scanner input = new Scanner(System.in); 
    System.out.println("This program will perform several types of calculations."); 
    System.out.println(); 
    System.out.println("-MENU-"); 
    System.out.println("Select from the following menu options:"); 
    System.out.println("1 - Compute integer powers of a number"); 
    System.out.println("2 - Compute a factorial"); 
    System.out.println("3 - Compute a square root"); 
    System.out.println("4 - Compute a cube root"); 
    System.out.println("5 - Compute an exponential"); 
    System.out.println("6 - Compute the sine of an angle"); 
    System.out.println("7 - Compute the cosine of an angle"); 
    System.out.println("8 - Convert a positive integer to binary"); 
    System.out.println("9 - Exit"); 
    System.out.println("Please enter the number corresponding to your choice:"); 

    int menuChoice = input.nextInt(); 
    while (menuChoice >= 1 && menuChoice <= 9); { 
     switch (menuChoice) { 
     case 1: 
      System.out.println("You have chosen to compute integer powers of a number."); 
      System.out.println("Please enter any number for the base:"); 
      double base1 = input.nextDouble(); 
      System.out.println("Now, enter a non-negative integer for the exponent:"); 
      int exponent1 = input.nextInt(); 
      if (exponent1 < 0) 
       System.out.println("Error: exponent is negitive."); 
      else 
       System.out.println(base1 + "^" + exponent1 + " = " + ""); 
      break; 
     case 2: 
      System.out.println("You have chosen to compute a factorial (n!) of a non-negative integer."); 
      System.out.println("Please enter a non-negitive integer for n:"); 
      long fact = input.nextLong(); 
      int result = 1; 
      if (fact < 0) 
       System.out.println("Error: integer is negitive."); 
      else if (fact >= 127) 
       System.out.println("Error: Answer too large to calculate"); 
      else 
       for (int i = 1; i <= fact; i++) { 
        result = result * i; 
       } 
      System.out.println(fact + "! = " + result); 
      break; 
     case 3: 
      System.out.println("You have chosen to compute a square root."); 
      break; 
     case 4: 
      System.out.println("You have chosen to compute a cube root."); 
      break; 
     case 5: 
      System.out.println("You have chosen to compute an exponential."); 
      break; 
     case 6: 
      System.out.println("You have chosen to compute the sine of an angle."); 
      break; 
     case 7: 
      System.out.println("You have chosen to compute the cosine of an angle."); 
      break; 
     case 8: 
      System.out.println("You have chosen to convert a positive integer to binary"); 
      break; 
     case 9: 
      System.out.println("You have chosen to exit"); 
      System.out.println("Program LB04Alexander is now terminating..."); 
      input.close(); 
      System.out.println("The program has ended. Goodbye."); 
      break; 
     default: 
      System.out.println("Invalid menu choice, please try again."); 
      break; 

     } } 


} 
} 

我有越来越菜单循环正道的第一个问题。它要么不工作,要么永远循环。

+0

目前,该程序接受许多,但什么都不做。如果我通过'while(menuChoice> = 1 && menuChoice <= 9)将while循环更改为do-while,'最后,如果有效,但会一遍又一遍地循环选择的案例。 – Gregory

回答

3
while (menuChoice >= 1 && menuChoice <= 9); 

摆脱那个分号。当您的选择满足条件时,它会永久循环。当它没有时,它将立即退出(因为没有任何匹配的情况)打印出来后Invalid menu choice, please try again.

+0

@RealSkeptic哎呀,太快地掠过OP的代码,甚至没有看到默认选择。 –

+0

我拿出了帮助的分号。一旦计算成功,我希望程序直接回到主菜单 – Gregory

+0

你*可以*打破标签,但这是一种丑陋。更好的方法是以不同的方式组织代码。也许每个“菜单”可能是它自己的方法,从'main'调用。当用户选择返回到上一个菜单时,您只需从方法返回即可。 –

0

试试这个,它比你的,但差不多某种程度上更模块化...

import java.util.Scanner; 

    public class LB04Alexander { 

     public static final Scanner SCANNER = new Scanner(System.in); 

     public static void main(String[] args) { 
     int choice; 

     showMenu(); 
     while((choice = getInt("Please enter the number corresponding to your choice:")) != 9) { 
      doCalculation(choice); 
      showMenu(); 
     } 
     } 

     public static void showMenu() { 
     System.out.println("This program will preform several types on calculations."); 
     System.out.println(); 
     System.out.println("===============MENU====================="); 
     System.out.println("Select from the following menu options:"); 
     System.out.println("1 - Compute integer powers of a number"); 
     System.out.println("2 - Compute a factorial"); 
     System.out.println("3 - Compute a square root"); 
     System.out.println("4 - Compute a cube root"); 
     System.out.println("5 - Compute an exponential"); 
     System.out.println("6 - Compute the sine of an angle"); 
     System.out.println("7 - Compute the cosine of an angle"); 
     System.out.println("8 - Convert a positive integer to binary"); 
     System.out.println("9 - Exit"); 
     System.out.println("========================================"); 

     } 


     private static void doCalculation(int choice) { 
     switch (choice) { 
     case 1: 
      System.out.println("\nYou have chosen to compute integer powers of a number."); 
      double base1 = getDouble("Please enter the number corresponding to your choice:"); 
      int exponent1 = getInt("Now, enter a non-negative integer for the exponent:"); 
      System.out.println(base1 + "^" + exponent1 + " = " + ""); 
      break; 
     case 2: 
      System.out.println("You have chosen to compute a factorial (n!) of a non-negative integer."); 
      long fact = getLong("Please enter a non-negitive integer for n:"); 
      int result = 1; 
      if (fact < 0) 
      System.out.println("Error: integer is negitive."); 
      else if (fact >= 127) 
      System.out.println("Error: Answer too large to calculate"); 
      else 
      for (int i = 1; i <= fact; i++) { 
       result = result * i; 
      } 
      System.out.println(fact + "! = " + result); 
      break; 
     case 3: 
      System.out.println("You have chosen to compute a square root."); 
      break; 
     case 4: 
      System.out.println("You have chosen to compute a cube root."); 
      break; 
     case 5: 
      System.out.println("You have chosen to compute an exponential."); 
      break; 
     case 6: 
      System.out.println("You have chosen to compute the sine of an angle."); 
      break; 
     case 7: 
      System.out.println("You have chosen to compute the cosine of an angle."); 
      break; 
     case 8: 
      System.out.println("You have chosen to convert a positive integer to binary"); 
      break; 
     default: 
      System.out.println("Invalid menu choice, please try again."); 
      break; 
     } 
     } 

     private static int getInt(String prompt) { 
     boolean unassigned = true; 
     int value = 0; 
     while(unassigned) { 
      try { 
       System.out.println(prompt); 
       value = SCANNER.nextInt(); 
       unassigned = false; 
      } 
      catch (IllegalArgumentException e) {} 
     } 
      System.out.println("[" + value + "]"); 

     return value; 
     } 

     private static double getDouble(String prompt) { 
     boolean unassigned = true; 
     double value = 0; 
     while(unassigned) { 
      try { 
       System.out.println(prompt); 
       value = SCANNER.nextDouble(); 
       unassigned = false; 
      } 
      catch (IllegalArgumentException e) {} 
     } 
      System.out.println("[" + value + "]"); 
     return value; 
     } 

     private static long getLong(String prompt) { 
     boolean unassigned = true; 
     long value = 0; 
     while(unassigned) { 
      try { 
       System.out.println(prompt); 
       value = SCANNER.nextLong(); 
       unassigned = false; 
      } 
      catch (IllegalArgumentException e) {} 
     } 
      System.out.println("[" + value + "]"); 

     return value; 
     } 
    }