[英]Java array lowest number and average not computing correctly
我是Java新手。 我的作业需要以下内容:开发一个程序,允许用户将数字输入数组。 输入如下:
用户将输入要输入数组的整数总数。
然后,用户将输入该数量的唯一整数(负数或正数)。 不允许输入的值数超过数组大小。
开发方法以:
对数组排序
确定最高值
确定最低值
计算平均值(两倍)
下面的代码可以运行,但是它将我输入的最低数字显示为0,这是不正确的,并且平均值的确以双精度格式显示,但是始终将数字四舍五入(3.0而不是3.3)。 有人可以让我知道我在做什么错以及如何解决这个问题。 我已经搜寻问题三天了,却找不到我哪里出了错。
import java.util.Scanner;
import java.util.Arrays;
public class UserArray2 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
//allow user input;
System.out.println("How many numbers do you want to enter?");
int num = input.nextInt();
int numbers[] = new int[num];
int low = numbers[0];
int max = numbers[0];
int sum = 0;
double avgNum;
System.out.println("Enter the " + num + " numbers now.");
for (int i = 0 ; i < numbers.length; i++ ) {
numbers[i] = input.nextInt();
}
//sort
System.out.println("The numbers you entered have been sorted from lowest to greatest:");
Arrays.sort( numbers );
for ( int i = 0 ; i < numbers.length ; i++ ) {
System.out.println(numbers[i]);
}
//max
for (int counter = 1; counter < numbers.length; counter++)
{
if (numbers[counter] > max)
{
max = numbers[counter];
}
}
//lowest
for (int counter = 1; counter < numbers.length; counter++)
{
if (numbers[counter] < low)
{
low = numbers[counter];
}
}
//average
for (int i : numbers)
sum += i;
avgNum = sum/numbers.length;
System.out.println("The largest number on your list is: " + max);
System.out.println("The lowest number on your list is: " + low);
System.out.println("The average of the list of numbers is: " + avgNum);
}
public static void printArray(int arr[]){
int n = arr.length;
for (int i = 0; i < n; i++) {
System.out.print(arr[i] + " ");
}
}
}
在接受用户输入之前,您已经完成了以下分配:
int low = numbers[0];
int max = numbers[0];
这意味着低值和最大初始值将为0。因此,对于您的最小逻辑,将用户输入与低值进行比较,并且没有任何值低于0,因此您始终得到的最小值为0。
您应在接受用户输入(即使用实数数组值)后定义或重新定义它们。
在这一行,
avgNum = sum/numbers.length;
sum
和numbers.length
都是整数,因此Java将结果计算为整数。 然后,将结果分配给avgNum
,它恰好是一个double。 到那时,除法结果的任何小数部分都已经消失了。
要解决此问题,您可以:
avgNum = (double)sum/numbers.length;
在执行除法运算之前,将sum
转换为double
。
数组索引从0开始。但是您的计数器从1开始。
for(int计数器= 0;计数器<数字。长度;计数器++)
您需要将int值转换为double。 否则它将舍入为int。
avgNum =(double)sum / numbers.length;
你很亲密 以下是导致您的代码无法正确完成的问题:
您太早初始化了min
和max
。 对于min
当所有数字均为正数时,这会产生问题。 对于最大值,当所有数字均为负数时。 读取完成后 ,您应该声明/初始化两个变量。 将声明移至读取循环后的位置将解决此问题。
尽管您将avgNum
的类型正确定义为double
,但您为其分配的表达式仍为int
,因为其两个元素均为int
。 因此,该划分被截断。 如下更改分区:
avgNum = (double)sum/numbers.length;
或更妙的是,将sum
声明为double
,并删除强制类型转换。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.