我正在学习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
:
*---------*
-*----*--*-
--*-----*--
---*---*---
----*------
-----*-----
-*----*--*-
---*---*---
--*-----*--
-*----*--*-
*---------*
我看到我已经成功地写了如何打印出'*'诊断之一。但有些东西不能与其他人合作,后者正在倒退。 不幸的是,我无法解决这个问题,需要你的建议。我究竟做错了什么?如何调试这样的问题?
答案 0 :(得分:1)
这个问题很容易调试。
看看第一个错误的*
。它显示在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)
}。