HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2012
0330
ひろp数式を、そのまま計算するには?4解決


ひろp

リンク

2012/3/30(Fri) 06:53:37|NO.45645

こんにちは。
google先生は、数式を検索すると その答えを返してくれますよね?
その機能を HSPで真似したいのですが、どうしたら良いのでしょうか?

↓ダメな例

*input数式 input 数式, 500,50 button goto "お願い!", *main計算 stop *main計算 結果 = double(数式) pos 10,100 mes 結果 stop



この記事に返信する


荒河

リンク

2012/3/30(Fri) 08:12:59|NO.45646

・だめな理由その1
提示されたスクリプトでは「数式」は文字列変数ではないように見受けられます。
文字列変数を使わないと入力ボックスに「+」「-」「*」「/」を入力できません。

・だめな理由その2
数式の入った文字列を整数および実数に変換しても計算結果は得られない。
double("1+2+3.4")の結果は数字ではない「+」とそれ以降の文字列は無視されるので、先頭の「1」しか処理されず「1.0」になります。

・解決策
文字列として数式を受け取り文字の種類を判別しながら数式を処理する。
整数の足し算と引き算だけのプログラムを作ってみたので参考にしてみてください。
多バイト文字が数式に入っていた場合の挙動は検証してないです。

notesel que ;数式の変数 cur = 0 ;if文で使う変数 memo = "" ;一時的に数字を文字列の状態で入れる変数 input que,260,30 button goto "Go",*go stop *keisan ;実際に計算する部分 logmes "calc ans="+ans+" memo="+memo+" mode="+mode switch mode case 0 ans = ans + int( memo ) memo = "" swbreak case 1 ans = ans - int( memo ) memo = "" swend return *go ;文字の判定と計算のループ ans = 0 ;答え変数 mode = 0 ;*keisanルーチンの為の変数 repeat notesize cur = peek(que,cnt) if( cur >= '0' & cur <= '9' ){ ;数字の場合 memo = memo + strmid(que,cnt,1) }else:if( cur == '+'){ ;「+」の場合 gosub *keisan mode = 0 }else:if( cur == '-'){ ;「-」の場合 gosub *keisan mode = 1 } loop gosub *keisan mes ans stop



TMKL

リンク

2012/3/30(Fri) 09:02:46|NO.45647

過酷な戦いになりますが、
http://hsp.tv/play/pforum.php?mode=pastwch&num=42969
の記事をNO.42971から読み、
きちんと自分で理解すればいいと思います



ひろp

リンク

2012/3/30(Fri) 12:46:03|NO.45651

ありがとうございます。
こんなに早くヒントを貰えるとは。回答者様は本職のプログラマーでしょうか。
とにかく やってみます。



ひろp

リンク

2012/4/2(Mon) 18:21:32|NO.45710

経過報告… ようやく、ここまで進みました。荒河さん、TMKLさん、ありがとう!


*L★準備 notesel c左辺 ; 左辺の入れ物。 c一字 = 0 ; 左辺を1文字 読み込み、ここに入れる。 c数字 = "" ; 読み込んだ文字が数字なら、ここに入れる。 ; mes "★常に左から計算されます!" ; mes "★符号が連続すると問題発生!" ; mes "★答えが整数の時の表示がウザイ!" ; input c左辺,260,20 ; button goto "計算",*L★左辺の読み込み ; ボタンが押されたら ★左辺の読み込み へ。 stop ; *L★計算 logmes "n右辺=" + n右辺 + " c数字=" + c数字 + " 符号番号=" + n符号 ;←デバッグメッセージ取得 switch n符号 ; 符号番号が ; case 0 ; 0ならば n右辺 = n右辺 + double( c数字 ) ; 加算し、 c数字 = "" ; swbreak ; ; case 1 ; 1ならば n右辺 = n右辺 - double( c数字 ) ; 減算し、 c数字 = "" ; swbreak ; ; case 2 ; 2ならば n右辺 = n右辺 * double( c数字 ) ; 掛算し、 c数字 = "" ; swbreak ; ; case 3 ; 3ならば n右辺 = n右辺 / double( c数字 ) ; 割算し、 c数字 = "" ; swbreak ; swend ; 計算ルーチン終了。 return ; ★メイン へ。 *L★左辺の読み込み ; ; n右辺 = double (0) ; n符号 = 0 ;*L★計算ルーチンの為の変数 ; repeat notesize ; ノートのバイト数だけ、↓を繰り返す ; c一字 = peek(c左辺,cnt) ; 数式を1文字 読み取り、c一字に入れ、 ; if( c一字 >= '0' & c一字 <= '9' ){ ; それが 数字なら、 c数字= c数字+ strmid(c左辺,cnt,1) ; c数字 に、1文字 書き足す。 ; }else:if( c一字 == '+'){ ; それが + なら、 gosub *L★計算 ; 符号番号0 で、 n符号 = 0 ; 計算ルーチンへ飛ぶ。 ; }else:if( c一字 == '-'){ ; それが − なら、 gosub *L★計算 ; 符号番号1 で、 n符号 = 1 ; 計算ルーチンへ飛ぶ。 ; }else:if( c一字 == '*'){ ; それが × なら、 gosub *L★計算 ; 符号番号2 で、 n符号 = 2 ; 計算ルーチンへ飛ぶ。 ; }else:if( c一字 == '/'){ ; それが ÷ なら、 gosub *L★計算 ; 符号番号3 で、 n符号 = 3 ; 計算ルーチンへ飛ぶ。 } ; loop ; *L★メイン gosub *L★計算 ; 計算ルーチンを処理して 戻ってきて、 c式の全体 = ""+ c左辺+ "= "+ n右辺 ; 式の全体 を考え、 mesbox c式の全体, 300,100, 1 ; それを表示し、 stop ; ストップ。



ONION software Copyright 1997-2023(c) All rights reserved.