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


HSPTV!掲示板


未解決 解決 停止 削除要請

2010
0505
アイガモ (投稿者削除)5解決


アイガモ

リンク

2010/5/5(Wed) 16:37:04|NO.32462

この記事は投稿者により削除されました。
2010/5/7(Fri) 18:39:05



この記事に返信する


ANTARES

リンク

2010/5/5(Wed) 23:50:26|NO.32469

>記号の計算ができません
「~」は何が計算したいのかわからないので「^」を追加してみました。

>「stat 0 +」だったら「stat + 0」みたいに
 これは別に「stat」をstatの値に変換する関数を作るべし。

<前略> #deffunc putnum poke num,inum,0 if num=="": return _put int(num) inum=0 num="" return #deffunc calc var ans, str p1, local sExp, local iTmp sExp = p1 iStat = NO_ERROR sdim num,64 inum=0 count = 0 repeat strlen(sExp) i = peek(sExp, cnt) switch i case '0':case '1':case '2':case '3':case '4' case '5':case '6':case '7':case '8':case '9' #if 0 // 数値の場合はスタックに積む _put i - '0' #else poke num,inum,i inum++ #endif swbreak case ' ' putnum swbreak // 以下、オペランドの場合はスタックから2つ取り出して演算する case '+' putnum _put _get() + _get() swbreak case '-' putnum iTmp = _get() _put _get() - iTmp swbreak case '*' putnum _put _get() * _get() swbreak case '^' putnum _put _get() ^ _get() swbreak case '/' putnum iTmp = _get() if iTmp == 0 { // 0で割ろうとした → エラー iStat = ERROR_DIVIDE_BY_ZERO } else { _put _get() / iTmp } swbreak default // 規定されていない文字 → エラー iStat = ERROR_UNKNOWN_CHARCTER swbreak swend if iStat != NO_ERROR : break loop if iStat == NO_ERROR : ans = _get() return iStat #global ;question = "12+5*", "10/", "123*1+-2/", "12~", "1+1" question = "1 2+5*", "1 0/", "1 2 3*1+-2/", "1 2^", "1+1", "12 11*" <後略>



ANTARES

リンク

2010/5/6(Thu) 23:18:05|NO.32507

 説明不足どころか、質問内容が全く違うでしょう。
そういうことであれば、私がレスしたことは忘れてください。
何の役に立つかわからないことは考える気がしないので。



takazin=begriff

リンク

2010/5/6(Thu) 23:41:08|NO.32508

どうもtakazinです。



buf="5 55 33 999 1234+ * /- 77 44+ - 999+ 888+ 555+ 444- 333- 222- 121 131 + -" //buf="3 4 5+-" sdim buf_,1024 sdim tmp,256,1024 sdim tmp_op,256,1024 dim op,1024 sdim tmp1,1024 sdim tmp2,1024 index=0 sp=0 while(1) if(index>=strlen(buf)):_break data=peek(buf,index) if(limit(data,'0','9')==data){ tmp(sp)="" while(1) if(index>=strlen(buf)):_break data=peek(buf,index) if(limit(data,'0','9')!=data):_break tmp(sp)+=strf("%c",data) index++ wend sp++ } if(data=='+'|data=='-'|data=='*'|data=='/'){ tmp(sp)=strf("%c",data) op(sp)=1 //演算子なら真 index++ sp++ } if(data==' '|data=='\t'|data==0x0D|data=0x0A){ index++ } wend spmax=sp index=0 sp=0 while(1) if(spmax<sp):_break if(op(sp)==1){ sp_=sp takou1=0 takou2=0 while(1) if(op(sp_)==0){ tmp1=tmp(sp_) op(sp_)=3 _break } if(op(sp_)==2){ tmp1=tmp(sp_) op(sp_)=3 takou1=1 takou1_sp=sp_ _break } sp_-- if(sp_<0){ mes "オペランドの数が合いません" stop } wend while(1) if(op(sp_)==0){ tmp2=tmp(sp_) op(sp_)=2 _break } if(op(sp_)==2){ tmp2=tmp(sp_) op(sp_)=2 takou2=1 takou2_sp=sp_ _break } sp_-- if(sp_<0){ mes "オペランドの数が合いません" stop } wend tmp1_=tmp1 tmp2_=tmp2 if(takou1==1){ if((tmp(sp)=="*"||tmp(sp)=="/")&&(tmp_op(takou1_sp)=="+"||tmp_op(takou1_sp)=="-")){ tmp1_="("+tmp1+")" } if((tmp(sp)=="/")&&(tmp_op(takou1_sp)=="*")){ tmp1_="("+tmp1+")" } if((tmp(sp)=="-")&&(tmp_op(takou1_sp)=="+"||tmp_op(takou1_sp)=="-")){ tmp1_="("+tmp1+")" } if((tmp(sp)=="+")&&(tmp_op(takou1_sp)=="+"||tmp_op(takou1_sp)=="-")){ tmp1_=tmp1 } } if(takou2==1){ if((tmp(sp)=="*"||tmp(sp)=="/")&&(tmp_op(takou2_sp)=="+"||tmp_op(takou2_sp)=="-")){ tmp2_="("+tmp2+")" } if((tmp(sp)=="-")&&(tmp_op(takou2_sp)=="+"||tmp_op(takou2_sp)=="-")){ tmp2_=tmp2 } if((tmp(sp)=="+")&&(tmp_op(takou2_sp)=="+"||tmp_op(takou2_sp)=="-")){ tmp2_=tmp2 } } tmp(sp_)=tmp2_+tmp(sp)+tmp1_ tmp_op(sp_)=tmp(sp) buf_=tmp2_+tmp(sp)+tmp1_ } sp++ wend mes buf mes buf_



かなり“クセ”のあるコードですが何とか解読してください^^;

1 2 + 5*
5 1 2 + *
3 4 5+-
をちゃんと

(1+2)*5
5*(1+2)
3-(4+5)
のように正しく括弧をつけることだできます。

サンプルでは演算子優先順位を”なんちゃって”判定しているので無駄な括弧は生成されません
↓このように
5-55/(33*(999+1234))-(77+44)+999+888+555-444-333-222-(121+131)

しかしその処理を端折っても一応 中置記法には変換できます(見栄えは悪いですが)
↓このように
(((((((((5-(55/(33*(999+1234))))-(77+44))+999)+888)+555)-444)-333)-222)-(121+131))
がんばってください。



GENKI

リンク

2010/5/7(Fri) 00:46:42|NO.32509

>> アイガモさん(NO.32462)

失礼ですが少し気になりましたのでかかせていただきます。脱線申し訳ない。
引用元はこちらではないでしょうか?
http://rpen.blogspot.com/2007/06/blog-post_06.html

こちらのサイトには次のように書かれています。
http://rpen.blogspot.com/2007/04/test.html
> 転載時はURLの記載で済む時はそうしてください。スクリプトそのものを転載する際は引用元を明記してください

利用方法が明記されている場合は、出来るだけこれに従うよう努力したほうがよいと思います。無用な誤解やトラブルを防ぐ意味でも。
また明記されていなくても、大部分を引用する場合は引用元を書いておいたほうが何かとよいかと思います。



アイガモ

リンク

2010/5/8(Sat) 18:21:14|NO.32540

takazin=begriffさん、ありがとうございます。解決しました。



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