java - 从用户那里收集一个数组,打印最小的数字,最大的数字,计算平均值和中位数

标签 java arrays logic average median

我在这个程序中进展顺利,但随着我的进步,我似乎犯了一些很难发现的逻辑错误,需要一些帮助。我有将数组从最小到最大排序的方法。每当我将最小的数字打印到屏幕上时,即使我没有输入任何零,它也总是将该数字显示为 0。我可以获得正确的最高数字,除了当用户输入最大数量的数字时,它会打印第二大数字。有时我得到中位数的正确输出,但从未得到平均值的正确输出。任何帮助是极大的赞赏!我觉得我已经接近正确的代码了,但这些错误给我带来了困难。

public static Scanner kbd = new Scanner(System.in);

public static void main(String[] args) {

    //change to 100 when done testing
    final int MAXSIZE = 10;
    int[] nums = new int [MAXSIZE];
    int usedSize, indexOfNextSmallest = 0;
    double median, average;

    System.out.println("Please enter each number starting from least to greatest(a negative number will quit input): ");
    usedSize = getNums(nums);

    for (int index = 0; index < nums.length -1; index++) {
        indexOfNextSmallest = getIndexOfSmallest(index, nums);
        interchange(index, indexOfNextSmallest, nums);
    }

    median = medians(nums);
    average = averages(nums);

    System.out.println("The smallest number entered is " + nums[0] + ".");
    System.out.println("The largest number entered is " + nums[nums.length-1] + ".");
    System.out.println("The median is: " + median);
    System.out.println("The average is: " + average);

}

public static int getIndexOfSmallest(int startIndex, int[] nums) {
    int min = nums[startIndex];
    int indexOfMin = startIndex;
    for (int index = startIndex +1; index < nums.length; index++) {
        if (nums[index] < min) {
            min = nums[index];
            indexOfMin = index;
        }
    }
    return indexOfMin;
}

private static void interchange(int index, int indexOfNextSmallest, int[] nums) {
    int temp = nums[index];
    nums[index] = nums [indexOfNextSmallest];
    nums[indexOfNextSmallest] = temp;
}

public static int getNums(int nums[]) {
    int usedSize = 0, userValue = 0;

    while(userValue >= 0 && usedSize < nums.length) {
        nums[usedSize] = userValue;
        userValue = kbd.nextInt();
        usedSize++;
    }
    if(!(userValue >= 0)) {
        --usedSize;
        System.out.println(usedSize + " numbers entered.");
    }
    else if(!(usedSize < nums.length)) {
        System.out.println("Maximum amount of inputs (" + nums.length + ") reached.");
    }

    return usedSize;
}

public static double medians(int nums[]) {
    double median;
    if (nums.length % 2 == 0)
        median = ((double)nums[nums.length / 2] + (double)nums[nums.length / 2 - 1]) / 2;
    else
        median = (double)nums[nums.length / 2];

    return median;

}

public static double averages(int nums[]) {
    double average;
    int sum = 0;
    for (int index = 0; index < nums.length; index++){
        sum = sum + nums[index];
    }
    average = ((double)sum / (double)nums.length);

    return average;
}

} 这是我输入 1, 2, 3, 4, 5, -7 时得到的输出(负面影响是停止用户输入(这可能是一个问题吗?))

Please enter each number starting from least to greatest(a negative number will quit input):
1 2 3 4 5 -7
5 numbers entered.
The smallest number entered is 0.
The largest number entered is 5.
The median is: 0.5
The average is: 1.5

使用正确的代码我应该得到的答案是 1、5、3.0 和 3.0

再次感谢您的帮助。

最佳答案

您的 medians()averages() 方法看起来不错。我建议您摆脱 getIndexOfSmallest()interchange() 方法。您表面上只是需要这些方法,因为您正在尝试排序。但我相信排序正在改变数组。使用以下方法求最小值:

public int getMin(int[] nums) {
    int min = nums[0];

    for (int i=1; i < nums.length; ++i) {
        if (nums[i] < min) {
            min = nums[i];
        }
    }

    return min;
}

我会将其作为家庭作业,让您编写一个方法来查找最大值。

关于java - 从用户那里收集一个数组,打印最小的数字,最大的数字,计算平均值和中位数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33793297/

相关文章:

java - main(String args[]) 不是动态数组吗?

ios - 更新数组内的自定义对象而不重新初始化

Java线程关联变量

c++ - 如何制作一个动态大小的数组?动态数组的一般用法(也可能是指针)?

javascript - 向数组添加函数

java - 理解这个程序中的转换

java - Java 中逻辑的分组方式有保证吗?

c++ - 如何在我的游戏中执行脚本?

java - N个相同处理器上任务调度的精确算法?

java - 如何将 GPS 点从 DDD MM.MMM(字符串)转换为十进制(纬度和经度)?