Search code examples
javamethodscharnested-loopsshapes

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


Solution

  • 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