我不明白为什么我的嵌套 for 循环有效
I don't understand why my nested for loop works
objective是根据定义的行数和列数在canvas上绘制若干个正方形:
int squareSize = 20;
int distance = squareSize + 10;
int numberofRows = 8;
int numberofColumns = 10;
for (int rows = 0; rows < numberofRows; rows++)
{
for(int columns = 0; columns < numberofColumns ; columns++)
{
square(30 + (distance * rows), 30 + (distance * columns), squareSize);
}
}
当行数小于列数时,程序如何仍然执行内部 for() 循环中的代码,这让我很困惑。我以为我遇到了问题,因为据我所知,只有当外循环被证明是真的时,内循环才会被读取和执行(所以在这种情况下,程序将停止工作时的数量行达到8。)
...然而,当我插入的行数少于列数时,程序仍会给出预期的结果。这是为什么?
编辑:英语不是我的第一语言,所以我在问题中犯了一个非常愚蠢的错误。显然,我的问题是当行数 低于 时代码是如何执行的。我相应地编辑了 post。
每次执行主循环时,内部循环将执行 numberofColumns
次。
所以主循环将执行 numberofRows
次,因此内循环将执行 numberofColumns
*numberofRows
次
您需要慢慢阅读您的代码。如前所述,两个环路彼此分离。另外用变量值替换变量可能有助于理解:
for (int i= 0; i< 8; i++)
{
for(int j = 0; j< 10; j++)
{
square(30 + (30* i), 30 + (30* j), 20);
}
}
如您所见,首先使用 i=0 j=0 调用 square 函数,然后是:
square(30,30,20).
Then i=0, j=1
square(30,60,20)
Then i=0 j=2
square(30,90,20).
...
i=0 j=10
square(30,330,20)
Then the inner for reached the maximum and then you come again to your outer loop and add one to i.
i=1 j=0
square(60,30,20)
i=1 j=1
square(60,60,20)
...
i=1 j=10
square(60,330,20)
...
继续做这个练习直到 i=8 和 j=10 的最大值。
square(240,330,20)
所有这些平方函数都将按照这些参数的特定顺序调用。如果您想进一步了解,请说明此平方函数的作用。
此致。
Bandolero 的回答很棒 (+1) !
这是草图的注释版本,将每个迭代步骤可视化为动画帧:
int squareSize = 20;
int distance = squareSize + 10;
int numberOfRows = 8;
int numberOfColumns = 10;
int rows;
int columns;
// do we still need to iterate through rows or columns or are we done ?
boolean isUpdating = true;
void setup(){
size(290, 350);
frameRate(3);
reset();
}
void reset(){
background(255);
rows = 0;
columns = 0;
isUpdating = true;
}
void draw(){
if(isUpdating){
// render each square
fill(255);
float x = 30 + (distance * rows);
float y = 30 + (distance * columns);
square(x, y, squareSize);
// render rows, columns values
fill(0);
text(rows + "," + columns, x, y + squareSize * 0.75);
// increment each row
rows++;
// if the end of a row is reached, reset the row count and increment the column count
if(rows >= numberOfRows){
rows = 0;
columns++;
}
// if we completed columns we're done
if(columns >= numberOfColumns){
isUpdating = false;
}
println("rows=", rows, "/", numberOfRows, "columns=", columns, "/", numberOfColumns);
}
}
void keyPressed(){
if(key == ' '){
reset();
}
if(key == 'r'){
numberOfRows--;
}
if(key == 'R'){
numberOfRows++;
}
if(key == 'c'){
numberOfColumns--;
}
if(key == 'C'){
numberOfColumns++;
}
}
本质上,它不是在一帧中使用 for
,而是使用每个新帧来递增。
随意将 frameRate()
更改为更快或更慢的内容,并使用 SPACE
键重置动画(以及 c/C
到 decrease/increase columns
和 r/R
到 decrease/increase 行)
objective是根据定义的行数和列数在canvas上绘制若干个正方形:
int squareSize = 20;
int distance = squareSize + 10;
int numberofRows = 8;
int numberofColumns = 10;
for (int rows = 0; rows < numberofRows; rows++)
{
for(int columns = 0; columns < numberofColumns ; columns++)
{
square(30 + (distance * rows), 30 + (distance * columns), squareSize);
}
}
当行数小于列数时,程序如何仍然执行内部 for() 循环中的代码,这让我很困惑。我以为我遇到了问题,因为据我所知,只有当外循环被证明是真的时,内循环才会被读取和执行(所以在这种情况下,程序将停止工作时的数量行达到8。)
...然而,当我插入的行数少于列数时,程序仍会给出预期的结果。这是为什么? 编辑:英语不是我的第一语言,所以我在问题中犯了一个非常愚蠢的错误。显然,我的问题是当行数 低于 时代码是如何执行的。我相应地编辑了 post。
每次执行主循环时,内部循环将执行 numberofColumns
次。
所以主循环将执行 numberofRows
次,因此内循环将执行 numberofColumns
*numberofRows
次
您需要慢慢阅读您的代码。如前所述,两个环路彼此分离。另外用变量值替换变量可能有助于理解:
for (int i= 0; i< 8; i++)
{
for(int j = 0; j< 10; j++)
{
square(30 + (30* i), 30 + (30* j), 20);
}
}
如您所见,首先使用 i=0 j=0 调用 square 函数,然后是:
square(30,30,20).
Then i=0, j=1
square(30,60,20)
Then i=0 j=2
square(30,90,20).
...
i=0 j=10
square(30,330,20)
Then the inner for reached the maximum and then you come again to your outer loop and add one to i.
i=1 j=0
square(60,30,20)
i=1 j=1
square(60,60,20)
...
i=1 j=10
square(60,330,20)
...
继续做这个练习直到 i=8 和 j=10 的最大值。
square(240,330,20)
所有这些平方函数都将按照这些参数的特定顺序调用。如果您想进一步了解,请说明此平方函数的作用。
此致。
Bandolero 的回答很棒 (+1) !
这是草图的注释版本,将每个迭代步骤可视化为动画帧:
int squareSize = 20;
int distance = squareSize + 10;
int numberOfRows = 8;
int numberOfColumns = 10;
int rows;
int columns;
// do we still need to iterate through rows or columns or are we done ?
boolean isUpdating = true;
void setup(){
size(290, 350);
frameRate(3);
reset();
}
void reset(){
background(255);
rows = 0;
columns = 0;
isUpdating = true;
}
void draw(){
if(isUpdating){
// render each square
fill(255);
float x = 30 + (distance * rows);
float y = 30 + (distance * columns);
square(x, y, squareSize);
// render rows, columns values
fill(0);
text(rows + "," + columns, x, y + squareSize * 0.75);
// increment each row
rows++;
// if the end of a row is reached, reset the row count and increment the column count
if(rows >= numberOfRows){
rows = 0;
columns++;
}
// if we completed columns we're done
if(columns >= numberOfColumns){
isUpdating = false;
}
println("rows=", rows, "/", numberOfRows, "columns=", columns, "/", numberOfColumns);
}
}
void keyPressed(){
if(key == ' '){
reset();
}
if(key == 'r'){
numberOfRows--;
}
if(key == 'R'){
numberOfRows++;
}
if(key == 'c'){
numberOfColumns--;
}
if(key == 'C'){
numberOfColumns++;
}
}
本质上,它不是在一帧中使用 for
,而是使用每个新帧来递增。
随意将 frameRate()
更改为更快或更慢的内容,并使用 SPACE
键重置动画(以及 c/C
到 decrease/increase columns
和 r/R
到 decrease/increase 行)