使用ASCII算法进行简单绘图

时间:2016-09-28 07:32:47

标签: c++ algorithm

我试图用ASCII绘制一个简单的形状,当我尝试绘制一个简单的三角形时,我的最后一行总是被省略。你能帮我个忙吗?也许我错过了什么?

static void set_char_at(char* mat, int cols, int x, int y, char c)
{
    mat[x*cols+y] = c;
}

int  test3()
{
    int n;
    cin >> n;
    char* mat = new char[(n*n)]; // newlines
    for(int i=0; i < n*n; i++) {
        mat[i] = ' ';
    }
    for(int i=0; i <= n; i++) {
        for(int j=0; j < i; j++) {
            set_char_at(mat, n, i, -j, '^');
        }
        set_char_at(mat, n, i, 0, '\n');
    }
    cout << mat;
}

编辑:输入为5,所需输出为:

     ^
    ^^
   ^^^
  ^^^^
 ^^^^^

在屏幕的右端看到。我错过了&#34; ^&#34;。

的最后一行

3 个答案:

答案 0 :(得分:2)

char* mat = new char[(n*n)]; // newlines
for(int i=0; i < n*n; i++)
    mat[i] = ' ';

可以说n为1.数组mat的大小为1*1。这可以容纳1个字符。在C ++中,字符串(不是std :: string)是由nul字节终止的字符数组,需要N + 1个字节。

char* mat = new char[(n*n) + 1];
for(int i=0; i < n*n; i++)
    mat[i] = ' ';
mat[n*n] = 0;

如果n为2,请回到您的代码:

for(int i=0; i <= n; i++) {
    for(int j=0; j < i; j++) {
        set_char_at(mat, n, i, -j, '^');
    }

这将致电:

        set_char_at(mat, n, 1, -0, '^');  => mat[1*2-0] => 2
        set_char_at(mat, n, 2, -0, '^');  => mat[2*2-0] => 4
        set_char_at(mat, n, 2, -1, '^');  => mat[2*2-1] => 3

请注意右侧的索引,循环中还有一行:

for(int i=0; i <= n; i++) {
    for(int j=0; j < i; j++) {
        set_char_at(mat, n, i, -j, '^');
    }
    set_char_at(mat, n, i, 0, '\n');

这转换为:

        set_char_at(mat, n, 1, -0, '^');  => mat[1*2-0] => 2
    set_char_at(mat, n, 1, 0, '\n');      => mat[1*2+0] => 2
        set_char_at(mat, n, 2, -0, '^');  => mat[2*2-0] => 4
        set_char_at(mat, n, 2, -1, '^');  => mat[2*2-1] => 3
    set_char_at(mat, n, 2, 0, '\n');      => mat[2*2+0] => 4

你需要留出回车的空间:

#include <iostream>

void testf(size_t n)
{
    const size_t matSize = (n+1) * n + 1;
    char* mat = new char[matSize] {};
    for (size_t i = 0; i < matSize - 1; ++i)
        mat[i] = ' ';
    mat[matSize - 1] = 0;

    for (size_t i = 0; i < n; ++i) {
       for (size_t j = 0; j <= i; ++j)
           mat[i*(n+1)+(n-j-1)] = '^';
       mat[i*(n+1) + n] = '\n';
    }

    std::cout << "--- start " << n << "\n";
    std::cout << mat;
    std::cout << "--- end\n";
}

int main()
{
    testf(4);
}

现场演示:http://ideone.com/mhY7iS

答案 1 :(得分:0)

for(int i=0; i <= n; i++) {

你应该在这里使用less运算符(&lt;),因为你的x坐标来自[0,n-1]。

set_char_at(mat, n, i, -j, '^');

你的y cooridinate似乎也来自[0,n-1],所以只是-j不是 一个不错的选择,也许你的意思是n-j?

set_char_at(mat, n, i, 0, '\n');

您可能希望为换行符(\ n)添加第n + 1列。

char* mat = new char[(n*n)]:

在这种情况下,您必须为(n + 1)* n而不是n * n标注尺寸。 然后x = n将是一个有效的参数。

cout << mat;

您将字符数组用作字符串。在这种情况下,您必须在数组中添加0作为最后一个字符。而且你必须在维度中添加一个,所以它应该看起来像

char* mat = new char[(n+1)*n + 1];

答案 2 :(得分:0)

您正在此行set_char_at(mat, n, i, 0, '\n');覆盖前一个字符“^”。我的意思是,当j = 0时,执行set_char_at(mat, n, i, 0, '^');行,然后执行set_char_at(mat, n, i, 0, '\n');