嵌套循环和模数c ++

时间:2016-09-30 20:29:25

标签: c++ loops nested-loops modulus

我正在学习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

,则会打印出来
*---------*
-*----*--*-
--*-----*--
---*---*---
----*------
-----*-----
-*----*--*-
---*---*---
--*-----*--
-*----*--*-
*---------*

我看到我已经成功地写了如何打印出'*'诊断之一。但有些东西不能与其他人合作,后者正在倒退。 不幸的是,我无法解决这个问题,需要你的建议。我究竟做错了什么?如何调试这样的问题?

1 个答案:

答案 0 :(得分:1)

这个问题很容易调试。

看看第一个错误的*。它显示在i=1j=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) }。