dポイントプレゼントキャンペーン実施中!

Javaのeval関数処理

はじめまして、こんばんわ。
いつも利用させて頂いております。
現在、Javaの課題を出されており、InputStreamを使って、1行の四則計算のプログラムを作成しております。
もうすこしで成功!!っというところで、減算の処理がDoubleでキャストしたときに例外として処理されてしまうため、非常に困っております。
もしよろしければどなたかご教授おねがいします。
protected String startCalc(String numerical)
{
// 初期値を設定
double addVal = 0;
double minusVal = 0;

while (true)
{
String val;

// 加算演算子の位置を検索
int addPosition = numerical.indexOf("+");

if (addPosition < 0)
{
val = numerical;
}
else
{
// 加算の演算子の前の式
val = numerical.substring(0, addPosition);
}

// 乗算、除算の計算を行う
addVal += procCalc(val);

if (addPosition < 0)
{
break;
}
else
{
// 加算の演算子の後の式
numerical = numerical.substring(addPosition + 1);
}
}

return new DecimalFormat("0").format(addVal + minusVal);
}
private double procCalc(String numerical)
{
// 乗算、除算の初期値を設定
double valNum = 1;

while (true)
{
String mNum = "";

// 乗算の演算子の位置を取得
int multiPosition = numerical.indexOf("*");

if (multiPosition < 0)
{
mNum = numerical;
}
else
{
// 乗算の前の式を抜き取る
mNum = numerical.substring(0, multiPosition);
}

int kai = 0;

double value = 1;

while (true)
{
String dNum = "";

int dPosition = mNum.indexOf("/");

// "/"がない場合
if (dPosition < 0)
{
dNum = mNum;
}
else
{
// 最初の / より前の項
dNum = mNum.substring(0, dPosition);
}

// 最初の計算の場合
if (kai == 0)
{
value = Double.parseDouble(dNum);// TODO マイナスの場合、ここで例外
}
else
{
value /= Double.parseDouble(dNum);
}

// "/"がない場合
if (dPosition < 0)
{
break;
}
else
{
kai++;

// 最初の / より以降の項
mNum = mNum.substring(dPosition + 1);
}
}

valNum *= value;

// "*"がない場合
if (multiPosition < 0)
{
break;
}
else
{
// 乗算の演算子の位置を取得
numerical = numerical.substring(multiPosition + 1);
}
}

return valNum;
}
}

A 回答 (3件)

#1です。

言い方がまずかったかな?

演算子「 - 」の処理が何処にも書いてないのではないでしょうか?
たとえば、減算演算子の位置を検索している部分はどこでしょうか。

>dNumの値を表示というとコンソール上に数値を表示させる?という意味でしょうか。
ええ、コンソールに表示しても構いません、要するにdNumの値がわかればいいのです。
#「String dNum = "";」と定義してあるから文字列ですけども・・

>確かに2-2が入ってきます。がしかし、その例外部分で減算処理をしてしまうと、
そりゃ、減算処理をやる位置がまずいのです。
加算演算子(+記号)の前後で分割して、前+後を計算しているのに、
減算演算子(-記号)の前後で分割して、前-後を計算していないから、
乗除算のルーチンで例外が発生しているのです。
    • good
    • 0

たとえば 2-2 を入力すると例外が送出されますが、


このときの Double.parseDouble(dNum); の dNum には
"2-2" が入ってませんか?
減算の処理ができてないように見えるんですけど。

この回答への補足

確かに2-2が入ってきます。がしかし、その例外部分で減算処理をしてしまうと、

3 + 5 - 1 * 9とかの計算でおかしな答えが算出されてしまいます。

補足日時:2010/03/07 18:46
    • good
    • 0

double minusVal = 0;


に計算結果が設定されていないのではありませんか?

>value = Double.parseDouble(dNum); // TODO マイナスの場合、ここで例外
のところで、dNumの値を表示してみればいかがでしょうか。

この回答への補足

ご回答ありがとうございます。

>value = Double.parseDouble(dNum); // TODO マイナスの場合、ここで例外
のところで、dNumの値を表示してみればいかがでしょうか。

>double minusVal = 0;に計算結果が設定されていないのではありませんか?
処理的にまだ完成していない為、この変数はまだ使用していません

>value = Double.parseDouble(dNum); // TODO マイナスの場合、ここで例外
のところで、dNumの値を表示してみればいかがでしょうか。

dNumの値を表示というとコンソール上に数値を表示させる?という意味でしょうか。

ちなみにvalue = Double.parseDouble(dNum)部分に、NumberformatExceptionを追加して減算処理を追加すると、計算の順序がずれてしまいます。

補足日時:2010/03/07 14:11
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!