简体   繁体   中英

How can I print a scalable pyramid in size determined with user input?

I'm taking a beginners Java course over the summer. I need to make a pyramid using loops for homework. The pyramid has to be made out of asterisks; in addition, size of pyramid is determined by user.

This is what I have for code now;

public class Pyramid {

  public static void main(String[] args) {

    int size = 6;
    for (int x = 0; x < size; x++) {
        for (int y = x; y < size; y++) {

        }
        for (int z = 0; z <= x; z++) {
            System.out.print("*");

        }

        System.out.println("");
    }
  }
}

The problem of my code is that the number of asterisks in each row is wrong by one.

for (int z = 0; z <= x; z++) {

will execute the loop until z <= x is no longer true. That means it executes for z=0 , z=1 , z=2 , ..., z=x --which means it actually executes the loop x+1 times. (The next z , z=x+1 , is the first z that makes z<=x false.)

The normal idiom in Java (and other language with C-like for statements) is to start at 0 and use < when checking for the upper bound:

for (int z = 0; z < x; z++) {

You'll run into cases where you want to use <= , and you'll run into cases where you want to start at 1 instead of 0, but the majority of for loops with an integer index follow this form.

If I understand your question correctly :

 public class Pyramid  {

    public static void main(String[] args) {
       int size =6;
       for (int i = 1; i <= size; i++) {
           for (int x = size - 1; x >= i; x--) {
               System.out.print(" ");
           }

           for (int y = 1; y<= i; y++) {
               System.out.print("*");
           }

           for (int z= 1; z <= i - 1; z++) {
               System.out.print("*");
           }

           System.out.println();
       }
     }
   }

The output is :

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

If I understand your question, you could do something like this

int levels = 0;
Scanner input = new Scanner(System.in);
while (levels < 1) {
    System.out.println("What size triangle would you like?");
    if (input.hasNextInt()) {
        levels = input.nextInt();
    } else if (input.hasNext()) {
        System.out.println("Not a valid size: " + input.next());
    } else {
        System.err.println("no more input");
        System.exit(1);
    }
}
for (int i = 1; i <= levels; i++) {
    StringBuilder sb = new StringBuilder();
    int t = i;
    while (--t > 0) {
        sb.append("*");
    }
    StringBuilder spaces = new StringBuilder();
    for (t = 0; t < levels - i; t++) {
        spaces.append(' ');
    }
    System.out.println(spaces.toString() + sb + "*" + sb);
}

To solve this problem it's best to think about the numbers that go into it...

  *
 ***
*****

If you label the parts of the triangle

  *     row 1, 2 spaces, 1 star
 ***    row 2, 1 space, 3 stars
*****   row 3, 0 spaces, 5 starts

Then you can just start playing with the numbers The number of spaces to display is 3 - row # + 1 The number of stars to display is 2 * row - 1

Then construct a loop to draw each line. within this loop, you need a loop to draw the number of spaces and a loop to draw the number of stars

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM