扭转一个循环形状?

时间:2015-11-12 10:19:53

标签: java while-loop do-while

所以我试图扭转我目前制作的形状的输出。我想知道我应该扭转病情吗?我尝试改变变量“a”和“c”的值,最后我得到了一个无限循环。

class IRT {

    public static void main(String[] args) {

        int a = 2;
        int b;
        int c = 6;

        do {
            b = a - 1;
            if (b != 0) {
                do {
                    System.out.print("*");
                    b--;

                } while (b >= 1);
            }
            b = 1;
            do {
                System.out.print(" ");
                b++;

            } while (b <= (c - a + 1));

            System.out.println();
            a++;
        } while (a <= c);

    }

}

XML CODE

   My output                    What i'm trying to get

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

2 个答案:

答案 0 :(得分:2)

如果你想做的就是颠倒每一行的顺序(即首先打印空格,然后打印* s),你只需要将顺序更改为两个内部while循环。

  int a=2;
  int b;
  int c=6;

  do{
    b=1;
    do{
      System.out.print(" ");
      b++;

    }while(b <= (c - a + 1));

    b = a - 1;
    if (b!=0){
      do{
        System.out.print("*");
        b--;

      }while(b >= 1);
    }

    System.out.println();
    a++;

  } while(a <= c);

P.S。缩进代码使其更容易理解。

输出:

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

答案 1 :(得分:0)

正如其他人已经指出的那样,你应该改变代码并给出有意义的名字。 更容易完全重写代码,我花了一些时间来简化代码并分享步骤:

<强> 1
我用无限循环替换了do-while循环,因为它们难以阅读。我认为while(true) breakcontinue语句(break label)也是低级操作,它们的行为与有意义的goto s相似。

int a = 2;
int b;
int c = 6;

while(true) {
    b = a - 1;
    if (b != 0) {
        while(true) {
            System.out.print("*");
            b--;
            if(b < 1) {
                break;
            }
        }
    }
    b = 1;
    while (true){
        System.out.print(" ");
        b++;
        if(b > (c - a + 1)) {
            break;
        }

    }

    System.out.println();
    a++;
    if(a > c) {
        break;
    }
}

<强> 2
我确定循环是最好的循环(后缀增量/减量(i++ / i--)是这个的标志。)

int a = 2;
int b;
int c = 6;

for (; a <= c; a++) {
    b = a - 1;
    if (b != 0) {
        for (; b >= 1; b--) {
            System.out.print("*");
        }
    }
    b = 1;

    for (; b <= c - a; b++) {
        System.out.print(" ");
    }

    System.out.println();
}

第3:
我将临时使用的变量b放到for循环init语句中,以阐明变量的生命周期及其实际用法。 c永远不会改变,因此我将其视为常量参数。

final int c = 6;

for (int a = 2; a <= c; a++) {
    if (a != 1) {
        for (int b = a - 1; b >= 1; b--) {
            System.out.print("*");
        }
    }
    for (int b = 1; b <= c - a; b++) {
        System.out.print(" ");
    }
    System.out.println();
}

<强> 4
我做了很多的索引转换,并将计数方向反转到了计数;步骤3中的if(a != 1)始终为真,因此删除了冗余的if分支。

  

旁注:
  形式for(int i = 0; i < n; i++)(=计数i=0直到n-1,具有n次迭代)的for循环可以作为简单模式应用。您可以在循环体(for(int i = 0; i < n;) { int index = i + offset; })或头部(for(int i = offset; i < n + offset; i++))中转换索引。您可以将计数方向反转 - for(int i = n - 1; i >= 0; i--)(=计数i=n-1降至0,进行n次迭代)。它们很有用,但请不要滥用它们 - 只使用带有索引转换的基本和反向for循环。不是像for(;;)for(int i=0, j=4; i<j && i%j==0; i++,j+=2)for(PrintStream out = System.out;;out.println("Hello World!")) break; ...

这样的意大利面条代码
final int c = 5;
for (int a = 0; a < c; a++) {
    for (int b = 0; b < a + 2; b++) {
        System.out.print("*");
    }
    for (int b = 0; b < c - (a + 1); b++) {
        System.out.print(" ");
    }
    System.out.println();
}

<强> 5
您可能已经注意到我将final int c更改为等于6而不是5。那是因为我发现它与行数和宽度有关,但只有一个单位更大。在这一步中,我为变量提供了有意义的名称,除了i,因为这是一个临时计数器,用于将 n 次写入一个字符。

final int size = 5;
for (int row = 0; row < size; row++) {
    for (int i = 0; i < size - (row + 1); i++) {
        System.out.print(" ");
    }
    for (int i = 0; i < row + 2; i++) {
        System.out.print("*");
    }
    System.out.println();
}

阅读第5步的代码并查看问题,我们会想到需要交换打印*的顺序。所以,最后是你的问题的答案:

final int size = 5;
for (int row = 0; row < size; row++) {
    for (int i = 0; i < size - (row + 1); i++) {
        System.out.print(" ");
    }
    for (int i = 0; i < row + 2; i++) {
        System.out.print("*");
    }
    System.out.println();
}