Печать шаблона в 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 и пропускаю его во втором, изменяя шаги.
- Инициализация k=2 вместо k=0. Исправление одиночного * повторения вместе с пробелом между ними.
- полностью удалил цикл for, который использовал j в качестве счетчика, потому что он искажал интервал в выходной печати, выводя нежелательные * подальше.
наконец добавил
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(); } } }
В конечном счете, это проблема, решаемая путаницей с числами или ручкой и бумагой до того, как писать код.