在控制台中打印时如何将打印出的形状从循环中移出以获取文本

曼比皮格

我已经读了很多书,还没有发现C ++中控制台输出的任何良好格式。我正在打印带有循环的三角形,我知道如何打印它,但是我想在控制台中将其移到上方,以便在导管旁边显示文本。

所以我希望我的输出像

                             *
                             * *
                8.5 inches   *   *
                             *     *                           
                             *********

这是绘制三角形的函数:

void Triangle::DisplayTriangle() {


    for (int x = 0; x <= 10; x++) {
        setprecision(2);

        for (int j = x; j > 10; j++)    cout << " ";
        for (int z = 0; z <= x; z++) {
            if (x == 10) {
                cout << '*';
            }
            else if (z == 0 || z == x) cout << "*";
            else cout << " ";
        }
        for (int y = 0; y < x; y++) {
            cout << " ";
        }
            cout << endl;

    }
}
克里斯托弗·奥立克(Christopher Oicles)

当目标输出变得越来越复杂时,手动循环绘制形状变得非常困难。

因此,在某些时候,您将需要使用文本绘图库(例如K.Shores提到的ncurses)。

但是,滚动自己的简单绘图API并不是脑部手术:

#include <iostream>

namespace auto_list_exploit {
    static auto li = {1,2};
    using initializer_list = decltype(li);
}

template <typename CT=char>
class TextSurface {
    using initializer_list = auto_list_exploit::initializer_list;
public:
    struct point {
        int x,y;
        point(int x=0, int y=0) : x(x), y(y) {}
        point(initializer_list list) : x((list.begin())[0]), y((list.begin())[1]) {}
    };
private:
    int m_width, m_height, m_data_count;
    CT* m_data;

    int OffsetOf(int x, int y) const { return y * m_width + x; }
    bool IsInside(int x, int y) { return x >= 0 && y>= 0 && x < m_width && y < m_height; }
    CT& at(int x, int y) { return m_data[OffsetOf(x,y)]; }
    CT at(int x, int y) const { return m_data[OffsetOf(x,y)]; }

    int Abs(int x) { return x < 0 ? -x : x; }

    void Poly(const point& pfirst, CT value, const point& plast) {
        Line(plast, pfirst, value);
    }
    template <typename ...Ts>
    void Poly(const point& pfirst, CT value, const point& p0, const point& p1, Ts...args) {
        Line(p0, p1, value);
        Poly(pfirst, value, p1, args...);
    }
public:
    TextSurface(int width=0, int height=0) : 
        m_width(height ? width : 0), 
        m_height(width ? height : 0),
        m_data_count(width * height)
    {
        m_data = m_data_count ? new CT[m_data_count] : nullptr;
        Clear();
    }
    // Cannot copy
    TextSurface(const TextSurface&) =delete;
    TextSurface& operator = (const TextSurface&) =delete;
    // Can return from functions
    TextSurface& operator = (TextSurface&& src) {
        delete [] m_data;
        m_width = src.m_width; m_height = src.m_height; m_data_count = src.m_data_count;
        m_data = src.m_data;
        src.m_data = nullptr;
        return *this;
    }
    TextSurface(TextSurface&& src) : m_data(nullptr) { operator = ((TextSurface&&)src); }
    ~TextSurface() { delete [] m_data; }

    int Width() const { return m_width; }
    int Height() const { return m_height; }
    void Clear(CT value=' ') {
        CT* p = m_data;
        CT* pe = p + m_data_count;
        while(p != pe) *(p++) = value;
    }
    void Line(int x0, int y0, int x1, int y1, CT value) {
        const int dx = x1-x0;
        const int dy = y1-y0;
        if(!dx && !dy) {
            if(IsInside(x0, y0)) { at(x0, y0) = value; }
            return;
        }
        const bool ymajor = Abs(dy) > Abs(dx);
        int x=x0, y=y0;
        int &mj = ymajor ? y : x;
        int &mn = ymajor ? x : y;
        const int mje = ymajor ? y1 : x1;
        const int mjst = mj < mje ? 1 : -1;
        double mnd = mn;
        double mnst = ymajor ? double(dx)/Abs(dy) : double(dy)/Abs(dx);
        do {
            mn = int(mnd + 0.5);
            if(IsInside(x,y)) { at(x,y) = value; }
            mj += mjst;
            mnd += mnst;
        } while(mj != mje+mjst);
    }
    void Line(const point& p0, const point& p1, CT value) { Line(p0.x, p0.y, p1.x, p1.y, value); }

    template <typename ...Ts>
    void Poly(CT value, const point& p0, const point& p1, Ts...args) {
        Line(p0, p1, value);
        Poly(p0, value, p1, args...);
    }
    // init-list overloads for triangle and quad (initializer_list can't be packed)
    void Poly(CT value, initializer_list l0, initializer_list l1, initializer_list l2) { Poly(value, point(l0), point(l1), point(l2)); }
    void Poly(CT value, initializer_list l0, initializer_list l1, initializer_list l2, initializer_list l3) { Poly(value, point(l0), point(l1), point(l2), point(l3)); }

