首页 > 解决方案 > 如何使用 C++ 中的字符绘制沙漏?

问题描述

因此,最终的目标是创建根据三角形大小绘制沙漏的代码。例如,如果我有一个初始化为 Hourglass h1(6,'^','-') 的对象,则该对象的大小为 6,边框字符为 '^'。而填充字符是'-'。最后,结果将如下所示:

大小为 6 的三角形(2 个三角形创建沙漏)

到目前为止,这就是我绘制函数的全部内容:

//Purpose is to draw the hourglass 
void Hourglass::Draw()
{
    char space=32;          //Stores spaces

    if (size==1)            //If the size is 1, then display the border
        cout << border << "\n";

    else {                  //just draw size-1 border characters
        for (int i=0; i<size-1;i++)  
            cout << border << space;
    }

    cout <<"\n";
}

这就是我卡住的地方。我不太确定当沙漏的大小增加到超过 1 时如何绘制沙漏。我确实认为我需要在 for 循环中编写一个 for 循环,但我再一次不确定如何去做吧。

如果有人能够,请引导我朝着正确的方向前进。我不是在寻找给我的答案。我宁愿被告知如何才能得到正确的答案。

谢谢你。

标签: c++loopsoopcharacter

解决方案


乔治的回答是一个好的开始。但是很容易简化它:

这是我的解决方案:

#include <iostream>

using namespace std;

void hourglass(size_t width, char outer, char inner)
{
    if (width < 1)
    {
        return;
    }

    size_t rows = width * 2 - 1;

    for (size_t row = 0; row < rows; row++)
    {
        size_t r = row;
        if (row > rows / 2)
        {
            // if we're drawing a row on the bottom half
            // normalize it to be the mirror of a row on the top half
            r = rows - row - 1;
        }

        // draw r leading spaces
        for (size_t i = 0; i < r; i++)
        {
            cout << " ";
        }

        // draw width-r charaters (including spaces in between)
        for (size_t i = 0; i < width-r; i++)
        {
            size_t last = width - r - 1;
            char c = inner;

            // if it's the top row, bottom row, or first char, or last char of the row
            // then draw an outer character
            if ((i == 0) || (i == last) || (r == 0))
            {
                c = outer;
            }

            cout << c;

            if (i != last)
            {
                cout << " ";
            }
        }
        cout << endl;
    }
}

int main()
{
    hourglass(5, '^', '*');
    cout << endl << endl;
    hourglass(6, '^', '*');
}

运行时:

^ ^ ^ ^ ^
 ^ * * ^
  ^ * ^
   ^ ^
    ^
   ^ ^
  ^ * ^
 ^ * * ^
^ ^ ^ ^ ^


^ ^ ^ ^ ^ ^
 ^ * * * ^
  ^ * * ^
   ^ * ^
    ^ ^
     ^
    ^ ^
   ^ * ^
  ^ * * ^
 ^ * * * ^
^ ^ ^ ^ ^ ^

至于将其转换为 C++ 类,那是你要解决的练习。


推荐阅读