如何正确打印此三角形的字符?

时间:2019-06-04 20:55:57

标签: java character ascii

此代码要求用户提供三角形高度和字母。

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 个答案:

答案 0 :(得分:2)

您的问题

让我们谈谈变量c,它是一个char。 (实际上,cCharacter,与char的框式等效,但这并不重要。)

在Java中,char is a number type。所有char是数字。例如,char文字'a'实际上是数字97:

'a' == 97; // true

您可以使用char进行算术运算,就像使用常规数字一样:

'a' + 1; // 98
'a' + 2; // 99
'a' + 3; // 100

在Java中,像'a'这样的字符与像97这样的数字之间的映射遵循通用标准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',在'a'之后是3个字母。

因此,如果您想在某个字符c之后加上x个字母,则代码就是(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,而不是cCharacter仅在需要处理boxing and unboxing(例如,您要定义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);