☆課題☆
オフライン試験のQ23〜Q38のついて考察せよ。
コードと実行結果を示し、各問について考察すること。
Q23
class Test23 {
public static void main(String[] args) {
int x,y;
x = 100; x +=1; x--; y = 200 + x;
System.out.println(y++);
}
}
実行結果
300
考察
x=100
x=100+1
x=101-1
y=200+x(100)
y++は後置きのインクリメントなので出力するときにはインクリメントされない。
Q24
class Test24 {
public static void main(String[] args) {
int a=0, x=0;
a=5; a +=3; x = ++a;
System.out.println(x);
}
}
実行結果
9
考察
a=0,x=0
a=5
a=5+3
x=a+1
x=9
Q25
class Test25 {
public static void main(String[] args) {
int a=9, b=3;
a /= b;
System.out.println(a %= b);
}
}
実行結果
0
考察
a=9,b=3
a=9/3
3/3の余りを出力。
Q26
class Test26 {
public static void main(String[] args) {
int i, j;
for(i=0, j=0; i<3; i++) ++j;
System.out.println(i * j);
}
}
実行結果
9
考察
iが3以下のときiとjに1を足す。
i*j=3*3=9
Q27
class Test27 {
public static void main(String[] args) {
int i=2;
while(i-- > 0) System.out.print(i);
}
}
実行結果
10
考察
i=2
i(2)が-1されて1が出力。その次i(1)が-1されて0が出力。
0でwhile文から抜ける。
Q28
class Test28 {
public static void main(String[] args) {
int num=10000;
for(int i = 0; i < 4; i++) num >>= i;
System.out.println(num);
}
}
実行結果
156
考察
num=10000
i=0
iが4未満ならi+1
numを右方向にiだけシフト。注意点は2進数だと言う事。
i=1,num=5000
i=2,num=1250
i=3,num=156
i=4になるとfor文から抜ける。
num(156)が出力。
Q29
class Test29 {
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
考察
num=0
i=1、iが10以下ならばiに1を足す。num+1をiで割り切れたらnum+1。
でもiとnumは同時に増えているので、num=10+1で11になり、
さらに+1されたものが出力される。
Q30
class Test30 {
public static void main(String[] args) {
int a = 9;
if(a++ != 10 | a++ == 10) a++;
System.out.println(a);
}
}
実行結果
12
考察
9!=10よってインクリメント
10==10よってインクリメント
これが真だから12が出力。
Q31
class Test31 {
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文、iから始まり、5未満ならiに1を足す。
i=0
i=1
i=2
i=3
i=4
Hello
が出力。
Q32
class Test32 {
public static void main(String[] args) {
int i;
for( i= 0; i < 9; i +=3){}
System.out.println(i);
}
}
実行結果
9
考察
i=0からはじまり9になるまで3を足す。
9が出力。
Q33
class Test33 {
public static void main(String[] args) {
for( int i = 0; i < 8; i ++){
System.out.println(i);
i += 3;
}
}
}
実行結果
0
4
考察
i=0,iが8未満ならiに1を足す。0が出力。
i+3されて4がfor文のなかに入り、4が出力。
+1されて+3されて8になり、for文から抜ける。
Q34
class Test34 {
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文のsayHelloで1回、その後にiに3が入ってhelloを3回。
合計4回出力。
Q35
class Test35 {
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
考察
staticなので共有。
num=0,id=0
Player p1 = new Player();
Player p2 = new Player();
クラスPlayerをTest35のクラスで使えるようにしている。
p1.id=1000
p2.id=2000
p1の中のnumに+1000
p2の中のnumに+2000
0+1000+2000=3000
Q36
class Test36 {
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
考察
35と同じ流れ。
p1.num==とp2.num==をただ出力してnumの値を入れている。
Q37
class Test37 {
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
考察
35と大体同じ部分はいいとして…
c1.deposit=1000
c2.deposit=2000
c3.deposit=3000
そしてこのときc1=c3なのでc1.deposit=3000
3000+2000+3000=8000が出力。
Q38
class Test38 {
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);
System.out.println(c2.deposit);
}
}
class Card{ int deposit; }
class Bank{
public static void useCard(Card c){
c.deposit -= 500;
}
}
実行結果
1000
1000
考察
出力部分がないので出力部分を足して実行した。
c1.deposit=1000
c2.deposit=2000
このとき、c2=c1なのでc1.deposit=2000
クラスBankに入りc1=2000-500=1500
このときc2も同じ値になる。
そしてc2も同様にBankに入り、c2.deposit=1500-500=1000
これがc1に入り同じ値になる。
そして両方1000が出力される。
感想
考えるというより作業だった。なぜこうなるのかと考えるのはよかったけどソースを書くのが長過ぎる…。
めんどくさいこと山のごとしでした。
今回は早めにやってよかった。