1

嘿,我是编程新手,正在用 eclipse 探索 Java。我正在尝试制作一个简单的程序,我可以在其中输入骰子有多少面,以及我想使用多少面。虽然 for 语句给我带来了麻烦。

这就是我所拥有的。

{
    public static void main(String[] args) 
    {
        Random generator = new Random ();
        int sides;
        int num;
        int rolls;
        Scanner scan = new Scanner(System.in);
        while (sides != 0);
        {

        System.out.println("How many sides does your dice have?(0 to quit)");
        sides = scan.nextInt();

        System.out.println("How many dice would you like to roll?");
        rolls = scan.nextInt();

        for (int num1 : rolls);
            {

                        num = generator.nextInt(sides);
                System.out.println("You rolled a " + num);
            }
        }   
    }
}

for 语句说,当我将鼠标悬停在“滚动”上时,它“只能迭代数组或 java.lang.Iterable 的实例”。帮助将不胜感激。

4

5 回答 5

2

Java 中的for ( <type> <name> : <collection> )期望在冒号右侧有一个集合:。如果要遍历整数范围,请使用不同的形式for

for (int num1 = 0 ; num1 < rolls ; num1++) {
    ...
}
于 2013-10-15T00:46:40.873 回答
1

你的程序有一个编译器抱怨的 Java 语法错误,以及一个更微妙的逻辑错误,即使在整个 C/C++/C#/Java 系列的有经验的程序员中也很常见。

语法错误是您使用的那种for需要您在冒号后指定一个集合;或者,更准确地说,是实现接口Iterable的类型的对象。接口定义了一个契约,它授权编译器对实现接口的类的实例执行某些操作。因此,只有当变量是Iterable时,编译器才会处理对变量的迭代。由于在您的情况下rollsint类型(因此甚至不是类)并且int不是Iterable,因此您会收到错误消息。

您使用经典的 for对整数进行迭代,在 C、C++、C# 和 Java 中几乎都支持它,没有任何区别。

for (int num1 = 0; num1 < rolls; num1 = num1 + 1)
    /* A single statement (body) */;

该语句的意思是:重复body,即for (...)之后提到的单个语句,正好滚动次数。更准确地说,它实现了以下算法:

A. Initialize num1 to 0
B. Is num1 lesser than rolls?
    If yes, execute the body, increment num1 and go back to B
    If not, go to the first instruction after the **for**

现在,第二个问题;这可能发生在 for 的两种风格中,但Iterable风格不太可能被忽视。您很可能不希望在for语句之后使用分号;这就是为什么。对于 C 和所有具有类似 C 语法的语言(如 Java)的设计决策是,在大多数要插入一条或多条语句的地方,实际上只能插入一条语句。for循环只能处理其主体中的一条指令,它将是 ) 之后的一条指令,考虑缩进和编码风格。考虑以下两个循环:

// Prints numbers from 0 to 9
int x = 0;
for (x = 0; x < 10; x = x + 1)
    System.out.println(x);

// Prints 10
int y = 0;
for (y = 0; y < 10; y = y + 1);
    System.out.println(y);

它们看起来很相似,但是第一个代码片段的效果是打印从 0 到 9 的数字,而第二个代码片段的效果是打印 10。原因是第二个 for 的主体实际上是一个空语句。您可以像这样重写两个 * for *s:

int x = 0;
for (x = 0; x < 10; x = x + 1)
    System.out.println(x);

int y = 0;
for (y = 0; y < 10; y = y + 1)
    /* Lalala... does nothing at all... */;
System.out.println(y); // When control flow gets here, y equals 10

要在for中放置多个语句,您必须使用,它是由许多语句组成的语句。对初学者的误导是,块不必与for相关联,实际上可以单独存在。Java中的以下代码是合法的:

        {
            num = generator.nextInt(sides);
            System.out.println("You rolled a " + num);
        }

当您将 a for which 错误地包含在末尾时:

        for (int num1 = 0; num1 < rolls; num1 = num1 + 1);
        {
            num = generator.nextInt(sides);
            System.out.println("You rolled a " + num);
        }

你基本上是在说:

        for (int num1 = 0; num1 < rolls; num1 = num1 + 1)
            /* Lalala... does nothing at all... */;
        {
            num = generator.nextInt(sides);
            System.out.println("You rolled a " + num);
        }

因此,您的 for 没有执行任何确切的滚动时间,然后它执行一次 block 语句。有时,由于 a for的主体会引用迭代变量num1 ,这样的错误会得到缓解,但这不是你的情况。考虑:

    for (int num1 = 0; num1 < rolls; num1 = num1 + 1);
    {
        Console.out.println("Roll No. " + num1);
        num = generator.nextInt(sides);
        System.out.println("You rolled a " + num);
    }

这有 ; 问题,但编译器检测到有问题,因为您在块语句中使用num1,但由于 ; block 语句与for无关,因此num1超出范围。以下虽然具有相同的逻辑错误,但不会导致编译器错误:

    for (int num1 = 0; num1 < rolls; num1 = num1 + 1);
    {
        num = generator.nextInt(sides);
        System.out.println("You rolled a " + num);
    }

注意:您的while也有类似的额外问题;特点。

于 2013-10-15T01:35:18.400 回答
0

Java 中的for循环传统上采用for (initialization; termination; increment). 该for-each快捷方式是最近(相对)添加的,用于允许更简单地循环遍历Iterable和 数组的实现。

尝试使用....

for (int num1 = 0; num1 < rolls; num1++) {...}

...反而。

仔细查看声明for获取更多详细信息

于 2013-10-15T00:46:58.297 回答
0

你要

for (int num1 = 0; num1 < rolls; num1++)

(后面没有分号)。

有两种 for 循环,基于范围的数组和可迭代,以及标准循环,在其中你给它一个初始化,一个是否继续执行的条件,以及在每个循环之后要做的事情。这三个部分用分号分隔,就像我在上面所做的那样。

于 2013-10-15T00:48:06.440 回答
0

foreach您遇到的问题是,当您打算使用for循环时,您实际上是在尝试执行。当您使用您正在使用的符号时,for(T x : Collection<T>)请注意您正在声明一个变量int num1,然后尝试迭代另一个数字rolls。这只能用于迭代集合,不能用于创建标准循环。相反,您应该使用标准for循环:

for (int x = 0; x < rolls; x++);
{

     num = generator.nextInt(sides);
     System.out.println("You rolled a " + num);
}
于 2013-10-15T00:48:51.337 回答