使用星号创建等腰三角形,仅在循环时创建

时间:2014-11-15 22:47:02

标签: java geometry

我需要创建一个至少5行的三角形。

我知道如何创建顶部和底部,但我无法弄清楚中间部分。我不知道如何找到算法来表示添加到第一行之后的每个后续行的空格的变化。我能得到提示吗? 这个问题来自我的老师。

This is what the completed problem looks like

2 个答案:

答案 0 :(得分:2)

您可以这样想:假设您想要绘制R行的三角形。然后,例如,对于R = 5,您将绘制如下内容:

*
**
***
****
*****

是等腰(也是对:))。因此,基本观察是如果当前行有i个星,则前一个有i-1,下一个有i + 1。因此,您可以使用当前行初始化变量,该行还包含要绘制的星数。像这样:

int R = (...) // get this parameter from user or whatever
int r = 1; // current row, and number of stars to paint in the current line
while (r <= R) { // while you haven't painted more than R rows
  int i = 1; // counter for painting r stars
  while (i <= r) {
    System.out.print('*');
    ++i; // next star
  }
  System.out.println(); // go to the next row (or line)
}

希望它有所帮助。

编辑:如果您的老师在评论中对RealSkeptic持怀疑态度,您可以使用以下观察。假设您想要绘制一个这样的三角形:

*
**
***
**
* 

也就是说,等腰三角形旋转,使得等边的len为R.例如,R = 3.你可以看到这样的三角形画就像用2种不同的细胞画一个矩形,就像以下内容:

*00 (1 star, 2 zeroes)
**0 (2 stars, 1 zero)
*** (3 stars)
**0 (2 stars, 1 zero)
*00 (1 star, 2 zeroes)

您可以注意到序列增长然后减少。您可以使用以负值开始并运行直到相同正值的计数器来模拟此类行为。代码类似于:

int R = (...) // get this parameter from user or whatever
int r = -R+1;
while (r <= R-1) {
  int i = 1;
  int rabs = r;
  if (rabs < 0) rabs = -rabs; // take only the positive value
  while (i <= R-rabs) {
    System.out.print('*');
    ++i; // next star
  }
  System.out.println(); // go to the next row (or line)  
  ++r;
}

EDIT2 :观看您添加到问题中的三角形(从一开始就应该添加),您可以按照上一次编辑的推理来确定每行的星数和空格数,并达到如下代码:

int R = (...) // get this parameter from user or whatever
int r = 1;
while (r < R) {
  int i = 1;
  while (i <= R-r) {
    System.out.print(" ");
    ++i;
  }
  if (r>1) System.out.print("*"); // because there's only 1 star on first row always
  i = 1;
  while (i <= 2*r-3) { // the amount of spaces you need to paint
    System.out.print(" ");
    ++i;
  }
  System.out.println("*");
  ++r;
} 
// paint the last row separately
int last = R+R-1;
while (last > 0) {
  System.out.print("*");
  --last;
}
祝你好运。

EDIT3 :也许这种方法更冗长,但更容易理解。关键是要保存变量在第一个星之前和第一个星之后需要在每行中打印多少个空格。代码如下:

  int R = (...) // get this number from user or whatever
  int spacesBeforeFirstStar = R-1;
  int spacesAfterFirstStar = -1;
  int r = 1;
  while (r <= R) {
    int i = 1;
    while (i <= spacesBeforeFirstStar) { // paint the first spaces
      System.out.print(" ");
      ++i;
    }
    if (r!=1) System.out.print("*"); // if not the first row, paint the first star
    i = 1;
    while (i <= spacesAfterFirstStar) { // paint the spaces inside the triangle
      if (r==R) // if we are in the last row
        System.out.print("*"); // we paint stars instead spaces
      else
        System.out.print(" "); // otherwise, we just paint spaces
      ++i;
    }
    System.out.println("*"); // print the second star
    spacesBeforeFirstStar -= 1; // in the next row, we paint one space less
    spacesAfterFirstStar += 2; // in the next row, we paint two spaces more
    ++r; // go to the next row
  }

答案 1 :(得分:1)

下面,

    int n = 6; 

    int row = 0;
    int col = 0;
    int space = 0;

    for(row = 1; row < n; row++) {
        for(space = 0; space < n - row; space++) {
            System.out.print(" ");
        }
        for(col = 1; col <= row; col++) {
            if(row == (n-1)) {
                System.out.print("* ");             
            } else {
                if(col == 1 || col == row) {
                    System.out.print("* ");
                } else { 
                    System.out.print("  ");
                }
            }
        }
        System.out.println();
    }

打印出以下内容:

enter image description here

你可以看到它是一个等边三角形。您可以使用条件语句修改循环中的代码,这样当它在创建三角形的基础时达到它将打印此

enter image description here

我离开了那个让你思考。