Создание песочных часов с помощью астерикс на java
Я знаю, что его спрашивали, но мне трудно понять другие программы и вложенные циклы, если у кого-то есть трюк, чтобы следовать вложенным циклам и создавать фигуру со звездочками, я хотел бы знать, потому что это действительно меня запутало.
Вот код, который я написал после многих попыток и экспериментов:
Scanner input = new Scanner(System.in);
System.out.print("Enter a number: ");
int userentry = input.nextInt();
for (int i = 0; i<userentry-1; i++) {
for (int k = 0; k<i; k++)
{
System.out.print(" ");
}
for (int j = userentry - 1; j>=i;j--)
{
System.out.print("*");
}
System.out.println();
}
for (int i = 0; i<userentry; i++) {
for (int k = 0; k<i+1; k++)
{
System.out.print(" ");
}
for (int j = 0; j<=i;j++)
{
System.out.print("*");
}
System.out.println();
}
}
}
Например, вывод числа 3 выглядит следующим образом, у меня проблемы с интервалом:
***
**
*
**
***
Я был бы очень признателен тому, кто может помочь мне с моей программой и объяснить мне алгоритм и как я могу сделать больше шаблонов.
6 ответов
Представьте себе координатную плоскость в диапазоне
[-n, n]
как по вертикали, так и по горизонтали. Вы можете использовать два вложенных цикла for и один оператор if else для его вывода:
int n = 3;
for (int i = -n; i <= n; i++) {
for (int j = -n; j <= n; j++)
if (i == 0 || j == 0)
System.out.print("*");
else
System.out.print("-");
System.out.println();
}
Координатная плоскость:
---*---
---*---
---*---
*******
---*---
---*---
---*---
Чтобы напечатать песочные часы, вам нужно только изменить оператор if else :
int n = 3;
for (int i = -n; i <= n; i++) {
for (int j = -n; j <= n; j++)
if (Math.abs(i) < Math.abs(j))
System.out.print(" ");
else
System.out.print("*");
System.out.println();
}
Песочные часы:
*******
*****
***
*
***
*****
*******
См. Также: Как печатать шаблоны ASCII на C#, но с использованием синтаксиса Java?
Вы можете визуализировать песочные часы как матрицу чисел в диапазоне
[-n, n]
включительно, где каждая точка:
m[i][j] = Math.abs(i) - Math.abs(j);
Если
n = 3
, то эта матрица выглядит так:
0 1 2 3 2 1 0
-1 0 1 2 1 0 -1
-2 -1 0 1 0 -1 -2
-3 -2 -1 0 -1 -2 -3
-2 -1 0 1 0 -1 -2
-1 0 1 2 1 0 -1
0 1 2 3 2 1 0
int n = 3;
IntStream.rangeClosed(-n, n)
.map(Math::abs)
.peek(i -> IntStream.rangeClosed(-n, n)
.map(Math::abs)
.forEach(j -> {
if (i - j < 0)
System.out.print(" ");
else
System.out.print("* ");
}))
.forEach(i -> System.out.println());
Выход:
* * * * * * *
* * * * *
* * *
*
* * *
* * * * *
* * * * * * *
См. Также: Как нарисовать лестницу на Java?
Поскольку все символы шрифта, используемого для ввода / вывода / кода, имеют одинаковую ширину, вам необходимо уменьшить каждую итерацию на 2, например:
****
**
**
****
или же
*****
***
*
***
*****
вместо одного. В качестве интервала используйте следующее:
for (int i = userentry; i > 0; i -= 2) {
for (int j = 0; j < (userentry - i) / 2; j++) System.out.print(" ");
for (int j = 0; j < i; j++) System.out.print("*");
for (int j = 0; j < (userentry - i) / 2; j++) System.out.print(" ");
System.out.println();
}
for (int i = (userentry % 2 == 0 ? 2 : 3); i <= userentry; i += 2) {
for (int j = 0; j < (userentry - i) / 2; j++) System.out.print(" ");
for (int j = 0; j < i; j++) System.out.print("*");
for (int j = 0; j < (userentry - i) / 2; j++) System.out.print(" ");
System.out.println();
}
Вы можете попробовать приведенный ниже код
class HelloWorld {
static void pattern(int rows_no)
{
int i, j, k;
for (i = 1; i <= rows_no; i++) {
for (k = 1; k < i; k++)
System.out.print(" ");
for (j = i; j <= rows_no; j++)
System.out.print("*"+ " ");
System.out.println();
}
for (i = rows_no - 1; i >= 1; i--)
{
for (k = 1; k < i; k++)
System.out.print(" ");
for (j = i; j <= rows_no; j++)
System.out.print("*"+ " ");
System.out.println();
}
}
public static void main(String[] args) {
int rows_no = 3;
pattern(rows_no);
}
}
Что дает результат как:
* * *
* *
*
* *
* * *
Если вы хотите напечатать песочные часы, вам нужно напечатать два треугольника, один прямой, а другой перевернутый (обратите внимание, что концы обоих треугольников имеют общую звездочку).
Это можно сделать с помощью кода, приведенного ниже ...
import java.util.Scanner;
class HourGlass{
public static void main(String args[]){
Scanner input = new Scanner(System.in);
System.out.print("Enter a number: ");
int userentry = input.nextInt();
for (int i = 0; i < userentry; i++) {
for (int k = 0; k < i; k++) {
System.out.print(" ");
}
for (int j = userentry - 1; j >= i; j--) {
System.out.print("*");
}
for(int k = userentry - i; k > 1; k--){
System.out.print("*");
}
System.out.println();
}
for (int i = 1; i < userentry; i++) {
for (int k = 0; k < userentry - i - 1; k++) {
System.out.print(" ");
}
for (int j = 0; j <= i; j++) {
System.out.print("*");
}
for (int k = 0; k < i ; k++){
System.out.print("*");
}
System.out.println();
}
}
}
Это печатает
*****
***
*
***
*****
при входе 3 ...
int n = 3;
for (int i = -n; i <= n; i++) {
for (int j = -n; j <= n; j++)
if (Math.abs(i) >= Math.abs(j) && (i + j) % 2 == 0)
System.out.print("*");
else
System.out.print(" ");
System.out.println();
}
Вывод в шахматном порядке:
* * * *
* * *
* *
*
* *
* * *
* * * *