I have this homework which required to print asterick to make draw a triangle.
When drawTriangle(0);
*
When drawTriangle(1);
*
**
When drawTriangle(2);
*
**
* *
****
when drawTriangle(3);
*
**
* *
****
* *
** **
* * * *
********
when drawTriangle(4);
*
**
* *
****
* *
** **
* * * *
********
* *
** **
* * * *
**** ****
* * * *
** ** ** **
* * * * * * * *
****************
when drawTriangle(5);
*
**
* *
****
* *
** **
* * * *
********
* *
** **
* * * *
**** ****
* * * *
** ** ** **
* * * * * * * *
****************
* *
** **
* * * *
**** ****
* * * *
** ** ** **
* * * * * * * *
******** ********
* * * *
** ** ** **
* * * * * * * *
**** **** **** ****
* * * * * * * *
** ** ** ** ** ** ** **
* * * * * * * * * * * * * * * *
********************************
Any advice will be appreciated. Cheers.
An OO design with object recursion is as follows;
public class Triangle
{
int n;
int size;
char[][] data;
public Triangle(int n)
{
this.n = n;
this.size = (int)Math.pow(n,2);
this.data = new char[size][size];
fillInData();
}
void fillInData()
{
if (n == 0)
{
//stop case
data[0][0] = '*';
}
else
{
//create a triangle with n-1
//fill in the top left quadrant of data[][] with spaces
//fill in the other 3 quadrants of data[][] with data[][] from the n-1 triangle
}
}
}
I'm sure you can figure out how to print the Triangle;
You've noticed that the height of the triangle is 2^n, I'm sure. So you know you'll need to print out that many rows. You also know you need to remember previous rows, if you're going to copy them in some way, so you know you need to have somewhere to store them - perhaps a Vector?
For a start, creating the triangle leaning over to the left instead of the right is a little easier. Adding the left padding to make it lean right is easy to do once you've got something going.
Start with a single row containing "*": print it, and store that string.
Then do this 'n' times:
That's it. Just add spaces to the left of everything you print out to make it lean over to the right.
(You might notice, once you've done this, that you can do the first step above inside the for
loop below it. When you 'make the rows square' you're actually just figuring out a number of spaces to add to each row. By just adding that many spaces between two copies of your current row, in the printout and in the new row that you store, you save printing out [and storing] any unnecessary spaces.)
Here are a couple of helpful string padding functions. padRight
will lengthen a string to be n
characters wide by adding spaces to the right. padLeft
, you guessed it, will add spaces to the left:
public static String padRight(String s, int n) {
return String.format("%1$-" + n + "s", s);
}
public static String padLeft(String s, int n) {
return String.format("%1$#" + n + "s", s);
}
One last opportunity for bonus points: you actually don't need to store the last half of the rows you print out.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With