Programing2 Report4

Report4


課題: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となり、この結果となる。


まとめ・感想

Javaの解答を考えていると、じっくりとやれば出来る問題が多い事に気付いた。 テストのときは緊張して出来なかった問題も、順序よく読み進めていく事によ り案外解けるものなのだと実感できた。 今回のレポートは、ソフトウェアとのレポートと被っていたため期限内にアッ プできるか心配だったが、何とか仕上げる事ができた。 やってみて自分が分かっているつもりになっていたこと、頭の中だけで考えず に、実際に動かしてみる事の大切さを思い出せた。初心の心を忘れずに次のレ ポートも頑張っていきたい。

Back Top