2012年01月22日投稿 / 投稿者 : 名無しさん / タグ : 投稿プログラム
再帰下降構文解析で中置記法の式を計算する電卓です。
今のままなら正直BASICで計算したほうが早いので、後でUI工夫します。
| 演算子 | 演算内容 | 優先順位 | 結合性 | 備考 |
|---|---|---|---|---|
| () | 括弧 | 1 | - | |
| ! | 階乗 | 2 | - | 連続で使用した場合の動作は保証されない(例:5!!) |
| 単項+ | 正の符号 | 3 | 右結合 | |
| 単項- | 負の符号 | 3 | 右結合 | |
| ^ | 累乗 | 4 | 右結合 | 精度に不安あり |
| * | 乗算 | 5 | 左結合 | |
| / | 除算 | 5 | 左結合 | |
| % | 剰余 | 5 | 左結合 | |
| + | 加算 | 6 | 左結合 | |
| - | 減算 | 6 | 左結合 |
| 変数名 | 内容 |
|---|---|
| E | 自然対数の底 |
| PI | 円周率 |
| X | 式を関数に見立てた時の独立変数 |
| ANS | 直前の計算結果 |
| 関数名 | 書式 | 引数 | 戻り値 |
|---|---|---|---|
| SIN | SIN(角度) | 弧度法による角度 | 引数の正弦 |
| COS | COS(角度) | 弧度法による角度 | 引数の余弦 |
| TAN | TAN(角度) | 弧度法による角度 | 引数の正接 |
| LN | LN(数値) | 自然対数を求める正の数 | 引数の自然対数 |
| LOG | LOG(数値) | 常用対数を求める正の数 | 引数の常用対数 |
| EXP | EXP(数値) | 指数値を求める数値 | 引数の指数 |
| RAD | RAD(角度) | 角度値 | 引数を度数法から弧度法に直したもの |
| DEG | DEG(角度) | 角度値 | 引数を弧度法から度数法に直したもの |
| ASIN | ASIN(正弦) | 正弦の値 | 引数のアークサイン |
| ACOS | ACOS(余弦) | 余弦の値 | 引数のアークコサイン |
| ATAN | ATAN(正接) | 正接の値 | 引数のアークタンジェント |
| SQRT | SQRT(数値) | 負の数でない値 | 引数の平方根 |
| SUM | SUM(初期値,終値,式) | 初期値,終値,式 | Xを初期値から終値まで1ごとに変化させた時の総和 |
スクリーンショット等はありません
- CLEAR
- SP=0:DIM STK(128)
- NUM$=”1234567890.”
- ALP$=”ABCDEFGHIJKLMNOPQRSTUVWXYZ”
- ’---ニュウシュツリョク イマハコレタ゛ケ
- @MAIN
- P=0
- LINPUT ”スウシキ”;EXPR$
- GOSUB @EVAL
- ANS=STK(SP)
- ?”= ”;ANS
- GOTO @MAIN
- ’---カケ゛ンサ゛ン
- @EVAL
- SP=SP+1:GOSUB @FACT
- STK(SP-1)=STK(SP)
- @ADDSUB
- C$=MID$(EXPR$,P,1)
- IF C$!=”+” AND C$!=”-” THEN SP=SP-1:RETURN
- P=P+1
- IF C$==”+” THEN GOSUB @FACT:STK(SP-1)=STK(SP-1)+STK(SP)
- IF C$==”-” THEN GOSUB @FACT:STK(SP-1)=STK(SP-1)-STK(SP)
- GOTO @ADDSUB
- ’---シ゛ョウシ゛ョサ゛ン
- @FACT
- SP=SP+1:GOSUB @POWER
- STK(SP-1)=STK(SP)
- @MULDIV
- C$=MID$(EXPR$,P,1)
- IF C$!=”*” AND C$!=”/” AND C$!=”%” THEN SP=SP-1:RETURN
- P=P+1
- IF C$==”*” THEN GOSUB @POWER:STK(SP-1)=STK(SP-1)*STK(SP)
- IF C$==”/” THEN GOSUB @POWER:STK(SP-1)=STK(SP-1)/STK(SP)
- IF C$==”%” THEN GOSUB @POWER:STK(SP-1)=STK(SP-1)%STK(SP)
- GOTO @MULDIV
- ’---ルイシ゛ョウ
- @POWER
- SP=SP+1:GOSUB @TERM
- STK(SP-1)=STK(SP)
- C$=MID$(EXPR$,P,1)
- IF C$==”^” THEN GOSUB @POWCONT
- SP=SP-1
- RETURN
- @POWCONT
- P=P+1
- IF STK(SP-1)==0 THEN RETURN
- GOSUB @POWER
- I=EXP(STK(SP)*LOG(ABS(STK(SP-1))))
- IF STK(SP-1)>0 OR STK(SP)%2==0 THEN STK(SP-1)=I
- IF STK(SP-1)<0 AND STK(SP)%2==1 THEN STK(SP-1)=-I
- RETURN
- ’---ニコウエンサ゛ンシイカ゛イ
- @TERM
- SP=SP+1:GOSUB @SKIP
- IF C$==”+” THEN P=P+1:GOSUB @TERM:STK(SP-1)=STK(SP)
- IF C$==”-” THEN P=P+1:GOSUB @TERM:STK(SP-1)=STK(SP)*(-1)
- GOSUB @STR2D:GOSUB @GETN
- IF NAME$==”PI” THEN STK(SP-1)=PI()
- IF NAME$==”E” THEN STK(SP-1)=EXP(1)
- IF NAME$==”X” THEN STK(SP-1)=X
- IF NAME$==”ANS” THEN STK(SP-1)=ANS
- IF NAME$==”RAD” THEN GOSUB @TERM:STK(SP-1)=STK(SP)*PI()/180
- IF NAME$==”DEG” THEN GOSUB @TERM:STK(SP-1)=STK(SP)*180/PI()
- IF NAME$==”SIN” THEN GOSUB @TERM:STK(SP-1)=SIN(STK(SP))
- IF NAME$==”COS” THEN GOSUB @TERM:STK(SP-1)=COS(STK(SP))
- IF NAME$==”TAN” THEN GOSUB @TERM:STK(SP-1)=TAN(STK(SP))
- IF NAME$==”LN” THEN GOSUB @TERM:STK(SP-1)=LOG(STK(SP))
- IF NAME$==”LOG” THEN GOSUB @TERM:STK(SP-1)=LOG(STK(SP))/LOG(10)
- IF NAME$==”EXP” THEN GOSUB @TERM:STK(SP-1)=EXP(STK(SP))
- IF NAME$==”ASIN” THEN GOSUB @TERM:STK(SP-1)=ATAN(STK(SP),SQR(1-STK(SP)*STK(SP)))
- IF NAME$==”ACOS” THEN GOSUB @TERM:STK(SP-1)=ATAN(SQR(1-STK(SP)*STK(SP)),STK(SP))
- IF NAME$==”ATAN” THEN GOSUB @TERM:STK(SP-1)=ATAN(STK(SP))
- IF NAME$==”SQRT” THEN GOSUB @TERM:STK(SP-1)=SQR(STK(SP))
- IF NAME$==”SUM” THEN GOSUB @SUM:STK(SP-1)=STK(SP)
- IF C$==”(” THEN P=P+1:GOSUB @EVAL:STK(SP-1)=STK(SP):P=P+1
- GOSUB @SKIP
- IF C$==”!” THEN P=P+1:GOSUB @KAIJO
- GOSUB @SKIP:SP=SP-1
- RETURN
- ’---スウチ
- @STR2D
- Q=P
- FOR I=0 TO 1
- I=1
- C$ = MID$(EXPR$,P,1)
- FOR J=0 TO 10
- IF C$==MID$(NUM$, J, 1) THEN P=P+1:I=0
- NEXT
- NEXT
- IF P>Q THEN STK(SP-1)=VAL(MID$(EXPR$,Q,P-Q))
- RETURN
- ’---カンスウメイ
- @GETN
- Q=P
- FOR I=0 TO 1
- I=1
- C$=MID$(EXPR$,P,1)
- FOR J=0 TO 25
- IF C$==MID$(ALP$,J,1) THEN P=P+1:I=0
- NEXT
- NEXT
- NAME$=MID$(EXPR$,Q,P-Q)
- RETURN
- ’---カイシ゛ョウ
- @KAIJO
- Q=1
- FOR I=1 TO STK(SP-1)
- Q=Q*I
- NEXT
- STK(SP-1)=Q
- RETURN
- ’---ソウワ
- @SUM
- SP=SP+5:P=P+1
- STK(SP-1)=X
- GOSUB @EVAL:P=P+1
- STK(SP-2)=STK(SP)
- GOSUB @EVAL:P=P+1
- STK(SP-3)=STK(SP)
- STK(SP-4)=P
- STK(SP-5)=0
- FOR X=STK(SP-2) TO STK(SP-3)
- P=STK(SP-4)
- GOSUB @EVAL
- STK(SP-5)=STK(SP-5)+STK(SP)
- NEXT
- X=STK(SP-1)
- P=P+1:SP=SP-5
- RETURN
- ’---クウハクヲノソ゛ク
- @SKIP
- C$=MID$(EXPR$,P,1)
- IF C$==” ” THEN P=P+1:GOTO @SKIP
- RETURN
この作品に対するコメントがあれば一言どうぞ。(作品に直接関係ない質問や雑談は掲示板へ)