Report4
学籍番号→065726D
名前 →久貝卓矢
課題 オンライン試験のQ23〜38について考察せよ。
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に1を加え、その後すぐに1を引く。
この時点でx=100となっているのでy=200+xは200+100=300となる。
出力には[y++]となっているが、これは実行後にインクリメントなので、ここ
では影響しない。
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);
}
}
考察
a1に5を代入、そしてa1 + 3をしているのでa1 == 8。
x2に代入する値は++a1なので、a1に+1する値になる。
よって、出力される値は9 。
Q25
public class q25 {
public static void main(String[] args){
int a = 9, b = 3;
a /= b;
System.out.println(a %= b);
}
}
考察
a2にa2 / b1の値、つまり3を代入している。
「a2 %= b1」の値を出力するのだから(%は剰余)出力される値は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(i=0,j=0;i<3;i++)++j;はi<3の場合++j;を実行する繰り返しの命令である。
iのインクリメントは++j;が実行された後に実行されるため
System.out.println(i * j);を実行するときには、i=3,j=3となるため実行結果
は9となる。
Q27
public class q27 {
public static void main(String[] args){
int i=2;
while(i-- > 0) System.out.print(i);
}
}
考察
iを2と宣言する。
iが0より大きいときに処理が行われる。
よってこのwhile文が行われるのはi=2,i=1の2回である。
実行ごとにデクリメントされたiが出力され、printlnなので改行もされる。
つまりi=2のとき出力は1、改行され、i=1のとき出力は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);
}
}
考察
num >>= i;はnum=num>>i;と同じ意味なのでfor文を繰り返すと結局num>>6と い
う意味になる。num=10000;なので2進数で表すと10011100010000となる。これ
を右に6桁ずらすので10011100となり10進数で156となるため実行結果は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);
}
}
考察
変数iの値は1から10まで、"++num"の意味はnum+1であるから、num=1の時だ
け"++num % i == 0"の条件に合う。for文によって、変数numの値は2から11
までになる。したがって、"num++"により、最後の実行結果は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++ != 10は後置きインクリメントnなので 9! = 10、a++ == 10
も後置きインクリメントなので 10 ==10なので真になる。
11になったあとにインクリメントするのでa=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の値を出力するまでがfor文の内容。for文に{}がない時は次のセミ コ
ロン(;)までを{}内と見なす。System.out.println("Hello")は{}外にあるので 1
回しか表示されない。printlnはfor文が最後まで実行された後に1度だけ実行
される。
Q32
public class q32 {
public static void main(String[] args){
int i;
for( i = 0; i < 9; i +=3){}
System.out.println(i);
}
}
考察
for文でi<9の間i+=3を繰り返す。for文の{}の中には何も入ってないのでこれ は
i+=3をしていく。したがってi=9が出力される
Q33
public class q33 {
public static void main(String[] args){
for( int i = 0; i < 8; i ++ ){
System.out.println(i);
i +=3;
}
}
}
考察
q33=0 q33=4 問33はfor文と演算子の複合問題である。このソースコードは「 i
< 8 なら i を出力して i = i + 3 をし終わってから i = i + 1をする」という
意味である。従って、このループは
1回目 0 < 8 → 0を出力 i = 0 + 3 = 3 → i = 3 + 1 = 4
2回目 4 < 8 → 4を出力 i = 4 + 3 = 7 → i = 7 + 1 = 8
3回目 i !< 8 なのでループ終了
という様になる。よって出力結果は 0 4 なる。
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");
}
}
考察
for文の中のsayHello();は"Hello"を表示するメソッド
(mainメソッドの下で 定義している)。forの初期化
セクションで最初にsayHello();が呼び出され る。そ
の次からループが始まり,3回ループする(iが0、3,9と増えるため)。
よって4回"Hello"が表示される。
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;
}
考察
問35はクラスの呼び出しについての問題である。まず
Playerクラスを見てみるとnum を定義する際に static
が用いられている。このおかげでPlayerを新しくよ
びだしても以前の値が保存される。 よって、
p1.num += p1.id → num = 0 + 1000 = 1000
p2.num += p2.id → num = 1000 + 2000 = 3000
よって出力結果は 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もp2.numも同じPlayerのnum を
参照する(staticがついているため)ので、p1.numも
p2.numも同じ。
Q37
public class q37 {
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;
}
考察
c1のdepositに1000を,c2のdepositに2000を,c3の
deposit(c1のそれと同じ) に3000を代入している。
sumはc1.deposit + c2.deposit + c1.depositと考え
られるので,sum=8000。 よって出力は8000。
Q38
public class q38 {
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;}
}
考察
Bank.useCard();は()の中に入れた値を−500してdepositに
代入する。つま りc1とc2を入れるという事は、2回−500
するという事である。よってA の時点でc1.depositと
c2.depositは等しい。
感想
分からないところがけっこーあったので、今回のレポートを
機会にしっかり学習することができたのでよかった。あまり
点数がよくなかったので期末ではもっと解けるようにしたい。