输入之间的空间不会在数组索引上产生异常?



我不确定这个问题的标题是什么(如果有人对这个问题的命名有什么意见,请告诉我(。我的程序要求用户输入 5 个整数和 5 个双精度。然后将这些数字放入数组中,并将其传递给方法以获取平均值。我的问题是,如果我用空格分隔用户输入并按回车键(例如,5space6...enter;它允许我输入比数组索引中允许的更多的内容。为什么它不给你一个错误?你如何防止这种情况?关于我如何编写代码的任何建议也会有所帮助!

这是代码。

import java.util.*;
public class Lab7A_BRC{
public static void main(String[] args) {
System.out.println("tt Average arrays ");
Scanner input = new Scanner(System.in);
//array count varriable
int n = 5;
//array declaration
int [] list1 = new int[n];
double [] list2 = new double[n];
System.out.print("Enter 5 integer values. ");
for(int i = 0; i < n; i++) {
list1[i]= input.nextInt();

if(i == (n - 1)){
System.out.println("t The average of the 5 integers is "
+ average(list1, n));
}
}
System.out.println("Enter 5 double values. ");
for (int i = 0; i < n; i++){
list2[i]= input.nextDouble();
if(i == (n-1)){
System.out.println("t The average of the 5 doubles is "
+ average(list2, n));
}
}
}
public static int average(int[] array, int n){
int sum = 0;
for(int i = 0; i < n; i++){
int holdNumber = array[i];
sum += holdNumber;
}
int average = sum / n;
return average;
}
public static double average(double[] array, int n){
double sum = 0;
for(int i = 0; i < n ; i++){
double holdNumber = array[i];
sum += holdNumber;
}
double average = sum / n;
return average;
}
}

它不会给你一个错误,因为你只读取前 5 个值,如你的 for 循环中所述。

第一件事是你应该将输入逻辑与输出逻辑解耦,这样当你退出for循环时,你就可以确定你在你的第5个数字中。

然后,您可以检查除了空白字符串之外是否还剩下任何其他内容,如果有,则可以抛出一个异常,指出它的数字太多。

我已经调整了整数部分,您可以轻松调整双精度逻辑。

如果您有任何疑问,请随时询问。

改编后的代码:

import java.util.Scanner;
public class Lab7A_BRC {
public static void main(String[] args) {
System.out.println("tt Average arrays ");
Scanner input = new Scanner(System.in);
//array count varriable
int n = 5;
//array declaration
int[] list1 = new int[n];
double[] list2 = new double[n];
System.out.print("Enter 5 integer values. ");
for (int i = 0; i < n; i++) {
list1[i] = input.nextInt();
}
if (!input.nextLine().equals("")) {
throw new RuntimeException("Too many numbers entered!");
}
System.out.println("t The average of the 5 integers is "
+ average(list1, n));

System.out.println("Enter 5 double values. ");
for (int i = 0; i < n; i++) {
list2[i] = input.nextDouble();
if (i == (n - 1)) {
System.out.println("t The average of the 5 doubles is "
+ average(list2, n));
}
}
}
public static int average(int[] array, int n) {
int sum = 0;
for (int i = 0; i < n; i++) {
int holdNumber = array[i];
sum += holdNumber;
}
int average = sum / n;
return average;
}
public static double average(double[] array, int n) {
double sum = 0;
for (int i = 0; i < n; i++) {
double holdNumber = array[i];
sum += holdNumber;
}
double average = sum / n;
return average;
}
}

我认为你混淆了两个不同的概念。

一个是输入,另一个是你的变量。

输入是由 shell 和扫描程序管理的缓冲区(读取:数据块(。它可以包含任意数量的数据,您与它无关。

代码中发生的情况是,扫描程序获取缓冲区并从缓冲区解析(读取:解释(下一个有效值,并将其转换为正确的数据类型 - 直到"第 n"个元素。因此,由于您采用"n"个元素(由for控制(,因此输入缓冲区中有多少可用数据并不重要,您始终读取有限量的数据。

数据量很重要的唯一方式是当扫描仪没有更多输入可供读取时,在这种情况下,它会要求更多输入。

原因是您正在迭代到您在开始时定义的n数字。

for(int i = 0; i < n; i++) {
list1[i]= input.nextInt();

因此,如果您尝试输入1 1 1 1 1 124124 1241您将看到平均值为 1,因为其余部分被忽略并且不会添加到列表中。因为它不会尝试nextInt()超过n给出的。

我是初学者,所以我的答案可能是错误的:(,对此感到抱歉。这段代码对我有用。就像@iajrz提到的,您可以在尝试使用 system.in 时执行spaece或换行符。

因为 for 循环会执行 n 次迭代,所以您只拾取输入的前 n 个整数。如果您的输入是 1 2 3 4 5 6 7 8,它将仅选择 1 2 3 4 5(因为在您的代码中 n=5(。您还可以插入以空格分隔的多个数字,因此输入 15 0 00 0010 0 的平均值=5

相关内容

  • 没有找到相关文章

最新更新