如何使用数字0退出循环?但现在我还有其他问题

时间:2010-09-25 06:43:08

标签: java arrays loops

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

3 个答案:

答案 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.执行此操作的理想方法是使用列表而不是数组,但可能因为这是作业,您可能 使用数组。

  1. 由于这是家庭作业,我不知道您是否被允许使用Arrays.sortArrays.copy。你的教授可能会对此不以为然,因为他的意图可能是你通过forifwhile来学习语言的结构。在这种情况下,您必须执行步骤1.5(使数组的大小合适)并自行排序 这并不困难(但请记住,除了在家庭作业中,这不是最好的方法)
  2. 复制数组(自制)(代替上面的步骤1.4)

    int[] newArray = new int[i]
    for(int j=0; j<i; j++){
       newArray[j] = num[j];
    }
    

    排序(自制)(代替上面的第2步):

    1. 遍历元素
    2. 如果一个元素大于前一个元素, swap 它们(按顺序,prev元素总是小于或等于下一个元素)
    3. 有两个循环,因为你必须连续进行比较:第一个元素,与整个数组比较,将它放在正确的位置,与整个数组进行第二次比较......)

        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也很有帮助。