ひとつだけいいところがあって、ベキ乗(累乗)が計算できます。2^16=65536とか。
上がプチコン、下の">"以降がプログラム実行結果 |
使い方:実行すると">"が表示されるので、数式を入力。1+1や1*2+3や3*(2+1)など。でEnterを押すと、答えを表示。かっこ、演算子は^、%、*、/、+、-が入力可能。
演算はプチコン頼り。数式の解釈がメイン。デバッグはプチコンで計算し、プログラムの計算と一致すればOKとしてます。
CLEAR DIM RP$(127),RPA(127),RPW$(127) LMAX=5 _PAR0=1 _PARC=2 _OPE=3 _NUM=4 @IN LINPUT ">";I$ IX=0:IE=LEN(I$)-1:B$="":ER=0 RPSP=0:RPWSP=0 @LOOP C$=MID$(I$,IX,1) IF C$==" " THEN GOTO @LSKP ATR=_NUM IF IX==0 AND C$=="-" THEN GOSUB @NUM IF (PRE==_PARC OR PRE==_OPE) AND C$=="-" THEN GOSUB @NUM IF C$>="0" AND C$<="9" THEN GOSUB @NUM ATR=_PARO IF C$=")" THEN GOSUB @PARCLOSE ATR=_PARC IF C$="(" THEN GOSUB @PAROPEN ATR=_OPE IF C$="*" THEN GOSUB @OPE IF C$="/" THEN GOSUB @OPE IF C$="^" THEN GOSUB @OPE IF C$="%" THEN GOSUB @OPE IF C$="+" THEN GOSUB @OPE IF C$="-" THEN GOSUB @OPE @LSKP IX=IX+1:IF IX<=IE GOTO @LOOP GOSUB @OPEEND GOSUB @CALC ?"=";A$ GOTO @IN @NUM A$=C$ @NUMLP C$=MID$(I$,IX+1,1) IF C$>="0" AND C$<="9" THEN A$=A$+C$:IX=IX+1:GOTO @NUMLP IF LEN(A$)>LMAX THEN ER=1:?"OVERFLOW ERROR":STOP IF ER=0 THEN GOSUB @RPPUSH C$="":PRE=ATR:RETURN @PAROPEN A$=C$:GOSUB @RPWPUSH C$="":PRE=ATR:RETURN @PARCLOSE IF RPWSP=0 THEN RETURN PRE=ATR GOSUB @RPWPOP IF A$=="(" THEN RETURN GOSUB @RPPUSH IF RPWSP>0 GOTO @PARCLOSE RETURN @OPE IF RPWSP<1 GOTO @OPEPUSH @OPEPUSHW A$=C$:GOSUB @RPWPUSH C$="":PRE=ATR:RETURN @OPEEND IF RPWSP==0 THEN RETURN GOSUB @RPWPOP GOSUB @RPPUSH IF RPWSP>0 GOTO @OPEEND RETURN @OPEPR PR=255 IF A$=="^" THEN PR=1 IF A$=="%" THEN PR=2 IF A$=="*" THEN PR=2 IF A$=="/" THEN PR=2 IF A$=="+" THEN PR=3 IF A$=="-" THEN PR=3 RETURN @CALC SP=0:RPWSP=0 @CALCLP A$=RP$(AP):ATR=RPA(SP) IF ATR==_NUM THEN GOSUB @RPWPUSH:GOTO @CALCSKP B$=A$ GOSUB @RPWPOP:A2=VAL(A$) GOSUB @RPWPOP:A1=VAL(A$) IF B$=="*" THEN A0=A1*A2 IF B$=="/" THEN GOSUB @CALCDIV IF B$=="^" THEN GOSUB @CALCPOW IF B$=="%" THEN A0=A1%A2 IF B$=="+" THEN A0=A1+A2 IF B$=="-" THEN A0=A1-A2 A$=STR$(A0):GOSUB @RPWPUSH @CALCSKP SP=SP+1 IF SPちなみにプログラム名はRPCALC1。その名の通り、逆ポーランド記法(Reverse Polish Notation)を使ってます。おかしいところがあったらすいません。 以下ページを見ながら作りました。非常に分かりやすい説明なので作りやすいのでは。 ところでLINPUTを初めて使いましたが、入力は32桁まででした。これ以上を実現しようとすると、INKEY$/BUTTON/タッチスクリーンとかで自作?0 THEN FOR I=1 TO A2:A0=A0*A1:NEXT RETURN @RPPUSH IF RPSP>127 THEN ER=1:?"RP STACK OVERFLOW":STOP IF ER==0 THEN RP$(RPSP)=A$:RPA(RPSP)=ATR:RPSP=RPSP+1 RETURN @RPPOP RPSP=RPSP-1:IF RPSP<0 THEN ER=1:?"RP STACK OVERFLOW":STOP IF ER==0 THEN RPW$(RPSP)=A$:RPSP=RPSP+1 RETURN @RPWPUSH IF PRWSP==127 THEN ER=3:?"ERR:RPW STACK OVERFLOW":STOP IF ER==0 THEN RPW$(RPWSP)=A$:RPWSP=RPWSP+1 RETURN @RPWPOP RPWSP=RPWSP-1:IF RPWSP<0 THEN ER=4:?"ERR:RPWSP -":STOP IF ER==0 THEN A$=RPW$(RPWSP): RETURN
2012/12/1 リストがおかしくなっていたので修正しました