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
この作品に対するコメントがあれば一言どうぞ。(作品に直接関係ない質問や雑談は掲示板へ)
表示モード : [ スマホ・3DS対応表示 | クラシック表示 ]
PukiWiki 1.4.7 Copyright © 2001-2006 PukiWiki Developers Team. License is GPL. Based on "PukiWiki" 1.3 by yu-ji
ページの処理時間 : 0.139 秒 | このページの最終更新 : 2022/09/20 (火) 12:44:08 (565d) | ログイン
Copyright(C) 2011-2014 プチコンまとめWiki ◆1sxkymI8ji30