レポート#4

学籍番号065703E
氏名 伊佐琢磨


課題

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

Q23

ソースコード

1     class test23{
2        public static void main(String argv[]){
3        int x,y;
4        x = 100;
5        x += 1;
6        x--;
7        y = 200 + x;
8        System.out.println(y++);
9         }
10    }

実行結果

1     [isatakuma-no-ibook-g4:~] j06003% java test23
2     300

考察

初めxに100を代入し、それに1を足して、1引くそのあとに200を足す。y++とあるがこれは後置きインクリメントなので表示されるのは300となる。

Q24

   

ソースコード

   
1      class test24{
2         public static void main(String argv[]){
3         int a=0, x=0;
4         a = 5;
5         a += 3;
6         x = ++a;
7         System.out.println(x);
8         }
9      }

実行結果

1     [isatakuma-no-ibook-g4:~] j06003% java test24
2     9

考察

まず初めにaに5が代入されている。a+=3で5に3を足して、++aで1を足して結果は9となる。

Q25

   

ソースコード

1     class test25{
2        public static void main(String argv[]){
3        int a=9, b=3;
4        a /= b;
5        System.out.println(a %= b);
6        }
7    }

実行結果

1     [isatakuma-no-ibook-g4:~] j06003% java test25
2     0
   

考察

a%=bはaをbで割った余りを出す式なので9を3で割ったときの余りの0が答え

Q26

   

ソースコード

1     class test26{
2        public static void main(String argv[]){
3        int i, j;
4        for(i=0,j=0; i<3; i++) ++j;
5        System.out.println(i * j);
6        }
7     }

実行結果

1     [isatakuma-no-ibook-g4:~] j06003% java test26
2     9

考察

for(i=0,j=0;i<3;i++)++jでiとjの値を増やす繰り返しの命令。i<3なのでiとjが3になる. 問題はi*jなので答えは9

Q27

   

ソースコード

1     class test27{
2        public static void main(String argv[]){
3        int i=2;
4        while(i-- > 0)
5        System.out.println(i);
6        }
7     }

実行結果

1     [isatakuma-no-ibook-g4:~] j06003% java test27
2     1
3     0

考察

iが初めは2になっている。while文でiを1減らしてiの値を表示これを0になるまで続けるので1と0が表示される。

Q28

   

ソースコード

1     class test28{
2        public static void main(String argv[]){
3        int num=10000;
4        for(int i = 0; i < 4; i++) num >>=i;
5        System.out.println(num);
6        }
7     }

実行結果

1     [isatakuma-no-ibook-g4:~] j06003% java test28
2     156

考察

10000をiの数だけシフト移動する式。iは0から3まであり合計6回シフト移動する。よって10000が156となる。

Q29

   

ソースコード

1     class test29{
2        public static void main(String argv[]){
3        int num = 0;
4        for(int i = 1; i <= 10; i++){
5          if(++num % i ==0) num++;
6          }
7        System.out.println(++num);
8        }
9     }

実行結果

1     [nw0603:~] j06003% java test29
2     12

考察

if文は最初i=1の時だけ実行される。iは最後は10になる事から++numは11になる 出力するまえに++numで1足すので答えは12となる。

Q30

   

ソースコード

1     class test30{
2        public static void main(String argv[]){
3        int a = 9;
4        if(a++ != 10 | a++ ==10) a++;
5        System.out.println(a);
6        }
7     }

実行結果

1     [nw0603:~] j06003% java test30
2     12

考察

a++なので条件に当てはめた後に+1する。 a(=9)!=10 | a(==10) ==10となり条件満たすのでa++{a(==11)+1} よって答えは12となる。

Q31

   

ソースコード

1     class test31{
2        public static void main(String argv[]){
3        for(int i=0; i < 5; i++)
4        System.out.println("i == " + i);
5        System.out.println("Hello");
6        }
7     }

実行結果

1     [nw0603:~] j06003% java test31
2     i == 0
3     i == 1
4     i == 2
5     i == 3
6     i == 4
7     Hello

考察

for文でiが0から4になる。この間はfor文のところに{}がないのでセミコロンまでを{}と見て始めのiを出力するところしか繰り返されない。for文が終わった後にHelloという文字が出力。

Q32

   

ソースコード

1     class test32{
2        public static void main(String argv[]){
3        int i;
4        for(i = 0; i < 9; i += 3){}
5        System.out.println(i);
6        }
7     }

実行結果

1     [nw0603:~] j06003% java test32
2     9

考察

iに3を足していきiが9以上になると終了となります。初めiが0なので3ずつ足していって9になったのでこの時にfor文が終了し、9が答えとなる。

Q33

   

ソースコード

