Programming II Report#4

 ProgramingII Report#3 <- TOP -> ProgramingII Report#5


課題内容
  1. オフライン試験のQ23〜Q38のついて考察せよ。

~ 目次 ~

  1. 「オフライン試験のQ23〜Q38のついて考察せよ。」について
  2. 1-1. 入力ソース
  3. 1-2. 実行結果
  4. 感想

1.「オフライン試験のQ23〜Q38のついて考察せよ。」について

1-1.入力ソース

Q23 ~ Q33

public class test {

	public static void main(String[] args) {
		Mon23_33 mon = new Mon23_33();
		mon.q23();
		mon.q24();
		mon.q25();
		mon.q26();
		mon.q27();
		mon.q28();
		mon.q29();
		mon.q30();
		mon.q31();
		mon.q32();
		mon.q33();
	}
}

class Mon23_33 {
	
	void q23(){
		int x,y;
		x = 100; x += 1; x--; y = 200 + x;
		System.out.println("q23\t"+y++);
	}
	
	void q24(){
		int a=0,x=0;
		a=5; a += 3; x = ++a;
		System.out.println("q24\t"+x);
	}
	
	void q25(){
		int a=9,b=3;
		a /= b;
		System.out.println("q25\t"+(a %= b));
	}
	
	void q26(){
		int i,j;
		for(i=0,j=0; i<3; i++) ++j;
		System.out.println("q26\t"+(i*j));
	}
	
	void q27(){
		int i=2;
		System.out.print("q27\t");
		while(i-- > 0)System.out.print(i);
	}
	
	void q28(){
		int num=10000;
		for(int i = 0; i< 4; i++)num >>=i;
		System.out.println("\nq28\t"+num);
	}
	
	void q29(){
		int num=0;
		for(int i=1; i<= 10; i++){
			if(++num % i==0) num++;
		}
		System.out.println("q29\t"+(++num));
	}
	
	void q30(){
		int a=9;
		if(a++ != 10 | a++ == 10) a++;
		System.out.println("q30\t"+a);
	}
		
	void q31(){
		System.out.print("q31");
		for(int i=0; i<5; i ++)
			System.out.println("\ti == " +i);
		System.out.println("\tHello");
	}
		
	void q32(){
		int i;
		for(i=0; i<9; i += 3){}
		System.out.println("q32\t"+i);
	}
	
	void q33(){
		System.out.print("q33");
		for(int i = 0; i<8; i++){
			System.out.println("\t"+i);
			i += 3;
		}
	}
}

Q23では、xに100を代入した後にxをインクリメントし、次にxをデクリメントする。
その後に、yにx+200を代入している。「100 + 1 - 1 + 200」という計算をしてい
るので、出力は、「300」になる。

Q24では、まず、aに5を代入した後にaを3づつインクリメントする。その後にaを1づ
つインクリメントした値をxに代入する.「5 + 3 + 1」という計算をしているので、
出力は「9」になる。

Q25では、 aをbで割った値をaに代入する。そして、その値をまたbで割るその余りを返す。
「9 / 3 → a , 3 / 3」という計算をしているので、出力では「0」になる。

Q26では、iが3より小さいときjをインクリメントしている。どちらとも1づつなので
iが3になったときif文を抜けるのでjも3である。「(1 + 1 + 1)×(1 + 1 + 1)」を
行っているので出力では「9」になる。

Q27では、最初にiに2を代入し、そしてwhile文でもってiをデクリメントしていき0よ
り大きい値のときwhile文は実行されるので「2 - 1 = 1,1 - 1 = 0」という命令を
実行するので出力は「1と0」である。

Q28ではまず、numに代入されている値10000を4回右にビットシフトしている。(2進数で)

1回目「10011100010000を右に0ビットシフトする=>10011100010000」
2回目「10011100010000を右に1ビットシフトする=> 1001110001000」
3回目「10011100010000を右に2ビットシフトする=>   10011100010」
4回目「10011100010000を右に3ビットシフトする=>      10011100」
for文を出たときには「10011100010000 が 10011100 にビットシフトされる」つま
なので出力は「156」である。

Q29ではfor内のifステートメントにおいて、変数numをインクリメントした値が変数iの値で割り切れるかどうかを判断し、そうであればnumを更にインクリメントする。その様子を以下に示す。
                num =  0
for  1: i =  1, num =  1, num = 2
for  2: i =  2, num =  3
for  3: i =  3, num =  4
for  4: i =  4, num =  5
for  5: i =  5, num =  6
for  6: i =  6, num =  7
for  7: i =  7, num =  8
for  8: i =  8, num =  9
for  9: i =  9, num = 10
for 10: i = 10, num = 11 (, i = 11)
最後に、println( )メソッドで出力される前に変数numの値はインクリメントされるので、出力される値は「12」になる。

