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