用于交替 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_zeroes
和 prints_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;
}
我应该如何在双循环中生成这样的东西?这样输出将变成
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_zeroes
和prints_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;
}