Q30では「a++ != 10」は真を返す。そのあとにaをインクリメントする。
次の「a++ == 10」でもa+1をされた状態であるから真を返す。そしてまたa+1をした後、a+1をする。
なので、出力は「12」になる。

Q31では、iが5以下のとき、そのときのiの値を出力し。for文を抜けると「Hello」を出力します。

Q32ではfor文でiを3づつインクリメントし、9より大きくなったらfor文を抜け、そのときのiの値
を出力します。なので出力は「9」になります。

Q33では、変数iの値は始め0で、最初のprintln( )メソッドでは「0」が出力される。その後、変数iは「i += 3」すなわち「i = i + 3 = 3」となり、forステートメントの最後を通過する時に更にインクリメントされ、4になる。これが2回目のprintln( )メソッドで出力されるので、結果として全体の出力は「0」「4」となる。println( )なので改行コードを含む。

Q34

public class q34 {
	public static void main(String args[]){
		int i=0;
		System.out.print("Q34");
		for( sayHello(); i<=6 ;i += 3){
			sayHello();
		}
	}
	
	static void sayHello(){
		System.out.println("\tHello");		
	}
}

この問題ではまず、4行目のfor文内、初期設定の部分でsayHello( )メソッドが呼び出されている。
そして、「i = 0」、「i = 3」、「i = 6」の時にもsayHello( )メソッドが呼び出されるので、合
計4回「Hello」が出力される。

Q35

public class q35{
	public static void main( String args[]){
		Player p1 = new Player();
		Player p2 = new Player();
		p1.id = 10000;
		p2.id = 20000;
		p1.num += p1.id;
		p2.num += p2.id;
		System.out.println("Q35\t"+Player.num);	
	}
}
class Player{
	int id = 0;
	static int num = 0;
}

この問題では、Playerクラスで宣言されている変数numは「static」なので、オブジェクトp1、p2で共有されている。
変数numの値は「p1.num += 1000」「p2.num += 2000」の処理で3000まで増加するので、出力される値は「3000」
となる。

Q36

public class q36 {
	public static void main(String[] args) {
		Player p1 = new Player();
		Player p2 = new Player();
		p1.id = 10000;
		p2.id = 20000;
		Player.num += p1.id;
		Player.num += p2.id;
		System.out.println("Q36\tp1.num == "+p1.num);
		System.out.println("\tp2.num == "+p2.num);
	}
}
class Player{
	int id = 0;
	static int num = 0;
}

この問題ではクラス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

public class q37 {
	public static void main(String[] args) {
		Card c1 = new Card();
		Card c2 = new Card();
		Card c3 = c1;
		c1.deposit = 10000;
		c2.deposit = 20000;
		c3.deposit = 30000;
		int sum = c1.deposit + c2.deposit + c3.deposit;
		System.out.println("Q37\t"+sum);
	}
}
class Card{
	int deposit;
}

この問題では、オブジェクトc1とc3は共有されるので、「c1.deposit = c3.deposit = 3000」である。
なので、「sum = 3000 + 2000 + 3000」から、出力される値は「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);
		System.out.println("Q38\tc1 = "+c1.deposit);
		System.out.println("\tc2 = "+c2.deposit);
		/* A */
	}
}
class Card{int deposit;}
class Bank{
	public static void useCard(Card c){
		c.deposit -= 500;
	}
}

この問題では、Card c2 = c1であるからc2とc1は同じものと考える。「c1.deposit =1000;」で「c2.deposit」
も1000になる。「c2.deposit =2000;」で「c1.deposit」も2000になる。
Bank.useCard( c1 );
Bank.useCard( c2 );
で二回500引かれるので「c1.deposit,c2.deposit」は1000になる。
よって出力結果は
「c1.deposit==1000 c2.deposit==1000」である。
よって、「c1.deposit == c2.deposit」という関係になる。


1-2. 実行結果
Q23 ~ Q33
q23	300
q24	9
q25	0
q26	9
q27	10
q28	156
q29	12
q30	12
q31	i == 0
	i == 1
	i == 2
	i == 3
	i == 4
	Hello
q32	9
q33	0
	4
Q34
Q34	Hello
	Hello
	Hello
	Hello
Q35
Q35	30000
Q36
Q36	p1.num == 30000
	p2.num == 30000
Q37
Q37	80000
Q38
Q38	c1 = 1000
	c2 = 1000

2. 感想
課題そっちのけでビリヤードをしていたら、焦っていました。そのことに後悔はしていませんが、とてもきつかったです。
最近寝るのが不規則でとても体がだるく感じます。疲れました。