1

在此程序中,您将找到一个菜单,其中包含在阵列上执行不同功能的选项。该数组取自名为“data.txt”的文件。该文件包含整数,每行一个。我想创建一个将这些整数存储到数组中的方法,以便在需要完成计算时调用该方法。显然,我没有包含整个代码(太长了)。但是,我希望有人可以帮助我解决计算平均值的第一个问题。现在,控制台打印 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.lengthlen传入的 替换

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 还提到的,您实际上可能希望也可能不希望使用浮点值作为平均值。现在你正在做整数算术,也就是说 和 的1平均值21。如果你愿意1.5,你应该考虑使用 adouble来计算平均值:

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并且double应该是avg函数的返回类型

于 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时(您在 infoMenu1 中计算 data.txt 中的条目数)并在循环中使用它并除以总和。这样,您的循环将不会运行 100 次迭代,并且行代码也减少了。

于 2013-03-09T21:10:57.887 回答