web-dev-qa-db-ja.com

forループで三角形を作成する

私はこれに対する答えを見つけることができないようです

Forループを使用して単純な三角形を描画する必要があります。

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

半分の三角形を作成できますが、現在のループに追加して完全な三角形を作成する方法がわかりません。

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



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

ありがとう

9
Kerry G

まず、正しい数の*シンボルを生成していることを確認する必要があります。 1、2、3ではなく、1、3、5などを生成する必要があります。これは、カウンター変数を変更することで修正できます。

for (int i=1; i<10; i += 2)
{
    for (int j=0; j<i; j++)
    {
        System.out.print("*");
    }
    System.out.println("");
}

ご覧のとおり、これにより、i1で始まり、2よりも小さい限り、各ステップで10ずつ増加します(つまり、13579)。これにより、正しい数の*シンボルが得られます。次に、行ごとにインデントレベルを修正する必要があります。これは次のように実行できます。

for (int i=1; i<10; i += 2)
{
    for (int k=0; k < (4 - i / 2); k++)
    {
        System.out.print(" ");
    }
    for (int j=0; j<i; j++)
    {
        System.out.print("*");
    }
    System.out.println("");
}

*シンボルを印刷する前に、いくつかのスペースを印刷します。スペースの数は、現在の行によって異なります。それが、k変数を使用したforループの目的です。 4321、および0ìの場合、kが値を反復処理することがわかります。 1357、および9。これは、三角形の高さが高いほど、配置する必要があるスペースが増えるためです。三角形をさらに下るほど、必要なスペースが少なくなり、三角形の最後の行にはスペースさえ必要ありません。

16
Simeon Visser

楽しくシンプルなソリューション:

for (int i = 0; i < 5; i++) 
  System.out.println("    *********".substring(i, 5 + 2*i));
20
Marko Topolnik

まず、コードなしのソリューションを考えてください。アイデアは、行ごとに増加する奇数の*を印刷することです。次に、スペースを使用して*を中央に配置します。最後の行の*の最大数を知っていると、最初の*を中央に配置するためのスペースの初期数がわかります。次に、コードで記述します。

3
Pablo Pazos

OPはJavaにとって新しいものであるため、メソッドは「高度な」ものと見なされる可能性がありますが、この問題を使用して、問題を細分化して攻撃する方法を示す価値があると思います。

1行を印刷するメソッドを記述して、メソッドに何行目であるかを考えてみましょう。

_public void printTriangleLine(int rowNumber) {
    // we have to work out what to put here
}
_

スペースをいくつか印刷してから、星をいくつか印刷する必要があります。

この例を見ると、(最初の行が0の場合)それは(5-rowNumber)スペースと(2 * rowNumber + 1)星であることがわかります。

文字の行を出力するメソッドを発明して、使用してみましょう:

_public void printTriangleLine(int rowNumber) {
    printSequence(" ", 5 - rowNumber);
    printSequence("*", 2 * rowNumber + 1);
    System.out.println(); 
}
_

実際にprintSequence()を記述するまでコンパイルされないので、それを実行しましょう。

_public void printSequence(String s, int repeats) {
    for(int i=0; i<repeats; i++) {
        System.out.print(s);
    }
}
_

これでtest printSequenceを単独で使用でき、test printTriangleLineを単独で使用できます。現時点では、main()でこれらのメソッドを直接呼び出して、試してみてください。

_public static void main(String [] args) {
    printSequence("a",3);
    System.out.println();
    printTriangleLine(2);
}
_

...実行して、(目で)出力されることを確認します。

_aaa
   *****
_

さらにプログラミングを始めるときは、jUnitのようなユニットテストフレームワークを使用する必要があります。印刷する代わりに、printTriangleLineのようなものを書いてString(プログラムの上位から印刷する)を返す可能性が高く、次のようなコマンドでテストを自動化します。

_assertEquals("   *****", TriangleDrawer.triangleLine(2));
assertEquals("     *", TriangleDrawer.triangleLine(0))
_

これで、三角形を描くために必要なピースができました。

