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


HSPTV!掲示板


未解決 解決 停止 削除要請

2010
0111
orzinput8未解決


orz

リンク

2010/1/11(Mon) 05:51:13|NO.29868

inputに"3+4"と入力してbuttonを押すと、"\"3+4\"\n"+7を返す方法がわかりません。
教えてください。



この記事に返信する


Kpan

リンク

2010/1/11(Mon) 09:35:38|NO.29873

まずは入力されてる文字を取得(3分割)してみては?
そうしないと計算させられないです。


sdim data, 2 buf = "3+4" input buf, 100 button "", *jump stop *jump getstr data.0, buf, , '+' mes data.0 mes strmid(buf, strsize - 1, 1) getstr data.1, buf, strsize mes data.1



begriff

リンク

2010/1/11(Mon) 11:57:14|NO.29877

こんにちはbegriffと申します。
字句解析とか結構大変になると思います

計算式が表現された文字列を渡すと数値を返すapiがあったような気がするのですが。

自力でするとすると、逆ポーランドとかで検索すると引っかかると思います

参考になるかは分かりませんが
http://begriff.zxq.net/index.php?%E5%BC%8F%E3%81%8B%E3%82%89%E6%BC%94%E7%AE%97%E6%89%8B%E9%A0%86%E3%82%92%E5%B0%8E%E3%81%8F
これは計算まではしませんが 計算手順までは示してくれます。

fujidigさんのウェブサイトでは
“文字列の式を計算 (演算子順位法)”
で計算式から 解を求める方法を紹介しています。



Chokoko

リンク

2010/1/11(Mon) 17:19:36|NO.29885

処理が面倒ですがこのようにすればできると思います。
[+]は[+]
[−]は[-]
[×]は[*]
[÷]は[/]
と表記してください

a="1+2+3+4+5" input a,150,20 button "(・∀・)",*処理 stop *処理 dim mode,100 max=0 flg=0 repeat c=-1 if instr(a,flg,"+")!-1:if c>instr(a,flg,"+") or c=-1:c=instr(a,flg,"+"):mode(cnt)=0 if instr(a,flg,"-")!-1:if c>instr(a,flg,"-") or c=-1:c=instr(a,flg,"-"):mode(cnt)=1 if instr(a,flg,"*")!-1:if c>instr(a,flg,"*") or c=-1:c=instr(a,flg,"*"):mode(cnt)=2 if instr(a,flg,"/")!-1:if c>instr(a,flg,"/") or c=-1:c=instr(a,flg,"/"):mode(cnt)=3 if c=-1{ max=cnt+1 break } flg+c+1 await 1 loop flg=0 repeat max-1 no1=0 no2=0 flg2=flg if cnt=0{ if mode(cnt)=0:no1=instr(a,flg,"+") if mode(cnt)=1:no1=instr(a,flg,"-") if mode(cnt)=2:no1=instr(a,flg,"*") if mode(cnt)=3:no1=instr(a,flg,"/") flg+no1+1 ans=int(strmid(a,flg2,no1)) } if max-2!cnt{ if mode(cnt+1)=0:no2=instr(a,flg,"+") if mode(cnt+1)=1:no2=instr(a,flg,"-") if mode(cnt+1)=2:no2=instr(a,flg,"*") if mode(cnt+1)=3:no2=instr(a,flg,"/") }else:no2=strlen(a)-flg if mode(cnt)=0:ans+int(strmid(a,flg,no2)) if mode(cnt)=1:ans-int(strmid(a,flg,no2)) if mode(cnt)=2:ans*int(strmid(a,flg,no2)) if mode(cnt)=3:ans/int(strmid(a,flg,no2)) flg+no2+1 flg2=flg await 1 loop mes "'"+a+"'="+ans+"" stop



orz

リンク

2010/1/11(Mon) 17:44:49|NO.29887

"(6+4)*3"では正常な答えが返りません。



inovia

リンク

2010/1/11(Mon) 17:57:34|NO.29888




ext

リンク

2010/1/11(Mon) 22:06:53|NO.29896

このスレ見て思ったんだが、
質問するときはあらかじめどういった条件でどのような動作をさせたいのか、
明記しておくべきだと思う。

あえて言うなら
最初の質問からは()や演算子の優性順位とかの有無はわからないし、
回答してもらっても、思っていた動作と違ったからといって、
自分では努力をせずにすぐに質問をするのはおかしいだろ?

そもそも、回答してもらったら第一にお礼を言うものだと俺は思うんだが・・・
そういった当然のことができない人には、誰も回答したくなんてないと思うんだ。

少なくとも俺はそう思った。
まあこの掲示板にはやさしい人がたくさんいるから平気かな。



u

リンク

2010/1/15(Fri) 22:56:52|NO.29973

instrとstrmidで粘ればカッコ付きの計算もできないこともないです。

(〜)を取得して元の(〜)部分は適当な文字列へ置き換える

取得した文字列から()を抜いて計算する

適当な文字列を計算した値に置き換える

あとはChokokoさんのようなプログラムで計算する



u

リンク

2010/1/15(Fri) 23:00:18|NO.29974

ああ、これじゃカッコが二重になった場合狂いますね。
となると「(」から「)」までを取得するまでに「(」がいくつあるかとか色々複雑にやっていかないとなりませんね。



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