嵌套循环和模数 c++
Nested loops and modulus c++
我正在学习 C++,但我的程序有问题。如果 n=11
:
它应该打印出以下内容
*---------*
-*-------*-
--*-----*--
---*---*---
----*-*----
-----*-----
----*-*----
---*---*---
--*-----*--
-*-------*-
*---------*
这是我的代码,适用于 n=5,但不适用于更大的数字:
#include <iostream>
using namespace std;
int main ()
{
int n;
cout << "Enter size (n x n): " << endl;
cin >> n;
for (int i=0;i<n;i++){
for (int j=0;j<n;j++){
if (i%n==j%n) cout << '*';
else if (i%(n-i)==j%(n-j)) cout << '*';
else cout << '-';
}
cout << endl;
}
return 0;
}
如果 n=11
:
*---------*
-*----*--*-
--*-----*--
---*---*---
----*------
-----*-----
-*----*--*-
---*---*---
--*-----*--
-*----*--*-
*---------*
我看到我已经成功编写了如何打印出“*”诊断之一。但是有些东西不能与另一个东西一起工作,这是倒退的。
不幸的是,我无法解决这个问题,需要您的建议。我究竟做错了什么?如何调试此类问题?
这个问题调试起来真的很简单
先看看第一个错误的*
。出现在i=1
、j=6
的位置。使用 n=11
,您的条件 i%(n-i)==j%(n-j)
变为 1%(11-1) == 6%(11-6)
,这实际上是真的,因为表达式在两边的计算结果都是 1
。
这个表情背后是什么?为什么要用这种if
来判断单元格是否属于第二条对角线呢?尝试写下应该打印在第二个对角线上的每一对 i, j
,您应该会注意到一个更简单的模式。
P.S。在表达式 if (i%n==j%n)
中,您不必对操作数取模 n
,因为它们都小于 n
,因此它是多余的,可以简单地重写为 if (i == j)
].
我正在学习 C++,但我的程序有问题。如果 n=11
:
*---------*
-*-------*-
--*-----*--
---*---*---
----*-*----
-----*-----
----*-*----
---*---*---
--*-----*--
-*-------*-
*---------*
这是我的代码,适用于 n=5,但不适用于更大的数字:
#include <iostream>
using namespace std;
int main ()
{
int n;
cout << "Enter size (n x n): " << endl;
cin >> n;
for (int i=0;i<n;i++){
for (int j=0;j<n;j++){
if (i%n==j%n) cout << '*';
else if (i%(n-i)==j%(n-j)) cout << '*';
else cout << '-';
}
cout << endl;
}
return 0;
}
如果 n=11
:
*---------*
-*----*--*-
--*-----*--
---*---*---
----*------
-----*-----
-*----*--*-
---*---*---
--*-----*--
-*----*--*-
*---------*
我看到我已经成功编写了如何打印出“*”诊断之一。但是有些东西不能与另一个东西一起工作,这是倒退的。 不幸的是,我无法解决这个问题,需要您的建议。我究竟做错了什么?如何调试此类问题?
这个问题调试起来真的很简单
先看看第一个错误的*
。出现在i=1
、j=6
的位置。使用 n=11
,您的条件 i%(n-i)==j%(n-j)
变为 1%(11-1) == 6%(11-6)
,这实际上是真的,因为表达式在两边的计算结果都是 1
。
这个表情背后是什么?为什么要用这种if
来判断单元格是否属于第二条对角线呢?尝试写下应该打印在第二个对角线上的每一对 i, j
,您应该会注意到一个更简单的模式。
P.S。在表达式 if (i%n==j%n)
中,您不必对操作数取模 n
,因为它们都小于 n
,因此它是多余的,可以简单地重写为 if (i == j)
].