2016-10-01 153 views
0

你好,我想創建一個平行四邊形時遇到麻煩了一點,所以我至今創建與循環

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

不要讓印刷星條件。打印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

話雖這麼說,這不是很可讀,我寧願去:(或靈犬萊西的回答)

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

live example

這將創建一個std::string s的i空格和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

當然,你可以讓'字符串(N, '*')'對象一次,重用它。 –

+0

好點,但它仍然有點浪費。編輯。 – krzaq

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 << "*"; 
} 
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); 
} 
+0

這是一個聰明的技巧,移動'setw'。也許編輯一個解釋到答案。 – krzaq