report4

ProgrammingII report#4

TOP 情報工HP ProgrammingII
report#01
report#02
report#03
report#04
report#05
report#06
動作環境はsafariでやったので、safariを推奨します。

【Report#4】 オフライン試験のQ23〜Q38のついて考察せよ。
  • コードと実行結果を示し、各問について考察すること。
  • 感想

  • Q23:次のコードを実行した後の出力値を述べよ


    コード
    1:
    2:
    3:
    
    int x,y;
    x = 100 ; x += 1; x--; y= 200 + x;
    System.out.println(y++);
    

    実行結果
    1:
    
    300
    

    考察
      1行目でint型の変数xとyを宣言して、2行目でxに100を代入して、「x += 1」でxの値を101にして、「x--」でxの値を
    100にして、「y= 200 + x」でyに200+100を代入してある。3行目で「y++」とあるが、yを先に出力するので、プラス1
    は出力されてからされる。逆に「++y」だったら実行結果は301になる。
    

    Q24:次のコードを実行した後の出力値を述べよ


    コード
    1:
    2:
    3:
    
    int a = 0, x = 0;
    a = 5; a += 3; x = ++a;
    System.out.println(x);

    実行結果
    1:
    
    9

    考察
     1行目でint型の変数aとxを宣言、そして初期化してある。2行目でaに5を代入して、それにさらに3を足して(a=8)、
    「x = ++a」でxにa+1した値を代入する。よってx= 8+1=9である。
    

    Q25:次のコードを実行した後の出力値を述べよ


    コード
    1:
    2:
    3:
    
    int a = 9, b = 3;
    a /= b ;
    System.out.println(a %= b);

    実行結果
    1:
    
    0

    考察
      1行目でint型変数aとbにそれぞれ、9と3を代入した。2行目では、a/bした値をaに代入してある。a/b=9/3=3となる。
    3行目の出力ではa%bした値をaに代入する。a%b=3%3=0となる。
    

    Q26:次のコードを実行した後の出力値を述べよ


    コード
    1:
    2:
    3:
    
    int i, j;
    for(i=0,j=0;i < 3;i++) j++;
    System.out.println(i * j);

    実行結果
    1:
    
    9

    考察
      1行目でint型の変数iとjを宣言して、2行目ではfor文を使っている。最初i=0,j=1となり、次にi=1,j=2となり、次に
    i=2,j=3となり、最後にi=3となった時点でfor文をぬけるので、jはプラスされない。よってi*jは3×3である。
    

    Q27:次のコードを実行した後の出力値を述べよ


    コード
    1:
    2:
    
    int i = 2;
    while(i-- > 0) System.out.print(i);

    実行結果
    1:
    
    10

    考察
      1行目でint型の変数iに2を代入してある。2行目でwhile文を使って、i--が0より大きい間だけループしている。
    iの値は 2→1→0となり0となった時点でループをぬけるから、10と表示される。ちなみにprintlnではないから、改行され
    ない。
    

    Q28:次のコードを実行した後の出力値を述べよ


    コード
    1:
    2:
    3:
    
    int num = 10000;
    for(int i = 0;i < 4;i++) num >>= i;
    System.out.println(num);

    実行結果
    1:
    
    156

    考察
      1行目でint型の変数numに10000を代入して、2行目でfor文を使って、「num >>= i」をループさせている。>>は右に
    ビットシフトさせる記号だからnumに0ビットシフト、1ビットシフト、2ビットシフト、3ビットシフト、4ビットシフトする
    ので、最終的に156となる。
    

    Q29:次のコードを実行した後の出力値を述べよ


    コード
    1:
    2:
    3:
    4:
    5:
    
    int num = 0;
    for(int i = 1;i <= 10;i++){
       if(++num % i ==0)  num++;
    }
    System.out.println(++num);

    実行結果
    1:
    
    12

    考察
      1行目でint型変数numを初期化して、2〜4行目でfor文とif文を使ってnumに1プラスしたのがiで割り切れたらnumに
    さらに1をプラスする。というのを繰り返している。5行目でnumにプラス1したやつを出力してある。
    

    Q30:次のコードを実行した後の出力値を述べよ


    コード
    1:
    2:
    3:
    
    int a = 9;
    if(a++ != 10 | a++ == 10) a++;
    System.out.println(a);

    実行結果
    1:
    
    12

    考察
      2行目でif文を使って、「a++が10でない」または「a++が10である」の条件を満たしたらa++するようにしてある。
    よって12である。
    

    Q31:次のコードを実行した後、"Hello"は何回表示されるか述べよ。


    コード
    1:
    2:
    3:
    
    for(int i = 0;i < 5;i++)
    System.out.println("i =="+i);
    System.out.println("Hello");

    実行結果
    1:
    2:
    3:
    4:
    5:
    6:
    
    i ==0
    i ==1
    i ==2
    i ==3
    i ==4
    Hello
    

    考察
      1行目〜2行目でiを4まで足して出力して、最後にHelloを出力するだけだから、1回表示される。
    

    Q32:次のコードを実行した後の出力値を述べよ。


    コード
    1:
    2:
    3:
    
    int i;
    for(i = 0;i < 9;i += 3){}
    System.out.println(i);

    実行結果
    1:
    
    9
    

    考察
      2行目でfor文を使って、iの値が「0→3→6→9」となり、9となった時点でfor文を抜けるから、答えは9である。
    

    Q33:次のコードを実行した後の出力値を述べよ。


    コード
    1:
    2:
    3:
    4:
    
    for(int i = 0;i < 8;i++){
      System.out.println(i);
      i += 3;
    }

    実行結果
    1:
    2:
    
    0
    4

      1行目〜4行目までfor文を使ってiの値を「0(出力)→3→4(出力)→7→8」と変化している。8になった時点でfor文を抜
    ける。
    

    Q34:次のコードを実行した後、"Hello"は何回表示されるか述べよ。


    コード
    1:
    2:
    3:
    4:
    5:
    6:
    7:
    8:
    9:
    
    public static void main(String args[]){
       int i = 0;
       for(sayHello();i <= 6;i +=3){
          sayHello();
       }
    }
    static void sayHello(){
       System.out.println("Hello");
    }

    実行結果
    1:
    2:
    3:
    4:
    
    Hello
    Hello
    Hello
    Hello

    考察
      3行目〜5行目まで、for文を使って、クラスsayHelloをiの数分ループさせて、Helloを出力させている。
    iの値は「0→3→6→9」となり9となった時点でループは終わるのでiの値の変化は4回、よって4回表示される。
    

    Q35:次のコードを実行した後の出力値を述べよ。


    コード
    01:
    02:
    03:
    04:
    05:
    06:
    07:
    08:
    09:
    10:
    11:
    12:
    13:
    14:
    15:
    
    class Test{
        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;
    }

    実行結果
    1:
    
    3000

    考察
      3行目〜4行目ではnew演算子を使って、クラスPlayerをp1とp2にコンストラクトしている。
    7行目〜8行目ではp1.numに10000を代入して、p2.numにp2.idの値を足したやつを代入している。ここで
    14行目に注目してもらいたい。staticを使っているから、p1.numもp2.numも所持している値は共有しているので、
    numの箱には最初10000が入って、その後20000が足されるから、答えは30000になる。
    

    Q36:次のコードを実行した後の出力値を述べよ。


    コード
    01:
    02:
    03:
    04:
    05:
    06:
    07:
    08:
    09:
    10:
    11:
    12:
    13:
    14:
    15:
    16:
    
    class Test{
        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;
    }

    実行結果
    1:
    2:
    
    p1.num ==3000
    p2.num ==3000

    考察
      Q35で説明したことの証明のようなものである。static変数は値を共有している。
    

    Q37:次のコードを実行した後の出力値を述べよ。


    コード
    01:
    02:
    03:
    04:
    05:
    06:
    07:
    08:
    09:
    10:
    11:
    12:
    13:
    14:
    15:
    
    class Test{
        public static void main(String args[]){
            Card c1 = new Card();
            Card c2 = new Card();
            Card c3 = new Card();
            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;
    }

    実行結果
    1:
    
    6000

    考察
      この問題は実に単純である。13行目〜15行目でのクラスCardをもとに、3行目〜8行目では
    c1.deposit,c2.deposit,c3.depositにそれぞれ1000,2000,3000を代入して9行目でその3つを足したものを
    int型の変数sumに代入している。よって1000+2000+3000=60000である。
    

    Q38:次のコードを実行したとき、コード中のAの時点においてc1.depositとc2.depositの関係を述べよ。


    コード
    01:
    02:
    03:
    04:
    05:
    06:
    07:
    08:
    09:
    10:
    11:
    12:
    13:
    14:
    15:
    16:
    17:
    18:
    19:
    20:
    21:
    
    class Test{
        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);
            System.out.println(c2.deposit);
        }
    }
    class Card{
        int deposit;
    }
    class Bank{
        public static void useCard(Card c) {
            c.deposit -= 500;
        }
    }

    実行結果
    1:
    2:
    
    1000
    1000

    考察
      4行目でやっていることはc1とc2がさすものは同一にするということである。5行目で1000をc1.depositに代入しても
    6行目でc2.depositに2000を代入しているので上書きしていることになる。7行目では2000がマイナス500されて1500に、
    8行目では1500がマイナス500されて1000になっている10行目〜11行目は自分が勝手に出力させました。
    


    感想


      今回の課題の対象であるテストでは低得点をとってしまいました。勉強不足でした。このレポートを通してより理解できるよう
    になったので、自分のためになったと思います。次からのレポートもがんばっていきたいです。