1     class test33{
2        public static void main(String argv[]){
3        for(int i=0; i < 8; i++){
4        System.out.println(i);
5        i += 3;
6        }
7       }
8     }

実行結果

1     [nw0603:~] j06003% java test33
2     0
3     4

考察

始めはi=0のとき出力されるので0が出力され、そのあとはi+=3でiが3になり、i++で4になる。今度はこれが出力されて4が表示。このあとまた3と1を足すが8となるのでfor文が終わり表示はされない。

Q34

   

ソースコード

1     class test34{
2        public static void main(String argv[]){
3        int i = 0;
4        for(sayHello(); i <= 6; i += 3){
5        sayHello();
6        }
7     }
8
9        static void sayHello(){
10	     System.out.println("Hello");
11       }
12    }

実行結果

1     [nw0603:~] j06003% java test34
2     Hello
3     Hello
4     Hello
5     Hello

考察

for文の中ですでに1回Helloと出力される。そのあと3足されてまたHelloが出力される。これをもう一度繰り返すので合計4回Helloが出力される。

Q35

   

ソースコード

1     class test35{
2        public static void main(String argv[]){
3        Player p1 = new Player();
4        Player p2 = new Player();
5        p1.id = 1000;
6        p2.id = 2000;
7        p1.num += p1.id;
8        p2.num += p2.id;
9        System.out.println(Player.num);
10       }
11    }
12
13    class Player{
14       int id =0;
15       static int num = 0;
16    }

実行結果

1     [nw0603:~] j06003% java test35
2     3000

考察

p1には1000,p2には2000が代入されている。 p1.numとp2.numはstatic変数なので値を共有できる。p1.idが1000でp2.idが2000、これをnumという変数で共有しているので1000+2000でPlayer.num==3000なる。

Q36

   

ソースコード

1     class test36{
2        public static void main(String argv[]){
3        Player1 p1 = new Player1();
4        Player1 p2 = new Player1();
5        p1.id = 1000;
6        p2.id = 2000;
7        Player1.num += p1.id;
8        Player1.num += p2.id;
9        System.out.println("p1.num =="+p1.num);
10       System.out.println("p2.num =="+p2.num);
11       }
12    }
13
14    class Player1{
15       int id = 0;
16       static int num = 0;
17    }

実行結果

1     [nw0603:~] j06003% java test36
2     p1.num ==3000
3     p2.num ==3000

考察

Q35と同じようにstatic関数なので数字が共有され3000となっている。この値をp1.numとp2.numに代入して出力させたいるので両方とも3000という値が出力される。

Q37

   

ソースコード

1     class test37{
2        public static void main(String argv[]){
3        Card c1 = new Card();
4        Card c2 = new Card();
5        Card c3 = c1;
6        c1.deposit = 1000;
7        c2.deposit = 2000;
8        c3.deposit = 3000;
9        int sum = c1.deposit + c2.deposit + c3.deposit;
10       System.out.println(sum);
11       }
12    }
13
14    class Card{
15       int deposit;
16    }

実行結果

1     [nw0603:~] j06003% java test37
2     8000

考察

c3=c1となっていて、c1に1000を代入した後にc3の3000を代入しているのでc1=3000となる。よってこれはc1+c2+c3なので3000+2000+3000=8000で8000が答えとなる

Q38

   

ソースコード

1    class test38{
2       public static void main(String argv[]){
3       Card1 c1 = new Card1();
4       Card1 c2 = c1;
5       c1.deposit = 1000;
6       c2.deposit = 2000;
7       Bank.useCard1(c1);
8       Bank.useCard1(c2);
9       /*c1.depositとc2.depositの関係は?*/
10      }
11    }
12
13    class Card1{ int deposit; }
14    class Bank{
15       public static void useCard1(Card1 c ){
16       c.deposit -= 500;
17       }
18    }

実行結果

1     [nw0603:~] j06003% java test38
2     c1.deposit = 1000
3     c2.deposit = 1000

考察

まずCard c2 = c1より、c1とc2の値が同じである。c1.deposit=1000とあるが、そのあとでc2.deposit=2000とあるうのでc1,c2は両方とも2000,という値になる。その後、Bank.useCard(c1)により呼び出された値c1=2000を-500して1500にする。このときc2も同じ値となっているのでc2=1500。今度はc2=1500を-500するので1000となる。この時c1とc2の値は同じである。よってc1.deposit==c2.depositとなる。

感想

他の課題ともかぶっていて課題を終わらすことが大変でしたがテスト問題の解説だったし問題そのものはそこまで難しくはない問題だったので比較的楽にはできました。テストは前半部分ができてなかったので後期のテストがあれば挽回できるように頑張りたいです。