Report#6

*課題:12/05付試験のQ23-Q38のついて考察せよ。

・コードと実行結果を示し、各問について考察すること。

◎コード(Q23-Q27)
Q23

class Q23{ public static void main(String[] args) { int x,y; x = 100;x +=1; x--; y = 200 + x; System.out.println(y++); } }

実行結果

300

Q24

class Q24{ public static void main(String[] args) { int a=0,x=0; a = 5; a +=3; x = ++a; System.out.println(x); } }

実行結果

9

Q25

class Q25{ public static void main(String[] args) { int a=9,b=3; a /= b; System.out.println(a %=b); } }

実行結果

0

Q26

class Q26{ public static void main(String[] args) { int i,j; for(i=0,j=0; i<3; i++) j++; System.out.println(i*j); } }

実行結果

9

Q27

class Q27{ public static void main(String[] args) { int i=2; while(i-- >0) System.out.print(i+","); System.out.println(); } }

実行結果

1,0,

◎考察(Q23-Q27)
Q23:

 最初、100は変数xの中に代入するから、"x += 1 = 101"である。その後、"x--"によって、xは元の100になった。最後、
"y = 200 + x"によって、実行結果は300である。("System.out.println(y++)"の後、"System.out.println(y)"
があれば、結果は301である。)

Q24:

"a +=3"は"a=a+3"の意味だから、a=8であって,"x = ++a"は"x=a+1"の意味によって、実行結果は9である。

Q25:

"a /= b"は"a=a/b"の意味だから、a=3であって、"a %=b"の意味は"a=a%b"である。したがって、実行結果は0である。

Q26:

for文によって、最後、変数iは3である。変数jは、for文の中の初期文の形式があるから、最後、変数iと同じ3になった。
したがって、i*j=9。(" for(i=0,j=0; i<3; i++) j++;"の";"があれば、i=3,なければ、i=0,1,2である。)

Q27:

"i--"の意味は"i=i-1"であって、while文によって、出力結果は1,0である。

◎コード(Q28)

class Q28{ public static void main(String[] args) { int num=10000; for(int i = 0; i < 4; i++) num >>= i; System.out.println(num); } }

実行結果

156

◎考察(Q28)
Q28:

10000は2進数で表示は10011100010000である。for文により、i=6である。numは右に6桁をシフトした後、156.25に
なった。しかし、変数numの型はint型ので、最後の実行結果は156である。

○ビット代入演算子
演算子 意味
&= 論理積(AND)と代入
|= 論理和(OR)と代入
^= 排他的論理和(XOR)と代入
>>= 符号拡張子付きの右シフトと代入
>>>= ゼロ充填ありの右シフトと代入
<<= ゼロ充填ありの左シフトと代入
○ビット論理演算子
演算子 意味
& 論理積(AND)
| 論理和(OR)
^ 排他的論理和(XOR)
~ ビットごとの補数
○ビットシフト演算子
演算子 意味
>> 符号拡張子付きの右シフトする
>>> ゼロ充填して右シフトとする
<< ゼロ充填して左シフトとする
○for文について

for文: for(初期文;条件;反復文){      本文; }

◎コード(Q29-Q34)
Q29

class Q29{ public static void main(String[] args) { int num = 0; for(int i = 1; i <= 10; i++){ if(++num % i ==0) num++; } System.out.println(++num); } }

実行結果

12

Q30

class Q30{ public static void main(String[] args) { int a = 9; if(a++ != 10 | a++ == 10) a++; System.out.println(a); } }

実行結果

12

Q31

class Q31{ public static void main(String[] args) { for( int i = 0; i<5; i++ ) System.out.println("i == "+i); System.out.println("Hello"); } }

実行結果

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

Q32

class Q32{ public static void main(String[] args) { int i; for( i = 0; i<9; i +=3){} System.out.println(i); } }

実行結果

9

Q33

class Q33{ public static void main(String[] args) { for( int i = 0;i < 8; i ++ ){ System.out.println(i); i += 3; } } }

実行結果

0 4

Q34

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

◎考察(Q29-Q34)
Q29:

変数iの値は1から10まで、"num++"の意味num+1であるから、num=1の時だけ"++num%i == 0"の条件に合う。for文
によって、変数numの値は2から11までになる。したがって、"num++"により、最後の実行結果は12である。("++num"の
意味はnum+1の値であり、"num++"の意味はnum値、その後1を加えることである。)
 インクリメント演算子またはデクリメント演算子を変数の前に置いた場合は、インクリメントまたはデクリメントが先に行わ
れ、その後に変数の値が式の中で使われる。

