user4256847
user4256847

Reputation:

Create Isoceles Triangle using asterisks and only while loops

I need to create a triangle of at least 5 rows.

I know how to create the top and bottom but I can't figure out the middle part. I don't know how to find the algorithms to express the changes in spaces added to each subsequent row following the first. Can I get hints? This problem is from my teacher.

This is what the completed problem looks like

Upvotes: 0

Views: 3149

Answers (2)

ale64bit
ale64bit

Reputation: 6242

You can think as this: suppose you want to paint a triangle of R rows. Then, for example, for R = 5, you would paint something like this:

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

which is isosceles (and also right :)). So, the basic observation is that if the current row has i stars, the previous has i-1 and the next one i+1. So, you can initialize a variable with the current row, which also holds the number of stars to paint. Something like this:

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)
}

Hope it helped.

Edit: if your teacher is as skeptical as RealSkeptic down there in the comments, you can use the following observation. Suppose you want to paint a triangle like this:

*
**
***
**
* 

That is, an isosceles triangle rotated, such that the len of the equal sides is R. For the example, R = 3. You can see that painting such triangle is like painting a rectangle with 2 different kinds of cells, like the following:

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

You can note that the sequence grows and then decreases back. You can simulate such behavior with a counter that starts in negative values and runs until the same positive value. The code would be something like:

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: watching the triangle you added to your question (which you should have added since the very beginning), you can follow the reasoning of the previous edit on the number of stars and spaces per row, and reach to a code like the following:

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;
}

Good luck.

EDIT3: maybe this approach is more verbose, but easier to understand. The point is to save in variables how many spaces you need to print before the first star, and after the first star, in each row. The code would be like this:

  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
  }

Upvotes: 2

Mestica
Mestica

Reputation: 1529

Here,

    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();
    }

It prints out the following:

enter image description here

As you can see it's an equilateral triangle. You can modify the code in the loop using conditional statements so that when it reaches at the time of creating the base for the triangle it will print this

enter image description here

I have left that one for you to ponder upon.

Upvotes: 1

Related Questions