• ベストアンサー

for文の問題について・・・

練習問題を解いていて、分らなかったので解答を見たのですが、 なぜそうなるのか理解出来ないので、教えていただければと思います。 分かる方にはすごく簡単なことなのかもしれないけど・・・ 問題:次のように画面に出力するコードを記述しなさい。 * ** *** **** ***** 解答: class SampleP4 { public static void main(String[] args) { for(int i=1; i<=5; i++){ for(int j =0; j<i; j++){ System.out.print("*"); } System.out.print("\n"); } } } i=1 : j=0 i=2 : j=0 i=2 : j=1 i=3 : j=0 i=3 : j=1 i=3 : j=2 ↑こういう感じで数字が増えていくので、それを*に置き換えれば 答えの通りになるのは理解出来るのですが、なぜ『i<=5』なのに i=3で終わっているんですか? i=4 : j=0 i=4 : j=1 i=4 : j=2 .... というふうにまだ続く気がするんですが。 初歩的な質問ですみません。 あまり専門用語を使われても理解出来ないと思うので、 丁寧に解説してくださる方歓迎します。 よろしくお願いします!

noname#205525
noname#205525
  • Java
  • 回答数5
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • luckymako
  • ベストアンサー率55% (29/52)
回答No.4

問題を 「アスタリスクを各行に(1)行数個分ずつ出力するプログラムを書きなさい。但し、行数は(2)5行とする。」 のように読み替えるとどうでしょうか? 行↓列→とすれば 外側のfor文で増加するiは行数を 内側のfor文で増加するjは列数を 表しています。 外側のfor文の終了条件は文章の(2)がそのまま当てはまり、 i<=5 で i は 1, 2, 3, 4, 5 と遷移し 5 回ループして各列を出力します。 内側のfor文の終了条件は文章の(1)より、 j<i で j は i 行目で 0, ..., i-1 と遷移し i 回ループすることでアスタリスクを行数i個分出力します。 内側のループと外側のループを切り離して考えるとわかりやすいかもしれません。 補足として、 回答では i は 1~5、 j は 0~4 となっていますが アスタリスクの個数を表すとすると、 j も 1~5 とし、 for(int j = 1; j<=i; j++) としたほうが解りやすいと思います。

noname#205525
質問者

お礼

ありがとうございました。 最初は?って感じだったけど、何度も読み返して for(int j = 1; j<=i; j++) として考えたら理解出来ました。 分かりやすい解説、感謝します!

その他の回答 (4)

  • auty
  • ベストアンサー率58% (284/486)
回答No.5

>>> iとjを足した数だけ*が表示されるわけではないのでしょうか? これは間違っています。プログラムの解釈が間違っています。 for文(forループ)ばかりに気が行って、改行するコードが理解できていません。 これは、buriburi3様の指摘にもあるとおりです。 「改行」とは、次の行に行って表示の準備をするということです。解答の System.out.print("*"); は、改行しません。*を表示してそのままです。次の表示はその後に続いて行われます。 System.out.print("\n"); は、改行だけを行います。\nが改行を指示します。 その違いを良く考える必要があります。 なお、\nを使わず改行するprintln()メソッドもあります。 System.out.println("*"); ここで、2つの サンプルを紹介します。 ------------------------------------------------------------ iとjを足した数だけ*を表示。 ここには、(i+j) という式が現れます。 Sample4_1.java ------------------------------------------------------------ class Sample4_1 { public static void main(String[] args) { for (int i = 1; i <= 5; i++) { for (int j = 0; j < i; j++) { System.out.print("i=" + i + " : j=" + j+"  ⇒ " + "*********".substring(0,(i+j)) + "\n"); } } } } ------------------------------------------------------------ >>> 問題:次のように画面に出力するコードを記述しなさい。 に対する別の解答。 Sample4_2.java ------------------------------------------------------------ class Sample4_2 { public static void main(String[] args) { for (int i = 1; i <= 5; i++) { System.out.print("*****".substring(0, i) + "\n"); } } } ------------------------------------------------------------ 疑問を持つことは大切なことです。少しづつ知識を確実なものにしながら一歩一歩進んでいきましょう。

  • buriburi3
  • ベストアンサー率44% (353/792)
回答No.3

途中をはしょるから分からなくなるのですよ。 i=1 : j=0 ⇒ * 改行 System.out.print("\n"); --- : --- ⇒ * ← この行はi=1の時に書かれた行 i=2 : j=0  ⇒ * --- : --- ⇒ * ← この行はi=1の時に書かれた行 i=2 : j=1  ⇒ ** 改行 System.out.print("\n"); --- : --- ⇒ *← この行はi=1の時に書かれた行 --- : --- ⇒ **← この行はi=2の時に書かれた行 i=3 : j=0  ⇒ * --- : --- ⇒ *← この行はi=1の時に書かれた行 --- : --- ⇒ **← この行はi=2の時に書かれた行 i=3 : j=1  ⇒ ** --- : --- ⇒ *← この行はi=1の時に書かれた行 --- : --- ⇒ **← この行はi=2の時に書かれた行 i=3 : j=2  ⇒ *** 改行 System.out.print("\n"); --- : --- ⇒ *← この行はi=1の時に書かれた行 --- : --- ⇒ **← この行はi=2の時に書かれた行 --- : --- ⇒ ***← この行はi=3の時に書かれた行 i=4 : j=0  ⇒ *

