嵌套循环和模数

Nested loops and modulus c++

本文关键字:嵌套循环      更新时间:2023-10-16

我正在学习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=1j=6的位置。对于n=11,你的条件i%(n-i)==j%(n-j)变成了1%(11-1) == 6%(11-6),这实际上是真的,因为表达式两边的计算结果都是1

这个表达式的背后是什么?为什么使用这种if来确定单元格是否属于第二条对角线?试着写下应该印在第二条对角线上的每一对i, j,你应该会注意到一个更简单的图案。

注:在表达式if (i%n==j%n)中,您不必对n取操作数模,因为它们都小于n,所以它是多余的,可以简单地重写为if (i == j)