所以我正在关注java 6.092课程@ mit ocw的介绍.我正在上第二课,但我尝试的任何事情似乎都使该计划正常运作.
我甚至注意到在第3课开始的第2课评论中提供的代码版本也有类似的问题.[编辑] - 课程中的代码不完整,因为我忘了添加一个变量.
员工获得报酬(工作小时数)×(基本工资),每小时最多40小时.
对于超过40的每小时,他们得到加班=(基本工资)×1.5.
基本工资不得低于最低工资(每小时8.00美元).
如果是,则打印错误.如果小时数大于60,则打印错误消息.
这是我尝试解决方案:
public static void main(String[] arguments) {
int startOT = 40;
int maxH = 60;
double otPay = 1.5;
int emp1Hours = 35, emp2Hours = 47, emp3Hours = 73;
double emp1Pay = 7.50, emp2Pay = 8.20, emp3Pay = 10.00;
double swer;
if (emp1Hours > startOT){
swer = emp1Pay * startOT + (emp1Pay * otPay) * (emp1Hours - startOT);
System.out.println("Employee John Doe makes " + "$" + swer + " this week!");
}else if (emp1Hours > maxH){
System.out.println("@John Doe ERROR! Hours worked is invalid!");
}
else if (emp1Pay < 8){
System.out.println("Invalid hourly pay ;(");
}
else {
swer = emp1Pay * emp1Hours;
System.out.println("Employee John Doe makes " + "$" + swer + " this week!");
}
double swerzie;
if (emp2Hours > startOT){
swerzie = emp2Pay * startOT + (emp2Pay * otPay) * (emp2Hours - startOT);
System.out.println("Employee Jane Doe makes " + "$" + swerzie + " this week!");
}else if (emp2Hours > maxH){
System.out.println("@Jane Doe ERROR! Hours worked is invalid!");
}
else if (emp2Pay < 8){
System.out.println("Invalid hourly pay ;(");
}
else {
swerzie = emp2Pay * emp2Hours;
System.out.println("Employee Jane Doe makes " + "$" + swerzie + " this week!");
}
double answer;
if (emp3Hours > startOT){
answer = emp3Pay * startOT + (emp3Pay * otPay) * (emp3Hours - startOT);
System.out.println("Employee malcom smith makes " + "$" + answer + " this week!");
}else if (emp3Hours == 73){
System.out.println("@malcom smith ERROR! Hours worked is invalid!");
}
else if (emp3Pay < 8){
System.out.println("Invalid hourly pay ;("); }
else {
answer = emp3Pay * emp3Hours;
System.out.println("Employee malcom smith makes " + "$" + answer + " this week!");
}
}
Run Code Online (Sandbox Code Playgroud)
这是程序的输出:
Run Code Online (Sandbox Code Playgroud)-Invalid hourly pay ;( -Employee Jane Doe makes $414.1 this week! -Employee malcom smith makes $895.0 this week!
看,你的代码重复(三次重复)所有逻辑和计算这是,呃,次优.
想象一个程序,它接受hours_worked并base_pay作为参数并打印所获得的总和或错误消息.然后将其应用于三个不同的员工三次.
有点像这样:
from java.math import BigDecimal; // money is never float or double.
public static void calculateWage(String name, BigDecimal hourly_rate, int hours) {
final int OVERTIME_THRESHOLD = 40;
final int HOURS_LIMIT = 60;
final BigDecimal MIN_HOURLY_RATE = new BigDecimal("8.00");
// ^^^ again, never store money in a floating point form!
if (hours > HOURS_LIMIT) {
// what do you do?
}
if (hourly_rate.compareTo(MIN_HOURLY_RATE) < 0) { // less than
// what do you do?
// now think how to merge it with previous
}
if (hours > OVERTIME_THRESHOLD) {
int overtime = hours - OVERTIME_THRESHOLD;
// calculate two values and sum them up
}
else { // no overtime
// calculate just one value
}
}
public static void main(String[] args) {
calculateWage("John", new BigDecimal("7.50"), 73);
calculateWage("Jane", /* well, you see*/);
}
Run Code Online (Sandbox Code Playgroud)
这段代码不是更具可读性和整洁性吗?你的也可以.