e055763
安富 順一
Report#6
[1]課題
12/05付試験のQ23〜Q38について考察せよ。コードと実行結果を示し、各問について考察する事。
[2]解答・実行結果・考察
Q23
ソースコード
public class Q23 {
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-1 =100 で、y = 200+x = 200+100 = 300 である。
- 「y++」は、「表示した後にy=y+1」なので、表示される時点では300で
ある。
Q24
ソースコード
public class Q24 {
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 = 8 で、x = a+1 = 8+1 =9 である。
Q25
ソースコード
public class Q25 {
public static void main(String[] args) {
int a=9, b=3;
a /= b;
System.out.println(a %= b);
}
}
実行結果
0
考察
- a = a/b = 9/3 =3 で、a%b = 0である。
Q26
ソースコード
public 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
考察
- for文は「i<3 の間、j = j+1 をしてから i = i+1」という意味である。
- 初め i=0 , j=0 で、一回目のループで i=1 , j=1 。
- 二回目のループで i=2 , j=2 。
- 三回目のループで i=3 , j=3 。
- 四回目のループは、i>3 となるので終了。
- ここで i*j = 3*3 = 9 である。
Q27
ソースコード
public class Q27 {
public static void main(String[] args) {
int i=2;
while(i-- > 0) System.out.print(i);
}
}
実行結果
10
考察
- while文は「i > 0 なら i = i-1 をして i を表示」という意味である。
- 一回目で i=2 , 2>0 なので i = 2-1 = 1 で 1 を表示。
- 二回目で i=1 , 1>0 なので i = 1-1 = 0 で 0 を表示。
- 三回目は i=0 で、ループが終了。
Q28
ソースコード
public 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
考察
- for文は「i < 4 の間 num >> i をしてから i = i+1」という意味である。
- (10000)10 = (10011100010000)2 である。
- 一回目のループは 0<4 なので num = (10011100010000)2 >> 0 =
(10011100010000)2 としてから i = 0+1 = 1。
- 二回目のループは 1<4 なので num = (10011100010000)2 >> 1 =
(1001110001000)2 としてから i = 1+1 = 2。
- 三回目のループは 2<4 なので num = (1001110001000)2 >> 2 =
(10011100010)2 としてから i = 2+1 = 3。
- 四回目のループは 3<4 なので num = (10011100010)2 >> 3 =(10011100)2
としてから i = 3+1 = 4。
- 五回目は i=4 なのでループ終了。
- 表示されるのは、(10011100)2 = (156)10 なので、156である。
Q29
ソースコード
public 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
考察
- for文は「i <= 10 の間{ }内を実行して i = i+1」で、if文は「num+1 が
i で割り切れるなら num = num+1」という意味である。
- 初期は i=1 , num=0である。
- 一回目のループでは i=1 , num+1 = 0+1 = 1 , 1%1 = 0 より、num =
1+1 =2。
- 二回目のループでは i=2 , num+1 = 2+1 = 3 , 3%2 = 1 より、num = 3。
- 三回目のループでは i=3 , num+1 = 3+1 = 4 , 4%3 = 1 より、num = 4。
- 四回目のループでは i=4 , num+1 = 4+1 = 5 , 5%4 = 1 より、num = 5。
- 五回目のループでは i=5 , num+1 = 5+1 = 6 , 6%5 = 1 より、num = 6。
- 六回目のループでは i=6 , num+1 = 6+1 = 7 , 7%6 = 1 より、num = 7。
- 七回目のループでは i=7 , num+1 = 7+1 = 8 , 8%7 = 1 より、num = 8。
- 八回目のループでは i=8 , num+1 = 8+1 = 9 , 9%8 = 1 より、num = 9。
- 九回目のループでは i=9 , num+1 = 9+1 = 10 , 10%9 = 1 より、num =
10。
- 十回目のループでは i=10 , num+1 = 10+1 = 11 , 11%10 = 1 より、
num = 11。
- 十一回目は i>10なので終了し、表示されるのは ++num = num+1 = 11+1
=12 である。
Q30
ソースコード
public class Q30 {
public static void main(String[] args) {
int a = 9;
if(a++ != 10 | a++ == 10) a++;
System.out.println(a);
}
}
実行結果
12
考察
- if文は「a++ が 10 でなければ、または a++ が 10 ならば a++」とい
う意味である。
- 9 は 10 ではないので a = a+1+1+1 = 12 である。
Q31
ソースコード
public 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
考察
- 「System.out.println("Hello");」はfor文の外にあるので、Helloが出
力されるのは1回である。
Q32
ソースコード
public class Q32 {
public static void main(String[] args) {
int i;
for(i = 0; i < 9; i +=3){}
System.out.println(i);
}
}
実行結果
9
考察
- for文は「i<9 の間 i = i+3」という意味である。
- 一回目のループでは 0 < 9 なので、i = 0+3 = 3。
- 二回目のループでは 3 < 9 なので、i = 3+3 = 6。
- 三回目のループでは 6 < 9 なので、i = 6+3 = 9。
- 四回目で i < 9 ではないので終了。
- 「Sytem.out.println(i);」は、for文の外にあるので、一回だけ 9 が
表示される。
Q33
ソースコード
public class Q33 {
public static void main(String[] args) {
for(int i = 0; i < 8; i ++){
System.out.println(i);
i += 3;
}
}
}
実行結果
0
4
考察
- このコードは「i<8 の間、i を表示して i = i+3 をし終わってから i
= i+1」という意味である。
- 一回目のループでは 0<8 より 0 を表示して、i = 0+3 = 3 , i = 3+1
= 4 である。
- 二回目のループでは 4<8 より 4 を表示して、i = 4+3 = 7 , i = 7+1
= 8 である。
- 三回目は i<8 ではないので終了。
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文は「i <= 6 の間 i = i+3 をしてからsayHello( )」という意味で
あり、「sayHello( ){ }」では Hello と表示する。
- 初期は i=0 sayHello( )。
- 一回目のループでは 0 <= 6 で i = 0+3 = 3 sayHello( )。
- 二回目のループでは 3 <= 6 で i = 3+3 = 6 sayHello( )。
- 三回目のループでは 6 <= 6 で i = 6+3 = 9 sayHello( )。
- 四回目は i <= 6 ではないので終了。
- sayHello( )が4個あるので、Helloは4回表示される。
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
考察
- numにはstaticがついているので「Player」を新しく呼び出しても値が
保存される。
- p1.num += p1.id -> num = 0+1000 = 1000となり、p2.num += p2.id ->
num = 1000+2000 = 3000である。
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
考察
- numにはstaticがついているので「Player」を新しく呼び出しても値は
保存される。
- p1.num += p1.id -> num = 0+1000 = 1000で、p2.num += p2.id -> num
= 1000+2000 = 3000である。
- ここで、Player{ }内には3000だけが残っているので、p1.num == 3000、
p1.num == 3000である。
Q37
ソースコード
public 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
考察
- 「Card c3 = c1;」より、「c3.deposit = 3000;」= 「c1.deposit =
3000;」となり、num = 3000+2000+3000 = 8000である。
Q38
ソースコード
public 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 */
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
考察
- 「Card c2 = c1;」より、「c2.deposit = 2000;」=「c1.deposit =
2000;」となる。
- クラスBankは deposit = deposit-500 なので、Bank.useCard(c4) ->
deposit = 2000-500 = 1500 となり、Bank.useCard(c5) =
Bank.useCard(c4) -> deposit = 1500 - 500 = 1000である。
- よってc4.deposit = c5.depositである。
[3]感想
やっと追いつきました。
テストが終わってから結構時間がたっていたので、いい復習になりました。
[4]参考文献
- 独習Java 第3版 ジョゼフ・オニール著 翔泳社
PukiWiki
プヲグラミングIIへ
とっぷにもどる