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
この作品に対するコメントがあれば一言どうぞ。(作品に直接関係ない質問や雑談は掲示板へ)