用于交替 C++ 的双 for 循环

Double for loop for alternation C++

我应该如何在双循环中生成这样的东西?这样输出将变成

O O O O O O O O O
O 1 O 1 O 1 O 1 O
O O O O O O O O O 
O 1 O 1 O 1 O 1 O
O O O O O O O O O 
O 1 O 1 O 1 O 1 O
O O O O O O O O O 
O 1 O 1 O 1 O 1 O
O O O O O O O O O 

我的尝试如下:

for (int i = 0; i < 8; i++)
{
    for (int j = 0; j < 8; j++)
    {
        //Insert code here
        if (j % 2 == 0)
        {
            array[b][a] = 0;
        }
        else if (i % 2 == 0 )
        {
            array[b][a] = 1;
        }
    }
}

我知道涉及 %,但我就是无法理解这里的逻辑,例如 二维数组的角全部为 0,有人可以指导我吗?

首先要做的最重要的事情就是确定模式!

当我查看该输出时,我看到的模式是当行和列都具有奇数索引时输出为 1。否则,数组有一个 0.

请注意,写下来涉及代码。这只是用简单的英语写成的事实。首先做到这一点非常重要。

我们如何确定一个数字是否为奇数?

数字 x 是奇数如果 x % 2 == 1.

所以让我们写一些代码:

bool isOdd(int x) {
    return x % 2 == 1;
}

void work() {
    int array[9][9];

    for (int i = 0; i < 9; i++) {
        for (int j = 0; j < 9; j++) {
            if (isOdd(i) && isOdd(j))
                array[i][j] = 1;
            else
                array[i][j] = 0;
        }
    }
}

您希望列索引为奇数,行索引为奇数,因此二维数组中 1 的正确条件为:

(i%2==1) && (j%2==1)

for (int i=0; i<9; i++) {
    for (int j=0; j<9; j++) {
        array[i][j] = ((j%2 && i%2)?1:0);
    }
}

解决大问题的一般方法是将它们分解成较小的问题。


练习 1

你有两个函数:

  • print_zeroes 打印 000000000
  • print_zeroes_and_ones 打印 010101010

编写一个循环交替调用这些函数,以便打印您想要的网格。


练习 2

编写函数print_zeroes.


练习 3

编写函数print_zeroes_and_ones.


额外学分

  • 编写一个函数 print_a_line,它接受一个参数并在 print_zeroesprints_zeroes_and_ones
  • 之间进行选择
  • 编写一个使用 print_a_line 打印网格的循环。
  • 手动内联函数(即用函数的代码替换函数调用)并尝试简化它。

例如你可以按以下方式进行

#include <iostream>

int main() 
{
    const size_t N = 9;
    int a[N][N];

    for ( size_t i = 0; i < N; i++ )
    {
        for ( size_t j = 0; j < N; j++ ) a[i][j] = i % 2 + j % 2 == 2;
    }

    for ( auto &row : a )
    {
        for ( int x : row ) std::cout << x << ' ';
        std::cout << std::endl;
    }

    return 0;
}

输出为

0 0 0 0 0 0 0 0 0 
0 1 0 1 0 1 0 1 0 
0 0 0 0 0 0 0 0 0 
0 1 0 1 0 1 0 1 0 
0 0 0 0 0 0 0 0 0 
0 1 0 1 0 1 0 1 0 
0 0 0 0 0 0 0 0 0 
0 1 0 1 0 1 0 1 0 
0 0 0 0 0 0 0 0 0 

或者您可以用零初始化数组,例如

int a[N][N] = {};

然后循环填充数组的奇数行。

例如

#include <iostream>

int main() 
{
    const size_t N = 9;
    int a[N][N] = {};

    for ( size_t i = 1; i < N; i += 2 )
    {
        for ( size_t j = 0; j < N; j++ ) a[i][j] = j % 2;
    }

    for ( auto &row : a )
    {
        for ( int x : row ) std::cout << x << ' ';
        std::cout << std::endl;
    }

    return 0;
}

程序输出与上图相同。

或者您可以只在循环中使用奇数行和奇数列。

#include <iostream>

int main() 
{
    const size_t N = 9;
    int a[N][N] = {};

    for ( size_t i = 1; i < N; i += 2 )
    {
        for ( size_t j = 1; j < N; j += 2 ) a[i][j] = 1;
    }

    for ( auto &row : a )
    {
        for ( int x : row ) std::cout << x << ' ';
        std::cout << std::endl;
    }

    return 0;
}