課題:Report#4:オフライン試験のQ23〜Q38のついて考察せよ。{〜 12/25(Mon)} * コードと実行結果を示し、各問について考察すること。
test.java(Q23~Q34)
class test{ public static void main(String args[]){ Question Q = new Question(); System.out.println("===Q23======"); Q.Q23(); System.out.println("===Q24======"); Q.Q24(); System.out.println("===Q25======"); Q.Q25(); System.out.println("===Q26======"); Q.Q26(); System.out.println("===Q27======"); Q.Q27(); System.out.println("===Q28======"); Q.Q28(); System.out.println("===Q29======"); Q.Q29(); System.out.println("===Q30======"); Q.Q30(); System.out.println("===Q31======"); Q.Q31(); System.out.println("===Q32======"); Q.Q32(); System.out.println("===Q33======"); Q.Q33(); } } class Question{ void Q23(){ int x,y; x = 100; x += 1; x--; y = 200 + x; System.out.println(y++); } void Q24(){ int a=0, x=0; a = 5; a += 3; x = ++a; System.out.println(x); } void Q25(){ int a=9, b=3; a /= b; System.out.println(a %= b); } void Q26(){ int i,j; for(i=0, j=0; i<3; i++) ++j; System.out.println(i * j); } void Q27(){ int i=2; while(i-- > 0) System.out.println(i); } void Q28(){ int num=10000; for(int i=0; i<4; i++) num >>= i; System.out.println(num); } void Q29(){ int num=0; for(int i=1; i<=10; i++){ if(++num % i ==0) num++; } System.out.println(++num); } void Q30(){ int a=9; if(a++ !=10 | a++ == 10) a++; System.out.println(a); } void Q31(){ for(int i=0; i<5; i++) System.out.println("i == " + i); System.out.println("Hello"); } void Q32(){ int i; for(i=0; i<9; i+=3){} System.out.println(i); } void Q33(){ for(int i=0; i<8; i++){ System.out.println(i); i+=3; } } } |
実行結果
[nw0602:~/prog2] j06002% java test ===Q23====== 300 ===Q24====== 9 ===Q25====== 0 ===Q26====== 9 ===Q27====== 1 0 ===Q28====== 156 ===Q29====== 12 ===Q30====== 12 ===Q31====== i == 0 i == 1 i == 2 i == 3 i == 4 Hello ===Q32====== 9 ===Q33====== 0 4 |
Q23 まず、xを100と宣言。次にxに1を加え、その後すぐに1を引く。 この時点でx=100となっているのでy=200+xは200+100=300となる。 出力には[y++]となっているが、これは実行後にインクリメントなので、ここ では影響しない。 Q24 int型でaとxを宣言。それぞれに0が入る。 その後、aに5を代入して、3を加える。この時点でa=8。 そしてxにインクリメントしたaを代入するので、x=9となる。 Q25 始めにa=9、b=3を宣言する。 次にaをbで割った商、つまり9/3=3をaに代入。 この時点でa=3となり、出力はa割るbの余りなので 3 % 3 = 0となり、出力は0となる。 Q26 int型でiとjを宣言。 for文でi=0、j=0と置く。iが3未満のとき実行されるので i=0,1,2の間繰り返し実行される。 実行されるのは++jで、処理が終わるとj=3となる。 i=2の処理が終わるとiがインクリメントされるので 結果としてiも3となる。よって出力される値は 3*3=9より、9となる。 Q27 iを2と宣言する。 iが0より大きいときに処理が行われる。 よってこのwhile文が行われるのはi=2,i=1の2回である。 実行ごとにデクリメントされたiが出力され、printlnなので改行もされる。 つまりi=2のとき出力は1、改行され、i=1のとき出力は0、改行される。 Q28 num=10000を宣言。 for文でi=0を宣言、i=3まで処理を繰り返す。処理後iはインクリメントされる。 処理はnumをi回右シフトするというもので、この場合forで繰り返される。 つまりi=0、i=1、i=2、i=3の間繰り返すので、合計(0+1+2+3)回シフトする。 よって10000 / 2^6 より出力されるのは156となる。 Q29 num=0と宣言。 for文でi=1と定義し、iが10以下の時処理を繰り返す。 処理はインクリメントされたnumをiで割り切れるとき、 numをインクリメントして返すというもの。 よってi=10まで処理は繰り返されるので、出力されるのはi=10のときの結果で ある。 i=10で割り切れるときnumは9である。処理が開始されるとインクリメントされ num=10となる。 このとき割り切れるのでnumは更にインクリメントされ11が入る。 出力段階で(++num)なので出力直前にさらにインクリメントされ、出力結果は 12となる。 Q30 a=9と宣言。 aはif文で条件を満たすとインクリメントされる。 よってa=9は!=10なのでまず左の条件は真である、よってaはインクリメントさ れa=10となる。するとa=10となり右の条件も満たす。その後インクリメントさ れ、a=11となる。故にifの条件文の中身は(真|真)となるため処理が始まる。 処理の中身はaをインクリメントする、とのことなのでif処理が終了した時点 でa=12となる。よってこの出力結果は12となる。 Q31 for文でi=0を定義。iが5未満のとき、処理が終わったらiをインクリメントす る。処理はiを表示するだけの簡単なもの。printlnのため1つ出力ごとに改行 される。i=4の処理が終わるとfor文を終了し、printlnでHelloを出力する。 Q32 for文でi=0を定義。iが9未満のとき処理を繰り返す。iに3を加える。 処理はなく、for文によってiが9になる。あとはiを出力するだけ。 Q33 for文でi=0を定義 この処理はiが8未満のときに行われる。処理を行うと、iがインクリメントさ れる。つまり最初の時点でi=0、よって0が出力され、改行が行われる。 iは出力された後に+3され、i=3となる。そこで1度目の処理が終了となり、iに 更に1が加わり、i=4となる。このi=4のとき2回目のfor文が始まる。 よってi=4 < 8 となるので処理可能。4が出力される。 その後i+3となりi=7となる。ここで処理が終わるので更にi+1となり、i=8とな る。i=8となったので、for文の範囲を超える。よってプログラムが終了となる。 |
Q34.java
class Q34{ public static void main(String args[] ){ int i = 0; System.out.println("===Q34======"); for(sayHello(); i <= 6; i += 3){ sayHello(); } } static void sayHello(){ System.out.println("Hello"); } } |
実行結果
[nw0602:~/prog2] j06002% java Q34 ===Q34====== Hello Hello Hello Hello |
この処理はi<=6の間、for文内と処理でsayHello()を繰り返し呼び出している。 始めにi=0を定義しているので、i<=6なのでfor処理に入る。 条件内でsayHelloを呼び出し、iに3を加え、処理としてまたsayHelloを呼び出 す。この時点でi=3なのでもう一度for文を開始する。処理を終えてもi=6なの で更に処理をし、合計sayHelloを4回呼び出すので結果はこのようになる。 |
Q35.java
class Q35{ public static void main(String args[]){ Player p1 = new Player(); Player p2 = new Player(); p1.id = 1000; p2.id = 2000; p1.num += p1.id; p2.num += p2.id; System.out.println(Player.num); } } class Player{ int id = 0; static int num = 0; } |
実行結果
[nw0602:~/prog2] j06002% java Q35 3000 |
これはPlayerメソッドをメインメソッド内でp1とp2で呼び出している。 p1.id=1000とp2.id=2000でp1.idとp2.idを設定する。 その後、numがstaticで宣言されているのでPlayerのnumにそれぞれidの値を加 え、1000+2000=3000がPlayerメソッドのnumに代入される。 よって出力されるのはnumなので、結果は3000となる。 |
Q36.java
class Q36{ public static void main(String args[]){ Player p1 = new Player(); Player p2 = new Player(); p1.id = 1000; p2.id = 2000; Player.num += p1.id; Player.num += p2.id; System.out.println("p1.num == "+p1.num); System.out.println("p2.num == "+p2.num); } } class Player{ int id = 0; static int num = 0; } |
実行結果
[nw0602:~/prog2] j06002% java Q36 p1.num == 3000 p2.num == 3000 |
これもQ35.javaと同じく、numはstaticで宣言されているのでp1.numに代入さ れた値も、p2.numに代入された値もすべて1つになる。よって p1.num=p1.id+p2.id、p2.num=p1.id+p2.idになるのでp1.id=p2.idとなり 両方とも3000となる。 |
Q37.java
class Q37{ public static void main(String argv[]){ Card c1 = new Card(); Card c2 = new Card(); Card c3 = c1; c1.deposit = 1000; c2.deposit = 2000; c3.deposit = 3000; int sum = c1.deposit + c2.deposit + c3.deposit; System.out.println(sum); } } class Card{ int deposit; } |
実行結果
[nw0602:~/prog2] j06002% java Q37 8000 |
まず、Cardをc1、c2、c3で使えるようにnew文を使って作成する。 また、ここでc3はc1と共有され、c1.depositに設定された値が、c3.depositに 置き換わる。よってc1.deposit=1000がc1.deposit=3000となる。 このことにより「C1.deposit+c2.deposit+c3.deposit」 =[3000+2000+3000]=8000=sumとなる。よって出力される値は8000。 |
Q38.java
class Q38{ public static void main(String argv[]){ Card c1 = new Card(); Card c2 = c1; c1.deposit = 1000; c2.deposit = 2000; Bank.useCard(c1); Bank.useCard(c2); System.out.println("c1.deposit = " + c1.deposit); System.out.println("c2.deposit = " + c2.deposit); } } class Card{ int deposit; } class Bank{ public static void useCard(Card c){ c.deposit -= 500; } } |
実行結果
[nw0602:~/prog2] j06002% java Q38 c1.deposit = 1000 c2.deposit = 1000 |
このプログラムも、[Card c2 = c1;]より、c1とc2の値が共有することになる。 まず、c1.deposit=1000とあるが、c2.deposit=2000によりc1.deposit=2000と 値が置き換わる。その後、Bank.useCard(c1)により呼び出された値c1=2000が -500され、c1=1500となる。このときもc2と共有されているためc2=1500となる。 次にBank.useCard(c2)が行われるためc2=1500-500=1000となり、c2の値は1000。 共有されているc1も同じ値に置き換わるのでc1=1000となり、この結果となる。 |