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

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

ただいまの
回答率

88.03%

なぜ1個開くのか? (Java練習中)

解決済

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 1,202

score 66

こんにちは。
javaの練習をしていたら以下のような問題に突き当たりました。


for(int i = 0; i < 10; i++) {
            for(int j = 0; j < 10 - i ; j++){
                System.out.print("⚫️");
            }
            System.out.println("");
        }
        for(int i = 1; i <= 10; i++){
            for(int j = 0; j < i; j++){
                System.out.print("⚫️");
            }
            System.out.println("");
        }

だと

⚫️⚫️⚫️⚫️⚫️⚫️⚫️⚫️⚫️⚫️
⚫️⚫️⚫️⚫️⚫️⚫️⚫️⚫️⚫️
⚫️⚫️⚫️⚫️⚫️⚫️⚫️⚫️
⚫️⚫️⚫️⚫️⚫️⚫️⚫️
⚫️⚫️⚫️⚫️⚫️⚫️
⚫️⚫️⚫️⚫️⚫️
⚫️⚫️⚫️⚫️
⚫️⚫️⚫️
⚫️⚫️
⚫️
⚫️
⚫️⚫️
⚫️⚫️⚫️
⚫️⚫️⚫️⚫️
⚫️⚫️⚫️⚫️⚫️
⚫️⚫️⚫️⚫️⚫️⚫️
⚫️⚫️⚫️⚫️⚫️⚫️⚫️
⚫️⚫️⚫️⚫️⚫️⚫️⚫️⚫️
⚫️⚫️⚫️⚫️⚫️⚫️⚫️⚫️⚫️
⚫️⚫️⚫️⚫️⚫️⚫️⚫️⚫️⚫️⚫

このようになって、


for(int i = 0; i < 10; i++) {
            for(int j = 0; j < 10 - i ; j++){
                System.out.print("⚫️");
            }
            System.out.println("");
        }
        for(int i = 0; i < 10; i++){
            for(int j = 0; j < i; j++){
                System.out.print("⚫️");
            }
            System.out.println("");
        }

だと、

⚫️⚫️⚫️⚫️⚫️⚫️⚫️⚫️⚫️⚫️
⚫️⚫️⚫️⚫️⚫️⚫️⚫️⚫️⚫️
⚫️⚫️⚫️⚫️⚫️⚫️⚫️⚫️
⚫️⚫️⚫️⚫️⚫️⚫️⚫️
⚫️⚫️⚫️⚫️⚫️⚫️
⚫️⚫️⚫️⚫️⚫️
⚫️⚫️⚫️⚫️
⚫️⚫️⚫️
⚫️⚫️
⚫️

⚫️
⚫️⚫️
⚫️⚫️⚫️
⚫️⚫️⚫️⚫️
⚫️⚫️⚫️⚫️⚫️
⚫️⚫️⚫️⚫️⚫️⚫️
⚫️⚫️⚫️⚫️⚫️⚫️⚫️
⚫️⚫️⚫️⚫️⚫️⚫️⚫️⚫️
⚫️⚫️⚫️⚫️⚫️⚫️⚫️⚫️⚫️

このように1個間が開くのはなぜでしょうか?

i = 0 ; i < 10

i = 1; i <= 10
では、何が違うのでしょうか?

内部の何かの構造のせいでなってると思うのですが、その理由を知っている方、お教えいただきたいです。

よろしくお願いします。
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 4

checkベストアンサー

0

後半コードの
for(int i = 0; i < 10; i++){ 
            for(int j = 0; j < i; j++){ 
                System.out.print("⚫️"); 
            } 
            System.out.println(""); 
} 
ここに注目してください.
最初i=0でjのループに入ると,j=0でj<iは0<0と解釈されるためfalseになります.
つまりループに入りません.そのまま次のSystem.out.println(""); が実行され,空の行ができます.
前半のコードはこの部分が0<1でtrueになるので,1回だけ●を出力します.

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/10/03 17:56

    そういうことなんですね!
    無意識にネストをしていただけだったので気がつきませんでした。
    ありがとうございます。
    一番初めにお答えいただいたので、ベストアンサーとさせていただきます。

    キャンセル

0

for(int j = 0; j < i; j++){

for(int j = 1; j < i; j++){
の違いです。
下のfor文はj==0 i==0ですから一度だけ通らない

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/10/03 17:57

    単純なことなのに、気づけなくて悔しいです。
    わかりやすい回答ありがとうございます。

    キャンセル

0

for文に、意味のないループ変数を使う場合は、
for(int i = 0; i < [ループ回数]; i++) {
}
で、iは0開始と固定で覚えてしまったほうが良いです。
(もちろんネストする場合は、j,kと変数名を変える必要はあります。)
これを、やり方コロコロ変えて、
「イメージ通りに動かない」→「処理を頭で追っかけて問題を突き止める」
とやっていては、苦労と時間が勿体無いです。

意味のある変数、例えば『1ページから5ページまで処理したい』
とかであれば、
for(int i = 1; i <= 5; i++) {
}
と、イメージした開始値・終了値・加算値で良いと思います。
しかしながら、ご質問のような疑問は、デバッグログをし込んだり、
●をちょっと変えてあげたら、頭のなかで処理を追っかける必要もなく
簡単に疑問解決可能になるかと思います。

↓例えばこんな感じ
System.out.println("=============1");
for(int i = 0; i < 10; i++) {
    System.out.print(String.format("i=%s/",i));
    for(int j = 0; j < 10 - i ; j++){
        System.out.print(j);
    }
    System.out.println("");
}
System.out.println("=============2");
for(int i = 1; i <= 10; i++){
    System.out.print(String.format("i=%s/",i));
    for(int j = 0; j < i; j++){
        System.out.print(j);
    }
    System.out.println("");
}
System.out.println("=============3");

結果
=============1
i=0/0123456789
i=1/012345678
i=2/01234567
i=3/0123456
i=4/012345
i=5/01234
i=6/0123
i=7/012
i=8/01
i=9/0
=============2
i=1/0
i=2/01
i=3/012
i=4/0123
i=5/01234
i=6/012345
i=7/0123456
i=8/01234567
i=9/012345678
i=10/0123456789
=============3

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/10/10 22:00

    しばらくアクセスしていなくて、お返事が遅くなってしまいました。
    とてもわかりやすく参考になりました。ありがとうございます!

    キャンセル

0

... 1個間が開くのはなぜでしょうか?...
これは 間が空いていると解釈するのはなく、後半の三角形が 0, 1, ..., 9 と⚫️の数が1つ少なくなっていると解釈するのが適切です。(一番下の行の⚫️の数が 9 であることを数えてみてください)

こう解釈できれば、後半の三角形を描くときの最初が 0 個の⚫️を出している理由を探ることになります。
そしてこのプログラムの実行結果が理解できると思います。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/10/10 21:58

    しばらくサイトにアクセスしていなくてお返事が遅くなってしまいました。
    ありがとうございました。

    キャンセル

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

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

関連した質問

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