###前提・実現したいこと
for文を使って、指定した回数、指定した個数ずつ表示を減らしていく文の構造を理解したい
###該当のソースコード
Java
1 for(int i=h-1;i>=0;i=i-1){ 2 for(int j=i;j>0;j=j-1){ 3 System.out.print("-"); 4 } 5 System.out.println(""); 6 }
###試したこと
hは入力で指定する数です。h=10とすると、
--------- -------- ------- ------ ----- ---- --- -- -
このような実行結果が得られました。
i=9から、i--していってiが0になるまで、つまり10回(10行分)、繰り返す中で、
j=9から、j--していってjが1になるまで、つまり9回、"-"を出力するということまで理解しています。
ここで、実行結果が
- - - - - - - - -
とならずに、上のようになるのが理解できていません。
初歩的ですが、きちんと納得したいのでご教授願いたいです、お願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
i=9から、i--していってiが0になるまで、つまり10回(10行分)、繰り返す中で、
j=9から、j--していってjが1になるまで、つまり9回、"-"を出力するということまで理解しています。
この理解が間違っていて、実際は
i=9から、i--していって、iが0になるまで、(つまり10回(10行分))以下を行う。
「j=iから、j--していってjが1になるまで"-"を出力することを繰り返す。その後改行する。」
つまり、
「j=9から、j--していってjが1になるまで"-"を出力することを繰り返す。その後改行する。」
「j=8から、j--していってjが1になるまで"-"を出力することを繰り返す。その後改行する。」
...
「j=1から、j--していってjが1になるまで"-"を出力することを繰り返す。その後改行する。」
「j=0から、j--していってjが1になるまで"-"を出力することを繰り返す。(つまり何も出力しない)その後改行する。」
根本的に
java
1public static void main(String[] args) throws Exception { 2 for(int j=3; j>0; j--){ 3 System.out.print("-"); 4 } 5}
の出力結果が
---
になるのは理解してますよね?
投稿2017/05/26 02:50
編集2017/05/26 03:56総合スコア13521
0
ベストアンサー
まず、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 ・・・・
投稿2017/05/26 02:51
編集2017/05/26 04:25総合スコア1947
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/05/26 03:51
2017/05/26 04:08
2017/05/26 04:09
2017/05/26 04:14
2017/05/26 04:21
2017/05/26 04:22
0
printとprintlnの違いです。
printは改行しませんが、printlnは改行します。
内側のfor文ではprintを使っているため改行されません。
そのため内側のforが続く間は出力が横に続くことになり、
内側のforが終わったあと、printlnによる改行が行われます。
補足
printlnのlnはline(行)の略です。
投稿2017/05/26 02:48
編集2017/05/26 02:48総合スコア20651
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/05/26 03:14
2017/05/26 03:25
2017/05/26 03:32
2017/05/26 03:41
2017/05/26 03:45
2017/05/26 03:51
2017/05/26 04:05