質問: ### 前提・実現したいこと for文を使って、指定した回数、指定した個数ずつ表示を減らしていく文の構造を理解したい ### 該当のソースコード ``` for(int i=h-1;i>=0;i=i-1){ for(int j=i;j>0;j=j-1){ System.out.print("-"); } System.out.println(""); } ``` ### 試したこと hは入力で指定する数です。h=10とすると、 ``` --------- -------- ------- ------ ----- ---- --- -- - ``` このような実行結果が得られました。 i=9から、i--していってiが0になるまで、つまり10回(10行分)、繰り返す中で、 j=9から、j--していってjが1になるまで、つまり9回、"-"を出力するということまで理解しています。 ここで、実行結果が ``` - - - - - - - - - ``` とならずに、上のようになるのが理解できていません。 初歩的ですが、きちんと納得したいのでご教授願いたいです、お願いします。
回答: まず、printとprintlnの違いは理解されていますか? printは文字出力のみ、printlnは文字出力+改行をします。 提示のコードですと、printが実行されている限りは改行されず、printlnが実行されたときに改行が発生します。 つまり「-----」と表示されているような場合、System.out.print("-")が5回実行されています。 上記を念頭に再度コードを確認しますと、 1.iを用いたループに入る。hを10とすると、iのループは10-1の9回繰り返される。 1-1【iのループ1度目 iは9】.jを用いたループに入る。jはその時点のiの回数繰り返されるので、System.out.print("-")が9回実行される。jを用いたループ終了後、 System.out.println("")が実行され文字が出力されず改行のみ実行される。 1-2.【iのループ2度目 iは8】.jを用いたループに入る。jはその時点のiの回数繰り返されるので、System.out.print("-")が8回実行される。jを用いたループ終了後、 System.out.println("")が実行され文字が出力されず改行のみ実行される。 1-3.【iのループ3度目 iは7】・・・ と実行していくと、ご提示のような実行結果になります。 ※※※追記 机上での計算処理※※※ 机上でその処理を分解してみましょうか?長くなってしまい申し訳ありません。 ``` ※h=10とする ■iのループ 【条件】 初期処理:iにh-1を代入する 継続条件:i >= 0の場合 処理終了時の処理:i - 1を実行する 【実行処理】 jのループを実行する。 jのループが完了したら改行する。 ■jのループ 【条件】 初期処理:jにiを代入する 継続条件:j > 0の場合 処理終了時の処理:j - 1を実行する 【実行処理】 「-」を出力する。 iのループを展開してみます。 ◆処理実行 初期処理:iにh-1を代入する i = 9 jのループを実行する。 改行する 処理終了時の処理:i - 1を実行する i = 8 jのループを実行する。 改行する 処理終了時の処理:i - 1を実行する i = 7 ・・・・ 更に、jのループも展開してみます。 ◆処理実行 iのループ初期処理:iにh-1を代入する i = 9 jのループを実行する。 jのループ初期処理:jにiを代入する j = 9 「-」を出力する jのループ処理終了時の処理:j - 1を実行する j = 8 「-」を出力する jのループ処理終了時の処理:j - 1を実行する j = 7 「-」を出力する jのループ処理終了時の処理:j - 1を実行する j = 6 「-」を出力する jのループ処理終了時の処理:j - 1を実行する j = 5 「-」を出力する jのループ処理終了時の処理:j - 1を実行する j = 4 「-」を出力する jのループ処理終了時の処理:j - 1を実行する j = 3 「-」を出力する jのループ処理終了時の処理:j - 1を実行する j = 2 「-」を出力する jのループ処理終了時の処理:j - 1を実行する j = 1 「-」を出力する jのループ処理終了時の処理:j - 1を実行する j = 0 継続条件:j > 0の場合 に当てはまらなくなったのでjのループ終了 改行する iのループ処理終了時の処理:i - 1を実行する i = 8 jのループを実行する。 jのループ初期処理:jにiを代入する j = 8 「-」を出力する jのループ処理終了時の処理:j - 1を実行する j = 7 「-」を出力する jのループ処理終了時の処理:j - 1を実行する j = 6 「-」を出力する jのループ処理終了時の処理:j - 1を実行する j = 5 「-」を出力する jのループ処理終了時の処理:j - 1を実行する j = 4 「-」を出力する jのループ処理終了時の処理:j - 1を実行する j = 3 「-」を出力する jのループ処理終了時の処理:j - 1を実行する j = 2 「-」を出力する jのループ処理終了時の処理:j - 1を実行する j = 1 「-」を出力する jのループ処理終了時の処理:j - 1を実行する j = 0 継続条件:j > 0の場合 に当てはまらなくなったのでjのループ終了 改行する iのループ処理終了時の処理:i - 1を実行する i = 7 ・・・・ ```