如何打印整个形状而不将其分成两个嵌套循环?

时间:2018-05-04 09:34:08

标签: c++

我试图打印以下形状:

*           
*   *       
*   *   *   
*   *   *   *
*   *   *   
*   *       
*

我将它分成2个嵌套循环。一个用于前四行(增量),另一个用于最后3行(减量),代码如下:

for (int i = 1; i <= 4; i++) {
        for (int j = 1; j <= i; j++) {
            cout << "*" << " ";
        }
        cout << '\n';
    }
    for (int i = 3; i >= 1; i--) {
        for (int j = 1; j <= i; j++) {
            cout << "*" << " ";
        }
        cout << '\n';
    }

是否可以仅使用一个嵌套循环打印此形状?

4 个答案:

答案 0 :(得分:1)

正如@ user463035818在评论中所说,你可以使用绝对值来做到这一点。方法如下:

#include <cstdlib> // std::abs
for (int line = 1; line < 8; line++)
{
    int numberOfStars = 4 - std::abs(4 - line);
    for (int i = 0; i < numberOfStars; i++)
        std::cout << "*" << " ";
    std::cout << "\n";
}

在我看来,非常优雅和简单。

答案 1 :(得分:1)

如果您不需要星号之间的空格,则可以使用

#include <iostream>
#include <string>
#include <cstdlib>

int main() {
    for (int i = -3; i <= 3; ++i){
        std::cout << std::string(4 - std::abs(i), '*') << "\n";
    }
}

只有一个循环:内部循环被委托给std::string构造函数。

答案 2 :(得分:1)

为了好玩,基于Bathsheba's answer(但不使用std::string和缺少的空格):

#include <iostream>
#include <iterator>
#include <algorithm>

int main()
{
    for (int i = -3; i <= 3; ++i) {
        std::fill_n(std::ostream_iterator<const char*>(std::cout), 4 - std::abs(i), "* ") = "\n";
    }
}

请参阅std::fill_nstd::ostream_iterator 请参阅live demo

答案 3 :(得分:0)

你可以这样做:

int i = 0;
while (i < 7) {
    int j = 0;
    while (j < 4) {
        if (i >= j && i + j < 7)
            std::cout << "* ";
        j++;
    }
    i++;
    std::cout << '\n';
}