Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从用户处收集数组,打印最小数、最大数、计算平均数和中值_Java_Arrays_Logic_Average_Median - Fatal编程技术网

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

Java 从用户处收集数组,打印最小数、最大数、计算平均数和中值,java,arrays,logic,average,median,Java,Arrays,Logic,Average,Median,我在这个项目中进展顺利,但随着我的进步,我似乎犯了一些难以发现的逻辑错误&需要一些帮助。我有从最小到最大排序数组的方法。每当我在屏幕上打印最小的数字时,它总是将该数字显示为0,即使我没有键入任何零。我可以得到正确的最高数字,除非用户输入最大数量的数字,然后打印第二高的数字。有时我得到了中位数的正确输出,但从未得到平均值的正确输出。非常感谢您的帮助!我觉得我接近正确的代码,但这些错误给了我一段艰难的时间 public static Scanner kbd = new Scanner(System.

我在这个项目中进展顺利,但随着我的进步,我似乎犯了一些难以发现的逻辑错误&需要一些帮助。我有从最小到最大排序数组的方法。每当我在屏幕上打印最小的数字时,它总是将该数字显示为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、5、3.0和3.0

再次感谢您的帮助。

您的
中间值()
平均值()
方法看起来不错。我建议您去掉
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;
}
public int getMin(int[]nums){
int min=nums[0];
对于(int i=1;i
我将把它作为家庭作业留给您编写一个方法来找到最大值。

您的
中间值()
平均值()
方法看起来不错。我建议您去掉
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;
}
public int getMin(int[]nums){
int min=nums[0];
对于(int i=1;i

我将把它作为一个家庭作业留给你编写一个找到最大值的方法。

整个过程在两个地方进行:

第一个

    final int MAXSIZE = 10;
    int[] nums = new int [MAXSIZE];
这意味着,即使程序在负值之后停止接受值;数组的其余部分都用0填充

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

第二期

    final int MAXSIZE = 10;
    int[] nums = new int [MAXSIZE];
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;
}
将确保num[0]处的值始终为零(因为userValue被初始化为0),并且不会从用户输入中获取该值

相反,它应该是:

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

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


根据评论更新

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

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

整个过程在两个地方进行:

第一个

    final int MAXSIZE = 10;
    int[] nums = new int [MAXSIZE];
这意味着,即使程序在负值之后停止接受值;数组的其余部分都用0填充

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

第二期

    final int MAXSIZE = 10;
    int[] nums = new int [MAXSIZE];
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;
}
将确保num[0]处的值始终为零(因为userValue被初始化为0),并且不会从用户输入中获取该值

相反,它应该是:

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

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


根据评论更新

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

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

averages()。因此,getNums()方法是让用户输入数组的数字的地方…还有什么地方可以更改数组?我想在排序数组的方法之一中可能会更改它。原因是
averages()
失败是因为
nums
数组在代码中的其他位置被更改。对于medians(),情况是否相同?这是我的猜测(但尚未测试
medians()
)。确定。所以getNums()方法就是让用户输入数组的数字的地方…数组还可以在哪里修改?我想在排序数组的方法中有一种可能会被修改。好的,我明白你的意思。我对第二部分进行了更改,但现在它告诉我,我输入的最低数字是-数字,用于停止输入。这是有道理的。但是我怎样才能让代码从本质上去除数组中的负数呢?因为我所需要的是退出用户输入对于常量…是否应该将其移动到getNums方法&而是将数组长度设置为nums[nums.length]?好的,很酷。因此,当我弄清楚该如何处理常数时,它应该运行平稳?@T3rm3nator检查更新后的答案以处理负数,并打印输入的总数的正确值。非常感谢您的帮助。我仍在努力练习如何提高代码的效率,您帮助我了解了我应该做哪些不同的事情。然而,负数并没有被分解到最小值或最大值方法中,但仍然会影响中值和平均值。@T3rm3nator请看一下neg的更新答案