0

我正在尝试为我的 java 类编写一些简单的代码,我遇到了两个问题。对不起,如果这对你们大多数人来说似乎很容易,我只是从 Java 开始。我遇到的第一个问题是循环不能正常继续。它运行一次就好了,如果在开始时输入“quit”就会退出,但运行一次后,它不会让用户输入另一个值作为emp name。它直接从最后一行输入emp名称到循环的第一行,输入小时费率,没有机会输入新名称或退出。

我的第二个问题是我的 if 语句试图确保输入的小时费率和工作时间值大于 0。如果输入 0,它会给出错误消息,但如果输入负数,程序会继续没有什么是错的。我如何确保输入的值只是一个正双精度,并且它不会接受负双精度或零?

// Program to Calculate Payroll
import java.util.Scanner;
import java.text.DecimalFormat;

class Payroll
{
   public static void main(String args[])
   {
   Scanner myScanner = new Scanner(System.in);
   String empName;
   double hourlyRate;
   double hoursWorked;
   double grossPay;
   double netPay;
   double taxes;
   DecimalFormat money = new DecimalFormat("$.00");
//Get User Information
   System.out.print( "Enter employee name or enter 'quit' when finished. " );
   empName = myScanner.nextLine();
   while (!empName.equals("quit"))
   {
     System.out.print( "What is their hourly rate? $");
     hourlyRate = myScanner.nextDouble();
     if (hourlyRate <= 0)
     {
         System.out.println( "Value is not valid, please enter an amount above zero.");
         System.out.print( "What is their hourly rate? $");
         hourlyRate = myScanner.nextDouble();
     }
     System.out.print( "How many hours did they work? ");
     hoursWorked = myScanner.nextDouble();
     if (hoursWorked <= 0)
     {
         System.out.println( "Value is not valid, please enter an amount above zero.");
         System.out.print( "How many hours did they work? ");
         hoursWorked = myScanner.nextDouble();
     }
//Calculate Pay and Taxes
     grossPay = hourlyRate * hoursWorked;
     taxes = .13 * grossPay;
     netPay = grossPay - taxes;
//Display All Information
     System.out.print( "Employee name: ");
     System.out.println(empName);
     System.out.print( "Hourly Rate: ");
     System.out.println(money.format(hourlyRate));
     System.out.print( "Hours Worked: ");
     System.out.println(hoursWorked);
     System.out.print( "Gross Pay = ");
     System.out.println(money.format(grossPay));
     System.out.print( "Federal Taxes = ");
     System.out.println(money.format(taxes));
     System.out.print( "Net Pay = ");
     System.out.println(money.format(netPay));
     System.out.print( "Enter employee name or enter 'quit' when finished. " );
     empName = myScanner.nextLine();
   }
   System.out.println( "Thank you for using this payroll program.");
   }
}
4

3 回答 3

2

while在回应您的第一个问题时,您不会在循环中重新询问员工姓名。您应该初始化empName循环外部,但每次循环时也要再次询问。

String empName = "";
while (!empName.equals("quit")) {
  //Get User Information  
  System.out.print( "Enter employee name or enter 'quit' when finished. " );
  empName = myScanner.nextLine();

  if (empName.equals("quit")) {
    break;
  }

对于第二个问题,您可以while再次使用循环并检查以确保hourlyRate大于0。只要确保每次循环返回检查时都重新提示。

hourlyRate = -1;
while (hourlyRate <= 0) {
  System.out.print( "What is their hourly rate? $");
  hourlyRate = myScanner.nextDouble();
  if (hourlyRate <= 0) {
    System.out.println( "Value is not valid, please enter an amount above zero.");
  }
}
于 2013-01-27T18:34:51.437 回答
0

它不会让用户为 emp 名称输入另一个值。

您只需询问员工姓名一次,因为它不在循环内。移动代码以询问循环内的名称。您可能会最简单地将代码添加到循环的末尾,但我更喜欢在开始时进行检查并休息一下。

我如何确保输入的值只是一个正双精度,并且它不会接受负双精度或零?

您只要求用户更正一次号码。如果您使用 while 循环,它将一直询问,直到速率正常。

于 2013-01-27T18:35:43.417 回答
0

它不会让用户为 emp 名称输入另一个值。

因为你的线路有问题

 hoursWorked = myScanner.nextDouble();

因为这只需要双精度值而不是\n值。所以,最后,当程序移动到该行时

 empName = myScanner.nextLine();

它将继续获取\nempName,并跳过键盘输入。在询问 empName 值的输入之前,您需要放置另一个 myScanner.nextLine()。

 myScanner.nextLine();
 System.out.println("....");
 empName = myScanner.nextLine();

对于验证,只需像其他建议的那样做

于 2013-01-27T18:47:44.957 回答