3

CSC 2310 のクラスで宿題をしていて、この 1 つの問題がわかりません。次のように書かれています。

次の形で 100 行の直角三角形を描くプログラムを書きます: 最初の行は 100 ' '、2 番目の行は 99 ' '... 最後の行は 1 つの '*' だけです。プログラムに PrintTriangle.java という名前を付けます。

i = 100いつ100個のアスタリスクを出力するか、いつi = 9999を出力するかなどをコードに認識させる方法を理解する必要があるため、私のコードはほとんど空白です。

public class PrintTriangle {
    public static void main(String[] args) {
        // Print a right triangle made up of *
        // starting at 100 and ending with 1
        int i = 100;
        while (i > 0) {
        // code here that reads i's value and prints out an equal value of *
            i--;
        }
    }
}

課題の残りの部分は、この課題よりもはるかに難しく、これを理解できないことに混乱しています。どんな助けでも大歓迎です。

4

4 に答える 4

2

ご存知のように、明らかに 100 行が必要です。したがって、100回の反復を行う外側のループが必要です(あなたが持っているように)。このループの本体では、i *文字を 1 行に出力する必要があるため、必要なのは次のとおりです。

for (int j = 0 ; j < i ; j++) System.out.print("*");
System.out.println();  // newline at the end

したがって、次のようになります。

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

または同等に、

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

EDITwhileループのみを使用:

int i = 100;  // this is our outer loop control variable
while (i > 0) {
    int j = 0;  // this is our inner loop control variable
    while (j < i) {
        System.out.print("*");
        j++;
    }
    System.out.println();
    i--;
}

それを分解するには:

  • i = 100下から にループする外側のループがありますi = 1

  • この外側のループの内側には、 からまでwhileループする別のループがあります 。したがって、最初の反復では、これは 0-99 (合計 100 回の反復)、次に 0-98 (合計 99 回の反復)、次に 0-97 (合計 98 回の反復) などになります。0i - 1

  • この内側のループ内で、*文字を出力します。しかし、これを行うi のは (ループであるため) ため、最初は 100*秒、次に 99 秒、次に 98 秒となります (上記のポイントからわかるように)。

  • したがって、三角形のパターンが現れます。

于 2012-09-29T02:31:06.810 に答える
1

各行に印刷する文字数を決定するループと、1 文字を印刷する回数を決定する内側のネストされたループの 2 つのループが必要です。

ヒントは、内側のループが常に固定数までカウントするとは限らず、1 から (100 - 何か) までカウントすることです。

于 2012-09-29T02:35:54.967 に答える
1

これを試して:

public class PrintTriangle {
    public static void main(String[] args) {

       for(int i = 100; i >= 1; i--){

           System.out.print("\n");

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

       }

   }
}

説明: ネストされた for ループには、j という名前の変数があります。j は * が印刷された回数です。印刷後、それが i と等しいかどうかをチェックします。i は大きな for ループの変数です。行が何回印刷されたかを追跡します。\n は改行を意味します。

于 2012-09-29T02:45:48.177 に答える
0

あなたはそれを脇道に来ることができます...

StringBuilder sb = new StringBuilder(100);
int index = 0;
while (index < 100) {
    sb.append("*");
    index++;
}

index = 0;
while (index < 100) {
    System.out.println(sb);
    sb.deleteCharAt(0);
    index++;
}

しかし、個人的には loop with loop アプローチを好むと思います ;)

ループごとに追加する星の数を増やし、それに応じてループの数を減らすことで、最初のループの効率を向上させることができます...

つまり、2 つの開始を追加、50 のループが必要、4 を追加、25 が必要、5 を追加、20 が必要、10 を追加、10 が必要...

例えば

while (index < 10) {
    sb.append("**********");
    index++;
}
于 2012-09-29T03:27:38.040 に答える