简体   繁体   中英

How to print out an X using nested loops

I have searched through to find a simple solution to this problem.

I have a method called

printCross(int size,char display)

It accepts a size and prints an X with the char variable it receives of height and width of size.

The calling method printShape(int maxSize, char display) accepts the maximum size of the shape and goes in a loop, sending multiples of 2 to the printCross method until it gets to the maximum.

Here is my code but it is not giving me the desired outcome.

public static void drawShape(char display, int maxSize)
  {
    int currentSize = 2; //start at 2 and increase in multiples of 2 till maxSize

    while(currentSize<=maxSize)
    {
      printCross(currentSize,display);
      currentSize = currentSize + 2;//increment by multiples of 2
    }
  }

public static void printCross(int size, char display)
{
for (int row = 0; row<size; row++)  
        {  
            for (int col=0; col<size; col++)  
            {  
                if (row == col)  
                  System.out.print(display);  
                if (row == 1 && col == 5)  
                  System.out.print(display);  
                if (row == 2 && col == 4)  
                 System.out.print(display);  
                if ( row == 4 && col == 2)  
                 System.out.print(display);  
                if (row == 5 && col == 1)  
                 System.out.print(display);  
                else  
                  System.out.print(" ");   

            }
            System.out.println(); 
    }
}

Is it because I hardcoded the figures into the loop? I did a lot of math but unfortunately it's only this way that I have been slightly close to achieving my desired output.

If the printCross() method received a size of 5 for instance, the output should be like this:
x   x
 x x
  x
 x x
x   x

Please I have spent weeks on this and seem to be going nowhere. Thanks

The first thing you have to do is to find relationships between indices . Let's say you have the square matrix of length size ( size = 5 in the example):

  0 1 2 3 4
0 x       x
1   x   x
2     x
3   x   x
4 x       x

What you can notice is that in the diagonal from (0,0) to (4,4) , indices are the same (in the code this means row == col ).

Also, you can notice that in the diagonal from (0,4) to (4,0) indices always sum up to 4 , which is size - 1 (in the code this is row + col == size - 1 ).

So in the code, you will loop through rows and then through columns (nested loop). On each iteration you have to check if the conditions mentioned above are met. The logical OR ( || ) operator is used to avoid using two if statements.

Code:

public static void printCross(int size, char display)
{
    for (int row = 0; row < size; row++) {
        for (int col = 0; col < size; col++) {
            if (row == col || row + col == size - 1) {
                System.out.print(display);
            } else {
                System.out.print(" ");
            }
        }
        System.out.println();
    }
}

Output: (size = 5, display = 'x')

x   x
 x x 
  x  
 x x 
x   x

Instead of giving a direct answer, I will give you some hints.

First, you are right to use nested for loops.

However as you noticed, you determine when to print 'x' for the case of 5.

Check that 'x' is printed if and only if row = col or row + col = size - 1

for your printCross method, try this:

public static void printCross(int size, char display) {
    if( size <= 0 ) {
        return;
    }

    for( int row = 0; row < size; row++ ) {
        for( int col = 0; col < size; col++ ) {
            if( col == row || col == size - row - 1) {
                System.out.print(display);
            }
            else {
                System.out.print(" ");
            }
        }
        System.out.println();
    }
}

ah, I got beaten to it xD

Here's a short, ugly solution which doesn't use any whitespace strings or nested looping.

public static void printCross(int size, char display) {
    for (int i = 1, j = size; i <= size && j > 0; i++, j--) {
        System.out.printf(
              i < j ? "%" + i + "s" + "%" + (j - i) + "s%n"
            : i > j ? "%" + j + "s" + "%" + (i - j) + "s%n"
            : "%" + i + "s%n", //intersection
            display, display
        );
    }
}

Lte's try this simple code to print cross pattern.

 class CrossPattern { public static void main(String[] args) { Scanner s = new Scanner(System.in); System.out.println("enter the number of rows=column"); int n = s.nextInt(); int i, j; s.close(); for (i = 1; i <= n; i++) { for (j = 1; j <= n; j++) { if (j == i) { System.out.print("*"); } else if (j == n - (i - 1)) { System.out.print("*"); } else { System.out.print(" "); } } System.out.println(); } } } 

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