noname#205525
質問者

お礼

回答ありがとうございます。 最初はやっぱり理解出来なかったのですが、下のluckymakoさんのを 読んだあとにもう一度読み直してみたら、なるほど!と理解出来ました。

  • auty
  • ベストアンサー率58% (284/486)
回答No.2

>>> i=3で終わっているんですか? 以外は、プログラム自身も説明も全てあっているように思われます。 この疑問が出てくるのは何を確認したからなのでしょうか。 i=5 : j=4 まで確かに実行されます。 **** ***** の部分が見えませんでしたか。 それともまだ自分で実行せずに、解答に i=3 : j=2 までしか書かれていなかったということでしょうか。

noname#205525
質問者

補足

さっそくの解答ありがとうございます! やっぱり考え方が間違っているのでしょうか・・・? 解答には『i=3 : j=2』までとは書かれていません。 実行したらちゃんと * ** *** **** ***** ↑こうなりました。 ただ、自分で考えていったら、 i=1 : j=0 ⇒ * i=2 : j=0 ⇒ ** i=2 : j=1 ⇒ *** i=3 : j=0 ⇒ *** i=3 : j=1 ⇒ **** i=3 : j=2 ⇒ ***** こういうことなのかな?と。***がだぶってますが・・・ そうすると、 i=4 : j=0 ⇒ **** ~ i=5 : j=4 ⇒********* とまだ表示されるんじゃないかと思ったわけですが、 なんか根本的な考え方が間違っているみたいですね。 iとjを足した数だけ*が表示されるわけではないのでしょうか? どうにもこのプログラムを解読できなくて・・・

  • ymmasayan
  • ベストアンサー率30% (2593/8599)
回答No.1

話が飛躍していますね。 どういう風に書いたらそうなったかが判りませんね。 おっしゃるとおりですがどこかに間違いがあるのでしょう。

noname#205525
質問者

補足

回答ありがとうございます! プログラム自体には問題ないんだと思います。 問題の解答を見ながら入力して実行したら、ちゃんと * ** *** **** ***** と出力されたので。 ただ、こう出力するのに何故このようなプログラムになるのかが 理解出来ないんですよね。

