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」パラメーターを追加する必要があります。