-2

我的输出应该是四个三角形和一个金字塔。我设法得到了四个三角形,但无法弄清楚金字塔。任何帮助都会很棒。(我还必须使用 setw 和 setfill)。

输出是一个左对齐的三角形,然后左对齐倒置。右对齐三角形,然后右对齐三角形倒置。

这是我当前的输出:

在此处输入图像描述

#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
4

2 回答 2

0

当您绘制金字塔时,调用setfill('*')将覆盖上一行的调用。每行只能有一个填充字符集。setfill(' ')

您可以尝试通过“手”“绘制”星号,如下所示:

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"; 
}   
于 2017-02-15T07:54:42.723 回答
0

在您开始考虑如何实现它之前,最好先定义您需要的输出。假设您需要一个高度为 5 的金字塔,如您的示例所示。这意味着顶行将有一个 *。在完美世界中第二排会有两个,但在屏幕上很难实现。那么它可能有 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;
}
于 2017-02-15T08:30:16.403 回答