我编写了一个程序来打印N x N
方形图案,其中包含0和1的替代方格。例如。一个5 x 5的正方形看起来像这样:
我使用了以下代码 -
#include<iostream.h>
int main()
{
int i, n;
cin >> n; //number of rows (and columns) in the n x n matrix
for(i = 1; i <= n*n; i++)
{
cout << " " << i%2;
if(i%n == 0)
cout << "\n";
}
fflush(stdin);
getchar();
return 0;
}
此代码适用于奇数,但对于偶数,它在每个新行中打印相同的内容而不是交替模式。对于4,它打印出来 -
我哪里错了?
答案 0 :(得分:2)
在我看来,迭代矩阵的最好方法是在另一个循环中使用循环。
我认为此代码对您有所帮助:
for(i = 0; i < n; i++) {
for (j = 1; j <= n; j++) {
cout<<" "<< (j + i) % 2;
}
cout<<"\n";
}
其中n
是行数,i
和j
是整数。
尝试了解其原因和方法。
答案 1 :(得分:2)
如果你是初学程序员,那么我建议(没有冒犯)不要试图对你的方法太聪明;你的代码不起作用的主要原因是(除了各种语法错误)逻辑错误 - 正如blauerschluessel所指出的那样。
只需使用两个循环,一个用于行,一个用于列:
for (int row = 1; row <= n; row++)
{
for (int col = 0; col < n; col++)
cout << " " << ((row % 2) ^ (col % 2));
cout << "\n";
}
编辑:既然你想要一个单循环解决方案,那么这样做的一个好方法是设置一个flip
标志来处理偶数和奇数n
之间的区别:
bool flip = false;
int nsq = n * n;
for (int i = 1; i <= nsq; i++)
{
cout << " " << (flip ^ (i % 2));
if (i % n == 0) {
if (n % 2 == 0) flip = !flip;
cout << "\n";
}
}
答案 2 :(得分:2)
它不起作用和创造的原因是因为你的逻辑。要解决此问题,您需要更改代码的功能。处理这个问题的最简单方法是考虑它的作用,并将其与您希望它做的事情进行比较。这听起来像是作业,所以我们可以给你答案,但是你不会得到我们的帮助,所以我写了这个答案,引导你自己解决它的逻辑。
让我们从它的作用开始。
目前它将打印0或1 n*n
次。你有一个名为i
的计数器,每次从0开始递增到(n*n)-1
。如果您要打印此号码i
,您将获得n=5
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25
现在您要检查值i
是奇数还是i%2
,这会使值0或1.给您下表
1 0 1 0 1
0 1 0 1 0
1 0 1 0 1
0 1 0 1 0
1 0 1 0 1
现在,在n=4
的情况下,您的计数器i
会打印出来给您一张桌子
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
现在,如果您打印出奇数或偶数模式,那么
1 0 1 0
1 0 1 0
1 0 1 0
1 0 1 0
这种模式差异是由于正方形的形状或更精确的矩阵打印而导致的打印数字模式的变化。要解决此问题,您需要调整如何确定要打印的数字的逻辑,因为它只适用于具有奇数宽度的矩阵。
答案 3 :(得分:1)
您只需添加一个参数即可打印该值。下面提到的代码包含您正在使用的更新for loop
:
int num = 0;
for(i = 1; i <= n*n; i++)
{
num = !num;
std::cout << " " << num;
if(i%n == 0) {
std::cout << "\n";
num = n%2 ? num : !num;
}
}
完整的编译代码:
#include <iostream>
#include <stdio.h>
int main()
{
int i, n, num = 0;
std::cin >> n; //number of rows (and columns) in the n x n matrix
for(i = 1; i <= n*n; i++)
{
num = !num;
std::cout << " " << num;
if(i%n == 0) {
std::cout << "\n";
num = n%2 ? num : !num;
}
}
fflush(stdin);
getchar();
return 0;
}