0

次のような在宅ワークの問題があります。

次のデータは、地震のリヒター スケール データを表しています。有効な地震データの平均を計算して出力するプログラムを作成します。

リヒター値を quakeLevels という名前の double の配列に格納します。

残念ながら、あなたの地震計は時々信頼できない測定値を生成することが知られています (この例の 10.1 の値のように)。したがって、最大値と最小値を破棄することにします。

プログラムは次のことを行う必要があります。

次のデータを使用して、quakeLevels 配列を宣言し、初期化します。 { 5.6, 6.2, 4.0, 5.5, 5.7, 6.1,7.4, 8.5, 5.5, 6.3, 6.4, 2.1, 6.9, 4.3, 3.1, 7.0, 10.1 }

配列内の最大値と最小値を決定します。最大値と最小値を除いて、配列の内容の平均を計算します。最大値と最小値を除いた配列の値を出力します。平均を出力します。

Math クラスを使用できないため、すべてが最大値と最小値を出力するように書き出されます。

これまでの私のコードは次のとおりです。

 public class ARRAYminAndmax0RichterScale
    {
        public static void main(String [] args)
        {
            double [] quakeLevels = { 5.6, 6.2, 4.0, 5.5, 5.7, 6.1 ,7.4, 8.5, 5.5, 6.3, 6.4, 2.1, 6.9, 4.3, 3.1, 7.0, 10.1};    
            double [] quakeLevelsNormalized = new double [(quakeLevels.length - 2)];
            int i;

            int minIndex = 0;  // start with 0th element as min
            for ( i = 1; i < quakeLevels.length; i++) {                 
                if (quakeLevels[i] < quakeLevels[minIndex]) {
                    minIndex = i;                        
                }                    
            }
            System.out.print("Min: " + quakeLevels[minIndex] + "    ");

            int maxIndex = 0;  // start with 0th element as max
            for ( i = 1; i < quakeLevels.length; i++) {                 
                if (quakeLevels[i] > quakeLevels[maxIndex]) {
                    maxIndex = i;                        
                }                    
            }

            System.out.println("Max: " + quakeLevels[maxIndex]);                
           System.out.println("The Richter values, excluding the extrema, are as follows: ");   

            //make a new array excluding the max and min
            for ( i = 1; i < quakeLevels.length - 2; i++ ) {

                if(quakeLevels[i]!= minIndex && quakeLevels[i]!= maxIndex){
                    quakeLevelsNormalized[i] = quakeLevels[i];
                    System.out.printf("%6s\n", quakeLevelsNormalized[i] );
                }                    
            }

          //***THIS LOOP IS HERE TO HELP ME FIGURE OUT THE PROBLEM***
            for( i =0; i < quakeLevelsNormalized.length; i++){
                System.out.println("quakeLevelsNormalized["+i+"] = " + quakeLevelsNormalized[i]);
            }

            //find average of quakeLevelsNormalized
            double arrayTotal = 0;
            double average = 0;
            for (i = 0; i < quakeLevelsNormalized.length; i++) {

                arrayTotal = arrayTotal + quakeLevelsNormalized[ i ];

            }
            average = arrayTotal / quakeLevelsNormalized.length;

            //output

            System.out.println( quakeLevelsNormalized[i-1]);
            System.out.printf("%s%.1f\n","Average Quake Level = ", average);
        }

    }

そして、次の出力が得られます。

Min: 2.1    Max: 10.1

The Richter values, excluding the extrema, are as follows: 
   6.2
   4.0
   5.5
   5.7
   6.1
   7.4
   8.5
   5.5
   6.3
   6.4
   2.1
   6.9
   4.3
   3.1
quakeLevelsNormalized[0] = 0.0
quakeLevelsNormalized[1] = 6.2
quakeLevelsNormalized[2] = 4.0
quakeLevelsNormalized[3] = 5.5
quakeLevelsNormalized[4] = 5.7
quakeLevelsNormalized[5] = 6.1
quakeLevelsNormalized[6] = 7.4
quakeLevelsNormalized[7] = 8.5
quakeLevelsNormalized[8] = 5.5
quakeLevelsNormalized[9] = 6.3
quakeLevelsNormalized[10] = 6.4
quakeLevelsNormalized[11] = 2.1
quakeLevelsNormalized[12] = 6.9
quakeLevelsNormalized[13] = 4.3
quakeLevelsNormalized[14] = 3.1
3.1
Average Quake Level = 5.2

問題

したがって、これは明らかに本来あるべき姿ではありません。最後に追加の 3.1 が表示されるのはなぜですか? [18 マイナス 2 つの極値] があるはずなのに、14 の要素しかありませんか? 私は初心者のプログラマーです。すべての助けに感謝します!!

