2016-09-28 82 views
0

我試圖繪製一個簡單的ASCII形狀,當我嘗試繪製一個簡單的三角形時,我的最後一行總是被省略。你能幫我一下嗎?也許我錯過了什麼?使用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,所期望的輸出是:

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

在屏幕的右端所見。我錯過了「^」的最後一行。

+0

什麼是你輸入你的實際輸出與您預計的輸出? –

+0

爲什麼這個標籤C?源代碼是C++。 –

+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)是一個由空字節結尾的字符數組,它需要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 

注意在右手邊的指標,還有一個更行你loop:

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

+0

這是一個很好的解釋。謝謝,這解決了我所處的謎團。 –

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

您應該使用更少的運算符(<)在這裏,作爲你的x座標爲[0,N-1]。

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

你Ÿcooridinate似乎是在[0,N-1]爲好,所以才-j不是 一個不錯的選擇,也許你的意思是正J&prime;

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

您可能想爲換行符(\ n)添加第n + 1列。

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

在這種情況下,你必須爲dimensionate(N + 1)* N代替N * N。 然後x = n將是一個有效的參數。

cout << mat; 

您使用字符數組作爲字符串。在這種情況下,您必須在數組中添加0作爲最後一個字符。而且你必須添加一個維度,所以它應該看起來像

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

你在這個行業set_char_at(mat, n, i, 0, '\n');前面的字符「^」 overwritting。我的意思是,當j = 0,則執行該行set_char_at(mat, n, i, 0, '^');,後來在執行set_char_at(mat, n, i, 0, '\n');

+0

我看到了調試器。真正。也許錯誤來自那裏。將盡快報告。 –