実行結果
0
考察
- aに9、bに3を代入したあと除算代入(割った答えを代入)しているので、この
時点でのaは3。出力する時にaを剰余代入(割った余りを代入)しているの
で、
9÷3の余りは0になるので、aに0が代入される。よって出力は0。
4.試験問題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。
5.試験問題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になっているので出力
されない。
6.試験問題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。
7.試験問題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。
8.試験問題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。
9.試験問題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回だけ表示される。
10.試験問題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。
11.試験問題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になる。
12.試験問題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"が表示される。
13.試験問題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。
14.試験問題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も同じ。
15.試験問題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。
16.試験問題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は等しい。
感想・反省
今回は筆記のテストが非常に悪かったです。c言語がわかればできるんじゃない
かとなめていました。期末はしっかりしたい。