report#4

課題

オフライン試験のQ23~Q38のついて考察せよ。


q23.javaのソース

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

q23.javaの実行結果


300

q23.javaの考察

  • 4行目では、xは100+1-1だから100となり、yは200+100だから、300となっている。
  • 5行目では、y++は表示された後に行われるので、表示は300となるので答えは300となる。


  • q24.javaのソース

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

    q24.javaの実行結果


    9

    q24.javaの考察

  • 4行目では、最初はa=5で、次にa+=3があるのでaは5+3で8になり、最後にx=++aで1たされ9になるので、答えは9となる。


  • q25.javaのソース

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

    q25.javaの実行結果


    0

    q25.javaの考察

  • 4行目では、a=a/bでa=3となる。
  • 5行目では、a%b=3%3=0となるので答えは0となる。


  • q26.javaのソース

    01:class q26{
    02: public static void main(String args[]){
    03: int i, j;
    04: for(i=0,j=0;i<3; i++) ++j;
    05: System.out.println(i*j);
    06: }
    07:}

    q26.javaの実行結果


    9

    q26.javaの考察

  • 4行目では、for文の中身はi<3ならj=j+1を行い、i=i+1をする。そして、for文でループする。4回目でループは終了する。
  • 5行目では、i=3とj=3だからi*j=3*3=9で答えは9となる。


  • q27.javaのソース

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

    q27.javaの実行結果


    10

    q27.javaの考察

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


  • q28.javaのソース

    01:class q28{
    02: public static void main(String args[]){
    03:int num=10000;
    04: for(int i=0; i < 4; i++) num >>= i;
    05: System.out.println(num);
    06: }
    07:}

    q28.javaの実行結果


    156

    q28.javaの考察

  • ループの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となる。


  • q29.javaのソース

    01:class q29{
    02: public static void main(String args[]){
    03:int num = 0;
    04: for(int i = 1; i<=10; i++){
    05: if(++num % i == 0) num++;
    06: }
    07: System.out.println(++num);
    08: }
    09:}

    q29.javaの実行結果


    12

    q29.javaの考察

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


  • q30.javaのソース

    01:class q30{
    02: public static void main(String args[]){
    03:int a = 9;
    04: if(a++ != 10 | a++ == 10) a++;
    05: System.out.println(a);
    06: }
    07:}

    q30.javaの実行結果


    12

    q30.javaの考察

  • 4行目のif文はa++が10でない、またはa++が10のときa++するのであり、ここでa=9であり、10ではないのでa++する。
  • 次にaは10となるのでa++する。
  • 次にaは11となりさらにa++するのでaは12となるので答えは12となる。


  • q31.javaのソース

    01:class q31{
    02: public static void main(String args[]){
    03:for( int i=0; i<5; i++)
    04: System.out.println("i==" + i);
    05: System.out.println("Hello");
    06: }
    07:}

    q31.javaの実行結果


    i==0
    i==1
    i==2
    i==3
    i==4
    Hello

    q31.javaの考察

  • 5行目のSystem.out.println("Hello");の上の行までがfor文であるからSystem.out.println("Hello");はfor文の外なので、Helloが表示されるのは1回となるので答えは1回となる。


  • q32.javaのソース

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

    q32.javaの実行結果


    9

    q32.javaの考察

  • for(i=0;i<9;i+=3)はi<9ならi=i+3であり、for(i=0;i<9;i+=3){}よりSystem.out.println(i);はfor文の外にあるので、条件式の最後に計算された値が表示される。最後に出る値は9なので答えは9となる。


  • q33.javaのソース

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

    q33.javaの実行結果


    0
    4

    q33.javaの考察

  • int型の変数iの初期値を0にして、インクリメントし続ける。i<8の間、iの値を出力して、iにi+3値を代入する。そして、i=8になった時に、処理を終える。よって、答えは0,4となる。


  • q34.javaのソース

    01:class q34{
    02: public static void main(String args[]){
    03:int i=0;
    04: for( sayHello(); i <= 6; i +=3){
    05: sayHello();
    06: }
    07: }
    08: static void sayHello(){
    09: System.out.println("Hello");
    10: }
    11:}

    q34.javaの実行結果


    Hello
    Hello
    Hello
    Hello

    q34.javaの考察

  • 3行目では、int型の変数iを定義し、初期値を0にする。
  • 4、5行目では、まずメソッドsayHello()を実行する。そして、i +=3し続けて、i<=6の間はsayHello()を実行する。i=6になったら処理を終わる。よって答えは4回となる。


  • q35.javaのソース

    01:class q35{
    02: public static void main(String args[]){
    03:Player p1 = new Player();
    04: Player p2 = new Player();
    05: p1. id = 1000;
    06: p2. id = 2000;
    07: p1. num += p1. id;
    08: p2. num += p2. id;
    09: System.out.println(Player.num);
    10: }
    11: }
    12: class Player{
    13: int id = 0;
    14: static int num = 0;
    15:}

    q35.javaの実行結果


    3000

    q35.javaの考察

  • 3、4行目では、クラスPlayerのオブジェクトp1、p2がそれぞれ生成されている。
  • 5、6行目では、オブジェクトp1のidを1000に初期化し、p2のidを2000に初期化する。
  • 7、8行目では、numにidを加えた値をnumに代入する処理を、p1とp2で行っている。
  • 13行目では、int型の変数idを定義している。
  • 14行目では、int型の静的変数numを定義しているので、答えは3000となる。


  • q36.javaのソース

    01:class q36{
    02: public static void main(String args[]){
    03:Player p1 = new Player();
    04: Player p2 = new Player();
    05: p1. id = 1000;
    06: p2. id = 2000;
    07: Player. num += p1. id;
    08: Player. num += p2. id;
    09: System.out.println("p1. num == " + p1. num);
    10: System.out.println("p2. num == " + p2. num);
    11: }
    12: }
    13: class Player{
    14: int id = 0;
    15: static int num = 0;
    16:}

    q36.javaの実行結果


    p1. num == 3000
    p2. num == 3000

    q36.javaの考察

  • 3、4行目では、クラスPlayerのオブジェクトp1、p2がそれぞれ生成されている。
  • 5、6行目では、オブジェクトp1のidを1000に初期化し、p2のidを2000に初期化する。
  • 7、8行目では、クラスPlayerの静的変数numにp1とp2のint型変数idを加えたので、答えはp1. num == 3000、p2. num == 3000となる。


  • q37.javaのソース

    01:class q37{
    02: public static void main(String argv[]){
    03:Card c1 = new Card();
    04: Card c2 = new Card();
    05: Card c3 = c1;
    06: c1. deposit = 1000;
    07: c2. deposit = 2000;
    08: c3. deposit = 3000;
    09: int sum = c1. deposit + c2. deposit + c3. deposit;
    10: System.out.println(sum);
    11: }
    12: }
    13: class Card{
    14: int deposit;
    15:}

    q37.javaの実行結果


    8000

    q37.javaの考察

  • 3、4行目では、クラスCardのオブジェクトc1、c2がそれぞれ生成されている。
  • 5行目では、オブジェクトc3がc1と同じであるとしている。
  • 6、8行目では、オブジェクトc1のdepositを1000に初期化し、c2のdepositを2000に初期化し、c3のdepositを3000に初期化しているがc3=c1なので、c1のdepositも3000になる。
  • 9行目では、sum=3000+2000+3000=8000となるので答えは8000となる。


  • q38.javaのソース

    01:class q38{
    02: public static void main(String argv[]){
    03:Card c1 =new Card();
    04: Card c2 = c1;
    05: c1.deposit =1000;
    06: c2.deposit =2000;
    07: Bank.useCard( c1 );
    08: Bank.useCard( c2 );
    09: /* A */
    10: System.out.println("c1.deposit==" +c1.deposit);
    11: System.out.println("c2.deposit==" +c2.deposit);
    12: }
    13:}
    14:class Card{ int deposit; }
    15:class Bank{
    16: public static void useCard( Card c){
    17: c.deposit -= 500;
    18: }
    19:}

    q38.javaの実行結果


    c1.deposit==1000
    c2.deposit==1000

    q38.javaの考察

  • 4行目では、Card c2 = c1 よりc2とc1は同じものと考えている。
  • 5、6行目では、c1.deposit = 1000; でc2.depositも1000になり、c2.deposit = 2000; でc1.depositも2000になる。
  • 7、8行目では、Bank.useCard(c1);、Bank.useCard(c2);で2回500引かれるので、c1.deposit、c2.depositは1000になる。よって答えは、c1.deposit==1000、c2.deposit==1000となり、c1.deposit==c2.deposit という関係になる。


  • 反省と感想


  • 今回は、ソースの中身が少なかったのだが、問題が結構あったので大変だった。今年のレポートはこれで終わりなのでよかった。