2016-11-29 390 views
-1

對於類項目,我們需要能夠在二維數組的字符中繪製三角形。算法上我無法解決如何做到這一點。如何在二維數組中繪製三角形(Java)

我當前的代碼是這樣的(但它不工作):

public void fill() { 
     for (int i = 0; i < h; i++) { 
      double x=h; 
      while(x<=0){ 
       drawing.setPoint(i, x, myChar); 
       x=Math.ceil(x/2); 
      } 
     } 
    } 

我所要的輸出是這個樣子:

....*.... 
...***... 
..*****.. 
.*******. 
********* 

我們不能使用任何預先存在方法或與繪圖相關的類。

感謝您的幫助

+1

你期待什麼輸出? – bradimus

+0

@bradimus我更新了它 –

+0

除非h <= 0,否則永遠不會進入while循環,如果是的話,也不會輸入for循環。 – dogwin

回答

3

根據您的圖紙,您需要9列5列。所以,

int height = 5; 
int width = 2*height - 1; 

雖然我不知道什麼drawing.setPoint(i, x, myChar);呢,我覺得這個例子讓你去。我將根據char建立一個String

char fill = '*'; 
char blank = '.'; 

我將在0行開始行,而在1行開始使數學更清晰。

對於row = 0,....*....您需要column = 5中的一顆星。

對於row = 1,...***...您需要column = 4,5,6三顆星。

對於row = 3,.*******.你需要在column = 2,3,4,5,6,7,8七顆星。

注意,對於row i你需要一個明星column j如果height = 5column j之間的距離小於或等於i。也就是說,當| height - column | <= row

for (int row = 0; row < height; row ++) { 
    StringBuilder line = new StringBuilder(width); 
    for (int column = 1; column <= width; column ++) { 
     char out = Math.abs(column - height) <= row ? fill : blank; 
     line.append(out); 
    } 
    System.out.println(line); 
} 

這就產生

....*.... 
...***... 
..*****.. 
.*******. 
********* 

我假設你可以使用Math.abs因爲你的例子有Math.ceil。如果不是,您可以將Math.abs轉換爲if聲明。

1

有很多方法可以解決這個問題,並且您已經看到了一個逐行繪製圖片的答案。

我打算假設你已經有例程創建char[][]並將該數組數組中的字符打印到屏幕上。它看起來好像你已經有了一個setPoint()的方法,來捅一個點到結構中。

作爲初學者,我認爲它不會幫助您獲得解決方案。你需要指出正確的方向來解決它自己。

許多經驗豐富的編碼員現在使用測試驅動設計,您可以從中學習:從一個簡單的案例開始,爲其創建一個測試,使測試通過,重複更多測試,直到沒有更多測試寫入。最終你應該學習像jUnit這樣的測試框架,但現在你可以通過運行你的程序來「測試」。所以第一個測試是,它是否適用於height == 1

您可以通過這個測試(對於現在的手段,運行該程序並看到輸出看起來右):

public void drawTriangle(int height) { 
     drawing.setPoint(0,5,'*') 
    } 

完成任務。

現在使它成爲height==2工作:

public void drawTriangle(int height) { 
     drawing.setPoint(0,5,'*'); 
     if(height == 2) { 
     drawing.setPoint(1,4,'*'); 
     drawing.setPoint(1,5,'*'); 
     drawing.setPoint(1,6,'*'); 
     } 
    } 

這仍然適用於height == 1,但也適用於height == 2

但是你可以立即看到一個循環的機會來替換第二行的這三個命令。所以:

public void drawTriangle(int height) { 
     drawing.setPoint(0,5,'*'); 
     if(height == 2) { 
     for(int 4; i<7; i++) { 
      drawing.setPoint(1,i,'*'); 
     } 
     } 
    } 

...你可以拉他們趕出的方法:

public void drawTriangle(int height) { 
     drawing.setPoint(0,5,'*'); 
     if(height == 2) { 
      drawRow2(); 
     } 
    } 

    private void drawRow2() { 
     for(int 4; i<7; i++) { 
     drawing.setPoint(1,i,'*'); 
     } 
    } 

這就是所謂的重構 - 寫一些作品,但是沒有寫入的最佳方式,對其進行測試以確保它能夠正常工作,然後逐步改變它的編寫方式,所以它仍然有效,但是方式更加整潔。

希望你可以看到這是怎麼回事。您可以將drawRow2()更改爲更一般的 - drawRow(int rowNumber),並逐漸用rowNumber中的變量替換其中的文字數字。然後您可以使用drawRow(0)繪製第一行,並使用drawRow(1)繪製第二行。然後,您可以通過添加drawRow(2)來繪製三排三角形,然後您可以改用循環來代替。