我如何在Java中绘制箭头?

时间:2017-05-31 02:45:33

标签: java

以下是我要创建的内容:

    *
    **
    ***
    **** 
*********
    ****
    ***
    **
    *

这是我创造的:

*
**
***
**** 
**********
****
***
**
*

这是我的代码:

for(int i = 1; i <= 5; i++){
    for(int j = 1; j<=i; j++){
        System.out.print("*");
    }
    System.out.println();
    if(i == 4){
        for(int f = 0; f < 5; f++){
            System.out.print("*");
        }
    }
}

for(int i = 1; i <= 5; i++){
    for(int j = 4; j>=i; j--){
        System.out.print("*");
    }
    System.out.println();
}

我不知道如何缩进尾部,请不要给我答案,只要告诉我问题在哪里,我会尽力去做。谢谢!

6 个答案:

答案 0 :(得分:1)

你应该在打印“*”的for循环之前添加另一个内部for循环打印“”。

答案 1 :(得分:1)

您可以使用printf方法以特定格式告知Java打印。例如,您需要前缀5个空格然后打印您的文本:

System.out.printf("%5s","hello");

要获得所需的输出,请尝试以下代码。注意:可能有更好的解决方案。

for (int i = 1; i <= 5; i++) {
    if (i != 5) // middle line should not be prefix with spaces
        // empty 5 spaces before starting the loop
        System.out.printf("%5s", "");

    for (int j = 1; j <= i; j++) {
        System.out.print("*");
    }
    System.out.println();
    if (i == 4) {
        for (int f = 0; f < 5; f++) {
            System.out.print("*");
        }
    }
}

for (int i = 1; i <= 5; i++) {
    // print 5 space before
    System.out.printf("%5s", ""); // <== note the printf here with empty string
    for (int j = 4; j >= i; j--) {
        System.out.print("*");
    }
    System.out.println();
}

答案 2 :(得分:1)

鉴于您提供的形状,并假设它将以等宽字体输出,我们可以在网格上绘制。

arrow on grid

将视觉分为两个部分,我们可以看到有两种主要模式。

尾巴(绿色)和头部(红色)。

enter image description here

还有第二种模式。头部中的恒星数量增加和减少的地方。

尾巴的大小可能会有所不同,头部的大小也会发生变化,它仍然是我们认为是箭头的形状。

enter image description here

当输出文本时,最简单的迭代顺序通常是从左到右,从上到下,除非处理从右到左的语言,或垂直阅读,我将假设西方文化的输出,因为这是什么在编程输出流中普及。

所以,问题是,如何最好地建立输出所需的字符串。

考虑到输出将在流上的格式,

宽度将是你的外部循环,尾部/长度是你的内部循环。

您提供的代码使用10表示宽度,将其分为2组5,第二组偏移1。

enter image description here

for(int i = 1; i <= 5; i++){
    for(int j = 1; j<=i; j++){
        System.out.print("*");
    }
    System.out.println();
    if(i == 4){
        for(int f = 0; f < 5; f++){
            System.out.print("*");
        }
    }
}

for(int i = 1; i <= 5; i++){
    for(int j = 4; j>=i; j--){
        System.out.print("*");
    }
    System.out.println();
}

将代码翻译回图纸,然后循环宽度,最后一次迭代输出尾部的星线。

您需要做的是在所有其他行上输出空格。

有多种方法可以输出,或者使用printf使用固定宽度格式化功能之一。

但是考虑到你当前的代码,当增加模式的宽度迭代不是4时,最小的区别是输出空格字符,宽度的循环是-1。

看着你的最终结果,你的尾巴正在你的头后打印。这需要提前。

你的尾巴太长了,需要将它抵消1。

你需要通过打印空格插入粉色和棕色部分,输出尾部的次数相同,只要你不输出尾部。

答案 3 :(得分:0)

Here's a method you can use to print the arrow:

private static void printArrow (final int min, final int max, final int tip)
{
    final int numSpaces = tip - max - 1;

    // print the top
    for (int i = min; i <= max; i++)
    {
        for (int j = 0; j < numSpaces; j++)
            System.out.print(" ");

        for (int j = 0; j < i; j++)
            System.out.print("*");

        System.out.println();
    }

    // print the tip
    for (int i = 0; i < tip; i++)
    {
        System.out.print("*");
    }
    System.out.println();

    // print the bottom
    for (int i = max; i >= min; i--)
    {
        for (int j = 0; j < numSpaces; j++)
            System.out.print(" ");

        for (int j = 0; j < i; j++)
            System.out.print("*");

        System.out.println();
    }
}

Call it from main with:

public static void main(String[] args)
{
    // this will print the arrow in your question
    printArrow(1, 4, 9);
}

Another Example:

printArrow(1, 10, 19);

Outputs:

        *
        **
        ***
        ****
        *****
        ******
        *******
        ********
        *********
        **********
*******************
        **********
        *********
        ********
        *******
        ******
        *****
        ****
        ***
        **
        *

答案 4 :(得分:0)

这是我的答案。您只需先插入空格然后打印*,直到到达中间线。如果您想使其动态化,只需动态替换k的边界值与f的边界相同:

public static void main(String[] args) {
    int k = 1;
    int m = 0;
    for (int i = 1; i <= 5; i++) {
        m = i - 1;
        while (k != 6 && m != 4) {
            System.out.print(" ");
            k++;

        }

        for (int j = 1; j <= i; j++) {

            System.out.print("*");
        }
        System.out.println();
        if (i == 4) {

            for (int f = 0; f < 5; f++) {

                System.out.print("*");
            }
        }
        k = 1;
    }

    k = 1;
    for (int i = 1; i <= 5; i++) {
        while (k != 6) {
            System.out.print(" ");
            k++;

        }

        for (int j = 4; j >= i; j--) {

            System.out.print("*");
        }
        System.out.println();
        k = 1;
    }

}

修改 我意识到输出后面只有一个*。因此,只需要将k的边界值从5更改为6(从f的边界值到f + 1的边界值) 输出如下所示: enter image description here

答案 5 :(得分:-2)

for (int i = 1; i <= 5; i++) {
        if (i!=5) {
            System.out.print("     ");
        }
        for (int j = 1; j <= i; j++) {
            System.out.print("*");
        }
        System.out.println();
        if (i == 4) {
            for (int f = 0; f < 5; f++) {
                System.out.print("*");
            }
        }
    }

    for (int i = 1; i <= 5; i++) {
        System.out.print("     ");
        for (int j = 4; j >= i; j--) {
            System.out.print("*");
        }
        System.out.println();
    }