Почему мои утверждения if / else игнорируются? - PullRequest
0 голосов
/ 20 августа 2011

Итак, я слежу за вступлением к курсу Java 6.092 @ mit ocw.Я на втором уроке, но, похоже, ничего из того, что я пытаюсь сделать, не позволяет программе работать правильно.

Я даже заметил, что версия моего кода, представленная в обзоре урока 2 в начале урока 3, имеетаналогичная проблема .[править] - код урока был неполным, потому что я забыл добавить переменную.

Работнику платят (отработанные часы) × (базовая оплата), за каждый час до 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!");
    }
}

А вот и вывод программы:

-Invalid hourly pay ;(
-Employee Jane Doe makes $414.1 this week!
-Employee malcom smith makes $895.0 this week!

Ответы [ 2 ]

7 голосов
/ 20 августа 2011

Смотрите, ваш код дублирует (дублирует) всю логику и вычисления. Это, эээ, неоптимально.

Представьте себе процедуру, которая принимает 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*/);
}

Разве этот код не более читабелен и аккуратен? Твой тоже может быть.

1 голос
/ 20 августа 2011

Первая часть кода выглядит нормально:

 double emp1Pay = 7.50,...
 ...
 if (emp1Hours > startOT){
   ...
 else if (emp1Pay < 8){ System.out.println("Invalid hourly pay ;("); }

Это выводит именно то, что вы ожидаете, если emp1Pay <8: </p>

"Неверная почасовая оплата; (".

SUGGESTIONS:

1) Шаг за шагом проходите через код под отладчиком Eclipse. Следите за тем, что происходит - и почему.

2) Подумайте над тем, чтобы немного «расширить свой код».

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

Вот гораздо лучший пример стиля кодирования:

http://java.sun.com/docs/codeconv/html/CodeConventions.doc3.html

3) Рассмотрите возможность разбить свою логику на отдельный метод. Вместо дублирования кода (по одному разу для каждого значения), просто вызовите новый метод три раза (с тремя разными наборами аргументов - но просто один блок кода).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...