解答例(g050155さん) |
---|
class Circle {//円の面積と円周 public static void main(String[] args) { //半径15の円の面積と円周 System.out.println(15*15*3.14); //面積 System.out.println(15*2*3.14); //円周 //半径3.14の円の面積と円周 System.out.println(3.14*3.14*3.14); //面積 System.out.println(3.14*2*3.14); //円周 } } |
解答例(g050155さん) |
---|
class circle {//円の面積と演習 public static void main(String[] args) { //半径15の円の面積と円周 double principal = 15; //半径 double interest = 3.1415926535; //円周率 double square = principal*principal*interest; System.out.println(square); //表示 double length = principal*2*interest; System.out.println(length); //表示 //半径3.14の円の面積と円周 double principal2 = 3.14; //半径 double interest2 = 3.1415926535; //円周率 double square2 = principal2*principal2*interest2; System.out.println(square2); //表示 double length2 = principal2*2*interest; System.out.println(length2); //表示 } } |
解答例(佐々木俊也さん) |
---|
class Overflow { //桁あふれ public static void main(String[] args) { int i=2000000000; //整数1 int j=2000000000; //整数2 int k=i+j; //kにi+jを代入する(32ビットを越えている) System.out.println(k); } } 実行結果 -294967296 コメント 2の32乗は4294967296。 すなわち、 2000000000+2000000000=4294967296-294967296 である。 つまり、32ビットを越えると、 (正しい値)−4294967296 が表示される。 応用 class Overflow2 { //桁あふれその2 public static void main(String[] args) { int i=2000000000; //整数1 int j=2000000000; //整数2 int k=(i+j)*2; //kに(i+j)*2を代入する(32ビットを越えている) System.out.println(k); } } 実行結果 -589934592 コメント 8000000000+589934592=4294967296*2 であるから、 4294967296の2倍を越えると、 (正しい値)−4294967296*2 (正しい値)−4294967296*2 が表示される。 おそらくその先も同様に続いていくのだろう。 |
解答例(佐々木俊也さん) |
---|
代入する変数の型<-代入する値の型 byte<-short NG byte<-int NG byte<-long NG byte<-float NG byte<-double NG byte<-boolean NG short<-byte OK short<-int NG short<-long NG short<-float NG short<-double NG short<-boolean NG int<-byte OK int<-short OK int<-long NG int<-float NG int<-double NG int<-boolean NG long<-byte OK long<-short OK long<-int OK long<-float NG long<-double NG long<-float NG long<-double NG long<-boolean NG float<-byte OK float<-short OK float<-int OK float<-long OK float<-double NG flaot<-boolean NG double<-byte OK double<-short OK double<-int OK double<-long OK double<-float OK double<-boolean NG boolean<-byte NG boolean<-short NG boolean<-int NG boolean<-long NG boolean<-float NG boolean<-double NG NGのところでは この型は = には不適合です。* から # への変換には明示的なキャストが必要です。 というエラーメッセージが表示されます。 (*:代入する値の型;#:代入する変数の型) ただ、boolean型を代入しようとすると、 この型は = には不適合です。boolean から # への変換はできません。 と表示されます。 逆の場合も、 この型は = には不適合です。* から boolean への変換はできません。 と表示されます。 結論として、 byte⊂short⊂int⊂long⊂float⊂double booleanは特殊のようです。 |
解答例(佐々木俊也さん) |
---|
改良前: baseiの計算には掛け算がi+1回、 demicialiの計算には掛け算が1回ずつ、 (i=0,1,2,…,n-1) 合計(1/2)*n*(n+3)回 改良後: baseiの計算にはi>1の時、掛け算が1回、 i=0の時、掛け算は0回、 demicialiの計算には掛け算が1回ずつ、 (i=0,1,2,…,n-1) 合計2n-1回 改良により、(n*n-n+2)/2回分掛け算が減ったことになる。 |
解答例(佐々木俊也さん) |
---|
練習2-6 class DecimalToBits { public static void main(String[] args){ //10進数から2進数に byte decimalNumber=123; //与えられた10進数の値 /* この処理方法では127までしか扱えないのでbyte型で宣言しています。 */ int bit0=decimalNumber % 2; //0桁目(最後の桁)を求める /*元の数を2で割った余りが最後の桁*/ int rest0=(decimalNumber-bit0)/2; //商を求める int bit1=rest0 % 2; //1桁目を求める int rest1=(rest0-bit1)/2; int bit2=rest1 % 2; //2桁目を求める int rest2=(rest1-bit2)/2; int bit3=rest2 % 2; //3桁目を求める int rest3=(rest2-bit3)/2; int bit4=rest3 % 2; //4桁目を求める int rest4=(rest3-bit4)/2; int bit5=rest4 % 2; //5桁目を求める int rest5=(rest4-bit5)/2; int bit6=rest5 % 2; //6桁目(先頭桁)を求める //表示 System.out.println("10進数"+decimalNumber+"を2進数で表すと"+ bit6+bit5+bit4+bit3+bit2+bit1+bit0+"です。"); } } 実行結果 10進数123を2進数で表すと1111011です。 コメント 10進数を2進数にするときに筆算でやるやり方を元にしています。 この方法の欠点は、 127までしか適用できない ということです。 計算回数を増やせば対応はできますが、 与えられる10進数の値が分からないときはこの方法では不可能です。 別の方法を考えなければいけません。 また、与えられる値が分かっていても、 例えばint decimalNumber=2000000000; などだったりすると、 30回も繰り返さなければならないので大変めんどうです。 また、余りを与える演算子%の答えはint型のようです。 |