2016-11-29 2 views
-1

클래스 프로젝트의 경우 2D 문자 배열에 삼각형을 그릴 수 있어야합니다. 알고리즘 적으로 나는 그것을하는 법을 배울 수 없다.2D 배열에서 삼각형 그리기 (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

도면에 따르면 5 열에 대해 9 개의 열이 필요합니다. 그래서, drawing.setPoint(i, x, myChar);가 무엇 확실하지 않다하더라도

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

은,이 예제는 가야 것이라 생각합니다. char을 기준으로 String을 작성합니다.

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

0에서 행을 시작하지만 1에서 열을 시작하여 수학을 좀 더 명확하게 만듭니다.

row = 0의 경우 ....*....column = 5에 하나의 별표가 필요합니다.

row = 1의 경우 ...***...의 경우 column = 4,5,6에 3 개의 별이 필요합니다.

row = 3의 경우 .*******.에는 column = 2,3,4,5,6,7,8에 7 개의 별이 필요합니다. height = 5column j 사이의 거리보다 작거나 i 동일한 경우 row i 당신이 column j에 별 필요

알 수 있습니다. | 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.ceil이 있기 때문에 당신이 Math.abs를 사용할 수있는 가정입니다. 그렇지 않은 경우 Math.absif 문으로 변환 할 수 있습니다.

1

이 문제를 해결할 수있는 방법이 많이 있으며 그림을 한 행씩 그리는 답변을 이미 보았습니다.

나는 이미 char[][]을 생성하고 그 배열 배열의 문자를 화면에 출력하는 루틴을 가지고 있다고 가정 할 것입니다. 구조에 점을 찍기 위해 이미 setPoint() 메소드가있는 것처럼 보입니다.

초심자로서, 나는 그것이 당신에게 해결책을 제공하는 데 도움이된다고 생각하지 않습니다. 자신을 해결하려면 올바른 방향으로 향하게해야합니다.

많은 경험 많은 코더가 이제 테스트 주도 설계를 사용하므로 간단한 사례로 시작하여 테스트를 작성하고 테스트를 통과하며 더 이상의 테스트가 작성 될 때까지 더 많은 테스트를 반복하십시오 .

결국 jUnit과 같은 테스트 프레임 워크를 배워야하지만, 이제는 프로그램을 실행하여 "테스트"할 수 있습니다. 따라서 첫 번째 테스트는 height == 1에서 작동합니까?

당신은 (지금 수단의 프로그램을 실행하고 출력 잘 보이는 것을 알)이 시험을 통과와 함께 할 수 있습니다 수행

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

작업.

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 작동 : 이제

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)을 추가하여 3 개의 행 삼각형을 그릴 수 있으며 대신 루프를 사용하여 개선 할 수 있습니다.