Ваша проблема
Давайте поговорим о вашей переменной c
, которая является char
. (На самом деле, c
- это Character
, в штучной упаковке эквивалент char
, но это не имеет большого значения.)
В Java char
- это тип числа . Все char
с являются числами. Например, char
литерал 'a'
на самом деле является числом 97:
'a' == 97; // true
И вы можете делать арифметику с char
, так же, как с обычными числами:
'a' + 1; // 98
'a' + 2; // 99
'a' + 3; // 100
Отображение между символами, такими как 'a'
, и числами, такими как 97 в Java, соответствует универсальному стандарту Unicode , расширенному набору более старого стандарта ASCII . Другими словами, 'a' == 97
, потому что ASCII так говорит. Вот таблица ASCII:
И ASCII, и Java char
были продуманно спроектированы так, чтобы арифметика с символами работала точно так, как вы ожидаете. Изучите эти примеры:
(char) ('a' + 1); // 'b'
(char) ('a' + 2); // 'c'
(char) ('a' + 3); // 'd'
Как вы видите, в последней строке добавление 3 к 'a'
и преобразование его обратно в char
дает 'd'
, что на 3 буквы после 'a'
.
Так что если вы хотите, чтобы x букв после некоторого символа c
, код просто (char) (c + x)
.
В вашем случае для каждой буквы, которую вы печатаете в треугольнике, вы хотите увеличить символ пользователя (в вашем примере, 'b'
) на расстояние буквы от печати до центральной буквы. Буква для печати находится в позиции k
, а центральная буква всегда в позиции i - 1
; таким образом, расстояние составляет Math.abs(k - (i - 1))
или Math.abs(k - i + 1)
. Вот сколько нужно добавить к персонажу.
С этим знанием легко исправить ваш код. Заменить:
for (k = 0; k < (2 * i - 1); k++)
{
System.out.print(c);
}
с:
for (k = 0; k < (2 * i - 1); k++)
{
System.out.print((char) (c + Math.abs(k - i + 1)));
}
Другие проблемы
Пока вы здесь, вы можете также исправить некоторые другие проблемы с вашим кодом:
В Java принято, что классы начинаются с заглавной буквы. Это означает, что вы должны изменить:
public class triangle
{
до:
public class Triangle
{
и переименуйте triangle.java
в Triangle.java
.
Вам не нужно объявлять переменные сверху. Лучше объявить их, когда они вам понадобятся, что позволит вам объединить объявление и начальное присвоение. Например, вместо:
int size = 0;
// ...
size = kb.nextInt();
Вы можете просто написать:
int size = kb.nextInt();
Вот ваш код, переработанный для исправления этого:
Scanner kb = new Scanner(System.in);
System.out.println("Enter height of the triangle : ");
int size = kb.nextInt();
System.out.println("Which character you want to use : ");
Character c = kb.next().charAt(0);
for (int i = 0; i < size + 1; i++)
{
for (int j = size; j > i; j--)
{
System.out.print(" ");
}
for (int k = 0; k < (2 * i - 1); k++)
{
System.out.print((char) (c + Math.abs(k - i + 1)));
}
System.out.println();
}
Вы должны использовать char
, а не Character
, для c
. Character
следует использовать, только если вам нужно иметь дело с боксом и распаковкой (например, вы хотите определить ArrayList<Character>
), что не имеет никакого отношения к вашей текущей проблеме. Так что замените:
Character c = kb.next().charAt(0);
с:
char c = kb.next().charAt(0);
Используйте System.out.print()
для подсказок. Это позволяет пользователю вводить ответ в той же строке. Вместо:
System.out.println("Enter height of the triangle : ");
int size = kb.nextInt();
System.out.println("Which character you want to use : ");
char c = kb.next().charAt(0);
Использование:
System.out.print("Enter height of the triangle: ");
int size = kb.nextInt();
System.out.print("Enter character you want to use: ");
char c = kb.next().charAt(0);