2016-11-29 76 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)来绘制三排三角形,然后您可以改用循环来代替。