〜プログラミング2 Report#6〜
課題
12/05付試験のQ23〜Q38のついて考察せよ。
コードと実行結果を示し、各問について考察すること。
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++);
}
}
|
〜実行結果〜
〜考察〜
x = 100 でxに100が入る。 x==100
x += 1 でxに1足される。 x==101
x-- でxから1引く。 x==100
y = 200 + x でyに200+xを入れる。 y==300
System.out.println(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);
}
}
|
〜実行結果〜
〜考察〜
a = 5 でaに5を代入。 a==5
a += 3 でaに3足す。 a==5+3==8
x = ++a でaに1足したものをxに代入。
よって出力結果は 9
Q25
☆ソースプログラム
public class q25{
public static void main(String args[]){
int a=9, b=3;
a /= b;
System.out.println(a %= b);
}
}
|
〜実行結果〜
〜考察〜
a=9,b=3で値をそれぞれに代入。
a /= b でa/bをaに代入。 a==3
a %= b で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);
}
}
|
〜実行結果〜
〜考察〜
for文に{}がついていない場合は次の「;」までを{}内と考える。
なので、このfor文は3回繰り返され i==3,j==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);
|
〜実行結果〜
〜考察〜
while文の場合も{}がない時は「;」までを{}内とする。
while(i-- >0)でi--となっているので後から1引く。
i(==2)は0より大きいので1引いて出力する。 1
i(==1)は0より大きいので1引いて出力する。 0
i(==0)は0より大きくないので終了。
よって出力結果は 10
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);
|
〜実行結果〜
〜考察〜
num==10000 を二進数で表すと、10011100010000 となる。
これを右シフトさせるのであるが、for文よりシフトさせるので合計6ビットシフトさせる。
よって 00000010011100 これを十進数で出力するので 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);
}
}
|
〜実行結果〜
〜考察〜
if文は最初 i=1 の時だけ実行され、後はnumの方が1多くて実行されない。
iは最後は10になることからnumは11になる。
出力する前に++numで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);
}
}
|
〜実行結果〜
〜考察〜
a++なので条件に当てはめた後に1足す。
a(=9)!=10 | a(==10) ==10 となり条件を満たすので a++{a(==11)+1}
よって出力結果は 12
Q31 Helloは何回表示されるか述べよ。
☆ソースプログラム
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
|
〜考察〜
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)
}
}
|
〜実行結果〜
〜考察〜
iには3足されていき、iが9以上になったときに終了するので、
最終的にはiは9となる。よって9が表示される。
Q33
☆ソースプログラム
public class q33{
public static void main(String args[]){
for( int i=0; i < 8; i ++){
System.out.println(i);
i += 3;
}
}
|
〜実行結果〜
〜考察〜
最初i=0のとき出力されるので0が表示される。
i += 3 で i=3 になり、その後i++とり1足すことになり i=4
そのまま出力されて、
0
4
そして3と1足されて i==8 となり終了
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");
}
}
|
〜実行結果〜
〜考察〜
まず for( sayHello(); i <= 6; i += 3) のsayHello()で1回表示。
for文は3回繰り返されるので3回表示。
合わせて4回表示される。
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 += p1.id;
System.out.println(Player.num);
}
}
class Player{
int id =0;
static int num =0;
}
|
〜実行結果〜
〜考察〜
p1には1000、p2には2000が代入されている。
p1.numとp2.numはnumがstatic変数なので値を共有する。
p1.num += p1.id で num==1000
p2.num += p2.id で num==1000+2000=3000
よってPlayer.num==3000
Q36
☆ソースプログラム
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
|
〜考察〜
クラスPlayerのint numはstatic変数で定義されている。
であるからp1.num p2.num Player.numは共有された状態にある。
Player.numに1000足して2000足しているので、Player.num==3000である。
p1.numもp2.numもPlayer.numと同じなので出力結果は
p1.num == 3000
p2.num == 3000
と表示される。
Q37
☆ソースプログラム
class Test{
public static void main(String args[]){
Card c1 = new Card();
Card c2 = cew 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;
}
|
〜実行結果〜
〜考察〜
Card c3 = c1; と置いているのでc1とc3は同じものと考える。
c1に1000を代入した後にc3に3000代入しているのでc1、c3==3000となる。
よって sum=3000+2000+3000=8000 となる。
Q38
☆ソースプログラム
class Test2{
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 );
/*c1.depositとc2.depositの関係は?*/
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とc1は同じものと考える。
c1.deposit = 1000; でc2.depositも1000になり、
c2.deposit = 2000; でc1.depositも2000になる。
Bank.useCard(c1);
Bank.useCard(c2);
で2回500引かれるので、c1.deposit、c2.depositは1000になる。
よって出力結果は
c1.deposit==1000
c2.deposit==1000
となり、c1.deposit==c2.deposit という関係になる。
反省・感想
じっくり考えてみると理解できるのに、テストではできなかった。
次は絶対とる!!{}がない場合の処理をよく覚えておこう。
参考資料
・翔泳社 出版 JOSEPH O'NEIL 著 トップスタジオ 訳 独習Java 第3版
ひとつ前のページに戻る
たいきのぺぇじ☆とっぷに戻る
プログラミング2 Wikiページに戻る