PROGRAMING2 report#6


課題
12/05付試験のQ23〜Q38のついて考察せよ。
●コードと実行結果を示し、各問について考察すること。


Q23  Q24  Q25  Q26  Q27  Q28  Q29

Q30  Q31  Q32  Q33  Q34  Q35  Q36

Q37  Q38


●Q23

ソースコード

public class Q23 { public static void main(String[] args) { int x,y; x = 100; x +=1; x--; y = 200 + x; System.out.println(y++); } }

実行結果

300


考察
  • この問題のポイントは、System.out.println(y++);と思った。y++は、後置きインクリメントなので、出力ではインクリメントされない。よってそれまでの計算結果の300が出力される。

    ●Q24

    ソースコード

    public class Q24 { public static void main(String[] args) { int a=0, x=0; a=5; a +=3; x = ++a; System.out.println(x); } }

    実行結果

    9


    考察
    ●a=5, a+=3はa+3 だから a=8 ,
      x=1+aだから x=9.

    ●Q25

    ソースコード

    public class Q25 { public static void main(String[] args) { int a=9, b=3; a /= b; System.out.println(a %= b); } }

    実行結果

    0


    考察
     a/=b は a=a/bということで、a=3  a%=b は a%bで 3%3なので、答えは0。

    ●Q26

    ソースコード

    public class Q26 { public static void main(String[] args) { int i, j; for(i=0, j=0; i<3; i++) ++j; System.out.println(i * j); } }

    実行結果

    9


    考察
    ●iが3になったときループを抜けて、そのときはjも3となっている。
    ●i*j=3*3=9

    ●Q27

    ソースコード

    public class Q27 { public static void main(String[] args) { int i=2; while(i-- > 0) System.out.print(i); } }

    実行結果

    10


    考察
    ●1回目のループでi−1されて出力され、1が出力。
    ●2回目のループでまた−1されて、0が出力。ループから抜ける。
    ●System.out.print();は改行しないので、1と0が続いて出力されて、答えは10。(十ではなく1と0)

    ●Q28

    ソースコード

    public class Q28 { public static void main(String[] args) { int num=10000; for(int i = 0; i < 4; i++) num >>= i; System.out.println(num); } }

    実行結果

    156


    考察
    ●ループにより、i-1と右ビットシフトを繰り返す。

      1回目のループ i=0 で、10000 >>= 0 num = 10000 
      2回目のループ i=1 , 10000 >>= 1 num = 5000
      3回目のループ i=2 5000 >>2 num = 1250
      4回目のループ i=3 1250 >>3 num = 156
     ループから抜ける。156が出力される。

    ●Q29

    ソースコード

    public class Q29 { public static void main(String[] args) { int num =0; for(int i = 1; i <= 10; i++){ if(++num % i==0) num++; } System.out.println(++num); } }

    実行結果

    12


    考察
    ●最初のループだけはif()の中でnumとiが同じで条件が真となり、num++される。
    ●残りのループではnumがiより1大きいので条件は真とならない。
    ●出力の時のnumの値は11で、出力のときにインクリメントされるから、実行結果は12となる。

    ●Q30

    ソースコード

    public class Q30 { public static void main(String[] args) { int a = 9; if(a++ != 10 | a++ == 10) a++; System.out.println(a); } }

    実行結果

    12


    考察
    if(a++ != 10 | a++ == 10) a++;
    ●a++は後置きインクリメントであるから、左の条件式は9 != 10で真となる。
    ●右はa++ ==10で、a=10なので10=10となり、条件は真。
    よってif()の条件は真となり、さらにインクリメントされ、出力時のaの値は12となる。

    ●Q31

    ソースコード

    public class Q31 { public static void main(String[] args) { for( int i = 0; i< 5; i ++) System.out.println("i=="+ i ); System.out.println("Hello"); } }

    実行結果

    i==0 i==1 i==2 i==3 i==4 Hello


    考察
    ●for文に{}が内ので、セミコロンまでがループされる。
    ●よってSystem.out.println("Hello");はforによってループされないので、for文でループされたあとにHelloが1回出力される。

    ●Q32

    ソースコード

    public class Q32 { public static void main(String[] args) { int i; for( i= 0; i < 9; i +=3){} System.out.println(i); } }

    実行結果

    9


    考察
    3,6,9とループのたびに3ずつプラスされ、i=9となるとループから抜ける
    よって出力は9。

    ●Q33

    ソースコード

    public class Q33 { public static void main(String[] args) { for( int i = 0; i < 8; i ++){ System.out.println(i); i += 3; } } }

    実行結果

    0 4


    考察
    まず、iに0が代入され、i<8なのでSystem.out.println(i);が実行されて、0が出力。i+=3となる。
    for()の中でi ++されて、i=4となる。
    i=4(<8)なので、上のような動作が繰り返され、4が出力され、i=8となり、ループから抜ける。

    ●Q34

    ソースコード

    public class Q34 { public static void main(String[] args) { int i = 0; for( sayHello(); i <= 6; i += 3){ sayHello(); } } static void sayHello(){ System.out.println("Hello"); } }

    実行結果

    Hello Hello Hello Hello


    考察
    for()のなかでsayHelloが実行され、その後3回ループが繰り返されるので、Helloは4つ表示される。

    ●Q35

    ソースコード

    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; }

    実行結果

    3000


    考察
    numはstatic変数なので値を共有する。
    p1.id = 1000, p2.id = 2000;、そのあとnumにp1.id 、p2.idが代入されるので、
    1000+2000で、3000が出力される。

    ●Q36

    ソースコード

    public 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; }

    実行結果

    p1.num == 3000 p2.num == 3000


    考察
    ●考え方は、Q35と同じで、numがstatic変数なので、値が共有されて、結果が同じになる。

    ●Q37

    ソースコード

    public 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; }

    実行結果

    8000


    考察

    c1.deposit = 1000;
    c2.deposit = 2000;
    c3.deposit = 3000; c3 = c1であるからこの時点でc1.deposit = 3000
    よって3000+2000+3000で、出力は8000となる。

    ●Q38

    ソースコード

    public 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); System.out.println(c2.deposit); } } class Card{ int deposit; } class Bank{ public static void useCard(Card c){ c.deposit -= 500; } }

    実行結果

    1000 1000


    考察

    c1.deposit = 1000;
    c2.deposit = 2000; //c2 = c1であるから、この時点でc1.deposit = 2000
    Bank.useCard(c1); //c1.deposit = 2000 - 500 = 1500 この時点でc2.depositも1500となる。
    Bank.useCard(c2); //c2.deposit = 1500 - 500 = 1000 この時点でc1.depositも1000となる。
    よってc1.deposit = c2.deposit = 1000

    反省・感想

    かなり遅れて提出しました。果たして全部期限内に提出できるのだろか・・・
    頑張ります。