0

今週はこのタイプの質問の週のようです。そして、すべての新しいものといくつかの古いものを読んだ後、私は同じように混乱しています!

5 人の従業員のテキスト ファイルがあり、それぞれの従業員の名前の下に 10 の給与値がリストされています。このファイルを読み込んで、従業員名、最低給与、最高給与、および各人の平均給与を見つけて表示します。ファイルの読み取りを制御するループ、配列にデータを追加するループ、計算を行うループの 3 つが必要です。Math.round各人の情報を 1 行に出力する必要があり、聞いたことがないような方法で小数点以下 2 桁に丸められるようにする必要があります。

私が持っているコードの混乱をお見せするのは恥ずかしいのですが、それはそれほど多くないからです。どのように進めればよいか、正しい考えを持っているかどうかさえわかりません。あなたの助けに感謝します。

更新されたコード:もう一度!

    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 つのループが必要です。1 つはファイルの読み取りを制御するため、もう 1 つはデータを配列に入れるため、もう 1 つは計算を行うためです。

私が以下に書いたことは、今のあなたにとってはもっとゴツゴツしたものかもしれませんが、もしあなたがこのクラスを乗り越えたなら、知っておくと役に立つかもしれません.

これを別の見方で見ると、よりオブジェクト指向で、起動するのに適した分解になります。データを保持し、計算を実行し、出力をレンダリングするには、オブジェクトが必要です。そのデータを取得する方法は重要ではありません。今日はファイルです。次回は 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は、給与、名前、および勤務している部門に関する情報を持っている可能性があることを考慮してください(例として)。

しかし、それは1つ Employeeだけです。あなたは何百も持っているかもしれません。

従業員のモデルを作成することを検討してください。それらの1つに最も適切なものを定義します。たとえば、全員に名前が必要であり、給与も必要です。

次に、一般的なEmployeeオブジェクトの範囲で、従業員のコレクションに関する情報(最小、最大、平均の給与など)を検索するロジックを処理することを選択します。

アイデアはこれです:

  • AnEmployeeは自分自身についてすべてを知っています。
  • 複数の従業員を結び付ける責任は開発者にあります。

あなたの問題が具体的に何を探しているのか、私には十分にわからない可能性があります-オブジェクトを使用できるかどうかさえわかりませんが、それは本当にひどいことです-しかし、これは間違いなく始まりです。


コンパイルエラーについて:

  • salaryですdouble[]。配列はそのdouble中に型の多くの異なる値を保持しますが、adouble[]は直接ではありませんdouble。技術的なスタンスとセマンティックなスタンスの両方から、非配列型を配列型に割り当てることは機能しません-あなたは多くの値を保持できるものを取り、それを1つの値を保持できるコンテナに割り当てようとしています。

    コードサンプルから、ループ(ループ変数を使用i)を使用して、内のすべての要素を反復処理しsalary、それらに値を割り当てます。使用salary[0]すると、最初の要素のみが変更されます。

于 2012-10-22T22:18:28.750 に答える