質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.92%

for文の繰り返しの構造

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 3,241

inyuuy

score 13

前提・実現したいこと

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回、"-"を出力するということまで理解しています。
ここで、実行結果が

-
-
-
-
-
-
-
-
-


とならずに、上のようになるのが理解できていません。
初歩的ですが、きちんと納得したいのでご教授願いたいです、お願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+6

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になるまで"-"を出力することを繰り返す。(つまり何も出力しない)その後改行する。」


根本的に

public static void main(String[] args) throws Exception {
    for(int j=3; j>0; j--){
        System.out.print("-");
    }
}


の出力結果が

---


になるのは理解してますよね?

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/05/26 12:45

    ではこの場合i--は何も機能していないということですか?

    キャンセル

  • 2017/05/26 12:51

    質問文のコードだと
    iが全行数(10始まり降順)
    jの初期値が行ごとの"-"の数です。

    そしたら
    j=iとすれば今の行数分"-"が書かれますし
    j=5とすれば今の行数にかかわらず"-----"が書かれますよねってだけの話です。

    キャンセル

  • 2017/05/26 13:05

    なるほど、確かにそうですね。
    長々と質問してしまいすみませんでした。
    ご回答ありがとうございました。

    キャンセル

checkベストアンサー

+2

まず、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のループ

【条件】
初期処理:jiを代入する
継続条件: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のループ初期処理:jiを代入する

 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のループ初期処理:jiを代入する

 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 13:14

    それは質問を編集するか、別質問で立てるべきでは?

    キャンセル

  • 2017/05/26 13:21

    同じように書かれているようには見えませんね。

    まず  for(int k=1;k>=0;k=k-1) の 条件文は2度繰り返して実行する条件になっています。

    次に for(int l=k;l<=h*2-1;l=l+2) の条件文ですが、多少ややこしい条件文ですがhの数だけ実行されます。

    というわけで、下の箇所はhの数だけ「*」を出力する、という処理を2度実行することになります。
    実行すると「*」が20個出力されて完了です。

    キャンセル

  • 2017/05/26 13:22

    理解しました!
    計算処理の追記、本当にありがとうございました。
    とても分かりやすかったです、本当に助かりました。
    お手本にして、*の処理も自分で考えてみます。
    ありがとうございました。

    キャンセル

+1

printとprintlnの違いです。
printは改行しませんが、printlnは改行します。
内側のfor文ではprintを使っているため改行されません。
そのため内側のforが続く間は出力が横に続くことになり、
内側のforが終わったあと、printlnによる改行が行われます。

補足
printlnのlnはline(行)の略です。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/05/26 12:08

    ありがとうございます。
    printとprintlnは理解しているのですが、おそらく"-"の出力の条件文が理解できておりません

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.92%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る