関連するQ&A

  • java ネストしたfor文について

    ***** **** *** ** * 上のように*が減るようにしたいのですが下のソースではどこが悪いか教えてください class TestGoo{ public static void main(String args[]){ for(int i = 5; i>=1; i--){ for(int j = 5;j>=1; j--){ System.out.print('*'); } System.out.println(); } } }

  • for文の実行結果について

    public class Trace3 { public static void main(String[] args) { for (int i = 1; i < 4; i++) { for (int j = 1; j <= i; j++) { System.out.print(" " + (i * j)); } System.out.println(); } } } 実行結果は 1 2 4 3 6 9 になります。 i < 4でiは4より小さいで123は解るのですが、 j <= iでjはiより小さくjを含むで何故469になるのですか?

    • ベストアンサー
    • Java
  • for文について

    for文を使って、以下のような図形を作成してますが、 どうしてもうまく作れません。 どなたか教えていただけないでしょうか? 現在出来ているソースは次のようです。 まるで異なる図形になってしまいますが。 public class kurikaeshi { public static void main(String[] args) { int i = 0, j = 0, k = 0, l=0; for(i = 0; i < 10; i++) { for(j = 0; j < i + 1; j++) { for(k = 0; k < 2*j; k++) { System.out.print(" "); } for(l = 0; l < (2*i + 1) - 2*k; l++) { System.out.print("*"); } System.out.println(); } } } } + +++ + +++++ +++ + +++++++ +++++ +++ + +++++++++ +++++++ +++++ +++ + +++++++++++ +++++++++ +++++++ +++++ +++ +

  • forループの中での初期化

    class Foo{   public static void main(String args[]){     int x=10;     for(int i=0;i<5;i++){       System.out.print(x+i);     }     System.out.print("\n"+i);   } } このプログラムはコンパイルエラーが出ます。 iがforループの中で宣言されていてその外では無効だからです。 そこで class Foo{   public static void main(String args[]){     int x=10;     int i;     for(i=0;i<5;i++){       System.out.print(x+i);     }     System.out.print("\n i="+i);   } } のようにしてみました。 i=5と出ました。 ふと、iは確かに宣言されているけど、初期化はforの中でしかされていないのになぜコンパイルエラーにならなかったんだろう??、と思ってしまいました。 おかしくないでしょうか?

    • ベストアンサー
    • Java
  • javaの問題

    import java.util.Scanner; class test6{ static void printArray(int[] a) { for(int i=0;i<a.length;i++) System.out.print(String.format("%1$6s", (a[i]+" "))); System.out.println(); } static void printArray(int[][] a) { for(int[] i:a) { for(int j:i) System.out.print(String.format("%1$6s",(j+"\t"))); System.out.println(); } } public static void main(String[] args) { int[] a = {12,536,-8,7}; int[][] c = {{32,-1,32,45,67}, {535,99999,2}, {2,5,-123,9}}; printArray(a); printArray(c); } } このプログラムを表示するとこのようになるのですが、 12 536 -8 7 32 -1 32 45 67 535 99999 2 2 5 -123 9 これに一工夫加えて見やすくしたいです。 このような形にするのはどのようにすればよいのでしょうか + + | 32 -1 45 67 | | 535 99999 2 | | 2 5 -123 9 | + +

  • for文の利用について

    for文を使って、以下のような図形を作成してますが、 どうしてもうまく作れません。 どなたか教えていただけないでしょうか? 現在出来ているソースは次のようです。 まるで異なる図形になってしまいますが。 public class kurikaeshi { public static void main(String[] args) { int i = 0, j = 0, k = 0, l=0; for(i = 0; i < 10; i++) { for(j = 0; j < i + 1; j++) { for(k = 0; k < 2*j; k++) { System.out.print("a"); } for(l = 0; l < (2*i + 1) - 2*k; l++) { System.out.print("*"); } System.out.println(); } } } } + +++ aa+ +++++ aa+++ aaaa+ +++++++ aa+++++ aaaa+++ aaaaaa+ +++++++++ aa+++++++ aaaa+++++ aaaaaa+++ aaaaaaaa+ +++++++++++ aa+++++++++ aaaa+++++++ aaaaaa+++++ aaaaaaaa+++ aaaaaaaaaa+

    • ベストアンサー
    • Java
  • javaのfor文

    nの値の和を求めるのはこれ以外に書き方はありますか? import java.util.*; class SampleGoo{ public static void main(String args[]){ Scanner std = new Scanner(System.in); System.out.print("整数値:");int n = std.nextInt(); int ans = 0; for (int i = 1;i <= n;i++){ ans = ans + i; } System.out.println(Integer.toString(ans)); } }

  • javaのfor文

    nの値の和を求めるのはこれ以外に書き方はありますか? import java.util.*; class SampleGoo{ public static void main(String args[]){ Scanner std = new Scanner(System.in); System.out.print(\"整数値:\");int n = std.nextInt(); int ans = 0; for (int i = 1;i <= n;i++){ ans = ans + i; } System.out.println(Integer.toString(ans)); } }

  • Java for文 だけで逆ピラミッドを作る

    教えてください。 for 文だけで逆ピラミッドを作りたいのですが、*の数が2個ずつ減ればピラミッド 作成なのですが、私の文だと*は1個ずつしか減りません。 2個の指定はどのうように記述すればよいでしょうか? *を3と指定した場合 ***** (5) -***   (3) --*     (1) と表示したいのですが、下の文だと ***** (5) -****  (4) --***   (3) となってしまいます。 import java.io.*; class Sample4 { public static void main(String [] args) throws IOException { System.out.println("いくつ*を入力しますか?"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str = br.readLine(); int num = Integer.parseInt(str); int j =0; int i =0; int s =0; //行数制御 for(i=0; i<num; i++) { for(s=0; s<i; s++) { System.out.print("-"); } for(j=num*2-1; j>i; j--) { System.out.print("*"); //System.out.print("d"); } //改行タグ System.out.print("\n"); } } }

  • 配列を使った・・・。

    配列を使って簡単な迷路を作っているのですが、なかなかうまくいきません。 0を" "1を"■"を表示させたいのですがうまくいきません。 何処を直せばいいのか教えてください。 public class Sample1 { public static void main (String[]args) { int [][] data = { {1,0,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1}, {1,0,1,1,0,0,0,1,1,1,0,1,1,1,1,1,0,1,1,1}, {1,0,0,0,0,1,0,0,0,1,0,0,0,1,1,1,0,1,1,1}, {1,1,1,1,1,1,1,1,0,1,0,1,0,1,1,0,0,1,1,1}, {1,1,1,1,1,0,0,0,0,1,0,1,0,0,0,0,1,1,1,1}, {1,1,1,1,1,0,1,1,0,0,0,1,1,1,1,1,1,1,1,1}, {1,1,1,1,0,0,1,1,0,1,0,1,1,1,0,1,1,1,1,1}, {1,1,1,1,0,1,1,1,1,1,0,1,1,1,0,0,0,1,1,1}, {1,1,1,0,0,1,1,1,1,1,0,0,0,0,0,1,1,1,1,1}, {1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1} }; for (int i=0; i<10; i++) { for (int j=0; j<20; j++) { System.out.print(data [i][j]); } if(data [i][j] = 1){ System.out.println("■"); }else{ System.out.println(" "); } } } }

    • ベストアンサー
    • Java