从用户收集数组,打印最小数字,最大数字,计算平均值和中位数

时间:2015-11-19 00:41:31

标签: 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和&amp; 3.0

再次感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

整个事情在两个地方出现:

第一个

    final int MAXSIZE = 10;
    int[] nums = new int [MAXSIZE];

这意味着即使程序在负值之后停止接受值;数组的所有其余部分都填充了0。

要解决此问题,您可以选择在int array上使用ArrrayList

第二个问题

getnums的现有代码是

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;
}

这里是while循环,语句

        nums[usedSize] = userValue;
        userValue = kbd.nextInt();

将确保num [0]的值始终为零(因为userValue初始化为0),并且不会从用户输入中获取它。

相反它应该是:

while(userValue >= 0 && usedSize < nums.length) {           
        userValue = kbd.nextInt();
        nums[usedSize] = userValue;
        usedSize++;
 }

如果你照顾这两个问题;那么剩下的代码应该可以正常工作。

这是我在第二期更新后运行程序时得到的结果:

  

输入

Please enter each number starting from least to greatest(a negative number will quit input): 
5
8
4
32
-5
  

输出

The smallest number entered is -5.
The largest number entered is 32.
The median is: 0.0
The average is: 4.4

这是正确的,因为平均值和中位数是针对10个数字计算的,其余数字(输入负数后)仅为0

根据评论更新

如果您只想拒绝负数,可以在getnums方法中更新while循环:

    while(userValue >= 0 && usedSize < nums.length) {           
        userValue = kbd.nextInt();
        if(userValue >= 0) {
            nums[usedSize] = userValue;
            usedSize++;
        }
    }

此外,之后的if循环不应减少usedSize

的值
if(!(userValue >= 0)) {        
        System.out.println(usedSize + " numbers entered.");
    }

答案 1 :(得分:2)

您的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;
}

我将把它作为家庭作业,让你编写一个方法来找到最大值。