用符号和大小的用户输入绘制沙漏

时间:2014-08-26 18:35:18

标签: java

我一直致力于自学考试,如果我尝试使用下面的代码打印沙漏,我似乎无法做到这一点。还在学习。

public class test
{
    public static void hourglass(int size, char symbol){

        for(int i=size-1;i>=1;i--){

          for(int j=i;j<size;j++)

              System.out.print(" ");

          for(int j=1;j<=i*2-1;j++)

              System.out.print(symbol);

              System.out.println();
        }

        for(int i=2;i<=size-1;i++)
        {

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

         for(int j=1;j<=i*2-1;j++)

             System.out.print(symbol);
             System.out.println();

        } 

    }
}

它将完美打印3:

output for 3

如果我尝试用数字5和7打印它

5:

output for 5

然后 7:

output for 7

我将如何纠正这个问题?

1 个答案:

答案 0 :(得分:1)

我运行了代码,发现了一些有趣的东西。如果您在不正确的沙漏中发现,顶部和底部会有一排额外的“A”。这必然意味着循环运行太多。如果我们看一下你的第一个循环

for(int i = size - 1; i >= 1; i--) {

特别是声明部分,我们看到它从size - 1开始,这只适用于3的高度。好吧,Math.floor(size / 2) == 1其中size == 3

我们可以在第二个主循环中看到类似的情况。

for(int i = 2; i <= size - 1; i++) {

这次size - 1部分位于循环的条件部分。

所以解决方案很简单,我们需要做的就是声明一个变量并用它来减去循环的前面两个部分。我将变量称为“减法”,但您可以随意调用它。

int subtract = (int)Math.floor(size / 2);

然后我们只减去subtract而不是减去1。

第一循环:

for(int i = size - subtract; i >= 1; i--) {

第二次循环:

for(int i = 2; i <= size - subtract; i++) {

这将使其正常工作。请记住,这仅适用于size的偶数值。