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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

4回答

1658閲覧

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

Takahito

総合スコア66

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2015/10/03 08:44

こんにちは。
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
では、何が違うのでしょうか?

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

よろしくお願いします。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

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

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

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

投稿2015/10/04 01:29

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Takahito

2015/10/10 12:58

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

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/03 09:22

TetsujiMiwa

総合スコア1124

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Takahito

2015/10/10 13:00

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

0

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

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

投稿2015/10/03 08:51

編集2015/10/03 08:54
cateye

総合スコア6851

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Takahito

2015/10/03 08:57

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

0

ベストアンサー

後半コードの

java

1for(int i = 0; i < 10; i++){ 2 for(int j = 0; j < i; j++){ 3 System.out.print("⚫️"); 4 } 5 System.out.println(""); 6}

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

投稿2015/10/03 08:49

編集2015/10/03 08:51
swordone

総合スコア20651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Takahito

2015/10/03 08:56

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問