プチコンまとめWiki (初代/mkII)

投稿プログラム : 電卓

パンくずリスト

2012年01月22日投稿 / 投稿者 : 名無しさん / タグ : 投稿プログラム

概要

再帰下降構文解析で中置記法の式を計算する電卓です。
今のままなら正直BASICで計算したほうが早いので、後でUI工夫します。

演算子一覧

演算子演算内容優先順位結合性備考
()括弧1-
!階乗2-連続で使用した場合の動作は保証されない(例:5!!)
単項+正の符号3右結合
単項-負の符号3右結合
^累乗4右結合精度に不安あり
*乗算5左結合
/除算5左結合
%剰余5左結合
+加算6左結合
-減算6左結合

変数一覧

変数名内容
E自然対数の底
PI円周率
X式を関数に見立てた時の独立変数
ANS直前の計算結果

関数一覧

関数名書式引数戻り値
SINSIN(角度)弧度法による角度引数の正弦
COSCOS(角度)弧度法による角度引数の余弦
TANTAN(角度)弧度法による角度引数の正接
LNLN(数値)自然対数を求める正の数引数の自然対数
LOGLOG(数値)常用対数を求める正の数引数の常用対数
EXPEXP(数値)指数値を求める数値引数の指数
RADRAD(角度)角度値引数を度数法から弧度法に直したもの
DEGDEG(角度)角度値引数を弧度法から度数法に直したもの
ASINASIN(正弦)正弦の値引数のアークサイン
ACOSACOS(余弦)余弦の値引数のアークコサイン
ATANATAN(正接)正接の値引数のアークタンジェント
SQRTSQRT(数値)負の数でない値引数の平方根
SUMSUM(初期値,終値,式)初期値,終値,式Xを初期値から終値まで1ごとに変化させた時の総和

スクリーンショット・動画

スクリーンショット等はありません