4

7 に答える 7

1

比較対象を間違えている可能性が高いと思います。

if(震度[i]!= minIndex && 震度[i]!= maxIndex)

この行では、インデックス i の VALUE が最小/最大インデックスと同じかどうかを尋ねます。これはあなたが望むほど正確ではありません。i を maxIndex および minIndex と直接比較する必要があります。

于 2013-10-03T13:31:47.310 に答える
1

あなたを助けるためにいくつかの可能な方法:

    /**
     * Get the largest number in the array
     */
    public double getMax(double[] array) {
            double max = Double.MIN_VALUE;
            for (double n : array) {
                    if (n > max) max = n;
            }
            return max;
    }

    /**
     * Get the smallest number in the array
     */
    public double getMin(double[] array) {
            double min = Double.MAX_VALUE;
            for (double n : array) {
                    if (n < min) min = n;
            }
            return min;
    }

    /**
     * Remove the specified number from the array, return a new array with the number removed
     */
    public double[] removeFromArray(double[] array, double number) {
            int count = 0;
            for (double n : array) {
                    if (n==number) count++;
            }
            double[] result = new double[array.length - count];
            int index = 0;
            for (double n : array) {
                    if (n!=number) result[index++] = n;
            }
            return result;
    }

    /**
     * Work out the mean of all the numbers in an array
     */
    public double averageOfArray(double[] array) {
            double total = 0;
            for (double n : array) {
                    total += n;
            }
            return total / array.length;
    }
于 2013-10-03T13:33:44.573 に答える
0
if(quakeLevels[i]!= minIndex && quakeLevels[i]!= maxIndex) {
           quakeLevelsNormalized[i] = quakeLevels[i];
           System.out.printf("%6s\n", quakeLevelsNormalized[i] );
}

minIndex と maxIndex に関連付けられた値ではなく、インデックスを比較する必要があります。

また、なぜ を反復する0...length-2のですか? を反復し0.. length-1て、インデックスがminIndexmaxIndex

これは次arrayTotal = arrayTotal + quakeLevelsNormalized[ i ]のように簡略化できます

arrayTotal += quakeLevelsNormalized[i] 

正規化されたレベルのデータ構造に ArrayList を使用できる場合は、この方法でインデックスを気にする必要はありません。

あなたはただやります:

if ((i != minIndex) && (i != maxIndex)) {
    normalized.add(quakeLevels[i])
 }
于 2013-10-03T13:30:40.447 に答える
0

あなたの問題は、quakeLevelsNormalized配列の計算にあります。これをチェックして

//you need another index variable for 'quakeLevelsNormalized'
int j = 0;
for (i = 0; i < quakeLevels.length; i++) {

    //check the index, not the value, you have this wrong in your code
    //if(quakeLevels[i]!= minIndex && quakeLevels[i]!= maxIndex){
    if (i != minIndex && i != maxIndex) {
        quakeLevelsNormalized[j] = quakeLevels[i];
        System.out.printf("%6s\n", quakeLevelsNormalized[j]);

        //increment the index of 'quakeLevelsNormalized' array
        j++;
    }
}
于 2013-10-03T13:39:42.360 に答える
0

コードを改善できる領域はほとんどありません。最小値と最大値を見つけるには、コレクション メソッドを使用できます。

int minIndex = quakeLevels.indexOf(Collections.min(quakeLevels));
int maxIndex = quakeLevels.indexOf(Collections.max(quakeLevels));

あなたの主な問題は次の行にあります。

**//make a new array excluding the max and min
            for ( i = 1; i < quakeLevels.length - 2; i++ )**

それはなぜなのかquakeLevels.length - 2、そうあるべきですquakeLevels.length。また、 for ループで使用する必要があることを確認する i = 1;か、 使用する必要があります。i = 0;

次の行を削除します

System.out.println( quakeLevelsNormalized[i-1]);
于 2013-10-03T13:29:39.470 に答える
0

コレクション型の使用は許可されていないと思いますよね?

問題を構成要素に分割し、それらを 1 つずつ実行してみてください。

1) 有効なデータのみを使用します。これを行うには、配列をループし、各要素を順番にチェックして、<=0 または >=10 であるかどうかを確認します。有効な場合は別の配列に貼り付け、そうでない場合は無視します。

2) 最大値と最小値を計算します。これで完了です。次のビットのインデックスを格納する

3) 平均を計算します: 値をループして加算し、上から保存した最小値と最大値をスキップして、それらを出力します。

次の作業を行う前に、各部分が機能していることを確認してください。デバッグが容易になります。

于 2013-10-03T13:30:05.523 に答える