06020
1年後期>report4


オフライン試験のQ23〜Q38のついて考察せよ。コードと実行結果を示し、各問について考察すること。

Q23

Q23.プログラム
01
02
03
04
05
06
07
public class Q23 {
    public static void main(String[] args) {
        int x,y;
        x = 100; x +=1; x--; y = 200 + x;
        System.out.println(y++);
    }
}

Q23.実行結果
300

Q23.考察
初めに x = 100 が設定され、
x +=1 のところで x = 101 となり、
x-- で x = 100
y = 200 + x で y = 300
System.out.println(y++) は後置きインクリメントなので、出力するときはまだインクリメントされていない。
よって出力は300となる。




Q24

Q24.プログラム
01
02
03
04
05
06
07
public class Q24 {
    public static void main(String[] args) {
        int a=0, x=0;
        a = 5;  a +=3;  x = ++a;
        System.out.println(x);
    }
}

Q24.実行結果
9

Q24.考察
a=5で、 a +=3 であるから aに3を加えて a=8、
x = ++a であるから aに1加えたものをxに代入して x = 9
よって xの値(9)が出力される。




Q25

Q25.プログラム
01
02
03
04
05
06
07
public class Q25 {
    public static void main(String[] args) {
        int a=9, b=3;
        a /= b;
        System.out.println(a %= b);
    }
}

Q25.実行結果
0

Q25.考察
int a=9, b=3
a /= b で a = 3
a %= b は 3/3 した値の余りをaに代入するので、0が出力される。




Q26

Q26.プログラム
01
02
03
04
05
06
07
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);
    }
}

Q26.実行結果
9

Q26.考察
iが3の時にループを抜ける。そのときはiもjも3である。よって、9を出力する。
また、このループ内でのインクリメント処理の順番は、++j , i++である。




Q27

Q27.プログラム
01
02
03
04
05
06
public class Q27 {
    public static void main(String[] args) {
        int i=2;
        while(i-- > 0) System.out.print(i);
    }
}

Q27.実行結果
10

Q27.考察
一回目のループでは i = 2 > 0 の判定の後、デクリメントされ i = 1 となり 1 が 出力される。但し改行はされない。
二回目のループでは i = 1 > 0 の判定の後、デクリメントされ i = 0 となり 0 が 出力。改行はされない。
次のループで i = 0 であるからループから抜ける。
したがって実行すると10が出力される。




Q28

Q28.プログラム
01
02
03
04
05
06
07
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);
    }
}

Q28.実行結果
156

Q28.考察
ビット演算子での計算になっている。
ループの一回目は、i = 0 であるから 10000 >>= 0 。num = 10000
二回目は、i = 1 であるから 10000 >>= 1 。num = 5000
三回目は、i = 2 であるから 5000 >>= 2 。num = 1250
四回目は、i = 3 であるから 1250 >>= 3 。num = 156
次は i = 4 となるからループから抜ける。
よって実行すると156が表示される。
このループ内での処理の順番は num >>= i , i++ である。




Q29

Q29.プログラム
01
02
03
04
05
06
07
08
09
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);
    }
}

Q29.実行結果
12

Q29.考察
++numとiが割り切れる時にnumをインクリメントする。 i=10のときnumは9である。処理が開始されるとインクリメントされ num=10となる。このとき割り切れるのでnumは更にインクリメントされ11が入る。 i=11のとき条件よりfor文を抜ける。 よって、出力される値は++numなので12。



Q30

Q30.プログラム
01
02
03
04
05
06
07
08
public class Q30 {
    public static void main(String[] args) {
        int a = 9;
        if(a++ != 10 | a++ == 10) a++;
        System.out.println(a);
    }
}

Q30.実行結果
12

Q30.考察
全て後置きインクリメントであるから、
9 != 10 → インクリメントされa=10、
10 == 10 → インクリメントされa=11となる。
また、これは真であるから、さらにインクリメントされa=12。
よって12が出力される。




Q31

Q31.プログラム
01
02
03
04
05
06
07
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");
    }
}

Q31.実行結果
i==0
i==1
i==2
i==3
i==4
Hello

Q31.考察
後置きインクリメントであるからforが行われた後にiがインクリメントされる。よって初めは0。
また、セミコロンまでが繰り返されるので、Helloは最後の1回だけ出力される。




Q32

Q32.プログラム
01
02
03
04
05
06
07
public class Q32 {
    public static void main(String[] args) {
        int i;
        for( i= 0; i < 9; i +=3){}
        System.out.println(i);
    }
}

Q32.実行結果
9

Q32.考察
iは3ずつ足されていき、i=9のときループを抜けて出力される。よって9。
forでくりかえす内容は何も無い。




Q33

Q33.プログラム
01
02
03
04
05
06
07
08
public class Q33 {
    public static void main(String[] args) {
        for( int i = 0; i < 8; i ++){
            System.out.println(i);
            i += 3;
        }
    }
}

Q33.実行結果
0
4

Q33.考察
このfor文の動作は次のようになる
まずi = 0のときに0が出力される。
そして、i += 3でi=3、i++でi=4。ここで1回目のループ終了。
2回目のループの時に4が出力。
i += 3でi=7、i++でi=8。ここで2回目のループ終了。
i=8だからループから抜ける。




Q34

Q34.プログラム
01
02
03
04
05
06
07
08
09
10
11
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");
    }
}

Q34.実行結果
Hello
Hello
Hello
Hello

Q34.考察
まずfor( sayHello(); i <= 6; i += 3)のsayHello()で一回表示される。
for文はi=0,3,6で合計三回繰り返されるので三回表示され、したがって全部で4回表示される。




Q35

Q35.プログラム
01
02
03
04
05
06
07
08
09
10
11
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;
}

Q35.実行結果
3000

Q35.考察
numはstatic変数なので値を共有する。
p1.id = 1000;
p2.id = 2000;
p1.num += p1.idはp1.num = 1000
p2.num += p2.idはp2.num = 1000 + 2000 = 3000
この3000がplayerメソッドのnumに代入されるので、Player.numは3000




Q36

Q36.プログラム
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
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;
}

Q36.実行結果
p1.num == 3000
p2.num == 3000

Q36.考察
numはstatic変数なので値を共有。
p1.id = 1000
p2.id = 2000
Player.num += p1.id   -->  Player.num = 1000
Player.num += p2.id   -->   Player.num = 1000 + 2000 = 3000
よってPlayer.numは3000であるから、p1.numもp2.numも3000となる。




Q37

Q37.プログラム
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
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;
}

Q37.実行結果
8000

Q37.考察
Card c3 = c1;ではc1の値がc3の値と共有される。
つまりc1=3000となるので、
3000+2000+3000=8000となる。




Q38

Q38.プログラム
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
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);   /* A */
        System.out.println(c2.deposit);   /* A */
    }
}
class Card{ int deposit; }
class Bank{
    public static void useCard(Card c){
        c.deposit -= 500;
    }
}

Q38.実行結果
1000
1000

Q38.考察
Card c2 = c1;ではc1がc2と共有される。
よってc1の値は2000となる。
Bank.useCard(c1);ではc1が500マイナスされる。しかしc1とc2は共有されているので、それぞれマイナスされ、c1=1500,c2=1500となる。
Bank.useCard(c2);も同様な動作となりc1=1000,c2=1000となる