9

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

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

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

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

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

12 に答える 12

20

楽しくてシンプルな解決策:

for (int i = 0; i < 5; i++) 
  System.out.println("    *********".substring(i, 5 + 2*i));
于 2012-07-10T09:20:44.447 に答える
17

まず、正しい数の*シンボルを生成していることを確認する必要があります。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("");
}

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

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 ループの目的です。が、k、、、 、 、 、 、 、 、 、、、、、、、および 三角形が高いほど、より多くのスペースを配置する必要があるため、これが必要です。三角形を下に行くほど、必要なスペースが少なくなり、三角形の最後の行にはスペースがまったく必要ありません。43210ì13579

于 2012-07-10T08:52:29.690 に答える
3

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);
    }
}

これで、printSequenceを単独でテストでき、printTriangleLineを単独でテストできます。今のところ、これらのメソッドを直接呼び出すことで試してみることができますmain()

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

...それを実行し、それが出力することを(あなたの目で)確認します:

aaa
   *****

プログラミングをさらに進めるときは、 jUnitのような単体テストフレームワークを使用することをお勧めします。印刷する代わりに、printTriangleLineのようなものを記述して文字列(プログラムの上位から印刷する)を返す可能性が高く、次のようなコマンドを使用してテストを自動化します。

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

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

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

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

追加のクレジットの場合:

  • System.outに出力する代わりに、メソッドが文字列を返すようにこれを調整します-したがって、main()で使用できますSystem.out.print(drawTriangle())
  • これを調整して、drawTriangle()にさまざまなサイズを要求できるようにします。つまり、drawTriangle(3)またはを呼び出すことができます。drawTriangle(5)
  • より大きな三角形で機能するようにします。ヒント:printTriangleLine()に新しい「width」パラメーターを追加する必要があります。
于 2012-08-21T12:43:47.273 に答える
2

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

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");
}
于 2012-07-10T08:51:12.443 に答える
1
  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("");
  }
于 2012-07-10T08:51:36.383 に答える
1

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

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("");
        }
    }
}
于 2013-11-17T10:14:28.093 に答える
0

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

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)));
    }
}
于 2018-03-29T12:22:32.530 に答える