1

1, 3, 5, 3, 5, 7, 5, 7, 9, 7, 9... の行のクリスマス ツリーを作成するにはどうすればよいですか?

クリスマスツリーは次のようになります。

               x
              xxx
             xxxxx
              xxx
             xxxxx
            xxxxxxx
             xxxxx
            xxxxxxx
           xxxxxxxxx
            xxxxxxx
           xxxxxxxxx
          xxxxxxxxxxx

ユーザーに行数の入力を求めます。私はこれまでのところこれを持っています。先ほどピラミッドを作りました*

import java.util.Scanner;

public class Pyramide {

    public static void main(String[] args) {

        // les inn antall rader
        System.out.println("Hvor mange rader skal pyramiden ha?");

        int antallRader;
        Scanner tastatur = new Scanner(System.in);
        antallRader = tastatur.nextInt();

        // skrive ut en kolonne som har saa mange rader som det ble angitt
        // for hver verdi som rad kan faa naar rad starter paa 1, er mindre
        // eller lik antallRader, og oekes hver gang med 1)

        // for hver verdi mellom startverdien og sluttverdien med avstand 1
        // gjenta
        for (int rad = 1; rad <= antallRader; rad++) {
            for (int antallTomt = 1; antallTomt <= antallRader - rad; antallTomt++) {
                System.out.print(" ");
            }
            for (int antallX = 1; antallX <= 2 * rad - 1; antallX++) {
                System.out.print("x");
            }
            for (int antallX = 1; antallX <= 2 * rad - 1; antallX++) {
                System.out.print("x");
            }
            System.out.println();
        }

    }

}

どういうわけか+2、+2、-2になるループだと思います。しかし、私はそれをプログラムする方法を理解できません。

4

3 に答える 3

4

あなたは非常に親密でした。考えてください:

int linjer = 0;
int radDenneGang = 1;
while (linjer < antallRader) {
    int antallRaderDenneGang;
    if (antallRader - linjer >= 3)
        antallRaderDenneGang = radDenneGang + 2;
    else
        antallRaderDenneGang = radDenneGang + antallRader - linjer - 1;
    for (int rad = radDenneGang; rad <= antallRaderDenneGang; rad++) {
        for (int antallTomt = 1; antallTomt <= antallRader - rad; antallTomt++) {
            System.out.print(" ");
        }
        for (int antallX = 1; antallX <= 2 * rad - 1; antallX++) {
            System.out.print("x");
        }
        // for (int antallX = 1; antallX <= 2 * rad - 1; antallX++) {
        // System.out.print("x");
        // }
        System.out.println();
    }
    linjer += antallRaderDenneGang - radDenneGang + 1;
    radDenneGang++;
}

を使用antallRader=15すると、次のような美しいクリスマス ツリーが生成されます。

          x
         xxx
        xxxxx
         xxx
        xxxxx
       xxxxxxx
        xxxxx
       xxxxxxx
      xxxxxxxxx
       xxxxxxx
      xxxxxxxxx
     xxxxxxxxxxx
      xxxxxxxxx
     xxxxxxxxxxx
    xxxxxxxxxxxxx
于 2013-08-30T01:22:01.377 に答える
1

最初のステップは、おそらく物事を抽象化することです。つまり、このツリーの 1 行だけを出力するメソッドを作成します。

private static void branch(int width,int centerPoint) {
    for (int i = 0; i < centerPoint - width / 2; i++) {
        System.out.print(' ');
    }
    for (int i = 0; i < width; i++) {
        System.out.print('x');
    }
}

次に、好きな形のツリーを作成できます。

public static void main(String... args) {
    System.out.println("Hvor mange rader skal pyramiden ha?");
    Scanner scanner = new Scanner(System.in);
    int numRows = scanner.nextInt();
    int width = 1;
    for (int i = 0;i < numRows;i++) {
        branch(width,numRows / 3 + 2);
        if (width % 3 == 2)
            width -= 2; //Reduces the width by 2 if it's line 2, 5, 8, etc.
        else
            width += 2; //Other lines, increases the width by 2.
    }
}
于 2013-08-30T01:14:16.140 に答える
0

どうぞ !

String x = "                xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
int ix = x.indexOf('x');
for (int i = 0; i < 12; i++) {
    int j = i/3 + i%3;
    System.out.println(x.substring(j, ix + 2*j + 1));
}

出力

            x
           xxx
          xxxxx
           xxx
          xxxxx
         xxxxxxx
          xxxxx
         xxxxxxx
        xxxxxxxxx
         xxxxxxx
        xxxxxxxxx
       xxxxxxxxxxx
于 2013-08-30T02:18:17.283 に答える