2017-02-15 5 views
-2

私の出力は4つの三角形とピラミッドです。私は四つの三角形を得ることができましたが、ピラミッドを理解することはできません。どんな助けも素晴らしいだろう。 (私もsetwとsetfillを使用する必要があります)。setwを使ってピラミッドを構築する

出力は、左揃えの三角形で、次に左揃えで表示されます。 右揃えの三角形、次に右揃えの三角形を逆さまにします。

これは私の現在の出力です:あなたはピラミッドを描いているとき

enter image description here

#include <iostream> 
#include <iomanip> 

using namespace std; 

//setw(length) 
//setfill(char) 

int height;  //Number of height. 
int i; 
int main() 
{ 

    cout << "Enter height: "; 
    cin >> height; 

    //upside down triangle 
    for (int i=height; i>=1; i--){ //Start with given height and decrement until 1 
      cout << setfill ('*') << setw((i)) <<"*"; 
      cout << "\n"; 
    }  

    cout<< "\n"; //line break between 

    //rightside up triangle 
    for (int i=1; i<=height; i++){ //Start with 1 and increment until given height 
     cout << setfill ('*') << setw((i)) <<"*"; 
     cout << "\n"; 
    } 

    cout<< "\n"; 

    //right aligned triangle 
    for (int i=1; i<=height; i++){ //Start with 1 and increment until given height 
     cout << setfill (' ') << setw(i-height) << " "; 
     cout << setfill ('*') << setw((i)) <<"*"; 
     cout << "\n"; 
    } 

    cout<< "\n"; 

    //upside down/ right aligned triangle 
    for (int i=height; i>=1; i--){ //Start with given height and decrement until 1 
     cout << setfill (' ') << setw(height-i+1) << " "; 
     cout << setfill ('*') << setw((i)) <<"*"; 
     cout << "\n"; 
    } 

    cout<< "\n"; 
    //PYRAMID 
    for (int i=1; i<=height; i++){ //Start with 1 and increment until given height 
     cout << setfill (' ') << setw(height-i*3) << " "; //last " " is space between 
     cout << setfill ('*') << setw((i)) <<"*"; 
     cout << "\n"; 
     } 
}//end of main 
+0

正確に表示したい内容を理解するのが難しい図 –

+0

提案に感謝します。私は現在の出力を追加しました。最後の三角はピラミッドでなければなりません。 – Ace

答えて

0

setfill('*')への呼び出しは、前の行にsetfill(' ')への呼び出しを却下します。 1行に1つのフィル文字セットしか指定できません。

あなたはこのように、「手」によってアスタリスクを「描く」を試みることができる:

for (int i = 1; i <= height; i++) { 
    cout << setfill (' ') << setw(height - ((i - 1) * 2 + 1)/2); 
    for (int j = 0; j < (i - 1) * 2 + 1; j++) 
     cout << '*'; 
    cout << "\n"; 
} 
0

それはあなたがそれを達成する方法を考え始める前に必要な出力を定義するために、常に最高です。 例のように、高さ5のピラミッドが必要であるとします。 これは、一番上の行が*を持つことを意味します。 完璧な世界では、2番目の行には2つの行がありますが、画面上で達成するのは難しいです。次に、3を持つことができます。 この場合、高さ5の最終結果は1,3,5,7と9 *になります。 (私はここでそれを描画しようとしましたが、成功しませんでした。最終結果を視覚化するために、テキストエディタで描画することをお勧めします)。

実装について: *の前に空白を埋める量が重要です。後の空白はそれ自身で起こります。 *の前に空白をどれだけ表示する必要がありますか? ピラミッドをテキストエディタで描画しようとすると、最下行の幅と各特定の行の*の量に依存することがわかります。 また、空白をよく見ると、三角形が形成されます...

追加: さらに、元の方法でも効果があります。 2ではなく1である。

int BottomRowWidth = 1 + 2 * (height - 1); 
int BlankNumber = (BottomRowWidth - 1)/2; 
int row, width; 
for (row = 1, width =1; (row <= height); row++, width = width+2, BlankNumber--) 
{ 
    if (BlankNumber > 0) 
    { 
     cout << setfill(' ') << setw(BlankNumber) << " "; 
    } 
    cout << setfill('*') << setw(width) << "*"; 
    cout << endl; 
} 
関連する問題