Q30:

 a=9,a++によって、a++=10である、9は2進数で表示は1001である。10は2進数で表示は1010である。"|"によって、
1011になった。1011は11である。最後、a++によって、実行結果は12である。

Q31:

このプログラムの中は"Hello"の出力することと変数iは関係がないから、実行結果は1回だけ"Hello"を出力する。

Q32:

for文の中は、初期文i=0,反復文i+=3と条件文1<9によって、iの値は0、3、6である。その後、"{}"によって、出力結
果は9である。("{}"と";"の作用は同じだ。)

Q33:

 初期文はそのまま出力する。その後、初期文は3を加えると3になって、for文によって、4になった。4は3を加えると7
になって、for文によって、8になった、この時、for文の条件文に合わないから、最後の出力結果は0と4である。

Q34:

 このプログラムは静的初期化ブロックを用いる。静的初期化ブロックはクラスがメモリにロードされる時に実行されるコード
ブロックを定義することである。
for文により、変数iの値は3、4、5、6四つだから、"Hello"の出力の回数は4である。

○staticについて

・静的初期化ブロック:   class clsName{
   .
   .
   .
  static{
 //ステートメントのブロック
 }
}
   .
   .
   .
}
・静的メソッドの宣言:
static rtype mthName(mparams){
//メソッドの本体
}

○連結演算子について

Javaには、二つの文字列、または、文字列と変数を連結する演算子が用意されています。これは連結演算子  と呼ばれ、「+」記号で表されます。引用符で囲んだ文字列を使用できる場所であれば、どこでも使用できま  す。

○if文について

if文は、このような形式です。 if(条件) 文; else 文; 条件が真(0以外)の場合、1番目の文が実行されます。偽(0)の場合は、2番目の文が実行されます。

○関係演算子
演算子 意味
== 等しい
!= 等しくない
> より大きい
< より小さい
>= より大きいか等しい
<= より小さいか等しい

○論理演算子
演算子動作説明
&論理積AND。2つの項が真の時だけ結果が真になる。
|論理和OR。2つの項が偽の時だけ結果が偽になる。
^排他的論理和Exclusive OR。2つの項が異なる時にだけ結果が真になる。
!否定NOT。項の真偽が逆になる。
&&論理積(ショートカット)
||論理和(ショートカット)
==等しい
!=等しくない
◎コード(Q35-Q37)
Q35

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

Q36

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

Q37

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

実行結果

8000

◎考察(Q35-Q37)
Q35:

 p1.numの値は1000になって、p2.numの値は2000になった。staticは静的メソッドだから、プログラムの中の変数
の値は全部保存できる。したがって、Player.numの値は1000+2000=3000になった。

Q36:

staticは静的メソッドだから、Player.numの値は3000である。その上" Player P1 = new Player();"と
" Player P2 = new Player();"によって、最後の実行結果はP1.num == 3000、P2.num == 3000である。

Q37:

このプログラムの中は、" Card c3 = c1 ;"によって、変数c1の値は変数c3と同じになった。したがって、最後の出力の
結果は8000である。

○オブジェクト指向について

・オブジェクト指向:操作対象となるもの(オブジェクト)を中心にすえる考え方。オブジェクトとは、処理や操作の手続きと、
対象となるデータよを包含するもので、GUIにおける、アイコンがそれに該当する。類似した対象に対する処理や手直しをする
際、一部の変更だけで対応できることを特徴としている。これによってコンピューターの操作がより自然で直感てきになったと
される。オブジェクト指向言語としては、"Smalltalk"や"C++"などがある。

・オブジェクトの生成: クラス名 オブジェクト変数 = new クラス名();

○クラスについて

・クラスはデータとメソッドを定義したもので、オブジェクトの雛形となるものだ。
[修飾子] class クラス名{
データ定義部;
メソッド定義部;
}

○メソッドについて

・メソッドは動作や処理内容(機能)を定義したものだ。
  [修飾子] メソッドの型 メソッド名(引数){
     処理内容
  }

・クラス内のメソッドを使うためには、そのクラスで定義したオブジェクトのどのメソッドであるにか"・"を付けて指定する。

○static変数について

static変数は静的変数だ。そのクラスのすべてのオブジェクトから共有される変数だ。変数の中の値はクラスの中で共有する。

◎コード(Q38)

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); /*A*/ } } class Card{ int deposit; } class Bank{ public static void useCard(Card c){ c.deposit -= 500; } }

答え

c1.deposit = c2.deposit

◎考察(Q38)
Q38:

プログラムの中の"Card c2 = c1;"によって、 c1.deposit と c2.depositの関係は等しいである。

*感想



 今回のテストはかなり難しかった。それ以前に問題用紙がなくて苦労した。