Report#6
課題
12/05付試験のQ23~Q38のついて考察せよ。
- コードと実行結果を示し、各問について考察すること。
解答・考察
試験問題Q23ソース
public class Test {
public static void main(String[] args) {
int x,y;
x = 100; x += 1; x--; y = 200 + x;
System.out.println(y++);
}
}
実行結果
300
考察
- まずxに100を代入して,そのあとに1を加算代入(+=)しているのでxは101。
しかし、その後すぐにデクリメント(x--)しているので結局xは100。よって200 + xは
300になるので、yは300。
- println の中の()のなかは、インクリメントが後付け(y++)なので、出力した
後にインクリメントする。よって出力は300。
試験問題Q24ソース
public class Test {
public static void main(String[] args) {
int a=0, x=0;
a = 5; a += 3; x = ++a;
System.out.println(x);
}
}
実行結果
9
考察
- aに5が代入された後に3を加算代入でaは8。こんどはインクリメントが先付け
(++a)なので代入する前にインクリメントしてxは9。よって出力は9。
試験問題Q25ソース
public class Test {
public static void main(String[] args) {
int a=9, b=3;
a /= b;
System.out.println(a %= b);
}
}
実行結果
0
考察
- aに9、bに3を代入したあと除算代入(割った答えを代入)しているので、この
時点でのaは3。出力する時にaを剰余代入(割った余りを代入)しているので、
9÷3の余りは0になるので、aに0が代入される。よって出力は0。
試験問題Q26ソース
public class Test {
public static void main(String[] args) {
int i, j;
for(i=0, j=0; i<3; i++) ++j;
System.out.println(i * j);
}
}
実行結果
9
考察
- for文の処理はiを判定、++j、i++の順で行われる。つまり、処理を繰り返し
ていきiが3になった時にfor文を抜けるのでその時にはiとjは3になっている。
よって出力は3*3より9。
試験問題Q27ソース
public class Test {
public static void main(String[] args) {
int i=2;
while(i-- > 0) System.out.print(i);
}
}
実行結果
10
考察
- while文の()の中のi--は判定の前に処理する。出力する時はiが
デクリメントされているので1。次の処理ではiが0になっているので出力されない。
試験問題Q28ソース
public class Test {
public static void main(String[] args) {
int num=10000;
for(int i = 0; i < 4; i++) num >>= i;
System.out.println(num);
}
}
実行結果
156
考察
- numにiを算術右シフト代入(右シフトした結果を代入)している。
右シフトは2で割るのと同じである。また、for文は処理は4回繰り
返されるのでそれぞれの処理で、最初はシフト無し(i=0)、次は1シフト
(2で割る)、次は2シフト(4で割る)、最後に3シフト(8で割る)をする。
つまり、10000を64で割った値が出力される。よって出力は156。
試験問題Q29のソース
public class Test {
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
考察
- for文の中身の処理はnumをインクリメントした値と、iが割り切れる
時にもう一度numをインクリメントする処理である。
- 最初にnum=0,i=1で初期化。if文の判定時にnumがインクリメントされ numが1になり、iで割り切れるのでもう一度インクリメントされてnumは3。
- これ以降numをiで割り切れる事が無い(numとiは1ずれてインクリメントされていくため)ので、iが10、numが11のときにループ終了(次がiが11になりi<=10を満たさないから)。
- さらに出力される前にもう一度インクリメントれるので、出力は12。
試験問題Q30ソース
public class Test {
public static void main(String[] args) {
int a = 9;
if(a++ != 10 | a++ == 10) a++;
System.out.println(a);
}
}
実行結果
12
考察
- if文の()の条件のなかでは判定の後にインクリメントされる。つまり()の中は「9 != 10 | 9 == 10」という意味になる。したがってifの中の処理も実行されaは12になる。よって出力は12。
試験問題Q31ソース
public class Test {
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
考察
- "Hello"という文字列が何回表示されるかという問題。
- for文に{}がついていないので、繰り返されるのは次の行だけ。よって"Hello"は1回だけ表示される。
試験問題Q32ソース
public class Test {
public static void main(String[] args) {
int i;
for(i = 0; i<9; i+=3) {}
System.out.println(i);
}
}
実行結果
9
考察
- iは3ずつ増えていき、9になったときにループを抜ける。よって出力は9。
試験問題Q33ソース
public class Test {
public static void main(String[] args) {
for(int i = 0; i<8; i++) {
System.out.println(i);
i += 3;
}
}
}
実行結果
0
4
考察
- if文の最初のprintlnメソッドの時点ではiは0。その後に3を加算代入、そしてiをインクリメントする。2回目のprintlnメソッドの時点ではiは4。その後3を加算代入して,iをインクリメントする。i<8なので3回目のループは無い。なので出力は0と4になる。
試験問題Q34ソース
public class Test {
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
考察
- "Hello"という文字列は何回表示されるかという問題。
- for文の中のsayHello();は"Hello"を表示するメソッド(mainメソッドの下で定義している)。forの初期化セクションで最初にsayHello();が呼び出される。その次からループが始まり,3回ループする(iが0、3,9と増えるため)。よって4回"Hello"が表示される。
試験問題Q35ソース
public 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;
}
実行結果
3000
考察
- 最初にPlayerクラスの中の変数を使うために、p1とp2という名前のオブジェクト変数を宣言している。
- 次にp1の変数idに1000を、p2の変数idに2000を代入している。p1とp2のそれぞれの変数idは違うメモリなので、それぞれの値を保持する。
- 次にp1のnumにp1のidを、p2のnumにp2のidを加算代入している。numはstaticがついているので値を共有する、つまりp1のidも、p2のidも同じ変数に加算代入される。よって出力は3000。
試験問題Q36ソース
public 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;
}
実行結果
p1.num == 3000
p2.num == 3000
考察
- Q35とほとんど変わらない。出力のときにp1.numもp2.numも同じPlayerのnumを参照する(staticがついているため)ので、p1.numもp2.numも同じ。
試験問題Q37ソース
public class Test {
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
考察
- 最初にPlayerクラスの変数を使うためにc1とc2というオブジェクトを宣言している。c3というオブジェクト変数も宣言しているが,これは値を格納する時はc1の変数に格納するという宣言をしている。
- c1のdepositに1000を,c2のdepositに2000を,c3のdeposit(c1のそれと同じ)に3000を代入している。
- sumはc1.deposit + c2.deposit + c1.depositと考えられるので,sum=8000。よって出力は8000。
試験問題Q38ソース
public 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 == " + 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
考察
- Aの時点でのc1.depositとc2.depositの関係(大小関係)を問う問題。
- Cardクラスの変数を使うためにc1というオブジェクト変数を宣言している。c2のdepositは、c1と同じメモリ(変数)に値を代入する事を宣言している。
- 次にc1の変数depositに1000を代入,その後にc2のdepositに2000が代入されているので結局depositには2000が代入されている。
- Bank.useCard();は()の中に入れた値を-500してdepositに代入する。つまりc1とc2を入れるという事は、2回-500するという事である。よってAの時点でc1.depositと、c2.depositは等しい。
感想・反省
今回のテストはなかなか点数が良かったのでかなりうれしかった。おかげで考察もかなり楽に出来た。しかし他のレポートが終わってないので早く終わらそうと思う(汗)。
.
.
.
オブジェクト (object)
客間や廊下などに置かれている物体。 クリックすると説明が出てくる。
参考資料・参考サイト
課題のページへ