3

もうすぐ完成です。必要なのは、配列を使用してテキスト ファイルから 5 つの最小値を見つける方法です。5 つの最高値を見つける方法はわかりましたが、最低値を見つけるための最小配列は常に 5 つの 0 を出力します。

出力: //明らかに個々のテキスト ファイルに依存

テキスト ファイル内の数字の合計数は 10 です

合計: 1832

1775 14 9 9 7 //最大

0 0 0 0 0 //分

どんな助けでも大歓迎です!

import java.util.Scanner; 
import java.io.*;

public class HW3
{
   public static void main(String[] args) throws IOException
   {
  File f = new File("integers.txt");
  Scanner fr = new Scanner(f);

    int sum = 0;
    int count = 0;
    int[] max = new int[5];
    int[] min = new int[5];
    int temp;

  while(fr.hasNextInt())
  {
        count++;        
        fr.nextInt();
  }

    Scanner fr2 = new Scanner(new File("integers.txt"));
    int numbers[] = new int[count];

    for(int i=0;i<count;i++)
  {
    numbers[i]=fr2.nextInt(); //fills array with the integers
  }

    for(int j:numbers)//get sum
    {
        sum+=j;
    }

    for (int j=0; j < 5; j++) //finds five highest
    {
        for (int i=0; i < numbers.length; i++)
            {
                if (numbers[i] > max[j])
                {
                    temp = numbers[i];
                    numbers[i] = max[j];
                    max[j] = temp;
                }
            }   
    }

    for (int j=0; j < 5; j++) //finds five lowest...array not assigned values
    {
        for (int i=0; i < numbers.length; i++)
            {
                if (numbers[i] < min[j])
                {
                    temp = numbers[i];
                    numbers[i] = min[j];
                    min[j] = temp;
                }
            }   
    }

    System.out.println("Total amount of numbers in text file is " + count);
    System.out.println("Sum is: " + sum);
    System.out.println(max[0] + " " + max[1] + " " + max[2] + " " + max[3] + " " + max[4]);
    System.out.println(min[0] + " " + min[1] + " " + min[2] + " " + min[3] + " " + min[4]);

   }
}
4

5 に答える 5

1

ネストされた最小ループ内に次の行を入力して、コードをデバッグしてみてください。

System.out.println("numbers[i] の値: " + numbers[i]);

したがって、次のようになります。

for (int j=0; j < 5; j++) //finds five lowest...array not assigned values
{
    for (int i=0; i < numbers.length; i++)
        {
            if (numbers[i] < min[j])
            {
                System.out.println("the value of numbers[i] is: " + numbers[i]);
                temp = numbers[i];
                numbers[i] = min[j];
                min[j] = temp;
            }
        }   
}

興味深いことに気付くでしょう。最も内側のネストされた部分は開始さえしません。

代わりに、ネストされた max ループのそれぞれの場所にその行を入れてみてください。うまく実行され、配列の最大値が表示されます。ネストされた最小ループの最も内側の部分が何らかの方法で開始されていないため (初期割り当て以外)、最小配列のゼロ値を取得しているため、実行に失敗し、検索された値が最小配列に割り当てられません。

min ループの外側のネストされた部分は、同様の行でデバッグしようとすると正常に実行されます。起動しないのはこの部分で、何か問題があります。

            if (numbers[i] < min[j])
            {
                System.out.println("the value of numbers[i] is: " + numbers[i]);
                temp = numbers[i];
                numbers[i] = min[j];
                min[j] = temp;
            }

(更新) 最小ループでは、i=0 から i=4 までの数値 [i] は、最大ループの完了後に 0 の値を持ちます。

1 行追加するだけで、最小ループ内で int i=0 の代わりに int i=5 を使用できます。

for (int j=0; j < 5; j++) //finds five lowest...array not assigned values
{
    min[j] = max[4];                         // added line
    for (int i=5; i < numbers.length; i++)   // change to int i=5
    {
        if (numbers[i] < min[j])
        {...
于 2014-10-22T00:16:58.817 に答える
0

2 つの問題があります。まずトム・エリオットが説明した。

2 番目の問題は、max[] 配列も 0 で初期化され、最大値を検索するときに、max 配列の値 (0) を numbers 配列の値で変更するため、numbers 配列が次の値で満たされることです。 0秒。

簡単な解決策 (最善ではありませんが) は、数値配列を一時配列にコピーし、最小値を検索するときにその一時を使用することです。

私が言ったことを正確に理解していない場合は、5 つの最大値を見つけた後で数値配列を印刷してみてください。

于 2014-10-21T22:29:31.770 に答える
0

他の回答が述べているように、問題は、0 から始まる配列を考慮していないことです。Java では、そのデータ構造のデフォルト値を設定します。プリミティブの場合、これは通常 0 または false になります。ただし、データ構造に移行すると、オブジェクトの初期化に失敗すると、null ポインター例外の問題が発生します。このため、使用する前にデータ構造に値を設定する習慣を身につけることを強くお勧めします。これにより、将来のデバッグ時間を大幅に節約できます。


値が事前にわかっている場合は、{0,0,0,0,0} 表記を使用して手動で設定するか、for ループを使用して初期化できます。

for(int i = 0; i < array.length; i++)
array[i] = init_value;

できるだけ統合することも検討することをお勧めします。たとえば、コードでは、同じデータを 4 回処理します。

1) ファイルから整数を整数配列に読み込みます

2) 整数配列内のすべての数値を合計します

3) 最大を探す

4) 分を探す

関数をまだカバーしているかどうかはわかりませんが、これを統合する 1 つの例は次のようになります。

while(fr2.hasNextInt()){
int i = fr2.nextInt();
sum += i;
checkHighest(i);
checkLowest(i);
}

次に、これらの関数を定義し、肉を別の場所に置きます。これにより、1 か所のループだけを気にすることができます。

于 2014-10-21T21:58:29.787 に答える