Создание песочных часов с помощью астерикс на 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();
}

Вывод в шахматном порядке:

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