2012-02-21 353 views
4

嗨,我有麻烦让我的程序正常运行。我能够清除任何语法错误,但现在我已经发布了我的输出。while循环嵌套的if/else语句

首先,在第一个IF语句中,它会提示要求人员同时输入他们的姓名和部门,以便在输出时,名称是空白的,只有部门有输入。我认为这是整个IF语句的事情,因为如果我将“String name”更改为input.next,则名称提示正确,但将dept和totalHrsWkd合并在一起。

此外,当测试我的程序时,它输入totalHrsWkd的负数时崩溃。它会在一行中显示两条打印语句,然后崩溃JCreator。

我很感激任何关于此事的帮助,谢谢!

public static void main(String[] args) 
    { 
    // TODO code application logic here 

    int attempt = 1, employeeID = 0; 
    double hoursWorked = 0.0; 
    double overtimeHrs = 0.0; 
    double totalHrsWkd = 0.0; 

    Scanner input = new Scanner(System.in); 

    while(attempt < 4) 
    { 
     System.out.println("Enter your employee ID: "); 
     employeeID = input.nextInt(); 

     if(employeeID == 12345678) 
     { 
     System.out.printf("Enter your name: "); 
     String name = input.nextLine(); 

    System.out.printf("Enter your department: "); 
     String dept = input.nextLine(); 

    System.out.printf("Enter your hours worked including overtime: "); 
     totalHrsWkd = input.nextDouble(); 

     while(totalHrsWkd < 0) 
      { 
      System.out.printf("Try again! Hours worked cannot be negative."); 

      System.out.printf("Enter your hours worked including overtime: "); 
      } 

      overtimeHrs = totalHrsWkd - 40; 
      hoursWorked = totalHrsWkd - overtimeHrs; 

      if(overtimeHrs <= 0) 
      { 
      } 
      else if(overtimeHrs == 0) 
      { 
      } 
      else if(hoursWorked == totalHrsWkd) 
      { 
      } 
      else if(hoursWorked == 40) 
      { 
      } 
     System.out.printf("Name: %s\n" + "Dept: %s\n" + 
        "Hours Worked: %.2f\n" + "Overtime Hours: %.2f\n" 
        + "Total Hours Worked: %.2f\n", name, dept, 
        hoursWorked, overtimeHrs, totalHrsWkd); 

     attempt = 3; 
     } 
    else 
    { 
     if(attempt < 3) 
     { 
     System.out.println("Invalid ID! Try again." ); 
     } 
     else 
     { 
     System.out.println("Invalid ID! 0 attempts left. Exiting program!"); 
     } 

     } 

    ++attempt; 
    } 
    System.exit(0); 
} 
} 
+0

'totalHrsWkd = input.nextDouble();'应该放在while循环中。否则,你只是在一个无限循环中运行,没有任何变化'totalHrsWkd' – biziclop 2012-02-21 20:49:18

+0

你为什么选择使用'Scanner'?这几乎不适用于交互式程序(并导致像你在这里看到的问题)。相反,使用['BufferedReader.readLine'](http://docs.oracle.com/javase/1.5.0/docs/api/java/io/BufferedReader.html)。 – 2012-02-21 20:50:23

+0

是的,这是我的Java 1类的编程任务。本质上,老师给我们提供了伪代码,我们需要编写程序。到目前为止,我们只处理Scanner类。我甚至没有在我们的书中遇到过BufferedReader.readLine。 – Abweichung 2012-02-21 20:54:21

回答

3

问题是

employeeID = input.nextInt(); 

读取从输入流中的数字序列的下一个。但是,为了实际输入员工ID,您还必须按Enter键。回车按键仍然在等待输入,所以当你下次调用

String name = input.nextLine(); 

Scanner类变为“哦,这里是一个输入按键,我猜测用户想要一个空的名字。”你甚至没有机会输入一个名字,这就是为什么你的程序似乎在同一时间提出两个问题(名称和部门)。

如果您希望继续使用Scanner类,我建议避开诸如nextInt()之类的方法,并始终使用nextLine()来代替。当然,您将不得不使用类似 parseInt()将用户键入的数字转换为Java整数。

+0

那么我需要先把它作为一个字符串吗?如: String ID = System.out.println(“输入您的员工ID:”); int employeeID = Int。parseInt(ID); 如果是这样,我会得到不兼容的类型错误以及找不到符号变量Int。 – Abweichung 2012-02-21 22:02:23

+0

不完全是,你试图把'println()'的返回值赋给一个'String'。尝试:'String employeeIDStr = input.nextLine(); int employeeID = Integer.parseInt(employeeIDStr);'还要注意'Integer'类的使用,而不是'Int'。 – 2012-02-21 22:08:21

+0

终于!真的很抱歉打扰你的初学者问题,但我基本上留下来为自己照顾,因为她花费课时讲授幻灯片。 我必须从头开始编写一个程序,所以我想先完成这个程序以帮助充当模板。 再次感谢! – Abweichung 2012-02-21 22:15:20

2
attempt = 3; // Seems suspicious 

attempt++; // I think it's more appropriate in loops of this kind than ++attempt 
1

当你的程序在totalHrsWkd小于0时不工作的原因是因为下面的代码创建了一个无限循环。

while (totalHrsWkd < 0) 
      { 
      System.out.printf("Try again! Hours worked cannot be negative."); 

      System.out.printf("Enter your hours worked including overtime: "); 
      } 

您应该读取此循环中工作的小时数。

+0

现在我明白了上面的含义,缺少totalHrsWkd = input.nextDouble(); 我需要把它放在我的第二个提示下。这解决了我的无限循环问题,但仍在解决其他问题,谢谢! – Abweichung 2012-02-21 21:54:31