1

このプログラムには、アレイに対してさまざまな機能を実行するためのオプションを含むメニューがあります。この配列は、「data.txt」というファイルから取得されます。このファイルには、整数が 1 行に 1 つずつ含まれています。これらの整数を配列に格納するメソッドを作成して、計算を実行する必要があるときにそのメソッドを呼び出すことができるようにしたいと考えています。明らかに、コード全体を含めていません (長すぎます)。しかし、誰かが平均を計算する最初の問題で私を助けてくれることを望んでいました. 現在、コンソールは平均値として 0 を出力します。これは、1、2、3 がファイル内にあることに加えて、残りの配列が 0 で埋められているためです。私が望む平均は2です。どんな提案も大歓迎です。私のプログラムの一部は以下のとおりです。ありがとう。

public static void main(String[] args) throws FileNotFoundException {
    Scanner sc = new Scanner(System.in);
    System.out.println("Welcome to Calculation Program!\n");
    startMenus(sc);

}

private static void startMenus(Scanner sc) throws FileNotFoundException {
    while (true) {
        System.out.println("(Enter option # and press ENTER)\n");

        System.out.println("1. Display the average of the list");
        System.out.println("2. Display the number of occurences of a given element in the list");
        System.out.println("3. Display the prime numbers in a list");
        System.out.println("4. Display the information above in table form");
        System.out.println("5. Save the information onto a file in table form");
        System.out.println("6. Exit");

        int option = sc.nextInt();

        sc.nextLine();

        switch (option) {
            case 1:
                System.out.println("You've chosen to compute the average.");
                infoMenu1(sc);
                break;
            case 2:
                infoMenu2(sc, sc);
                break;
            case 3:
                infoMenu3(sc);
                break;
            case 4:
                infoMenu4(sc);
                break;
            case 5:
                infoMenu5(sc);
                break;
            case 6:
                System.exit(0);
            default:

                System.out.println("Unrecognized Option!\n");
        }

    }
}

private static void infoMenu1(Scanner sc) throws FileNotFoundException {
    File file = new File("data.txt");
    sc = new Scanner(file);

    int[] numbers = new int[100];

    int i = 0;

        while (sc.hasNextInt()) {
            numbers[i] = sc.nextInt();
            ++i;
        }

    System.out.println("The average of the numbers in the file is: " + avg(numbers));
}

public static int avg(int[] numbers) {
    int sum = 0;
    for (int i = 0; i < numbers.length; i++) {
        sum = (sum + numbers[i]);
    }
    return (sum / numbers.length);
}
4

4 に答える 4

1

次のようにメソッドを変更するだけです。実際の数値は
public static int avg(int[] numbers, int len)どこに保存されますか。 あなたの場合、次のように呼び出します。 len

System.out.println("The average of the numbers in the file is: " + avg(numbers, i));  

そして、平均のコードでは:

 for (int i = 0; i < len; i++) {
        sum = (sum + numbers[i]);
    }  

numbers.lengthつまり、len渡された ものに置き換えます

そして、やりますreturn (sum / len);

于 2013-03-09T20:41:04.730 に答える
1

静的サイズの配列を使用する代わりに、動的サイズの を使用できますList

import java.util.List;
import java.util.LinkedList;

// . . .

private static void infoMenu1(Scanner sc) throws FileNotFoundException {
    File file = new File("data.txt");
    sc = new Scanner(file);

    List<Integer> numbers = new LinkedList<Integer>();

    while (sc.hasNextInt()) {
        numbers.add(sc.nextInt());
    }

    System.out.println("The average of the numbers in the file is: " + avg(numbers));
}

public static int avg(List<Integer> numbers) {
    int sum = 0;
    for (Integer i : numbers) {
        sum += i;
    }
    return (sum / numbers.size());
}

これにより、100 を超える数を読み取ることができるという利点が追加されました。LinkedListでは、任意の数の操作を一定の時間内に実行できるためadd、入力を読み取る前に数値 (またはカウントの上限) を知る必要はありません。

kkonrad も述べたように、実際には平均値に浮動小数点値を使用する場合と使用しない場合があります。現在、整数演算を行っています。つまり、 と の平均12です1。代わりに、 aを使用して平均を計算する1.5ことを検討する必要があります。double

public static double avg(List<Integer> numbers) {
    double sum = 0;
    for (Integer i : numbers) {
        sum += i;
    }
    return (sum / numbers.size());
}
于 2013-03-09T20:45:36.393 に答える
0

sumは double にする必要があり、doubleavg関数の戻り値の型にする必要があると思います

于 2013-03-09T20:40:57.070 に答える
0

このように平均関数を変更してください

  private static void infoMenu1(Scanner sc) throws FileNotFoundException {
    .
    .
    .
    System.out.println("The average of the numbers in the file is: " + avg(numbers,i));
  }

  public static int avg(int[] numbers,int length) {
    int sum = 0;
    for (int i = 0; i < length; i++) {
        sum = (sum + numbers[i]);

    }
    return (sum / length);
}

平均関数を呼び出している間、i (data.txt のエントリ数として infoMenu1 で数えたもの) も渡し、それをループで使用して合計を除算します。これにより、ループは100回の反復で実行されなくなり、行のコードも削減されます。

于 2013-03-09T21:10:57.887 に答える