- ベストアンサー
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
- 回答数4
- ありがとう数1
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
miya_des さん、はじめまして。 私自身、C言語の経験はありますが、Javaの経験は殆ど無く、あまり偉そうなことは言えませんが、 今回のご質問に関しては、C言語とほぼ同じような部分なので、失礼ながらコメントさせて頂きます。 たぶんですが、miya_des さんは下記の実行文、 System.out.print(" " + (i * j)); の意味を、 変数 i と 変数 j の内容(値)を表示させる実行文 だと勘違いされているのではないでしょうか? この実行文は、そうではなく、 変数 i と 変数 j を掛算( i × j )した結果の値 を表示させる実行文です。 ご存知だとは思いますが、(i * j) の部分の '*' (アスタリスク)は四則演算での「掛算(×)」を 意味する演算子になります。 <Javaでの四則演算の演算子>...(※これはC/C++言語でも同様となります。) + 加算(+) a = b + c; - 減算(-) a = b - c; * 乗算(×) a = b * c; / 除算(÷) a = b / c; % 剰余 a = b % c; ですので、今回のプログラムでは (※以下はtgook さんの示されたものを引用させて頂きました。m(__)m) 【i のループ】 【j のループ】 【(i * j)の値】 【表示出力】 【備 考】 1 1 1×1 = 1 1行目: 1 j のループ終了→改行実行 2 1 2×1 = 2 2行目: 2 j のループ継続→改行なし 2 2 2×2 = 4 2行目: 2 4 j のループ終了→改行実行 3 1 3×1 = 3 3行目: 3 j のループ継続→改行なし 3 2 3×2 = 6 3行目: 3 6 j のループ継続→改行なし 3 3 3×3 = 9 3行目: 3 6 9 j のループ終了→改行実行 4 → i のループ終了 と処理され結果として、 1 2 4 3 6 9 という表示結果になると思います。 ※Java言語の基本的な記号、文法、構文規則などについては、Java言語関連の書籍などを よくお読み頂くことをお勧め致します。 あと、WEB上のJava言語関連の入門サイトなどをご覧になるのも良いかと思います。
その他の回答 (3)
- tgook
- ベストアンサー率48% (96/198)
FarEyesさん 投稿した回答の不足分をサポートして頂いただけでなく、 より詳細なご回答、ありがとうございます。 私もFarEyesさんの提示された処理で正しいと思います。 また、今回のmiya_desさんの質問内容とは異なってしまいますが、 Javaの演算子に関しまして追加コメントを入れさせていただきます。 加算演算子(+)に関しての追加コメントですが、 こちらは文字列を連結させる、連結演算子という用い方もできます。 以下は、"回答 => " という文字列と、iの値を連結させ、 プロンプトに出力する例です。 例 : System.out.println("回答 => " + (i)); 実行しますと以下のようになります。 出力結果 iの値が 7の時 : 回答 => 7 iの値が43の時 : 回答 => 43 詳しくは以下をご参照ください。 => http://www.javaroad.jp/java_operator1.htm
- redfox63
- ベストアンサー率71% (1325/1856)
変数を表示しながら結果を表示してみましょう for (int i = 1; i < 4; i++) { System.out.print( "i=" + i ); for (int j = 1; j <= i; j++) { System.out.print(" j=" + j); System.out.print(" (" + i + "*" + j + ")=" + (i * j)); } System.out.println(); } とした結果と 以前の結果を比較してみてください 4,6,9は 2x2、3x2、3x3 による結果です
補足
j <= iでjはiより小さく i を含むでした。 i を含むで何故4.6.9は2x2、3x2、3x3 になるのか、 まだまだ変数が読めないので難しいです。
- tgook
- ベストアンサー率48% (96/198)
最後の 469 というのは 369の間違いですか? ちなみに miya_des さんのコードを デバッグしますと以下のようになります。 i j output 備考 1 1 1 1回目終了 => " 1" 2 1 2 改行されない 2 2 4 2回目終了 => " 2 4" 3 1 3 改行されない 3 2 6 改行されない 3 3 9 3回目終了 => " 3 6 9" j の繰返し処理部分は j <= i により j が i より大きくならないということは正しいと思います。 ( j の値 は i の値以下 であるといった感じです。 ) また、上記の結果から実行結果も問題ないと思います。 アルゴリズムを考えたり、コーディング作業が終了したら、 自分の考え通り処理が動くか、 紙に書いてみたり、Excelなどを使って計算してみたりすると デバッグのいい勉強になると思います。
補足
何回やっても 1 2 4 3 6 9 になるのですが? 間違ってはないはずです。
関連するQ&A
- for文の実行結果について
public class Trace2 { public static void main (String[] args) { int i; int num; num = 1; for (i = 0; i < 10; i++) { num += num; } System.out.println("iの値は" + i); System.out.println("numの値は" + num); } } 実行結果は iの値は10 numの値は1024になります。 何故こうなるのですか?
- ベストアンサー
- Java
- 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(); } } }
- 締切済み
- Java
- for文の実行結果について
public class Trace2 { public static void main (String[] args) { int i; int num; num = 1; for (i = 0; i < 10; i++) { num += num; } System.out.println("iの値は" + i); System.out.println("numの値は" + num); } } 実行結果は iの値は10 numの値は1024になります。 for文をfor (i = 0; i <= 10; i++) { に変えるとiの値は11でnumの値は2048になります。 i < 10はiが10より小さいときtrue、i <= 10はiが10以下のときtrue。 10より小さいと10以下の違いが解りません。 何故、i <= 10になるとiの値は11でnumの値は2048になるのでしょう?
- ベストアンサー
- 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(); } } } } + +++ + +++++ +++ + +++++++ +++++ +++ + +++++++++ +++++++ +++++ +++ + +++++++++++ +++++++++ +++++++ +++++ +++ +
- ベストアンサー
- C・C++・C#
- javaのプログラムについて
java始めたばかりの者です。 class sample1 { public static void main(String[] args) { for(int i=1; i<=5; i++){ for(int j=0; j<i; j++){ System.out.println("*"); } System.out.println("\n"); } } } これを実行すると * * * * * * * * * * * * * * * こうなってしまい * ** *** **** ***** このようにするにはどうしたらいいのでしょうか??
- ベストアンサー
- Java
- 配列を使った・・・。
配列を使って簡単な迷路を作っているのですが、なかなかうまくいきません。 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
- 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
- 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文を使って、以下のような図形を作成してますが、 どうしてもうまく作れません。 どなたか教えていただけないでしょうか? 現在出来ているソースは次のようです。 まるで異なる図形になってしまいますが。 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
- 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講座入門の教科書の問題を見て勉強してます。 問題を見て紙に書いてのトレースが出来ません。 *が掛け算というのはわかってましたが、 どういうふうに掛け算をするのかわかりません。 問題の意味を理解してトレースがとにかくできるようにしたいです。