Печать шаблона в Java, как полусфера

Пытаясь напечатать шаблон наподобие полусферы ниже, я добавил фактический и ожидаемый результат вместе с моим кодом, кто-нибудь может помочь, как это сделать. заранее спасибо

Мой код

public class PatternHalfSphere {

    public static void main(String[] args) {
        int i,j;
        for(i = 1;i<=4;i++){
            System.out.println();
            for(int k=3;k>=i;k--){
                System.out.print(" "+"*"+" ");
            }
            for(j=1;j<=i;j++){

                System.out.print("   ");
            }
        }
        for(int k=0;k<=3;k++) {
            for(int l = 0; l<k;l++) 
            {
                System.out.print(" "+"*"+" ");
            }
            System.out.println();
        }
    }


}

Фактический вывод

 *  *  *    
 *  *       
 *          

 * 
 *  * 
 *  *  * 

Ожидаемый результат

     *  *  *    
     *  *       
     *                 
     *  * 
     *  *  * 

3 ответа

Решение

Быстрое и грязное решение

 public static void main(String[] args) {
        upperHalf(4);
        bottomHalf(4);
    }

    private static void upperHalf(int size) {
        for(int row = 0; row<size; row++){
            String rowContent = "";
            for(int col=0; col<size-row; col++){
                rowContent+= " *";
            }
            if(!rowContent.equals(""))
                System.out.println(rowContent);
        }
    }

    private static void bottomHalf(int size) {
        for(int row=2; row<=size; row++) {
            String rowContent = "";
            for(int col=0; col<row;col++) 
            {
                rowContent+= " *";
            }
            System.out.println(rowContent);
        }
    }

Этот ответ берет ваш точный код, и с несколькими изменениями вы получите ожидаемый результат. Вы были близки, и вам нужно было только напечатать спейсер на каждой строке, а также отрезать одну итерацию от вашего второго внешнего for петля, чтобы избежать печати * дважды.

for (int i=1;i <= 3; i++) {
    for (int k=3; k >= i; k--) {
        // print a new spacer at the start of each line
        if (k == 3) System.out.print("   ");
        System.out.print(" " + "*" + " ");
    }
    for (int j=1; j <= i; j++) {
        System.out.print("   ");
    }
    System.out.println();
}

// start at k=2 so as to NOT print a double single asterisk *
for (int k=2; k <= 3; k++) {
    for (int l=0; l < k; l++) {
        // print a new spacer at the start of each line
        if (l == 0) System.out.print("   ");
        System.out.print(" "+"*"+" ");
    }
    System.out.println();
}

    *  *  *    
    *  *       
    * 
    *  * 
    *  *  * 

демонстрация

Во-первых, инициализируйте k с остальными переменными.

int i, j, k;

Затем вы должны решить, какой цикл for будет отвечать за один напечатанный символ '*', и соответственно настроить другой. Например, если вы прервете первый цикл на 1 шаг раньше, это должно исправить разрыв между двумя частями.

Теперь я сохраняю один '*' для первого цикла for и пропускаю его во втором, изменяя шаги.

  1. Инициализация k=2 вместо k=0. Исправление одиночного * повторения вместе с пробелом между ними.
  2. полностью удалил цикл for, который использовал j в качестве счетчика, потому что он искажал интервал в выходной печати, выводя нежелательные * подальше.
  3. наконец добавил System.out.println() перед вторым циклом for, чтобы *, напечатанный вторым циклом for, начинался с новой строки.

    import java.util.*;
    import java.lang.*;
    
    class Rextester
    {  
        public static void main(String args[])
        {
            for (int i=1;i <= 3; i++) {
                System.out.println();
                for (int k=3; k >= i; k--) {
                    System.out.print(" " + "*" + " ");
                }
            }
            System.out.println();
            for (int k=2; k <= 3; k++) {
                for (int l=0; l < k; l++) {
                    System.out.print(" "+"*"+" ");
                }
                System.out.println();
            }
        }
    }
    

В конечном счете, это проблема, решаемая путаницей с числами или ручкой и бумагой до того, как писать код.

Другие вопросы по тегам