使用类和访问变量的Java问题

时间:2017-03-14 06:39:49

标签: java class methods while-loop

我目前正在注册Java类。我们负责的项目是编制一个程序,其中年薪总额通过固定的年薪,年内销售的投入以及作为佣金获得的销售额的百分比来计算。我的问题是我应该使用哪个变量来获取表中“总补偿”列的正确输出。我无法弄清楚如何使用另一列中的数字输出正确的数字,并利用其他类中的逻辑。这是我的代码到目前为止,每个类都是一个单独的Java文件:

package sales;

import java.util.Scanner;

public class Sales {
public static void main(String[] args) {
    // Initialise scanner
    Scanner input = new Scanner(System.in);
    System.out.print("Please enter your annual sales:");

    // Read sales from input & calculate salary
    double annualSales = input.nextDouble();
    double salary = Utils.calculateSalary(annualSales);

    // Calculate commission bonus
    double commissionBonus = 1.5 * annualSales;

    // Print information for user
    System.out.println("The total yearly salary is: " + Utils.numFormat(salary));
    System.out.println("Total Sales \t\t Total Compensation");

    while (annualSales <= commissionBonus) {
        System.out.println(annualSales + " \t\t " + salary);
        annualSales += 5000;

        // Update salary according to annual sales
        salary = Utils.calculateSalary(annualSales);
    }

    // Close scanner
    input.close();
}
}

package sales;

/**
 *
 * @author etw11
 */
import java.text.DecimalFormat;

public class Utils {
     public final static double FIXED_SALARY = 30000;
/**
 * @param dec
 * @return 
 */
public static String numFormat(double dec) {
    return new DecimalFormat("##,##0.00").format(dec);
}

/**
 * Calculates the salary based on the given sales.
 * @param sales The annual sales
 * @return The calculated salary.
 */
public static double calculateSalary(double sales) {
    double commissionRate = 0.10d;

    if (sales < 320000) {
        commissionRate = 0.00d;
    } else if (sales >= 320000 && sales < 400000) {
        commissionRate = 0.08d;
    }

    // System.out.println("The current commission is " + (int)(commissionRate * 100) + "% of total sales.");

    return FIXED_SALARY + (sales * commissionRate);
}
}

1 个答案:

答案 0 :(得分:0)

不确定,如果这是您想要的,但您需要更新循环中的total以更新Total Compensation列中的值。

让我们先从你应该改变的小事做起。 Java中的naming convention是驼峰式的。你应该相应地改变它。例如,您应该为getsalesDouble命名,而不是getSalesDouble - 与您的numFormat类似。

接下来,您还应该更改方法和参数/变量的名称。为了做到这一点,我想问自己这个方法将会做什么?。一旦我知道我为它提出了一个合适的动词,那就是我的方法的名字。例如,您的Calculator应命名为calculate,以便拥有动词。但这不是不言自明的,因此,另一个名称必须取而代之 - 问自己它的计算方法是什么?(例如calculateSalary)。

接下来,您的utilsCalculate类应以大写字母开头(请参阅上面的链接)。我更喜欢将其命名为Utils,因为无论如何只有一个utils类。此外,该类应该只有静态方法,因此您不需要创建实例(请参阅下面的代码)。您可能希望创建一个私有默认构造函数,以避免团队中的其他程序员意外创建Utils类的实例。

现在,说到这一点,你应该像你一样避免发表评论。它只会使你的代码混乱。例如,方法的结尾由}表示。因此,无需声明方法的结尾位于}出现的行。如果您发现很难看到方法的结束},您可能会考虑正确格式化代码。通常,您的IDE可以通过按快捷方式或使用菜单栏为您执行此操作。

最后但并非最不重要,我认为,您的代码适合您,但total不会更新(在while loop内)。这是因为您只计算一次总计,并且永远不会使用新值salesDouble重新计算它。更新total = salesObject.Calculator();值后,您必须致电salesDouble。当然,这需要您创建一个新的utilsCalculate实例。否则,该值将始终相同,因为您永远不会更新utils类中的salesDouble。这不是我建议您做的事情,但会按原样解决您的问题。

有这个例子,关于如何正确地 *。

<强>的Utils

package utils;

import java.text.DecimalFormat;

public class Utils {
    public final static double FIXED_SALARY = 30000;

    /**
     * Formats the given decimal number.
     * @param dec The number to format
     * @return The formatted number as string.
     */
    public static String numFormat(double dec) {
        return new DecimalFormat("##,##0.00").format(dec);
    }

    /**
     * Calculates the salary based on the given sales.
     * @param sales The annual sales
     * @return The calculated salary.
     */
    public static double calculateSalary(double sales) {
        double commissionRate = 0.10d;

        if (sales < 320000) {
            commissionRate = 0.00d;
        } else if (sales >= 320000 && sales < 400000) {
            commissionRate = 0.08d;
        }

        // System.out.println("The current commission is " + (int)(commissionRate * 100) + "% of total sales.");

        return FIXED_SALARY + (sales * commissionRate);
    }
}

主要

package sales;

import java.util.Scanner;

import utils.Utils;

public class Person {
    public static void main(String[] args) {
        // Initialise scanner
        Scanner input = new Scanner(System.in);
        System.out.print("Please enter your annual sales:");

        // Read sales from input & calculate salary
        double annualSales = input.nextDouble();
        double salary = Utils.calculateSalary(annualSales);

        // Calculate commission bonus
        double commissionBonus = 1.5 * annualSales;

        // Print information for user
        System.out.println("The total yearly salary is: " + Utils.numFormat(salary));
        System.out.println("Total Sales \t\t Total Compensation");

        while (annualSales <= commissionBonus) {
            System.out.println(annualSales + " \t\t " + salary);
            annualSales += 5000;

            // Update salary according to annual sales
            salary = Utils.calculateSalary(annualSales);
        }

        // Close scanner
        input.close();
    }
}

<强>输出

Please enter your annual sales:320000
The total yearly salary is: 55.600,00
Total Sales          Total Compensation
320000.0         55600.0
325000.0         56000.0
330000.0         56400.0
335000.0         56800.0
340000.0         57200.0
345000.0         57600.0
350000.0         58000.0
355000.0         58400.0
360000.0         58800.0
365000.0         59200.0
370000.0         59600.0
375000.0         60000.0
380000.0         60400.0
385000.0         60800.0
390000.0         61200.0
395000.0         61600.0
400000.0         70000.0
405000.0         70500.0
410000.0         71000.0
415000.0         71500.0
420000.0         72000.0
425000.0         72500.0
430000.0         73000.0
435000.0         73500.0
440000.0         74000.0
445000.0         74500.0
450000.0         75000.0
455000.0         75500.0
460000.0         76000.0
465000.0         76500.0
470000.0         77000.0
475000.0         77500.0
480000.0         78000.0

*当然,仍有增强空间,但我认为它应该足以解决您的问题。

注意我没有检查你的方程,因为我不知道如何计算 - 我认为你的计算是正确的。