top > Programing2 Report4



課題内容



目次
  1. Q23 考察
  2. Q24 考察
  3. Q25 考察
  4. Q26 考察
  5. Q27 考察
  6. Q28 考察
  7. Q29 考察
  8. Q30 考察
  9. Q31 考察
  10. Q32 考察
  11. Q33 考察
  12. Q34 考察
  13. Q35 考察
  14. Q36 考察
  15. Q37 考察
  16. Q38 考察
  17. まとめ



  1. Q23
    • ソース
          void Q23(){
              int x,y;
              x = 100; x += 1; x--; y = 200 + x;
              System.out.println(y++);
          }
      

    • 実行結果
      Q23
      300
      

    • ソースの考察
      x = 100; x += 1; x--; y = 200 + x;
      まず、xに100を入れ、x+1、x-1、よって、xは、100のまま。
      yには、200+x = 200+100 = 300を入れる。
      System.out.println(y++);で、yを表示するが、
      このときのy++は、yを表示するので、インクリメントしないで、
      そのまま、300が表示される。
      ++yだと、インクリメントした後に表示するので、301になる。
      


  2. Q24
    • ソース
          void Q24(){
              int a=0, x=0;
              a = 5; a += 3; x = ++a;
              System.out.println(x);
          }
      

    • 実行結果
      Q24
      9
      

    • ソースの考察
      a = 5; a += 3; x = ++a;
      aに5を入れ、a+3をする。
      xには、a+1を入れる。
      よって、表示結果は9
      


  3. Q25
    • ソース
          void Q25(){
              int a=9, b=3;
              a /= b;
              System.out.println(a %= b);
          }
      

    • 実行結果
      Q25
      0
      

    • ソースの考察
      a /= b;
      aをbで割り、aに入れる。よって、この時点では、a = 3
      System.out.println(a %= b);
      a %= bなので、これを実行後に、aが表示される。
      3を3で割ってその余りをaに入れる。
      よって、表示されるのは0
      


  4. Q26
    • ソース
          void Q26(){
              int i,j;
              for(i=0, j=0; i<3; i++) ++j;
              System.out.println(i * j);
          }
      

    • 実行結果
      Q26
      9
      

    • ソースの考察
      for(i=0, j=0; i<3; i++) ++j;
      iが3になるまでjとiをインクリメントする。
      System.out.println(i * j);
      表示するのは、i*j なので、3*3で表示されるのは9
      


  5. Q27
    • ソース
          void Q27(){
              int i=2;
              while(i-- > 0) System.out.println(i);
          }
      

    • 実行結果
      Q27
      1
      0
      

    • ソースの考察
      
      while(i-- > 0) System.out.println(i);
       i が0になるまでiを表示するように設定してある。
       i は、前の行で2に設定されているので、
       まず、i から 1 を引いて、iを表示する。
       2 - 1 = 1 
       続いて、まだ0 ではないので、繰り返す。
       1 - 1 = 0 
       より、表示結果は、1 (改行) 0となる。
       0になったのでループから吐き出されてQ27が終了。
      
  6. Q28
    • ソース
          void Q28(){
              int num=10000;
              for(int i=0; i<4; i++) num >>= i;
              System.out.println(num);
          }
      

    • 実行結果
      Q28
      156
      

    • ソースの考察
      for(int i=0; i<4; i++) num >>= i;
      i が 3 になるまで i をインクリメントしつつ、numを i 回だけ右シフトする。
      よって、結果的にnumを(0+1+2+3より)合計6回右シフトする。
      numは、1000なので、1000/2の6乗で表示されるのは156
      


  7. Q29
    • ソース
          void Q29(){
              int num=0;
              for(int i=1; i<=10; i++){
                  if(++num % i ==0) num++;
              }
              System.out.println(++num);
          }
      

    • 実行結果
      Q29
      12
      

    • ソースの考察
       for(int i=1; i<=10; i++){
      if(++num % i ==0) num++;
      }
      System.out.println(++num);
      i が10になるまでiをインクリメントし、for文内を繰り返す。
      for文内ではもし、numに1を足して i で割り、
      その余りが0の場合numに1を足す。
      よって、以下のことが行われている。
      1+num=1(1÷1より、余りが0なのでnum+1 = 2)
      1+num=3(3÷2より、余りが1なのでそのまま)
      1+num=4(4÷3より、余りが1なのでそのまま)
      1+num=5(5÷4より、余りが1なのでそのまま)
      1+num=6(6÷5より、余りが1なのでそのまま)
      1+num=7(7÷6より、余りが1なのでそのまま)
      1+num=8(8÷7より、余りが1なのでそのまま)
      1+num=9(9÷8より、余りが1なのでそのまま)
      1+num=10(10÷9より、余りが1なのでそのまま)
      1+num=11(11÷10より、余りが1なのでそのまま)
      ここで、for文から出る。
      出力される時に、numに1を足すので出力結果は12
      


  8. Q30
    • ソース
          void Q30(){
              int a=9;
              if(a++ !=10 | a++ == 10) a++;
              System.out.println(a);
          }
      

    • 実行結果
      Q30
      12
      

    • ソースの考察
       int a=9;
      if(a++ !=10 | a++ == 10) a++;
      まず、aは、9となっている。
      aは9なので、a++!=!0は、成り立ち、aはインクリメントされる
      aがインクリメントされ、a=10となり、
      そのとなりのa++==10は真となり、aは又インクリメントする
      よって、a=11となる。
      両方とも真だったので、if文の内容が実行され、(a+1=a)
      a=12となり、表示結果は12
      


  9. Q31
    • ソース
          void Q31(){
              for(int i=0; i<5; i++)
                  System.out.println("i == " + i);
              System.out.println("Hello");
          }
      

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

    • ソースの考察
      for(int i=0; i<5; i++)
      System.out.println("i == " + i);
      System.out.println("Hello");
      Iが4になるまでfor文の内容、
      System.out.println("i == " + i);を繰り返す。
      表示した後にiはインクリメントされるので、
      i == 0
      i == 1
      i == 2
      i == 3
      i == 4
      となり、そのあとに、Helloを表示する。
      


  10. Q32
    • ソース
          void Q32(){
              int i;
              for(i=0; i<9; i+=3){}
              System.out.println(i);
          }
      

    • 実行結果
      Q32
      9
      

    • ソースの考察
      for(i=0; i<9; i+=3){}
      iが9以上になるとfor文から抜ける。
      今回は、for文内は空なので、iを3ずつインクリメントするだけ。
      よって、for文を抜けるとき、iは9になり、表示結果は9
      
  11. Q33
    • ソース
          void Q33(){
              for(int i=0; i<8; i++){
                  System.out.println(i);
                  i+=3;
              }
      

    • 実行結果
      Q33
      0
      4
      

    • ソースの考察
       for(int i=0; i<8; i++)
      iが7になるまでfor文を繰り返す。
      繰り返す度に1ずつインンクリメント。
      for文内では、iを出力し、その後に3インクリメントする。
      よって、もう一度for文を繰り返すときは合計で4インクリメントされている。
      つまり、最初は0で初期化されているので
      0がまず出力される。
      続いて、4インクリメントされたので
      4が出力され、そのあと、4インクリメントされるが
      8以上なのでここでfor文を出て終了。
      


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

    • 実行結果
      Hello
      Hello
      Hello
      Hello
      

    • ソースの考察
      for(sayHello(); i <= 6; i += 3)
      iは初期値で0に設定されており、3ずつインクリメントするので
      0  3  6  9と増えて行く(9でループから出る)
      よって、4回sayHello()を繰り返す。
      sayHelloはmainの下のほうから呼び出されている
      sayHelloはHelloを出力するメゾット。
      


  13. 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;
      }
      

    • 実行結果
      3000
      

    • ソースの考察
      Playerクラス中の変数を使うためにp1とp2というオブジェクト変数を宣言。
      p1の変数idに1000を、p2の変数のidに2000を代入している。
      それぞれのidは違うメモリなので両方とも値を保持する。
      p1のnumにはp1のidを、p2のnumにはp2を加算していれる。
      numはstaticがついているので値を共有する。
      つまり、p1.numとp2.numには両方とも同じ値が入る。
      p1.idの値とp2.idの値がnumに足されているので
      合計2000で、表示結果は3000となる。
      
      


  14. 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 = 3000
      p2.num = 3000
      

    • ソースの考察
      Q36とほぼ同様の操作が行われている。
       System.out.println("p1.num = " + p1.num);
      System.out.println("p2.num = " + p2.num);
      numは共有されているのでp1.numもp2.numも同じ値。
      よって表示結果は
      p1.num = 3000
      p2.num = 3000
      となる。
      


  15. 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;
      }
      

    • 実行結果
      8000
      

    • ソースの考察
      まず、new Card()を用いて、Cardクラスのオブジェクトを2つ作る。
      Card c3は、c1とイコールになっているので同じ値を指していることが分かる。
      つづいて、それぞれに1000、2000、3000とそれぞれ値をいれる。
      ただし、このとき、c1とc2は同じ値を入れているので
      後で入れた3000の方が結果的には入ることになる。
      sumはc1、c2、c3をそれぞれ足した結果。
      c1 = 3000、c2 = 2000、c3 = 3000なので、
      合計8000になり、sumにいれられる。
      最後にsumを表示しているので8000が表示結果となる。
      


  16. 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;
          }
      }
      

    • 実行結果
      c1.deposit == 1000
      c2.deposit == 1000
      

    • ソースの考察
      まず、new Card()でCardクラスのオブジェクトを1つ作る。
      c2はQ37の時と同様c1とイコールでおなじところを指している。
      続いて、c1、c2にそれぞれ1000、2000を入れるが、
      c1とc2はイコールなので後で入れたc2の方が格納される。
      続いてuseCardを使う。
      7行目のBank.useCard(c1);では、
      2000 - 500 = 1500で、1500がmainに帰ってくる。
      続いて8行目のBank.useCard(c2);では、
      (c1=c2なので7行目より)1500 - 500 = 1000で
      1000がメインに戻る。
      よって、c1=c2=1000になる。
      System.out.println("c1.deposit == " + c1.deposit);
      System.out.println("c2.deposit == " + c2.deposit);
      で、表示される結果は
      c1.deposit == 1000
      c2.deposit == 1000です。
      
  17. まとめ・感想
    問題数多かったです。
    テストではけっこう間違えた気がします。
    Q35~38は興味深い問題でした。
    staticがつくと共有するのをようやく理解しました;
    







Copyright since-2006 j06008 All rights reserved.