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

Java 如何正确打印此三角形字符?,java,character,ascii,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 t

此代码要求用户输入三角形高度和字母

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();
        }
    }
}
但它应该是:

  b
 cbc
dcbcd
如何在上面显示的三角形图案中,在给定字母后打印字母表中的字母?

您的问题 让我们讨论一下变量
c
,它是一个
char
。(实际上,
c
是a,装箱后相当于
char
,但这并不重要。)

在Java中。所有字符都是数字。例如,
char
literal
'a'
实际上是数字97:

'a'==97;//真的
您可以使用
char
进行算术运算,就像使用常规数字一样:

'a'+1;//98
“a”+2;//99
“a”+3;//100
Java中像
'a'
这样的字符和像97这样的数字之间的映射遵循通用标准,这是旧标准的超集。换句话说,
'a'==97
,因为ASCII是这么说的。这是一个ASCII表:

ASCII和Java的
char
都经过了深思熟虑的设计,因此使用字符进行算术运算的效果与您预期的完全一样。研究这些例子:

(char)('a'+1);/'b'
(char)('a'+2);/'c'
(char)('a'+3);/'d'
如您所见,在最后一行中,将3添加到
'a'
,然后将其转换回
字符
将生成
'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++)
{
系统输出打印(c);
}
与:

for(k=0;k<(2*i-1);k++)
{
系统输出打印((char)(c+Math.abs(k-i+1));
}
其他问题 在这里,您还可以修复代码中的其他一些问题:

  • 在Java中,类通常以大写字母开头。这意味着您应该更改:

    公共类三角形
    {
    
    致:

    公共类三角形
    {
    
    并将
    triangle.java
    重命名为
    triangle.java

  • 您不需要在顶部声明变量。最好在第一次需要变量时声明它们,这样可以将声明和初始赋值结合起来。例如,而不是:

    int size=0;
    // ...
    size=kb.nextInt();
    
    你可以简单地写:

    int size=kb.nextInt();
    
    这是您的代码,经过重构以修复此问题:

    Scanner kb=新的扫描仪(System.in);
    System.out.println(“输入三角形的高度:”);
    int size=kb.nextInt();
    System.out.println(“要使用的字符:”);
    字符c=kb.next().charAt(0);
    对于(int i=0;ii;j--)
    {
    系统输出打印(“”);
    }
    对于(int k=0;k<(2*i-1);k++)
    {
    系统输出打印((char)(c+Math.abs(k-i+1));
    }
    System.out.println();
    }
    
  • 您应该使用
    char
    ,而不是
    Character
    ,因为
    c
    Character
    仅在您需要处理(例如,您想定义一个
    ArrayList
    )时才应该使用,这与您当前的问题无关。因此,请替换:

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

    charc=kb.next().charAt(0);
    
  • 使用
    System.out.print()
    进行提示。它允许用户在同一行中键入答案。而不是:

    System.out.println(“输入三角形的高度:”);
    int size=kb.nextInt();
    System.out.println(“要使用的字符:”);
    char c=kb.next().charAt(0);
    
    使用:

    System.out.print(“输入三角形的高度:”);
    int size=kb.nextInt();
    System.out.print(“输入要使用的字符:”);
    char c=kb.next().charAt(0);
    

  • 如果用户输入一个
    z
    ,您可能需要考虑怎么做,作为提示,您可能应该使用
    ascii
    来获取后面的字母。
    System.out.print(c)
    这将始终打印用户输入的信件。如果您需要打印不同的信件,您将不得不执行不同的操作。谢谢您的回答,谢谢您的宝贵建议!!以前没有人告诉我任何一封信。
      b
     cbc
    dcbcd