如何更好地理解嵌套循环?

How to better understand nested loops?

我的问题是我对嵌套循环的理解不够好,无法回答这个问题。我应该使用嵌套的 for 循环将我在左对齐上制作的堆栈右对齐,但我不太清楚两个内部条件的条件。

正确答案:

Height = 8
.......#
......##
.....###
....####
...#####
..######
.#######
########

我的回答:

Height = 8
.......#
.......#......#
.......#......#.....#
.......#......#.....#....#
.......#......#.....#....#...#
.......#......#.....#....#...#..#
.......#......#.....#....#...#..#.#
.......#......#.....#....#...#..#.##

我玩过它,认真对待它但什么也没有。我做了 (k = 7, k > j, k--), (k = 0, k < n-1, k++), k < j+7, 我画了表格,我知道高度差不多作为空格的值,但在每一行上倒置。我也知道哈希和空格的值应该等于用户输入的高度。

它应该从用户那里获取一个值,但我已经在一个单独的文件上处理它,值 n 是高度以简化并在没有程序其余部分的情况下处理它。

#include <stdio.h>

int main(void) {
    int n = 8;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < i; j++) {
            for(int k = 7; k > j; k--) {
                printf(".");
            }
            printf("#");
        }
        printf("\n");
    }
}

其实很简单。每行写一个table,需要打印多少个空格和'#'

n == 8

| output   | line | num_spaces | num_signs |
| -------- | ---- | ---------- | --------- |
| .......# | 1    | 7          | 1         |
| ......## | 2    | 6          | 2         |
| .....### | 3    | 5          | 3         |
| ....#### | 4    | 4          | 4         |
| ...##### | 5    | 3          | 5         |
| ..###### | 6    | 2          | 6         |
| .####### | 7    | 1          | 7         |
| ######## | 8    | 0          | 8         |    

对于line,您可以从01n开始,然后倒退。选择最简单的东西。您会看到从 1 开始是您示例中最简单的。

现在,对于每个 line,我们需要确定要打印多少 num_spacesnum_signs。他们应该依赖于 linen.

对于 num_spaces 它是 n - line 而对于 num_signs 它是 line

所以代码应该是这样的:

// for each line
for (int line = 1; line <= n; ++line)
{
    // print n - line spaces

    // print line # characters

    // print \n
}

使用循环,代码将如下所示:

// for each line
for (int line = 1; line <= n; ++line)
{
    // print n - line spaces
    for (int i = 0; i < n -line; ++i)
        std::cout << ' ';

    // print line # characters
    for (int i = 0; i < line; ++i)
        std::cout << '#';

    std::cout << '\n';
}

std::cout.flush();

但实际上不推荐这样做。您可以摆脱那些内部循环。一种简单好用的方法是使用字符串:

// for each line
for (int line = 1; line <= n; ++line)
{
    // print n - line spaces
    std::cout << std::string(n - line, ' ');

    // print line # characters
    std::cout << std::string(line, '#');

    std::cout << '\n';
}

std::cout.flush();

你还可以更进一步:

// for each line
for (int line = 1; line <= n; ++line)
{
    // print n - line spaces and line # characters
    std::cout << std::string(n - line, ' ') << std::string(line, '#') << '\n';
}

std::cout.flush();