使用Java创建用户输入的星号三角形

时间:2019-02-25 07:54:39

标签: java

我想...

使用Java

创建一个星号三角形,该三角形与用户输入的任意数字(1至50之间)的长度匹配。

详细信息

  1. 第一行始终以星号开头。
  2. 下一行将增加一个星号,直到与 用户的输入。
  3. 然后,以下各行将递减,直到返回到第一个 星号。

例如,如果用户输入3,则输出将在第一行上带有一个星号,在第二行上带有两个星号,在第三行上带有三个星号,然后在下一行返回到两个星号行,然后在最后一行以星号结束。

到目前为止我已经尝试过的

我必须使用嵌套的for循环。到目前为止,我尝试使用下面的练习示例对其进行测试。我只能在数字输出上创建。我也有一些输出星号三角形的概念。如何应用此代码的概念来跟随用户的输入数字?

 import java.util.Scanner;

public class Program
{
    public static void main(String[] args) {
        Scanner keyboard = new Scanner(System.in);
        int count, index = 0, value, number;
        System.out.println("This program creates a pattern of numbers " );
        System.out.println("Based on a number you enter." );
            System.out.println("Please enter a positive integer. " );
        count = keyboard.nextInt();
        value = count;
        for (index = 1; index <= count; index++)
        {
            for (number = value; number >= 1; number--)
            {
                System.out.println(number);
            }
            value--;
            System.out.println();
        }
        }
}

3 个答案:

答案 0 :(得分:1)

这就是我要怎么做

  1. 编写一个方法printAsterisks,该方法以int N作为参数并写入N行星号。您将需要一个for循环来这样做。
  2. printAsterisks循环中调用for,该循环从1计数到COUNT
  3. 在第二个循环中调用printAsterisks,该循环从COUNT-1倒数到1

应该可以解决问题。

此外,请注意,您应该关闭扫描仪。这样做的简单方法是将ot封装在try-with-resource中,如下所示:

try (Scanner keyboard = new Scanner(System.in);) {
 // your code here
}

让我们知道该程序可以运行的版本(或您仍有疑问):)

HTH

答案 1 :(得分:0)

这是您想要的:

public class Asterisk {
    private static final String ASTERISK = "*";
    private static final String SPACE = "";
    private static int LENGTH;

    public static void main(String[] args) {
        try{
            readLength();
            for (int i=1; i<=LENGTH; i++) {
                if (i == LENGTH) {
                    for (int j=LENGTH; j>=1; j--) {
                        drawLine(j);
                    }   
                    break;
                }
                drawLine(i);
            }
        }catch (Exception e) {
            System.out.println("You must enter a number between 1 and 50.");
        }
    }

    static void readLength(){
        System.out.println("Enter asterisk's length (1-50)");
        LENGTH = Integer.parseInt(System.console().readLine());
        if (LENGTH<=0 || LENGTH>50) 
            throw new NumberFormatException();
    }

    static void drawLine(int asterisks){
        StringBuilder line = new StringBuilder();
        int spacesLeft = getLeftSpaceCount(asterisks);
        int spacesRight = getRightSpaceCount(asterisks);

        for (int i=0; i<spacesLeft; i++) {
            line.append(SPACE);
        }

        for (int i=0; i<asterisks; i++) {
            line.append(ASTERISK);
        }

        for (int i=0; i<spacesRight; i++) {
            line.append(SPACE);
        }

        System.out.println(line.toString()+"\n");
    }

    static int getLeftSpaceCount(int asterisks){
        int spaces = LENGTH - asterisks;
        int mod = spaces%2;
        return spaces/2 + mod;  
    }

    static int getRightSpaceCount(int asterisks){
        int spaces = LENGTH - asterisks;
        return spaces/2;    
    }
}
  

我必须使用嵌套的循环

是的,主要逻辑就在那里...

for (int i=1; i<=LENGTH; i++) {
    if (i == LENGTH) {
        for (int j=LENGTH; j>=1; j--) {
            drawLine(j);
        }   
        break;
    }
    drawLine(i);
}

使用5作为输入的三角形。

*

**

***

****

*****

****

***

**

*

提示:

有一种使用System.console().readLine()从用户那里获取输入的简便方法。

答案 2 :(得分:-1)

关于印刷部分,我想稍微弄清楚答案:

int input = 3; //just an example, you can hook in user input I'm sure!
for (int i = 1; i < (input * 2); i++) {
    int amount = i > input ? i / 2 : i;
    for (int a = 0; a < amount; a++)
        System.out.print("*");
    }
    System.out.println();
}

对于循环条件,有一些解释:

  • i < (input * 2):由于i从1开始,我们可以考虑一些情况。如果输入为1,则需要1行。输入2、3行。 4:5行。简而言之,长度与行数的关系是row count = (length * 2) - 1,因此我另外从1而不是0开始偏移了1。

  • i > input ? i / 2 : i:这称为三元语句,它基本上是if语句,您可以在其中以boolean/if ? value_if_true : value_if_false的形式获取值。因此,如果行数大于您要求的长度(大于一半),则长度除以2。

另外,该循环中的所有内容都可能是一行:

System.out.println(new String(new char[i > input ? i / 2 : i]).replace('\0', '*'));

是的,从技术上讲,我们可以使用IntStream将整个事情变成一行,尽管在那一点上,我将为了清楚起见而换行

请记住,我不会将其称为“初学者的解决方案”,但希望它能引起您学习关于编程的其他一些有用的小知识,例如为什么我在自己的编程语言中替换了\0单行示例。