こんにちは。趣味でプログラミングをしているものです。
さっそくですが、質問させていただきます。
文具店などで千円くらいで販売している電卓を再現しようとしているのですが、
コーディングが終わり、動作を確認しているのですが
やはり、多くの不具合が出ていて、修正しようとしているのですが、
その中で、すこし奇妙に思えるようなものが発生してしまいました。
電卓で計算した結果の文字列を表示桁数に収めるようにする、
あるいは桁のあふれがあった場合、例外を投げる、というメソッド
において、
単純な条件分岐を判定しない、というもののように思えるのですが、
以下にその抜粋したものを説明させていただきます。
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 をふたたびインストールというか
解凍して配置したほうがよいのでしょうか?
ご存知のかた、教えていただけないでしょうか?
よろしくお願いします。
No.1
- 回答日時:
以前も書きましたが、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 );
これもおかしいように思います。電卓ならば、
先頭文字列を残すのではなく、末尾文字列を残すのではないでしょうか?
さっそく回答していただきありがとうございます。
説明不足ですいません。
計算の経過を説明させていただきます。
電卓を起動し
オペランド 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 に不具合が出ている、ということでしょうか?
よろしくお願いします。
No.2ベストアンサー
- 回答日時:
まず、処理の流れを確定することからはじめましょう。
今は、
「表示されない」
→ブロックが実行されていない
という判断をされているかと思いますが、何らかの理由で表示されていないことも考えられるので、
実行の判断は、あくまでも表示された事実に基づくのがいいかと思います。
具体的には、次の2点を直して実行してみて下さい。
1:問題箇所のifに対するelseブロックを追加、メッセージを表示。
2:ifブロック内のメッセージ表示を、ブロックの最初にする。
これにより、どこを通っているか、またはそもそもここまで来ていないかが確定します。
回答していただきありがとうございます。
ご指摘していただいた内容を受けて
以下のように問題の部分を変更しました。
まず、ブロック内部の 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 );
//
}
---------------------------------------------
上記のように修正したところ、
期待どおりの例外処理に移りました。
今回質問させていただいたところは解決しましたので
質問を終了させていただきます。
貴重な時間をさいての回答、ありがとうございました。
No.3
- 回答日時:
「ブロック内部に移らない」と思った根拠はなんですか?
System.out.println( seisu_length > 12 );
がtrueを出力するなら、このifの条件も真のはずです。
気になるのは、これがプログラムそのままなのか、ということです。
単純にコピー→ペーストしたものなのか、その後、書き直したものなのか。
System.out.println( seisu_length > 12 );
の後から(ア)までの間で値が変化するようなことはないか、
ifの中が、括弧が二重になっていますが、本来は
if( (seisu_length > 12) && (なにか別の条件) ) //(ア)
とかになっていないか?
「例外を返す」とありますが、正常に期待通りの例外だけが返ってますか?
ifの中で例外発生しているとかはないですか?
回答していただきありがとうございます。
ご指摘していただいた内容を受けて
以下のように問題の部分を変更しました。
まず、ブロック内部の 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 );
//
}
---------------------------------------------
上記のように修正したところ、
期待どおりの例外処理に移りました。
今回質問させていただいたところは解決しましたので
質問を終了させていただきます。
貴重な時間をさいての回答、ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) Pythonを用いたフラッシュ暗算ソフトの開発に必要なもの 2 2023/01/29 02:22
- PHP PHPの構文で間違えが分からない 5 2022/07/11 16:38
- 高校 有効数字計算 確定した値を含む 2 2023/01/18 06:03
- Excel(エクセル) エクセルのセルの書式設定・ユーザー定義の条件設定について 1 2022/08/17 21:56
- Visual Basic(VBA) 【再々投稿】VBAのプログラムで動作しなくて困っています 8 2022/10/14 09:06
- その他(コンピューター・テクノロジー) 【Tableau Desktop】文字列から8桁の数字を日付型(yyyyMMdd)として取得 1 2023/07/31 10:17
- Excel(エクセル) Excel 特定セルの数値を参照したセルの0表示が空白にならないのはどうしてか? 3 2022/04/28 22:23
- Excel(エクセル) SUMIFのIF分岐について 4 2023/04/15 12:57
- Java Java 南京錠 2 2023/02/04 11:46
- PHP SQLとPHPの連結方法がわからないのでアドバイスお願い致します 1 2022/07/12 12:16
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
1~100までの数字を表示し、か...
-
Javaで改行などが出来ないのです。
-
Log4jで機能毎に別ファイルへ出...
-
flush()とclose()について
-
System.err. printlnとSystem.o...
-
Log4Jではログを改行できない?
-
[至急]Project Euler:#17Number...
-
サーブレットPrintWriterについて
-
Java 九九の表について
-
大容量のテキストファイルの内...
-
バイトスワップ
-
switch分が機能しません。
-
System.out.printを書くとエラー
-
PrintWriterとBufferedWriterの...
-
「得た値をCSV出力するJAVAプロ...
-
ArrayListによる計算表作成
-
java ファイル操作について
-
1~100までの数字を表示したい
-
system.out.printが出力されない
-
固定長データの情報処理について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
System.err. printlnとSystem.o...
-
1~100までの数字を表示し、か...
-
Javaで改行などが出来ないのです。
-
Log4jで機能毎に別ファイルへ出...
-
1~100までの数字を表示したい
-
flush()とclose()について
-
System.out.printlnの出力先
-
ジャバスクリプトについて。
-
system.out.printが出力されない
-
Eclipseのコンソールを常に表示...
-
System.out.printlnの意味がよ...
-
一定のスペースを空けて端を揃...
-
switch分が機能しません。
-
Tomcatが無応答となる現象が起...
-
javaのwhile文で九九の表
-
Javaの問題なのですが、 永久ル...
-
JavaScriptの変数をjavaのメソ...
-
テキストエリアで改行する
-
StringBufferで改ページ処理を...
-
VBSエラー"オブジェクト型の変...
おすすめ情報