Как правильно распечатать этот треугольник символов? - PullRequest
1 голос
/ 04 июня 2019

Этот код запрашивает у пользователя высоту треугольника и букву.

import java.util.*;
public class triangle
{
    public static void main(String [] args)
    {
        Scanner kb = new Scanner(System.in);
        int size = 0;
        Character c;

        System.out.println("Enter height of the triangle : ");
        size = kb.nextInt();

        System.out.println("Which character you want to use : ");
        c = kb.next().charAt(0);

        int i, j, k;

        for (i = 0; i < size + 1; i++)
        {
            for (j = size; j > i; j--) 
            {
                System.out.print(" ");
            }
            for (k = 0; k < (2 * i - 1); k++) 
            {
                System.out.print(c);
            }
            System.out.println();
        }
    }
}

Для высоты 3 и буквы b токовый выход:

  b
 bbb
bbbbb

Но это должно быть:

  b
 cbc
dcbcd

Как можно печатать буквы алфавита после данной буквы в схеме треугольника, показанной выше?

1 Ответ

2 голосов
/ 05 июня 2019

Ваша проблема

Давайте поговорим о вашей переменной 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)));
}

Другие проблемы

Пока вы здесь, вы можете также исправить некоторые другие проблемы с вашим кодом:

  1. В Java принято, что классы начинаются с заглавной буквы. Это означает, что вы должны изменить:

    public class triangle
    {
    

    до:

    public class Triangle
    {
    

    и переименуйте triangle.java в Triangle.java.

  2. Вам не нужно объявлять переменные сверху. Лучше объявить их, когда они вам понадобятся, что позволит вам объединить объявление и начальное присвоение. Например, вместо:

    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();
    }
    
  3. Вы должны использовать char, а не Character, для c. Character следует использовать, только если вам нужно иметь дело с боксом и распаковкой (например, вы хотите определить ArrayList<Character>), что не имеет никакого отношения к вашей текущей проблеме. Так что замените:

    Character c = kb.next().charAt(0);
    

    с:

    char c = kb.next().charAt(0);
    
  4. Используйте 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);
    
...