電卓あそび 山中和義 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が表示される。(叩かれて前に出てきた) |