i_use_the_internet i_use_the_internet - 11 days ago 7
Java Question

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

Answer

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
Comments