首页 > 解决方案 > 如何更好地理解嵌套循环?

问题描述

我的问题是我对嵌套循环的理解不足以回答这个问题。我应该使用嵌套的 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");
    }
}

标签: c++loopsfor-loopnestednested-loops

解决方案


其实很简单。写一个表格,每行有多少个空格,'#'你需要打印:

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你可以从0或从1或从开始n,然后倒退。选择最简单的东西。您会看到,在您的示例中,从开始1是最简单的。

现在对于每个line我们需要确定有多少num_spaces,然后num_signs我们打印。他们应该依赖line和依赖n

因为num_spacesn - linenum_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();

But that's actually not recommended. You can get rid of those inner loops. One good and easy way is to use strings:

// 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();

And you can go even one step further:

// 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();

推荐阅读