2013-05-11 57 views
0

我之前问过这样的问题,但它有点误导,因为我没有包括打印顺序。我认为再问一次会更贴切。使用光标操作打印垂直直方图C++ [ncurses] [已解决无W/O ncurses]

#include <iostream> 
    using namespace std; 
    int main() 
    { 
     int a, b, c, i; 
     cin >> a >> b >> c; 

     for (i = 0; i < a; i++) 
      cout << "*" << endl; 

     for (i = 0; i < b; i++) 
      cout << "*" << endl; 

     for (i = 0; i < c; i++) 
      cout << "*" << endl; 
    } 

林意识到,输出是一样的:

for (i = 0; i < a + b + c; i++){ 
cout << "*" << endl; 
} 

因此,对于2 3 1我得到:

*

*

*

*

*

*

我要的是:

 * 

* * 

* * * //Horizontal distance between 2 shapes don't matter. 

它必须能准确地完成在order.Also每列的印刷必须是完成一个独立的功能。

第一个循环:

* 

* 

第二环:

* 

* * 

* * 

最后循环:

* 

* * 

* * * 

* 编辑: * Appereantly有一个其他的解决办法做到不任何使用光标操作。我的老师建议我应该先将字符存储在char指针中,然后逐行打印该char指针的内存。其中工作得很好。

+0

没有“光标”在标准C++中,只有一个不透明的输出流。你必须重新思考一切。 – 2013-05-11 11:38:01

+0

这就是为什么我需要通过使用ncurses或做同样的事情来做到这一点。请帮忙吗? – SpiderRico 2013-05-11 13:44:25

+0

是的,你可以用ncurses来完成。通过教程,你应该能够立即做到这一点。 – 2013-05-12 15:41:28

回答

1

这里有一个诅咒程序,将做到这一点

#include <iostream> 
#include <curses.h> 

using namespace std; 

int main(int argc, char** argv) 
{ 
    int a,b,c,i; 
    cin >> a >> b >> c; 

    initscr(); // initialise curses 
    int rows, cols; 
    getmaxyx(stdscr, rows, cols); // get screen size 


    for (i=0; i<a; i++) { 
    mvprintw(rows - 1 - i, 0, "*"); // plot at bottom column 0 
    } 

    for (i=0; i<b; i++) { 
    mvprintw(rows - 1 - i, 1, "*"); // plot at bottom column 1 
    } 

    for (i=0; i<c; i++) { 
    mvprintw(rows - 1 - i, 2, "*"); // plot at bottom column 2 
    } 

    refresh(); // update screen 
    getch(); // exit when key is pressed 
    endwin(); // exit curses 
    return 0; 
} 
0

你不能这样做你想要的。您需要一次打印一条水平线,因为您无法垂直输出到控制台。

首先,您需要找出总共需要多少条线路,totalLines,这是最大值a,bc。然后你应该遍历每一行。

在行迭代中,您需要在正确的位置打印正确数量的*。是否需要为a绘制点的条件是a >= totalLines - line(其中line是当前行,从第一行的0开始)。同样,对于bc,所以您需要3个if语句,这些语句每个都打印出空格或*

+0

甚至没有使用ncurses或类似的东西吗?一行一行地做它根本不会帮助我。我抽象出我的真实程序,它包含一些复杂的绘制算法,不仅包含“*”,而且还包含多个形状,所以我很害怕我必须处理光标操作或更改整个程序本身:< – SpiderRico 2013-05-11 12:45:47

+0

@ user2362377嗯,是的,你可以用ncurses来完成。你的问题似乎意味着你想用标准的I/O库来做到这一点。 – 2013-05-11 12:47:19

+0

Rite,ty.I编辑头文件。如果您知道如何使用ncurses执行操作,请不要犹豫,以便发布答案:> – SpiderRico 2013-05-11 13:02:44