ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

Java質問&情報提供サイトコミュの二次方程式の解を求める問題

  • mixiチェック
  • このエントリーをはてなブックマークに追加
JAVA初心者です、ご助力お願いします。

【問題】
コマンドラインから入力された3つの整数a,b,cを係数とする次の2次方程式の解を求める。
2次方程式:axの2乗 + bx + c = 0

仕様
以下のとおり、2次方程式の解を求める。ただし、a,b,cはそれぞれコマンドラインから入力された1,2,3番目の引数をfloat型に変換した値である。これらの変数を含めて、計算に必要な変数はfloat型を仕様する。
a=0のとき
b=0かつc=0:解は不定
b=0かつc≠0:解は不能
b≠0:x=-c/b
a≠0のとき(以下、d=(bの2乗)-4ac
d>0:解は異なる実数解。解の公式より求める。
d=0:解はひとつの実数解。x=-b/(2a)
d<0:解は複素数解[実数部:-b/(2a)、虚数部:-d/(2a)]
ヒント:2乗根=Math.sqrt(値)

コメント(4)

「仕様」のところに書いてある通りにコードを組めば良いのでは…?

それとも正解(動作するやつ)をそっくりそのまま書いてほしいということなんでしょうか。
class Nijihouteisiki3 {
public static void main ( String[] args ){
float a,b,c,d,heihoukonn ;

if ( args.length == 3 ){
a = Float.parseFloat( args [ 0 ] );
b = Float.parseFloat( args [ 1 ] );
c = Float.parseFloat( args [ 2 ] );

System.out.println( a+"x^2"+b+"x"+c+"= 0 の解を求める" );


if ( a == 0 ){
if ( b == 0 ){
if ( c == 0 ){
System.out.println( "解は不定" );
}else{
System.out.println( "解は不能" );
}
}else{
System.out.println( "x = "+ (-c / b)) ;
}
}else{
d = b * b - 4 * a * c ;
if ( d > 0 ){
heihoukonn = ( float )Math.sqrt( d ) ;
System.out.println( "x = "+ ( float )( ( -b + heihoukonn ) /2/a )+ " , "
+ ( float )( ( -b - heihoukonn ) / 2 / a )) ;
}else{
if ( d == 0 ){
System.out.println( "x = " + ( float )( -b /2/a ) );
}else{
heihoukonn = ( float )Math.sqrt( -d ) ;
System.out.println( "x = "+ ( float )(-b /2/a) +" + " + ( float )( heihoukonn /2/a ) + "i"
+ " , " + " + " + ( float )( -b /2/a ) + " - " + ( float )( heihoukonn /2/a ) + "i" ) ;
}
}
}
}else{
System.out.println( "入力するパラメータは3つです" );
}
}
}


C:\Documents and Settings\sys1\java>javac Nijihouteisiki.java

C:\Documents and Settings\sys1\java>java Nijihouteisiki
入力するパラメータは3つです

C:\Documents and Settings\sys1\java>java Nijihouteisiki 5 5 5
5.0x^25.0x5.0= 0 の解を求める
x = -0.5 + 0.86602545i , + -0.5 - 0.86602545i

C:\Documents and Settings\sys1\java>java Nijihouteisiki 0 0 0
0.0x^20.0x0.0= 0 の解を求める
解は不定

C:\Documents and Settings\sys1\java>java Nijihouteisiki 0 0 1
0.0x^20.0x1.0= 0 の解を求める
解は不能

C:\Documents and Settings\sys1\java>java Nijihouteisiki 0 1 1
0.0x^21.0x1.0= 0 の解を求める
x = -1.0

C:\Documents and Settings\sys1\java>


C:\Documents and Settings\sys1\java>javac Nijihouteisiki.java

C:\Documents and Settings\sys1\java>java Nijihouteisiki
入力するパラメータは3つです

C:\Documents and Settings\sys1\java>java Nijihouteisiki 5 5 5
5.0x^25.0x5.0= 0 の解を求める
x = -0.5 + 0.86602545i , + -0.5 - 0.86602545i

C:\Documents and Settings\sys1\java>java Nijihouteisiki 0 0 0
0.0x^20.0x0.0= 0 の解を求める
解は不定

C:\Documents and Settings\sys1\java>java Nijihouteisiki 0 0 1
0.0x^20.0x1.0= 0 の解を求める
解は不能

C:\Documents and Settings\sys1\java>java Nijihouteisiki 0 1 1
0.0x^21.0x1.0= 0 の解を求める
x = -1.0

C:\Documents and Settings\sys1\java>java Nijihouteisiki 1 4 4
1.0x^24.0x4.0= 0 の解を求める
x = -2.0

C:\Documents and Settings\sys1\java>java Nijihouteisiki 1 -1.3 -8
1.0x^2-1.3x-8.0= 0 の解を求める
x = 3.552154 , -2.2521544

C:\Documents and Settings\sys1\java>java Nijihouteisiki 0 5.8 -49
0.0x^25.8x-49.0= 0 の解を求める
x = 8.448276

C:\Documents and Settings\sys1\java>java Nijihouteisiki 3 0 8
3.0x^20.0x8.0= 0 の解を求める
x = -0.0 + 1.6329932i , + -0.0 - 1.6329932i

C:\Documents and Settings\sys1\java>


ご迷惑おかけしました。ご指摘よろしくお願いします。
>ご指摘よろしくお願いします。

質問内容が結局、明記されてません。
全部読んで、おかしいかどうか判断して欲しいということです?
どこらがおかしいと思うから質問しているのかを明記して欲しいです。

おそらく、表示とa≠0の計算ですかね。


System.out.println( a+"x^2"+b+"x"+c+"= 0 の解を求める" );

5.0x^25.0x5.0= 0 の解を求める

  ↓ 5x^2 + 5x + 5 = 0 の解を求める にしました

StringBuffer sb = new StringBuffer();
sb.append(args[0]);
sb.append("x^2 + ");
sb.append(args[1]);
sb.append("x + ");
sb.append(args[2]);
sb.append(" = 0 の解を求める");

System.out.println(sb.toString());

可読性、メモリ、処理速度の点から文字列自体の多数の連結はやめた方がよいと思います。
5.0x^2 + 5.0x + 5.0 = 0 にするのであればargs[n]→a,b,cにしてください。


System.out.println( "x = "+ ( float )(-b /2/a) +" + " + ( float )( heihoukonn /2/a ) + "i"
+ " , " + " + " + ( float )( -b /2/a ) + " - " + ( float )( heihoukonn /2/a ) + "i" ) ;

x = -0.5 + 0.86602545i , + -0.5 - 0.86602545i

 ↓ x = -0.5 + 0.86602545i , -0.5 - 0.86602545i

final float zitu = -b / (2f * a);
final float kyo = heihoukonn / (2f * a);

sb.delete(0, sb.length());
sb.append("x = ");
sb.append(zitu);
sb.append(" + ");
sb.append(kyo);
sb.append("i , ");
sb.append(zitu);
sb.append(" - ");
sb.append(kyo);
sb.append("i");

System.out.println(sb.toString());

 ↓ x = -0.5±0.86602545i (ついで)

sb.delete(0, sb.length());
sb.append("x = ");
sb.append(zitu);
sb.append('\u00b1');
sb.append(kyo);
sb.append("i");

に変更


仕様に沿うだけであれば以上だと思います。
沿わない話ですと、気になるのは例外処理。

文字列をfloatにする際に、文字列がfloatでない場合のParseExceptionくらいは処理すべきです。

他は、整形くらいかな。
実部の0.0は表示すべきかどうか、実部も虚部も整数値である場合は小数点(.0)を表示すべきかどうか。

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

Java質問&情報提供サイト 更新情報

Java質問&情報提供サイトのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング