学籍番号:055720A
名 前 :小橋川 俊

○課題

12/05付試験のQ23〜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++);
    }
}


○考察
 x = 100;
  x +=1;  // x = x + 1 なので x = 101
  x--;    // x = x - 1 なので x = 100
  y = 200 + x;  // y = 200 + 100 で y = 300
  System.out.println(y++);  //後置きインクリメントなので、出力するとき
  はまだインクリメントされない。よって実行結果は 300
実行結果
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); } }


○考察
 int a=0, x=0;
  a=5;
  a +=3;  // a = a + 3 であるから a = 8
  x = ++a;  // x = a + 1 であるから x = 9
  System.out.println(x);  // xの値(9)を出力する

実行結果
 9 

Q25

○ソースプログラム

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


○考察
 int a=9, b=3;
  a /= b;  // a = a / b よって a = 3
  System.out.println(a %= b);  // a = a % b = 3 % 3の値(0)を出力
実行結果
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);
    }
}


○考察
for(i=0, j=0; i<3; i++) ++j;//i<3の時iとjをインクリメントするから
ループを抜けるときはiもjも3。
System.out.println(i * j);  // i * j の値(9)を出力
  
・このループ内での処理は、インクリメント野市関係から++j , i++の順番に行われる。

実行結果
9

Q27

○ソースプログラム

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


○考察
  
  ループ1周目では i = 2 (>0) その後デクリメントされ i = 1 となり 1が出力。但し改行されない。
  ループ2周目では i = 1 (>0) その後デクリメントされ i = 0 となり 0が出力。
  ループ3周目では i = 0 であるからループから抜ける。
  したがって実行すると10(1と0)が出力される。
実行結果
10

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


○考察
  
  ループの1周目では、i = 0 (<4) であるから 10000 >>= 0  → num = 10000
  ループの2周目では、i = 1 (<4) であるから 10000 >>= 1  → num =  5000
  ループの3周目では、i = 2 (<4) であるから  5000 >>= 2  → num =  1250
  ループの4周目では、i = 3 (<4) であるから  1250 >>= 3  → num =   156
  ループの5周目では、i = 4 となるからループから抜ける。
  よって実行すると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); } }


○考察
 if文は最初i=1の時だけ実行され、後はnumの方が1多くて実行されない
iは最後は10になる事からnumは11になる。 出力するまえに++numで1足すので出力結果は 12
実行結果
12

Q30

○ソースプログラム

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


 後置きインクリメントであるから
  9 != 10 → インクリメント(a=10)→ 10 == 10 → インクリメント(a=11)
  となる。これは真であるから、さらにインクリメント(a=12)。
  よって出力時のaの値は12
実行結果
12

Q31 Helloは何回表示されるか述べよ

○ソースプログラム

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


○考察
 {}を使わないfor文、while文ではセミコロンまでが処理内容である。
  よって、System.out.println("Hello");はfor文の影響を受けていない。
  よってHelloが出力されるのは一回だけ。

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

Q32

○ソースプログラム

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


○考察
 i = 9 となりループから抜けるので答えは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; } }


○考察
 for文中の処理は次のようになる

  i = 0 (<8)→ System.out.println(i);→ i += 3 (i=3)→ i++ (i=4)→

 → i = 4 (<8)→ System.out.println(i); → i += 3 (i=7)→ i++ (i=8)→ ループから抜ける
実行結果
0
4

Q34

○ソースプログラム

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


○考察
 for( sayHello(); i <= 6; i += 3)のsayHello()で一度表示される。
  ソース中でfor文は三回繰り返されるのでプラス三回表示、合計4回表示される。

実行結果
Hello
Hello
Hello
Hello

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 += p1.id; System.out.println(Player.num); } } class Player{ int id =0; static int num =0; }


 numは「static変数」なので値を共有。
  p1.id = 1000;
  p2.id = 2000;
  p1.num += p1.id;  //p1.num = 0 + 1000
  p2.num += p2.id;  //p2.num = 1000 + 2000 = 3000
  よってPlayer.numの値は 3000

実行結果
3000

Q36

○ソースプログラム

class Test{ 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; }


○考察
 numはstatic変数なので領域を共有する。
  p1.id = 1000;
  p2.id = 2000;
  Player.num += p1.id;  //Player.num = 0 + 1000
  Player.num += p2.id;  //Player.num = 1000 + 2000 = 3000
  よってPlayer.numは3000であるから、p1.numもp2.numも3000となる。
実行結果
p1.num == 3000
p2.num == 3000

Q37

○ソースプログラム

class Test{ public static void main(String args[]){ Card c1 = new Card(); Card c2 = cew 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; }


○考察
 c1.deposit = 1000;
  c2.deposit = 2000;
  c3.deposit = 3000;  //c3 = c1であるからこの時点でc1.deposit = 3000
  int sum = c1.deposit + c2.deposit + c3.deposit; // int sum = 3000 + 2000 + 3000 = 8000
  したがって8000が出力される。
実行結果
8000

Q38

○ソースプログラム

class Test2{ public static void main(String args[]){ Card c1 =new Card(); Card c2 = c1; c1.deposit =1000; c2.deposit =2000; Bank.useCard( c1 ); Bank.useCard( c2 ); /*c1.depositとc2.depositの関係は?*/ 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; } }


○考察
 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
  つまりc1.deposit=c2.depositという事が分かる。
実行結果
1000
1000

○反省 感想

テストの結果が意外にも良かったのでほっとしました。
残りのレポートもがんばります。
お疲れさまでした m(_ _)m


○参考文献

・独習Java 第三版  

Wiki に戻る 戻るー>