我在这个程序中移动得很好,但随着我的进步,我似乎已经做出了一些难以找到的逻辑错误。需要一些帮助。我有方法将数组从最小到最大排序。每当我将最小的数字打印到屏幕时,即使我没有输入任何零,它也始终将该数字显示为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
再次感谢您的帮助。
答案 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;
}
我将把它作为家庭作业,让你编写一个方法来找到最大值。