Печать ромбовидной формы с Java
Я хочу напечатать форму сетки на консоли вывода в Eclipse.
В основном я взял целое число от пользователя, которое является числом звезд на одной границе сетки.
Вот код, который у меня есть до сих пор:
import java.util.Scanner;
public class PrintDiamond {
public static void main(String[] args) {
System.out.print("Enter the number: ");
Scanner scan = new Scanner(System.in);
int num = scan.nextInt();
num--;
for (int i=num; i>0; --i){
//Insert spaces in order to center the diamond
for (int n=0; n<i; ++n){
System.out.print(" ");
}
System.out.print(" *");
for (int n=i; n<num; ++n){
System.out.print(" + ");
System.out.print(" ");
}//Ending bracket of nested for-loop
System.out.println();
}//Ending bracket of for loop
//Print out a diamond shape based on user input
for (int i=0; i<=num; ++i){ //<= to print the last asterisk
//Insert spaces in order to center the diamond
for (int n=0; n<i; ++n){
System.out.print(" ");
}
System.out.print(" *");
for (int n=i; n<num; ++n){
System.out.print(" + ");
System.out.print(" ");
} //Ending bracket of nested for-loop
System.out.println();
} //Ending bracket of for loop
}
}
и вывод (для int. 6):
*
* +
* + +
* + + +
* + + + +
* + + + + +
* + + + +
* + + +
* + +
* +
*
4 ответа
Вот код:
public static void main(String[] args) {
System.out.print("Enter the number: ");
Scanner scan = new Scanner(System.in);
int num = scan.nextInt();
final char[][] diamond = makeDiamond(num);
for (int i = 0; i < diamond.length; i++) {
for (int j = 0; j < diamond[i].length; j++) {
System.out.print(diamond[i][j]);
}
System.out.println();
}
}
public static char[][] makeDiamond(int n) {
int width = 1 + 4 * (n - 1);
int height = 1 + 2 * (n - 1);
char[][] out = new char[height][width];
int x0 = 2 * (n - 1);
int y0 = n - 1;
for (int i = 0; i < width; i += 2) {
// Top borders
int y1 = Math.abs(y0 - i / 2);
out[y1][i] = '*';
// Bottom borders
int y2 = height - Math.abs(i / 2 - y0) - 1;
out[y2][i] = '*';
if ((x0 - i) % 4 == 0) {
// Plus signs
for (int j = y1 + 1; j < y2; j++) {
out[j][i] = '+';
}
}
}
return out;
}
Некоторые советы для вашего решения:
- Создайте метод для печати "алмазной строки" для заданной ширины строки и заданной общей ширины ромба.
- Создайте метод инструмента для печати заданного количества пробелов.
- Ваш основной метод должен иметь два простых цикла: один для верхней, другой для нижней половины.
- Волшебство заключается в методе печати одной алмазной строки для заданных двух параметров
w
а такжеn
,
Это всегда хороший подход - свести вашу сложную проблему к проблеме с меньшей сложностью - в этом случае, создавая методы и используя их, например, в циклах.
В вашем методе печати одной алмазной строки вам нужно будет проверить, находитесь ли вы в "нечетной" или "четной" строке.
Хорошо, это похоже на школьное задание, поэтому я не буду писать код.
Сначала вам нужно понять и написать в псевдокоде или просто на английском языке, что вы хотите сделать:
- Инструкция о том, как нарисовать сетку.
- Сколько строк я должен напечатать?
- Какова длина каждой строки?
- Как узнать, нужно ли мне печатать
+
или нет?
- Общие шаги вашей программы.
- Считать размер сетки, Н.
- Если N < 1, спросите снова (или выйдите из программы).
- Если N = 1 или больше, выведите сетку.
- Подробные подэтапы вашей программы.
- Распечатать сетку
- Цикл для количества строк.
- Создайте пустой массив / буфер / список / строку с правильной длиной для текущей строки.
- ...
- Распечатать сетку
Потому что сейчас кажется, что вы ничего не поняли. И если это так, то ваша проблема не имеет ничего общего с Java, а скорее с базовыми знаниями в области программирования, которые вы не получите, если мы просто кодируем алгоритм для вас.
Один из вариантов знаменитого рисунка:
public static void main(String[] args) {
printDiamond(0);
printDiamond(2);
printDiamond(5);
}
static void printDiamond(int n) {
System.out.println("n=" + n);
for (int i = -n; i <= n; i++) {
for (int j = -n; j <= n; j++)
if (Math.abs(i) + Math.abs(j) == n)
System.out.print("* ");
else if (Math.abs(i) + Math.abs(j) < n && j % 2 == 0)
System.out.print("+ ");
else
System.out.print(" ");
System.out.println();
}
}
Выход:
n=0
*
n=2
*
* + *
* + *
* + *
*
n=5
*
* + *
* + *
* + + + *
* + + + *
* + + + + + *
* + + + *
* + + + *
* + *
* + *
*
См. Также: Как нарисовать двойной пустой ромб ASCII?