使用for循环创建平行四边形

时间:2016-10-01 20:10:26

标签: c++ visual-c++

您好我正在尝试创建一个平行四边形,到目前为止我有点麻烦

void stars(int n) {
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (i > j) {
                cout << " ";
            }
            else cout << "*";
        }
        cout << endl;
    }
}

所以星星(7)打印

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

然而我需要它像这样打印

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

我的功能是正确地移动空间,但它也减少了恒星的数量,我怎样才能继续移动恒星而不会丢失恒星的数量?

3 个答案:

答案 0 :(得分:3)

不要让印刷明星有条件。打印i个空格,然后打印n个星号。

for(int i = 0; i < n; ++i) {
    for(int j = 0; j < i; ++j) {
        cout << ' ';
    }
    for(int j = 0; j < n; ++j) {
        cout << '*';
    }
    cout << '\n';
}

live example

话虽如此,这并不是非常易读,我宁愿选择:(或者Lassie的回答)

string nstars(n, '*');
for(int i = 0; i < n; ++i) {
    cout << string(i, ' ') << nstars << '\n';
}

live example

这会创建std::stringi个空格和n个星星。它带来了额外分配的成本,但可读性通常更为重要,特别是对于小型玩具项目。

如果您更多地了解stdlib算法:

for(int i = 0; i < n; ++i) {
    fill_n(ostream_iterator<char>(cout), i, ' ');
    fill_n(ostream_iterator<char>(cout), n, '*');
    cout << '\n';
}

我不认为这应该比第一个循环更糟糕,但对新手来说可能看起来很可怕。

答案 1 :(得分:1)

#include <iostream>
#include <iomanip>
#include <string>

void stars (int n)
{
    std::string s(n,'*'); // construct it only 1 time
    for(int i=0; i<n; ++i)
        std::cout << std::setw(n+i) << s << std::endl;
}

int main ()
{
    stars(7);
}

答案 2 :(得分:0)

看看这个:

void stars(int n)
{
for(int i =0; i < n; i++, cout << "\n")
    for(int j = 0-i; j < n; j++)
        if(j < 0) cout << " ";
        else cout << "*";
}