    void Rect(int x, int y, int width, int height, CT value) {
        Poly(value, point(x,y), point(x+width-1, y), point(x+width-1, y+height-1), point(x, y+height-1));
    }
    // Label places text. xloc selects the meaning of the x coordinate.
    // Its value is between -1 and 1: -1 for x at the left of the text,
    // 0 for x in the middle, and 1 for x at the end of the text.
    void Label(const CT* text, int x, int y, double xloc=-1) {
        int len = 0;
        while(text[len]) { ++len; }
        x -= int((xloc + 1)/2 * (len - 1));
        for(int i=0; i<len; ++i) {
            if(IsInside(x,y)) { at(x,y) = text[i]; }
            ++x;
    }   }
    void Present() const {
        const CT* p = m_data; 
        for(int j=0; j<m_height; ++j) {
            std::cout.write(p, m_width);
            std::cout << '\n';
            p += m_width;
    }   }
};

typedef TextSurface<char> CharSurface;

int main() {
    CharSurface surf(60,20);
    surf.Poly('*', {20,2}, {34,16}, {20,16});
    surf.Label("14 ft", 18, 10, 1);
    surf.Label("9 ft", 26, 17, 0);
    surf.Present();
}

http://ideone.com/i03DV8

main()输出中的示例

                *
                **
                * *
                *  *
                *   *
                *    *
                *     *
                *      *
          14 ft *       *
                *        *
                *         *
                *          *
                *           *
                *            *
                ***************
                     9 ft

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在控制台中打印时如何将打印出的形状从循环中移出以获取文本

来自分类Dev

我正在尝试从我的 for 循环中获取输出以在控制台中的一行中打印

来自分类Dev

如何将单个输入保存在while循环中并在最后打印出来?

来自分类Dev

如何将查询结果打印到控制台中。机器人框架

来自分类Dev

在控制台中打印对齐的文本

来自分类Dev

为什么在控制台中没有打印出括号?

来自分类Dev

如何在python 3控制台中打印出导入库的成员函数?

来自分类Dev

如何在python 3控制台中打印出导入库的成员函数?

来自分类Dev

如何将变量从 for 循环中移出?

来自分类Dev

在控制台中打印阵列

来自分类Dev

在fileinput循环中时如何将stdout仅重定向到控制台

来自分类Dev

如何将unicode符号打印到控制台

来自分类Dev

(Java)在滞后控制台中逐个字母打印文本

来自分类Dev

获取类似于在Chrome控制台中打印的功能名称

来自分类Dev

删除“ 在JavaScript控制台中打印数组时

来自分类Dev

将代码链接打印到PyCharms控制台中

来自分类Dev

将代码链接打印到PyCharms控制台中

来自分类Dev

我如何设法使stderr消息不在控制台中打印?

来自分类Dev

我如何设法使stderr消息不在控制台中打印?

来自分类Dev

如何在控制台中打印CSV文件?

来自分类Dev

如何产生要在js控制台中打印的“ JSON diff”?

来自分类Dev

程序完成后如何将控制台打印到文本文件(Python)?

来自分类Dev

我可以在控制台中看到在angular js中打印JSON,但无法打印出相同的JSON

来自分类Dev

在for循环中打印出参数值

来自分类Dev

打印出python循环中的特定键

来自分类Dev

在python控制台中打印数据

来自分类Dev

未在控制台中打印功能返回

来自分类Dev

在控制台中打印/ etc / shadow文件

来自分类Dev

在Windows控制台中打印unicode

Related 相关文章

  1. 1

    在控制台中打印时如何将打印出的形状从循环中移出以获取文本

  2. 2

    我正在尝试从我的 for 循环中获取输出以在控制台中的一行中打印

  3. 3

    如何将单个输入保存在while循环中并在最后打印出来?

  4. 4

    如何将查询结果打印到控制台中。机器人框架

  5. 5

    在控制台中打印对齐的文本

  6. 6

    为什么在控制台中没有打印出括号?

  7. 7

    如何在python 3控制台中打印出导入库的成员函数?

  8. 8

    如何在python 3控制台中打印出导入库的成员函数?

  9. 9

    如何将变量从 for 循环中移出?

  10. 10

    在控制台中打印阵列

  11. 11

    在fileinput循环中时如何将stdout仅重定向到控制台

  12. 12

    如何将unicode符号打印到控制台

  13. 13

    (Java)在滞后控制台中逐个字母打印文本

  14. 14

    获取类似于在Chrome控制台中打印的功能名称

  15. 15

    删除“ 在JavaScript控制台中打印数组时

  16. 16

    将代码链接打印到PyCharms控制台中

  17. 17

    将代码链接打印到PyCharms控制台中

  18. 18

    我如何设法使stderr消息不在控制台中打印?

  19. 19

    我如何设法使stderr消息不在控制台中打印?

  20. 20

    如何在控制台中打印CSV文件?

  21. 21

    如何产生要在js控制台中打印的“ JSON diff”?

  22. 22

    程序完成后如何将控制台打印到文本文件(Python)?

  23. 23

    我可以在控制台中看到在angular js中打印JSON,但无法打印出相同的JSON

  24. 24

    在for循环中打印出参数值

  25. 25

    打印出python循环中的特定键

  26. 26

    在python控制台中打印数据

  27. 27

    未在控制台中打印功能返回

  28. 28

    在控制台中打印/ etc / shadow文件

  29. 29

    在Windows控制台中打印unicode

热门标签

归档