_public void drawTriangle() {
    for(int i=0; i<5; i++) {
        printTriangleLine(i);
    }
}
_

私たちが書いたコードは、他の人が与えた答えよりも少し長いです。しかし、各ステップをテストすることができ、他の問題で再び使用できるメソッドがあります。実際には、問題を多すぎるメソッドに分解するか、少なすぎるメソッドに分解するかの適切なバランスを見つける必要があります。私は多くの本当に短い方法を好む傾向があります。

追加のクレジット:

  • system.outに出力する代わりに、メソッドがStringを返すようにこれを調整します。したがって、main()でSystem.out.print(drawTriangle())を使用できます。
  • これを調整して、drawTriangle()にさまざまなサイズを要求できるようにします。つまり、drawTriangle(3)またはdrawTriangle(5)を呼び出すことができます。
  • 大きな三角形で動作するようにします。ヒント:新しい "width"パラメーターをprintTriangleLine()に追加する必要があります。
3
slim

Javaでこれを試してください

for (int i = 6, k = 0; i > 0 && k < 6; i--, k++) {
    for (int j = 0; j < i; j++) {
        System.out.print(" ");
    }
    for (int j = 0; j < k; j++) {
        System.out.print("*");
    }
    for (int j = 1; j < k; j++) {
        System.out.print("*");
    }
    System.out.println();
}
2
loveleen

宿題の質問?元の「直角三角形」コードを変更して、スペースを含む反転した「直角三角形」を生成することができます。

for(i=0; i<6; i++)
{
for(j=6; j>=(6-i); j--)
{
   print(" ");
}
for(x=0; x<=((2*i)+1); x++)
{
   print("*");
}
print("\n");
}
2
Ganesh Iyer

これはあなたの質問に答えます。コメントされたコードのコメントを外して、外側の行のみを表示します:)

public class TrianglePattern {

    public static void main(String[] args) {
        // This logic will generate the triangle for given dimension
        int dim = 10;
        for (int i = 0; i < dim; i++) {
            for (int k = i; k < dim; k++) {
                System.out.print(" ");
            }
            for (int j = 0; j <= i; j++) {
                //if (i != dim - 1)
                //  if (j == 0 || j == i)
                //      System.out.print("*");
                //  else
                //      System.out.print(" ");
                //else
                    System.out.print("*");
                System.out.print(" ");
            }
            System.out.println("");
        }
    }
}
1
Chandra
  for (int i=0; i<6; i++)
  {
     for (int k=0; k<6-i; k++)
     {
        System.out.print(" ");
     }
     for (int j=0; j<i*2+1; j++)
     {
        System.out.print("*");
     }
     System.out.println("");
  }
1
citydeer
private static void printStar(int x) {
    int i, j;
    for (int y = 0; y < x; y++) { // number of row of '*'

        for (i = y; i < x - 1; i++)
            // number of space each row
            System.out.print(' ');

        for (j = 0; j < y * 2 + 1; j++)
            // number of '*' each row
            System.out.print('*');

        System.out.println();
    }
}
1
Fahim Faysal

さて、2つのシーケンスがありますsize-nはスペースおよび(2*(n+1)) -1星。どうぞ。

public static void main(String[] args) {
    String template = "***************************";
    int size = (template.length()/2);
    for(int n=0;n<size;n++){
        System.out.print(template.substring(0,size-n).replace('*',' '));
        System.out.println(template.substring(0,((2*(n+1)) -1)));
    }
}
0
zawhtut

これにより、もう少し制御しやすくなります。

_public static int biggestoddnum = 31;

public static void main(String[] args) {
    for (int i=1; i<biggestoddnum; i += 2)
    {
        for (int k=0; k < ((biggestoddnum / 2) - i / 2); k++)
        {
            System.out.print(" ");
        }
        for (int j=0; j<i; j++)
        {
            System.out.print("*");
        }
        System.out.println("");
    }
}
_

_public static int biggestoddnum_の値を任意の奇数に変更するだけで、for(int k...)が動作することがテストされています。

0
user8742736