アプリ版:「スタンプのみでお礼する」機能のリリースについて

こんにちは。趣味でプログラミングをしているものです。
さっそくですが、質問させていただきます。

文具店などで千円くらいで販売している電卓を再現しようとしているのですが、
コーディングが終わり、動作を確認しているのですが
やはり、多くの不具合が出ていて、修正しようとしているのですが、
その中で、すこし奇妙に思えるようなものが発生してしまいました。

電卓で計算した結果の文字列を表示桁数に収めるようにする、
あるいは桁のあふれがあった場合、例外を投げる、というメソッド
において、

単純な条件分岐を判定しない、というもののように思えるのですが、
以下にその抜粋したものを説明させていただきます。

seisu_length = len - 1;

// test statement
System.out.println( "seisu_length2 is " + String.valueOf( seisu_length ));
System.out.println( seisu_length > 12 );
//

if( (seisu_length > 12) ) //(ア)
{
gap = seisu_length - 12;
overflag = true;
retstring = retstring.substring( 0, 12 );
//test statement
System.out.println( "(4)" );
//
}
len int 計算結果を表す文字列のlength()により、長さを格納

seisu_length int 整数部分の桁数、再現しようとしている電卓が
整数部分の桁数で表示桁のあふれを判定しているので

gap int 再現しようとしている電卓が、あふれている桁数の情報を
         答えの文字列の先頭から数えたインデックスにドットを
挿入するので

overflag boolean 桁あふれの場合の処理に移るためのフラグ

retstring String 表示桁数分の計算結果の文字列
このメソッドの戻り値

test statement は変数の値をみたり、このブロックに到達しているのか
確認しています。

上記の(ア)の部分の判定で ブロック内部に移らないのですが
コードに誤りはないように思えるのですが
eclipse に不具合が発生している、
ということでしょうか?
eclipse をふたたびインストールというか
解凍して配置したほうがよいのでしょうか?

ご存知のかた、教えていただけないでしょうか?
よろしくお願いします。

A 回答 (3件)

以前も書きましたが、seisu_lengthの値が説明の通りかわからないので、開示してください。


判定は合っているので、取得している部分がおかしいように思えます。

それとも
> System.out.println( "seisu_length2 is " + String.valueOf( seisu_length ));
> System.out.println( seisu_length > 12 );
上記のコードは、
> seisu_length2 is 13
> true
とか出力されるのでしょうか?せっかくSystem.outを入れているので、情報がほしいです。

あと、
> retstring = retstring.substring( 0, 12 );
これもおかしいように思います。電卓ならば、
先頭文字列を残すのではなく、末尾文字列を残すのではないでしょうか?
    • good
    • 0
この回答へのお礼

さっそく回答していただきありがとうございます。
説明不足ですいません。
計算の経過を説明させていただきます。
電卓を起動し
オペランド A, B にそれぞれ、
"123456789123.", "10." の引数をコンストラクタに
与えて BegDecimal 型のインスタンスを生成し
オペレータ は 掛け算なので、multiply によって
結果を得ました。
結果から文字列を得て( "1234567891230" )
小数ではないので末尾にドットを追加してから
この文字列を問題のメソッドの引数にして
文字列の加工に移りました。
この時点での文字列の長さは 14 です
最大表示桁数は12 なのでドットを加えて長さ13 の
文字列を得たいとしています。

抜粋して示したところの出力の内容を
示させていただきます。
--------------------------------
出力結果
from validControl len is 14
from validControl "・"is len-1 ? : true
seisu_length2 is 13
true
--------------------------------
説明不足ですいませんでした。
そうです、
true が表示されるのですが
if 文のブロック内部に処理が移らないみたいなのです。
処理が移っていればブロック内部の(4)が
出力されるはずなのですが...
retstring の加工についてはあとでできると思うのですが
恐れ入りますが、if のブロックに移らないことについて
ご存知であれば教えていただけないでしょうか?
やはり、eclipse に不具合が出ている、ということでしょうか?
よろしくお願いします。

