package hw3;
public class Main {
public static void main(String[] args) {
final int NumberOfElements = 1000;
int[] num = new int[NumberOfElements];
int var = 0;
//create input
java.util.Scanner input = new java.util.Scanner(System.in);
for (int i = 0; i < NumberOfElements; i++) {
System.out.print("Enter any positive number or enter 0 to stop: ");
num[i] = input.nextInt();
var++;
if (num[i] == 0)
break;
}
Arrays.sort( num, 0, var);
int i;
for (i = 0; i < var; i++) {
System.out.print(" " + num[i]);
}
}
}
编写一个Java程序,读取每行输入一个正整数序列。输入整数“0”时程序停止读取。程序将对它们进行排序并将其输出为递增的数字顺序。例如:5 1 7 12 36 8 0 输出:1 5 7 8 12 36
答案 0 :(得分:1)
尝试理解问题:有三个步骤
第1步:获取用户的输入。继续输入,直到用户输入0
第2步:排序
第3步:打印结果
第1步:您的for
循环几乎正确
但是你得到输入之后,for循环应该立即结束
在以下代码中,
num[i] = input.nextInt();
var++;
if (num[i] == 0)
break;
您要将用户输入添加到数组,然后检查它是否为0
。这意味着0
也将成为数组的一部分。如果您不想这样,则应检查输入并仅在数组不是0
时将其添加到数组中。
另请注意i
循环前for
的声明。因为在for循环之后我们需要它。为什么?见下文。
int i = 0;
for (i = 0; i < NumberOfElements; i++) {
int n = input.nextInt();
if (n == 0)
break;
else
num[i] = n;
} //for loop ends here
第2步:对其进行排序
Arrays.sort(num);
第3步:打印输出:
for (i = 0; i < num.length; i++) {
System.out.print(" " + num[i]);
}
问题是,在第2步中,对1000个元素的数组进行了排序,而实际上您只需要考虑用户输入的元素数。您最初不知道这就是为什么您创建了1000个元素的数组。但是,此时(在步骤2之后)您执行知道用户输入了多少元素。这存在于i
1和2之间的新步骤:创建一个仅包含用户输入的元素的新数组 步骤1.5:
int[] newArray = Arrays.copyOf(num, i);
现在对这个新数组进行排序并打印它(与你的代码相同,但使用我们刚创建的新数组)
Arrays.sort(newArray);
for (i = 0; i < newArray.length; i++) {
System.out.print(" " + newArray[i]);
}
备注:强>
1.执行此操作的理想方法是使用列表而不是数组,但可能因为这是作业,您可能 使用数组。
Arrays.sort
或Arrays.copy
。你的教授可能会对此不以为然,因为他的意图可能是你通过for
,if
和while
来学习语言的结构。在这种情况下,您必须执行步骤1.5(使数组的大小合适)并自行排序
这并不困难(但请记住,除了在家庭作业中,这不是最好的方法)复制数组(自制)(代替上面的步骤1.4)
int[] newArray = new int[i]
for(int j=0; j<i; j++){
newArray[j] = num[j];
}
排序(自制)(代替上面的第2步):
有两个循环,因为你必须连续进行比较:第一个元素,与整个数组比较,将它放在正确的位置,与整个数组进行第二次比较......)
for(int j=0; j<newArray.length; j++) {
for(int k=0; k<newArray.length; k++) {
if(newArray[k] > newArray[j]) {
//the swap logic:
int t = newArray[k];
newArray[k] = newArray[j];
newArray[j] = t;
}
}
}
尝试了解真正发生的事情,而不仅仅是复制粘贴。
一旦理解了自制排序逻辑,请考虑以下事项:
排序or(int k=0; k<newArray.length; k++) {
中的第二个for循环实际上可能只是for(int k=0; k<newArray.length; k++) {
。为什么呢?
您的打印循环将保持您编写的方式,但您将打印newArray
而不是num
。您可能希望将循环变量更改为int j
或其他内容,但i
也可以。 (i
现在保留输入的数量,所以我不会将它用于任何其他目的。但它只是一种编码方式。技术上没有区别 - 代码将以相同的方式工作)
我没有合并这些部分。我离开你了,否则看起来我做了你的作业: - )
答案 1 :(得分:0)
这里你的应用程序正在读取int,你可以检查最后一个是!=从0和break
循环。
如果您不喜欢使用break,您仍然可以为for
添加条件。
对于数组排序,有Arrays.sort()
解决方案。
要打印它们,你需要另一个循环,但要小心,因为阵列中只有不到1000个项目,你不能简单地打印整个阵列。
您需要找到一种方法来计算您在数组中添加的元素数量。
编辑后:
好你的应用似乎在这里工作是我得到的:
Mac-Makkhdyn:~Makkhdyn $ java hw3.Main
输入任何正数或输入0表示停止:1
输入任意正数或输入0表示停止:2
输入任何正数或输入0表示停止:3
输入任何正数或输入0表示停止:4
输入任何正数或输入0表示停止:5
输入任意正数或输入0表示停止:0
Mac-Makkhdyn:~Makkhdyn $
你拥有的0必须来自其他地方。您的实际代码与您在此处发布的代码略有不同吗?
资源:
答案 2 :(得分:0)
num[i]
包含您正在阅读的最后一个号码。因此,您必须将其与0
进行比较,如果是0
,则必须结束循环。阅读branching statements以了解如何执行此操作。
一般来说,阅读control flow statements也很有帮助。