0

看起来这是这类问题的一周。在阅读了所有新的和几个旧的之后,我同样感到困惑!

我有一个包含 5 名员工的文本文件,每个员工的姓名下方都列出了 10 个薪水值。我要阅读这个文件,找到并显示每个人的员工姓名、最低工资、最高工资和平均工资。我必须有 3 个循环:一个用于控制读取文件,一个用于将数据加载到数组中,一个用于计算。我必须在一行上打印每个人的信息,而且我必须允许小数点四舍五入到小数点后 2 位,这显然Math.round是我从未听说过的!

我很尴尬地向您展示我拥有的乱七八糟的代码,因为它并不多,但是在阅读完所有内容后,我什至不知道我是否开始正确。我不知道我是否对如何进行有正确的想法。感谢您的帮助。

更新代码:再次!

    import javax.swing.*;
import java.io.*;
public class MinMaxSalary3
{
    public static void main(String args[])throws Exception
    {
        // Declare input file to be opened.
        FileReader fr = new FileReader ("salary.dat");
        BufferedReader br = new BufferedReader (fr);
        //General Declarations
        final String TITLE = "Employee's Salary Report";
        String employeeName, salaryString;
        double avgSalary=0.0;
        double totalSalary = 0.0;
        double sum = 0.0; 
        // Declare Named Constant for Array.
        final int MAX_SAL = 10;     
        // Declare array here.
        int salary[] = new int[MAX_SAL];

         System.out.println (TITLE);
            while ((employeeName = br.readLine()) != null)
            {
               System.out.print ("" + employeeName);


        // Use this integer variable as your loop index.
                int loopIndex;                  
        // Assign the first element in the array to be the minimum and the maximum.
                double minSalary = salary[1];
               double maxSalary = salary[1]; 
        // Start out your total with the value of the first element in the array.
                sum = salary[1]; 
            // Write a loop here to access array values starting with number[1]
                for (loopIndex = 1; loopIndex < MAX_SAL ;loopIndex++)
        // Within the loop test for minimum and maximum salaries.
                {
                    if  (salary[loopIndex] < minSalary)
                    {
                        minSalary = salary[loopIndex];

                   if (salary[loopIndex] > maxSalary)

                    maxSalary = salary[loopIndex];


                    }   

                        {
            // Also accumulate a total of all salaries.
                       sum += sum; 
          // Calculate the average of the 10 salaries.
                            avgSalary = sum/MAX_SAL;
                        }
            //  I know I need to close the files, and end the while loop and any other loops. I just can't think that far right now. 
            }
            {
        // Print the maximum salary, minimum salary, and average salary.
            System.out.println ("Max Salary" + maxSalary);  
            System.out.println ("Min Salary" + minSalary); 
            System.out.println ("Avg Salary" + avgSalary); 
            }


        System.exit(0);
    }
  }
}
4

2 回答 2

2

我必须有 3 个循环:一个用于控制读取文件,一个用于将数据加载到数组中,一个用于计算。

我在下面写的内容现在对你来说可能只是更花哨的东西,但如果你通过这门课,知道它可能会很有用。

另一种看待这个问题的方法是更加面向对象和更好的分解:您需要一个对象来保存数据、执行计算和渲染输出。你如何获得这些数据并不重要。今天是文件;下次可能是 HTTP 请求。

从 Employee 对象开始。我故意遗漏了许多您必须填写并弄清楚的细节:

package model;

public class Employee {
    private String name;
    private double [] salaries;

    public Employee(String name, int numSalaries) { 
        this.name = name;
        this.salaries = new double[numSalaries];
    }

    public double getMinSalary() {
        double minSalary = Double.MAX_VALUE;
        // you fill this in.
        return minSalary;
    };

    public double getMaxSalary() {
        double maxSalary = Double.MIN_VALUE;
        // you fill this in.
        return maxSalary;
    }

    public double getAveSalary() {
        public aveSalary = 0.0;
        if (this.salaries.length > 0) {
            // you fill this in.
        }
        return aveSalary;
    }
}

这种方法的美妙之处在于您可以单独对其进行测试,而不必担心有关文件 I/O 的所有废话。把这个对象弄好,把它放在一边,然后处理下一块。最终,当您将所有这些较小的部分组装在一起时,您将获得一个干净的解决方案。

使用 JUnit 在没有文件 I/O 的情况下对其进行测试:

package model;

public class EmployeeTest {
    @Test
    public void testGetters() {
        double [] salaries = { 10000.0, 20000.0, 30000.0, 40000.0 };
        Employee testEmployee = new Employee("John Q. Test", salaries);
        Assert.assertEquals("John Q. Test", testEmployee.getName());
        Assert.assertEquals(10000.0, testEmployee.getMinSalary(), 1.0e-3);
        Assert.assertEquals(40000.0, testEmployee.getMaxSalary(), 1.0e-3);
        Assert.assertEquals(25000.0, testEmployee.getMinSalary(), 1.0e-3);     
    }
}
于 2012-10-21T16:26:57.253 回答
1

在这种情况下,您要支持的方法是面向对象的方法。请记住,对象是相关数据的表示。考虑一个Employee可能有关于他们的薪水、姓名和他们工作的部门的信息(例如)。

但这只是一个 Employee。您可能有数百个.

考虑创建一个员工模型。定义与其中之一最相关的内容。例如,他们都必须有名字,并且必须有薪水。

然后将选择处理查找有关Employees 集合的信息的逻辑——包括最低、最高和平均工资——超出通用Employee 对象的范围。

这个想法是这样的:

  • Employee知道自己的一切。
  • 开发人员有责任将多个员工联系在一起。

可能我对您的问题具体要查找的内容知之甚少-我什至不确定您是否可以使用对象,这确实很糟糕-但这绝对是一个开始。


至于你的编译错误:

  • salary是一个double[]。数组在其中包含许多不同的类型值double,但 adouble[]不是直接 a double。从技术立场和语义立场来看,将非数组类型分配给数组类型是行不通的 - 您正在获取可以保存许多值的东西并尝试将其分配给可以保存一个值的容器。

    从您的代码示例中,您希望使用循环(带有循环变量i)来遍历 中的所有元素salary,并为它们分配一些值。使用 justsalary[0]只修改第一个元素。

于 2012-10-22T22:18:28.750 回答