Report4


学籍番号→065726D
名前  →久貝卓矢

課題 オンライン試験のQ23〜38について考察せよ。


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を加え、その後すぐに1を引く。
この時点でx=100となっているのでy=200+xは200+100=300となる。
出力には[y++]となっているが、これは実行後にインクリメントなので、ここ
では影響しない。

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);
    }
}
考察
a1に5を代入、そしてa1 + 3をしているのでa1 == 8。
x2に代入する値は++a1なので、a1に+1する値になる。
よって、出力される値は9 。

Q25

public class q25 {
    public static void main(String[] args){
        int a = 9, b = 3;
        a /= b;
        System.out.println(a %= b);
    }
 }
考察
a2にa2 / b1の値、つまり3を代入している。
「a2 %= b1」の値を出力するのだから(%は剰余)出力される値は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の場合++j;を実行する繰り返しの命令である。
iのインクリメントは++j;が実行された後に実行されるため
System.out.println(i * j);を実行するときには、i=3,j=3となるため実行結果
は9となる。

Q27

public class q27 {
    public static void main(String[] args){
        int i=2;
        while(i-- > 0) System.out.print(i);
    }
}
考察
iを2と宣言する。
iが0より大きいときに処理が行われる。
よってこのwhile文が行われるのはi=2,i=1の2回である。
実行ごとにデクリメントされたiが出力され、printlnなので改行もされる。
つまりi=2のとき出力は1、改行され、i=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);
    }
}
考察
num >>= i;はnum=num>>i;と同じ意味なのでfor文を繰り返すと結局num>>6と い
う意味になる。num=10000;なので2進数で表すと10011100010000となる。これ
を右に6桁ずらすので10011100となり10進数で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);
     }
}
考察
変数iの値は1から10まで、"++num"の意味はnum+1であるから、num=1の時だ 
け"++num % i == 0"の条件に合う。for文によって、変数numの値は2から11 
までになる。したがって、"num++"により、最後の実行結果は12である。

Q30

public class q30 {
    public static void main(String[] args){
        int a = 9;
        if(a++ != 10 | a++ == 10) a++;
        System.out.println(a);
    }
}
考察
a++ != 10は後置きインクリメントnなので 9! = 10、a++ == 10 
も後置きインクリメントなので 10 ==10なので真になる。 
11になったあとにインクリメントするので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の値を出力するまでがfor文の内容。for文に{}がない時は次のセミ コ
ロン(;)までを{}内と見なす。System.out.println("Hello")は{}外にあるので 1
回しか表示されない。printlnはfor文が最後まで実行された後に1度だけ実行
される。

Q32

public class q32 {
    public static void main(String[] args){
        int i;
        for( i = 0; i < 9; i +=3){}
        System.out.println(i);
    }
}
考察
for文でi<9の間i+=3を繰り返す。for文の{}の中には何も入ってないのでこれ は
i+=3をしていく。したがってi=9が出力される

Q33

public class q33 {
    public static void main(String[] args){
        for( int i = 0; i < 8; i ++ ){
            System.out.println(i);
            i +=3;
        }
    }
}
考察
q33=0 q33=4 問33はfor文と演算子の複合問題である。このソースコードは「 i
< 8 なら i を出力して i = i + 3 をし終わってから i = i + 1をする」という
意味である。従って、このループは
1回目   0 < 8 → 0を出力 i = 0 + 3 = 3 → i = 3 + 1 = 4
2回目   4 < 8 → 4を出力 i = 4 + 3 = 7 → i = 7 + 1 = 8
3回目   i !< 8 なのでループ終了
という様になる。よって出力結果は 0 4 なる。

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");
    }
}
考察
for文の中のsayHello();は"Hello"を表示するメソッド
(mainメソッドの下で 定義している)。forの初期化
セクションで最初にsayHello();が呼び出され る。そ
の次からループが始まり,3回ループする(iが0、3,9と増えるため)。
 よって4回"Hello"が表示される。

Q35

public 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;
}
考察
問35はクラスの呼び出しについての問題である。まず
Playerクラスを見てみるとnum を定義する際に static
 が用いられている。このおかげでPlayerを新しくよ
びだしても以前の値が保存される。 よって、
  p1.num += p1.id → num = 0 + 1000 = 1000
  p2.num += p2.id → num = 1000 + 2000 = 3000
よって出力結果は 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もp2.numも同じPlayerのnum を
参照する(staticがついているため)ので、p1.numも
p2.numも同じ。

Q37

public class q37 {
    public static void main(String[] args){
        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;
}
考察
c1のdepositに1000を,c2のdepositに2000を,c3の
deposit(c1のそれと同じ) に3000を代入している。
sumはc1.deposit + c2.deposit + c1.depositと考え
られるので,sum=8000。 よって出力は8000。

Q38

public class q38 {
    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);
        /* A */
     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;}
}
考察
Bank.useCard();は()の中に入れた値を−500してdepositに
代入する。つま りc1とc2を入れるという事は、2回−500
するという事である。よってA の時点でc1.depositと
c2.depositは等しい。

感想

分からないところがけっこーあったので、今回のレポートを
機会にしっかり学習することができたのでよかった。あまり
点数がよくなかったので期末ではもっと解けるようにしたい。