プログラムリスト

  1. CLEAR
  2. SP=0:DIM STK(128)
  3. NUM$=”1234567890.”
  4. ALP$=”ABCDEFGHIJKLMNOPQRSTUVWXYZ”
  5. ’−−−ニュウシュツリョク イマハコレタ゛ケ
  6. @MAIN
  7.  P=0
  8.  LINPUT ”スウシキ”;EXPR$
  9.  GOSUB @EVAL
  10.  ANS=STK(SP)
  11.  ?”= ”;ANS
  12.  GOTO @MAIN
  13. ’−−−カケ゛ンサ゛ン
  14. @EVAL
  15.  SP=SP+1:GOSUB @FACT
  16.  STK(SP−1)=STK(SP)
  17.  @ADDSUB
  18.   C$=MID$(EXPR$,P,1)
  19.   IF C$!=”+” AND C$!=”−” THEN SP=SP−1:RETURN
  20.   P=P+1
  21.   IF C$==”+” THEN GOSUB @FACT:STK(SP−1)=STK(SP−1)+STK(SP)
  22.   IF C$==”−” THEN GOSUB @FACT:STK(SP−1)=STK(SP−1)−STK(SP)
  23.   GOTO @ADDSUB
  24. ’−−−シ゛ョウシ゛ョサ゛ン
  25. @FACT
  26.  SP=SP+1:GOSUB @POWER
  27.  STK(SP−1)=STK(SP)
  28.  @MULDIV
  29.   C$=MID$(EXPR$,P,1)
  30.   IF C$!=”*” AND C$!=”/” AND C$!=”%” THEN SP=SP−1:RETURN
  31.   P=P+1
  32.   IF C$==”*” THEN GOSUB @POWER:STK(SP−1)=STK(SP−1)*STK(SP)
  33.   IF C$==”/” THEN GOSUB @POWER:STK(SP−1)=STK(SP−1)/STK(SP)
  34.   IF C$==”%” THEN GOSUB @POWER:STK(SP−1)=STK(SP−1)%STK(SP)
  35.  GOTO @MULDIV
  36. ’−−−ルイシ゛ョウ
  37. @POWER
  38.  SP=SP+1:GOSUB @TERM
  39.  STK(SP−1)=STK(SP)
  40.  C$=MID$(EXPR$,P,1)
  41.  IF C$==”^” THEN GOSUB @POWCONT
  42.  SP=SP−1
  43.  RETURN
  44. @POWCONT
  45.  P=P+1
  46.  IF STK(SP−1)==0 THEN RETURN
  47.  GOSUB @POWER
  48.  I=EXP(STK(SP)*LOG(ABS(STK(SP−1))))
  49.  IF STK(SP−1)>0 OR STK(SP)%2==0 THEN STK(SP−1)=I
  50.  IF STK(SP−1)<0 AND STK(SP)%2==1 THEN STK(SP−1)=−I
  51.  RETURN
  52. ’−−−ニコウエンサ゛ンシイカ゛イ
  53. @TERM
  54.  SP=SP+1:GOSUB @SKIP
  55.  IF C$==”+” THEN P=P+1:GOSUB @TERM:STK(SP−1)=STK(SP)
  56.  IF C$==”−” THEN P=P+1:GOSUB @TERM:STK(SP−1)=STK(SP)*(−1)
  57.  GOSUB @STR2D:GOSUB @GETN
  58.  IF NAME$==”PI”   THEN STK(SP−1)=PI()
  59.  IF NAME$==”E”    THEN STK(SP−1)=EXP(1)
  60.  IF NAME$==”X”    THEN STK(SP−1)=X
  61.  IF NAME$==”ANS”  THEN STK(SP−1)=ANS
  62.  IF NAME$==”RAD”  THEN GOSUB @TERM:STK(SP−1)=STK(SP)*PI()/180
  63.  IF NAME$==”DEG”  THEN GOSUB @TERM:STK(SP−1)=STK(SP)*180/PI()
  64.  IF NAME$==”SIN”  THEN GOSUB @TERM:STK(SP−1)=SIN(STK(SP))
  65.  IF NAME$==”COS”  THEN GOSUB @TERM:STK(SP−1)=COS(STK(SP))
  66.  IF NAME$==”TAN”  THEN GOSUB @TERM:STK(SP−1)=TAN(STK(SP))
  67.  IF NAME$==”LN”   THEN GOSUB @TERM:STK(SP−1)=LOG(STK(SP))
  68.  IF NAME$==”LOG”  THEN GOSUB @TERM:STK(SP−1)=LOG(STK(SP))/LOG(10)
  69.  IF NAME$==”EXP”  THEN GOSUB @TERM:STK(SP−1)=EXP(STK(SP))
  70.  IF NAME$==”ASIN” THEN GOSUB @TERM:STK(SP−1)=ATAN(STK(SP),SQR(1−STK(SP)*STK(SP)))
  71.  IF NAME$==”ACOS” THEN GOSUB @TERM:STK(SP−1)=ATAN(SQR(1−STK(SP)*STK(SP)),STK(SP))
  72.  IF NAME$==”ATAN” THEN GOSUB @TERM:STK(SP−1)=ATAN(STK(SP))
  73.  IF NAME$==”SQRT” THEN GOSUB @TERM:STK(SP−1)=SQR(STK(SP))
  74.  IF NAME$==”SUM”  THEN GOSUB @SUM:STK(SP−1)=STK(SP)
  75.  IF C$==”(” THEN P=P+1:GOSUB @EVAL:STK(SP−1)=STK(SP):P=P+1
  76.  GOSUB @SKIP
  77.  IF C$==”!” THEN P=P+1:GOSUB @KAIJO
  78.  GOSUB @SKIP:SP=SP−1
  79.  RETURN
  80. ’−−−スウチ
  81. @STR2D
  82.  Q=P
  83.  FOR I=0 TO 1
  84.   I=1
  85.   C$ = MID$(EXPR$,P,1)
  86.   FOR J=0 TO 10
  87.    IF C$==MID$(NUM$, J, 1) THEN P=P+1:I=0
  88.   NEXT
  89.  NEXT
  90.  IF P>Q THEN STK(SP−1)=VAL(MID$(EXPR$,Q,P−Q))
  91.  RETURN
  92. ’−−−カンスウメイ
  93. @GETN
  94.  Q=P
  95.  FOR I=0 TO 1
  96.   I=1
  97.   C$=MID$(EXPR$,P,1)
  98.   FOR J=0 TO 25
  99.    IF C$==MID$(ALP$,J,1) THEN P=P+1:I=0
  100.   NEXT
  101.  NEXT
  102.  NAME$=MID$(EXPR$,Q,P−Q)
  103.  RETURN
  104. ’−−−カイシ゛ョウ
  105. @KAIJO
  106.  Q=1
  107.  FOR I=1 TO STK(SP−1)
  108.   Q=Q*I
  109.  NEXT
  110.  STK(SP−1)=Q
  111.  RETURN
  112. ’−−−ソウワ
  113. @SUM
  114.  SP=SP+5:P=P+1
  115.  STK(SP−1)=X
  116.  GOSUB @EVAL:P=P+1
  117.  STK(SP−2)=STK(SP)
  118.  GOSUB @EVAL:P=P+1
  119.  STK(SP−3)=STK(SP)
  120.  STK(SP−4)=P
  121.  STK(SP−5)=0
  122.  FOR X=STK(SP−2) TO STK(SP−3)
  123.   P=STK(SP−4)
  124.   GOSUB @EVAL
  125.   STK(SP−5)=STK(SP−5)+STK(SP)
  126.  NEXT
  127.  X=STK(SP−1)
  128.  P=P+1:SP=SP−5
  129.  RETURN
  130. ’−−−クウハクヲノソ゛ク
  131. @SKIP
  132.  C$=MID$(EXPR$,P,1)
  133.  IF C$==” ” THEN P=P+1:GOTO @SKIP
  134.  RETURN

CHECKER FLAG (ひとことコメント)

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

  • 投稿者 : 最近プチコンの存在を知り、衝動買いした挙句このようなものまで書いてしまいました。 (2012/01/22 (日) 18:24:49)
  • 投稿者 : 至らない点もあると思いますが、どうかご指摘ください。 (2012/01/22 (日) 18:25:45)
  • 名無しさん : サンプルプログラム3のコメントにもありますが、FOR-NEXTの途中からGOTOで抜けると内部メモリが減るので、避けたほうが無難だと思います。 (2012/01/25 (水) 05:34:24)
  • まりお : 最新版なら内部メモリは、減らないよ!! (2012/01/25 (水) 10:20:55)
  • 名無しさん : FORのみの入れ子は255段までみたいね (2012/01/25 (水) 12:34:59)
  • 名無しさん : 最新版でもプログラム実行前に内部メモリをクリアするようになっただけで、内部メモリが減ること自体は変わっていません。そのため、プログラムを終了せずに何度も入力を繰り返すようにこのプログラムを改造すると、いずれOut of memoryで実行が止まります。 (2012/01/25 (水) 22:21:26)
  • 投稿者 : ご指摘ありがとうございます。FOR文中でGOTOしないように修正しました。 (2012/01/26 (木) 00:26:31)
  • まりお : そーっだったのか!初心者なので鵜呑みにしてしまった。名無しさんありがとうございました。修正するまえでよっかった・・・ (2012/01/26 (木) 16:33:01)
  • 名無しさん : いくつか指摘。1. %が計算できない(26行目で%の判定が抜けてる) 2. 83行目と86行目のIとJが逆では? 3. 単項+,-が計算できない(48行目のGOSUB @STR2Dで0クリアされてる) 4. 累乗^は右結合では? (2012/01/28 (土) 09:07:17)
  • 名無しさん : 現状だとASIN(1)やACOS(0)がエラーになってしまうので、ATANの2引数バージョンを使ってみてはいかがでしょうか。(59行目と60行目の'/'を','に書き換える) (2012/01/29 (日) 07:28:00)
  • 投稿者 : ご指摘ありがとうございます。ご指摘の点を修正しました。 (2012/01/29 (日) 16:56:53)
  • カイ : 配列変数が範囲外と出ます どうしたらいいですか (2012/03/05 (月) 21:27:28)
  • カイ : 配列変数が範囲外(85)と出ますどうしたらいいでしょうか (2012/03/05 (月) 21:41:16)
  • : subscript out of range(85)と出るのですがどうしたらいいですか。誰か教えて〜 (2012/03/08 (木) 17:23:14)
  • 3.141592・・・ : QRコード載せて下さい (2012/12/22 (土) 15:55:19)
  • 名無しさん : そんなあなたにリンク集 (2012/12/22 (土) 21:43:45)
  • Topaz : 便利ですね。今作っているソフトに利用させていただいてもよろしいでしょうか。 (2013/01/04 (金) 15:14:25)
  • 天郷思音 : タッチ入力で使えるように改造した版のQR http://f.hatena.ne.jp/ken10ken/20130513140510 (2013/05/13 (月) 14:07:36)
  • がんばる卓球部 : ↑この改造版をBASICOSに使わせていただきたいのですが、、、 (2013/09/09 (月) 23:18:55)
  • 天郷思音 : ↑私としてはOKです。
            その改造版が動画「プチコンマガジン」に乗るのでこのページでその旨を投稿者さんへ報告させていただきます。 (2014/11/12 (水) 16:11:49)

表示モード : [ スマホ・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