新しく発言する EXIT インデックスへ
電卓あそび

  電卓あそび 山中和義 2007/07/02 15:13:12 
  つづき(プログラム) 山中和義 2007/07/02 15:14:19 
   └サンプル(あ〜たぁ!たたぁ!たぁ〜) 山中和義 2007/07/02 15:15:32 

  電卓あそび 山中和義 2007/07/02 15:13:12  ツリーへ

電卓あそび 返事を書く ノートメニュー
山中和義 <drdlxujciw> 2007/07/02 15:13:12
電卓で 12345679*9*3= とすると、数字が並んだり、
また、定数や関数値(プログラム参照)が計算できます。


電卓への手入力は大変ですので、電卓シミュレータで予め検算するためのものです。
四則演算、平方根、逆数、メモリ計算ができる(普通の)電卓を想定しています。

キー操作の手順は、数値計算を行う一種のプログラミングで、
・プログラム1 1+2+3+4+5+6+7+8+9+10=
 BASIC言語では、for文を使う場合に相当する
・プログラム2 10+1*10/2=
 Σk=n*(n+1)/2の式を使った場合に相当する
と解釈できます。


実際の電卓を叩くのも一興かと、、、



!電卓あそび

!aのn乗根 例 3^(1/7)
!※K=2^8(256乗根)とすると、(2/((2/(a^(1/K)+1)-1)/n+1)-1)^Kである。
DATA "3√√√√√√√√" !aの256乗根を求める。Bとする。
DATA "+1=M+2÷MR−1=" !C=2/(B+1)-1を計算する。
DATA "÷7" !D=C/nを計算する。
DATA "+1=MCM+2÷MR−1=" !E=2/(D+1)-1を計算する。
DATA "×=×=×=×=×=×=×=×=" !Eの256乗を求める。


LET reg=0 !表示される値
LET mem=0 !メモリの値
LET acc=0 !計算結果
LET op$="" !演算キー

DO
READ IF MISSING THEN EXIT DO: s$ !キー操作を読み込む
CALL calculator(s$) !計算する
LOOP


SUB calculator(s$) !電卓の本体
LET p=1 !文字ポインタ
CALL EatSpace(s$)

LET L=LEN(s$)
DO WHILE p<=L !行末まで
LET c=GetValue(s$)
IF c>=0 THEN !数値なら
LET reg=c
PRINT c, !入力された数値

ELSE
LET p=p+1 !eat it
IF t$="M" OR t$=":" THEN !2文字なら
LET t$=t$&token$(s$)
LET p=p+1 !eat it
END IF
PRINT t$, !入力された演算キー

SELECT CASE t$
CASE "+","+","−","-","×","*","÷","/"
IF op$<>"" THEN LET reg=calc(acc,op$,reg) !保留していた計算を行う

LET op$=t$ !保留する
LET acc=reg
CASE "=","="
IF op$<>"" THEN LET reg=calc(acc,op$,reg)
LET op$="" !保留なし
CASE "√","@"
LET reg=SQR(reg)
CASE "±"
LET reg=-reg
CASE "r"
LET reg=1/reg
CASE "C",":q"
LET reg=0
LET acc=0
LET op$=""
CASE "M+",":p"
IF op$<>"" THEN LET reg=calc(acc,op$,reg) !「=」を実行する
LET op$=""

LET mem=mem+reg
CASE "MR",":r"
LET reg=mem
CASE "MC",":c"
LET mem=0
CASE ELSE
PRINT "不正なキー操作です。"
STOP
END SELECT
END IF
PRINT reg,mem !結果を表示する

CALL EatSpace(s$) !次へ
LOOP
END SUB

  つづき(プログラム) 山中和義 2007/07/02 15:14:19  ツリーへ

Re: 電卓あそび 返事を書く ノートメニュー
山中和義 <drdlxujciw> 2007/07/02 15:14:19
つづき(プログラム)