お礼日時:2013/01/08 22:55

まず、処理の流れを確定することからはじめましょう。


今は、
「表示されない」
→ブロックが実行されていない
という判断をされているかと思いますが、何らかの理由で表示されていないことも考えられるので、
実行の判断は、あくまでも表示された事実に基づくのがいいかと思います。

具体的には、次の2点を直して実行してみて下さい。

1:問題箇所のifに対するelseブロックを追加、メッセージを表示。
2:ifブロック内のメッセージ表示を、ブロックの最初にする。


これにより、どこを通っているか、またはそもそもここまで来ていないかが確定します。
    • good
    • 0
この回答へのお礼

回答していただきありがとうございます。
ご指摘していただいた内容を受けて
以下のように問題の部分を変更しました。
まず、ブロック内部の test statement をブロック先頭にもってきたら
(4) が出力されましたので、ブロック内部には移っていることが
わかりました。
そして、substring のところがおかしいことに気づきました。
retstring はメソッド内の冒頭で宣言し
仮の初期値として、""; を与えていました。
このメソッドに渡す仮引数は value としているのですが、
計算結果の文字列を加工したものを retstring に格納するのですから
retstring = value.substring( index, index ) とするべきでした。

---------------------------------------------
seisu_length = len - 1;

// test statement
System.out.println( "seisu_length2 is " + String.valueOf( seisu_length ));
System.out.println( seisu_length > 12 );
//

if( seisu_length > 12 )
{
//test statement
System.out.println( "(4)" );
//
gap = seisu_length - 12;
overflag = true;
retstring = value.substring( 0, 12 );
// 以前の内容
retstring = retstring.substring( 0, 12 );
//

}
---------------------------------------------

上記のように修正したところ、
期待どおりの例外処理に移りました。
今回質問させていただいたところは解決しましたので
質問を終了させていただきます。
貴重な時間をさいての回答、ありがとうございました。

お礼日時:2013/01/09 06:49

「ブロック内部に移らない」と思った根拠はなんですか?



System.out.println( seisu_length > 12 );
がtrueを出力するなら、このifの条件も真のはずです。

気になるのは、これがプログラムそのままなのか、ということです。
単純にコピー→ペーストしたものなのか、その後、書き直したものなのか。

System.out.println( seisu_length > 12 );
の後から(ア)までの間で値が変化するようなことはないか、

ifの中が、括弧が二重になっていますが、本来は
if( (seisu_length > 12) && (なにか別の条件) ) //(ア)
とかになっていないか?

「例外を返す」とありますが、正常に期待通りの例外だけが返ってますか?
ifの中で例外発生しているとかはないですか?
    • good
    • 0
この回答へのお礼

回答していただきありがとうございます。
ご指摘していただいた内容を受けて
以下のように問題の部分を変更しました。
まず、ブロック内部の test statement をブロック先頭にもってきたら
(4) が出力されましたので、ブロック内部には移っていることが
わかりました。
そして、substring のところがおかしいことに気づきました。
retstring はメソッド内の冒頭で宣言し
仮の初期値として、""; を与えていました。
このメソッドに渡す仮引数は value としているのですが、
計算結果の文字列を加工したものを retstring に格納するのですから
retstring = value.substring( index, index ) とするべきでした。

---------------------------------------------
seisu_length = len - 1;

// test statement
System.out.println( "seisu_length2 is " + String.valueOf( seisu_length ));
System.out.println( seisu_length > 12 );
//

if( seisu_length > 12 )
{
//test statement
System.out.println( "(4)" );
//
gap = seisu_length - 12;
overflag = true;
retstring = value.substring( 0, 12 );
// 以前の内容
retstring = retstring.substring( 0, 12 );
//

}
---------------------------------------------

上記のように修正したところ、
期待どおりの例外処理に移りました。
今回質問させていただいたところは解決しましたので
質問を終了させていただきます。
貴重な時間をさいての回答、ありがとうございました。

お礼日時:2013/01/09 06:49

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