Кажется, не удается правильно печатать символы в массиве

#java #arrays

#java #массивы

Вопрос:

Я пытаюсь напечатать пирамиду из ‘*’, используя методы массива 5×5 или 7×7 или 9×9 или 11×11 в соответствии с вводом пользователя.

Мой код прямо сейчас печатает половину пирамиды, похоже, не может получить другую половину. Помощь была бы очень признательна.

 public static char[][] pointUp (char asterik, int length){
        char [] [] pointUp = new char [length] [length];
        for (int i = 0; i < length; i  ){
            for (int j = 0; j < length; j  ) {
                pointUp[i][j] = ' ';
            }
        }

        int end = length; 
        int j = 0;
        for (int column = 0; column < end; column  ) {
            for (int row = j; row <= length/2; row  ) {
                pointUp[row][column] = asterik;
            }
            j  ;
            end  ;

        }
        return pointUp;
    }
 

ожидается для кода 5×5:

     *   
  * * *
* * * * *

(space intended for remaining 2 columns)

 

ожидается для кода 7×7 и так далее:

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

(space intended for remaining 3 columns)



 

что я получаю за код 7×7 и так далее (другая половина отсутствует):

  *            
 * *          
 * * *        
 * * * *   

(space intended for remaining 3 columns)


 

Ответ №1:

Это то, что вы хотите?

 class test {
    public static void main(String[] args) {
        testPointUp(21);
    }

    public static char[][] pointUp(char asterisk, int length) {
        // make sure length is odd, other wise you can't do this
        // I encourage to make your own Exception class for clarity (e.g. NotOddException)
        if (length % 2 == 0) 
            throw new RuntimeException("Can't make a pyramide with an even lower row");

        // make the desired return value
        char[][] ret = new char[length][length];

        // if you devide the length parameter by two and avoid the .5, you
        // get the amount of empty columns in the first row, decrement this every
        // for every row, do this while emptyCols >= 0
        int emptyCols = (int) length/2;
        int row = 0;
        int desiredAsterisks = 1;
        while (emptyCols >= 0) {
            // first, add all empty cols
            for (int i = 0; i < emptyCols; i  ) {
                ret[row][i] = ' ';
            }
            // then, add the desired amount of asterisks
            for (int i = 0; i < desiredAsterisks; i  ) {
                ret[row][i   emptyCols] = asterisk;
            }
            // and of course, add the remaining empty cols
            for (int i = emptyCols   desiredAsterisks; i < length; i  ) {
                ret[row][i] = ' ';
            }
            // change all necessary variables
            emptyCols--;
            desiredAsterisks  = 2;
            row  ;
        }
        return ret;
    }

    public static void testPointUp(int length) {
        char[][] test = pointUp('*', length);
        // I use a StringBuilder rather then a String because I want to
        // append a lot of characters to the variable I want to print out
        // in the end. Strings are immutable so every time you concatenate a String
        // a new variable is being made and given to the String variable, using a 
        // StringBuilder is much more efficient in concatenating (appending).
        StringBuilder sb = new StringBuilder("");
        for (int i = 0; i < length; i   ) {
            for (int j = 0; j < length; j  ) {
                sb.append(test[i][j]);
            }
            sb.append("n");
        }
        System.out.println(sb);
    }
}
 

Ответ №2:

Ну вот и все!

 public static char[][] pointUp(char asterik, int length) {
    char[][] pointUp = new char[length][length];
    int halfLength = length / 2;
    for (int i = 0; i < halfLength   1; i  ) {
        int end = halfLength - i;
        for (int j = 0; j < end; j  ) {
            pointUp[i][j] = ' ';
        }
        for (int k = 0; k < 2 * i   1; k  )
            pointUp[i][k   end] = asterik;
    }

    return pointUp;
}
 

Разбейте шаблон на серии, затем попытайтесь решить меньшую серию и создайте свое решение.