FUNCTION calc(v1,op$,v2) !保留していた加減乗除を計算する
SELECT CASE op$ !演算子に応じて
CASE "+","+"
LET calc=v1+v2
CASE "−","-"
LET calc=v1-v2
CASE "×","*"
LET calc=v1*v2
CASE "÷","/"
IF v2=0 THEN
PRINT "0では割れません。"
STOP
END IF
LET calc=v1/v2
CASE ELSE
END SELECT
END FUNCTION


FUNCTION GetValue(s$) !数値 xx.xxx形式
LET i0=p !先頭位置を記録する

CALL EatDigit(s$) !整数部分

LET t$=token$(s$)
IF t$="." THEN LET p=p+1 !小数点

CALL EatDigit(s$) !小数点以下

IF p>i0 THEN
LET GetValue=VAL(s$(i0:p-1)) !数字列の範囲を切り取る
ELSE
LET GetValue=-1
END IF
END FUNCTION

SUB EatDigit(s$) !数字を読み飛ばす
LET t$=token$(s$)
DO WHILE t$>="0" AND t$<="9" !数字が続けば
LET p=p+1
LET t$=token$(s$)
LOOP
END SUB


!下位の共通ルーチン
FUNCTION token$(s$) !1文字読み込む
CALL EatSpace(s$)

LET token$=""
IF p<=LEN(s$) THEN LET token$=s$(p:p)
END FUNCTION

SUB EatSpace(s$) !空白を読み飛ばす
DO WHILE s$(p:p)=" " AND p<=LEN(s$)
LET p=p+1
LOOP
END SUB


END

   └サンプル(あ〜たぁ!たたぁ!たぁ〜) 山中和義 2007/07/02 15:15:32  ツリーへ

Re: つづき(プログラム) 返事を書く ノートメニュー
山中和義 <drdlxujciw> 2007/07/02 15:15:32
サンプル(あ〜たぁ!たたぁ!たぁ〜)

!5の平方根
DATA "C.5" !X0=0.5
DATA "MCM+*=*5±+3*MR/2=" !Xn+1=Xn*(3-A*Xn^2)/2 平方根の逆数(1/SQR(A))を求める
DATA "MCM+*=*5±+3*MR/2="
DATA "MCM+*=*5±+3*MR/2="
DATA "MCM+*=*5±+3*MR/2="
DATA "MCM+*=*5±+3*MR/2="
DATA "MCM+*=*5±+3*MR/2=" !収束!?
DATA "*5=*=" !Xn*A



!eの近似値 Σ1/k!
DATA "1M+"
DATA "÷1M+"
DATA "÷2M+"
DATA "÷3M+"
DATA "÷4M+"
DATA "÷5M+"
DATA "÷6M+"
DATA "÷7M+"
DATA "÷8M+"
DATA "÷9M+"
DATA "÷10M+"
DATA "÷11M+"
DATA "÷12M+"
DATA "÷13M+"
DATA "÷14M+"
DATA "÷15M+"
DATA "MR"



!eの近似値 (( … ((1/15+1)/14+1)/13+ … +1)/2+1)/1+1
DATA "1"
DATA "÷15+1="
DATA "÷14+1="
DATA "÷13+1="
DATA "÷12+1="
DATA "÷11+1="
DATA "÷10+1="
DATA "÷9+1="
DATA "÷8+1="
DATA "÷7+1="
DATA "÷6+1="
DATA "÷5+1="
DATA "÷4+1="
DATA "÷3+1="
DATA "÷2+1="
DATA "÷1+1=" !"+1="



!手品
DATA "68888889+" !※タネを仕込む
DATA "12345678" !相手に見せながら。表示された数(1〜8)の中で一番大きいのは?
DATA "" !電卓をトントンと叩く動作をする。
DATA "=" !おもむろに=キーを押すと、先頭に8が表示される。(叩かれて前に出てきた)


インデックスへ EXIT
新規発言を反映させるにはブラウザの更新ボタンを押してください。