使用用户输入数组的移动平均线
Moving Average Using User-Input Array
我需要编写一个程序,通过用户输入的数组计算移动平均线。数组的第一个元素是 window 大小,输入以 0 结束。输出值在小数点后打印两位数。
示例输入:3 2 4 7 7 8 11 12 0
对应输出:4.33 6.00 7.33 8.67 10.33
(4.33 是 2、4、7 的平均值,6 是 4、7、7 等的平均值)
到目前为止,这是我的代码:
package movingaverage;
import java.util.Scanner;
public class MovingAverage {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] arr = new int[n];
int sum = 0;
for (int i = 0; i < n; i++) {
sum += arr[i];
}
avg[0] = sum / 5;
int j = 1;
for (int i = 5; i < arr.length; i++) {
sum = sum + arr[i] - arr[i - 5];
avg[j++] = sum / 5;
}
}
}
我想我的循环是正确的,但我不确定如何让数组以 0 结尾。
这是一个可能的解决方案。
public class Test
{
private static final Scanner SCANNER;
static {
SCANNER = new Scanner(System.in);
}
public static final void main(final String... args) {
final String[] numbers = SCANNER.nextLine().trim().split(" ");
final int consideredElements = Integer.parseInt(numbers[0]);
float sum = 0;
int value = 0;
for (int i = 1; i < numbers.length; i++) {
sum = 0;
for (int k = 0; k < consideredElements; k++) {
value = Integer.parseInt(numbers[i + k]);
if (value == 0) {
return;
}
sum += value;
}
System.out.println(new BigDecimal(sum / consideredElements).setScale(2, RoundingMode.HALF_EVEN));
}
}
}
首先,您在程序中的几个地方使用了 5,我看不出有什么理由这样做。可能是您对用户输入的期望导致您将 5 放在您真正应该使用的数字的位置,取决于用户输入?也许您应该改用 window 大小?我在这里猜了一点。
接下来,正如@lppEdd 指出的那样,您没有从输入中读取数字——只有 window 大小。
接下来,您要声明大小为 n
的数组,我认为这是您的 window 大小,而不是数组大小。我相信这个问题的真正解决方案是使用更好、更具解释性的变量名。
您的代码无法编译,因为您尚未声明您尝试将移动平均线存储到其中的数组 avg
。
第五,当你想要你的平均值作为double
时,你需要在除法之前转换为double
(这是一个经典的陷阱已经在 Stack Overflow 上产生了很多问题)。
我希望这能让你更进一步。
我需要编写一个程序,通过用户输入的数组计算移动平均线。数组的第一个元素是 window 大小,输入以 0 结束。输出值在小数点后打印两位数。
示例输入:3 2 4 7 7 8 11 12 0
对应输出:4.33 6.00 7.33 8.67 10.33
(4.33 是 2、4、7 的平均值,6 是 4、7、7 等的平均值)
到目前为止,这是我的代码:
package movingaverage;
import java.util.Scanner;
public class MovingAverage {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] arr = new int[n];
int sum = 0;
for (int i = 0; i < n; i++) {
sum += arr[i];
}
avg[0] = sum / 5;
int j = 1;
for (int i = 5; i < arr.length; i++) {
sum = sum + arr[i] - arr[i - 5];
avg[j++] = sum / 5;
}
}
}
我想我的循环是正确的,但我不确定如何让数组以 0 结尾。
这是一个可能的解决方案。
public class Test
{
private static final Scanner SCANNER;
static {
SCANNER = new Scanner(System.in);
}
public static final void main(final String... args) {
final String[] numbers = SCANNER.nextLine().trim().split(" ");
final int consideredElements = Integer.parseInt(numbers[0]);
float sum = 0;
int value = 0;
for (int i = 1; i < numbers.length; i++) {
sum = 0;
for (int k = 0; k < consideredElements; k++) {
value = Integer.parseInt(numbers[i + k]);
if (value == 0) {
return;
}
sum += value;
}
System.out.println(new BigDecimal(sum / consideredElements).setScale(2, RoundingMode.HALF_EVEN));
}
}
}
首先,您在程序中的几个地方使用了 5,我看不出有什么理由这样做。可能是您对用户输入的期望导致您将 5 放在您真正应该使用的数字的位置,取决于用户输入?也许您应该改用 window 大小?我在这里猜了一点。
接下来,正如@lppEdd 指出的那样,您没有从输入中读取数字——只有 window 大小。
接下来,您要声明大小为 n
的数组,我认为这是您的 window 大小,而不是数组大小。我相信这个问题的真正解决方案是使用更好、更具解释性的变量名。
您的代码无法编译,因为您尚未声明您尝试将移动平均线存储到其中的数组 avg
。
第五,当你想要你的平均值作为double
时,你需要在除法之前转换为double
(这是一个经典的陷阱已经在 Stack Overflow 上产生了很多问题)。
我希望这能让你更进一步。