テンキーの数字からキーコードへの変換式

これまで、色々とプログラムを作っている際、押したテンキーの数字から、そのキーのキーコードを導き出す簡単な計算式があれば良いと思いつつも、そのようなものは考えついていませんでした。

そこで、配列変数を使って、以下のように対応を付ける方法を使っています。
10→DimZ
35→Z[1]:36→Z[2]
37→Z[3]:21→Z[4]
22→Z[5]:23→Z[6]
31→Z[7]:32→Z[8]
33→Z[9]:25→Z[0]


この場合は、テンキーの数字を N とすると、キーコードZ[N] で得られます。


fx-5800P では、配列変数へのアクセスは20ms 程度の時間がかかるので、上のように10個の配列変数を初期化するのに 200ms (0.2秒) かかります。それだけでなく、プログラム中で Z[N] を使えば、そのたびに 20ms の時間がかかります。実際はこの程度の時間を許容するしかないと思っています。

もし簡潔で高速に計算できるなら、テンキーの数字からキーコードを計算して使えばよく、配列変数の遅さを解消できる可能性があるので、頭の隅っこで引っかかっていました。


ところで、PCで使う Windows プログラムを作っていて、アイディアがひらめきました。全然違うことに頭を使っていると、昔の疑問へのヒントが突然現れる...人間の脳の働きは面白いと思います。

そして、fx-5800Pテンキーの数字からキーコードを求める式ができそうな気がしたので、整理してみました。

テンキー Nキーコードキーコード計算AB共通の計算式
135= 17+N+171117+N+10A+7B
236= 17+N+171117+N+10A+7B
337= 17+N+171117+N+10A+7B
421= 17+N+0 0017+N+10A+7B
522= 17+N+0 0017+N+10A+7B
623= 17+N+0 0017+N+10A+7B
731= 17+N+7 0117+N+10A+7B
832= 17+N+7 0117+N+10A+7B
933= 17+N+7 0117+N+10A+7B

このように、3色で区別したグループ内では、それぞれ共通点があり、上の表に示したように、AB が 01 になれば、17+N+10A+7B でキーコードが計算できることが分かりました。

従って、AB を高速に求める計算方法が見つかれば、今後のプログラムで利用できます



A については、単調減少する反比例のグラフ y = a/x +b をヒントにして、x = 1, 2, 3 の時 1≦y≦1.9 となり x = 4, 5, 6, ,7, 8, 9 の時 0 < y < 1 となる条件から ab を求め、N が 1, 2, 3 の時に A が 1 で、それ以外は A が 0 となる式を決めました。

 Int(1.35÷N+ 0.55)→A



B については、x = 4, 5, 6 の時 0< y < 1 となり、x がそれ以外の時 1≦ y < 2 となる使えそうなグラフは何かと考えてみて、取りあえず三角関数くらいしかなさそうだと考え、N = 1 ~ 9 を余弦関数 (cos) の1周期としてみると、

cos [2π (N-1)/8] 

ここで、N = 3 , 7 で丁度 0 となり、N= 1, 9 で丁度 1 となります。つまり、N = 4~6 で 0 以下となり、それ以外は正の数となるので、目的に合うことが分かります。あとは、係数をあれこれ検討すればよく、以下の式が出来ました。

Int(1+0.9cos((N-1)π÷4))→B

余弦関数 cos で N=1 の時から N=9 の時を1周期となるようにして、あとは Int( ) で 0 か 1 かになるように cosの振幅係数を 0.9 とし、グラフ全体を 1 だけ持ち上げるようにしたわけです。


以上をまとめると、テンキー Nキーコード  K は、

17+N+10Int(1.35÷N+0.55)+7Int(1+0.9cos((N-1)π÷4)))→K

と、取りあえず計算で求められることが分かりました。角度には Rad (ラジアン) を指定する必要があります。以下のプログラムは、1~9までのテンキーを押すと、計算だけでキーコードを表示します。


計算でテンキーのキーコードを求めるプログラム
Rad
Lbl 0
"N"?→N
17+N+10Int(1.35÷N+0.55)+7Int(1+0.9cos((N-1)π÷4))◢
Goto 0




この計算に要する時間を簡単に測定するために、以下の2つのプログラムの処理時間を比較してみます。

プログラムA
Rad
100→C:1→N
Lbl 0
17+N+10Int(1.35÷N+0.55)+7Int(1+0.9cos((N-1)π÷4))
N=9⇒0→N:Isz N
Dsz C
Goto 0
"DONE"



プログラムB
Rad
100→C:1→N
Lbl 0
N=9⇒0→N:Isz N
Dsz C
Goto 0
"DONE"


この2つのプログラムの処理時間の差が、換算式の処理時間とします。その結果、この計算には 152ms もかかることが分かり、残念ながら配列変数を使う方がはるかに速いことになります。実用性を考えれば、この方法を採用できません。なおテンキー 0 には対応していません。


今後、AB の計算が速くできる方法が見つかれば実用可能になります。ご提案があれば、是非聞かせてください

記録に残す意味も含めて、本エントリーをアップします。




なお、If文や ⇒命令を使って A と B を決めて計算すれば、当然ながら処理速度は速くなりますが、キーコードが必要な時に一々 If文や ⇒命令を使ったロジックを採用するのは、Casio Basicプログラムが途端に見づらくなります。またこのロジックをサブルーチンにして使う方法もありますが、fx-5800P ではサブルーチンの呼び出しのオーバーヘッドが大きく、処理時間がかかるので採用しづらくなります。従って、配列変数か計算式の速い方を採用するのが現実的でしょう。




応援クリックをお願いします。励みになるので...
にほんブログ村 IT技術ブログ 開発言語へ


 

keywords: fx-5800Pプログラミングプログラム関数電卓

リンク集 | ブログ内マップ
関連記事

テーマ : プログラム関数電卓
ジャンル : コンピュータ

コメントの投稿

非公開コメント

最新記事
検索フォーム
最新コメント
カテゴリ
C# (3)
Online Counter
現在の閲覧者数:
プロフィール

やす (Krtyski)

Author:やす (Krtyski)
since Oct 30, 2013


プログラム電卓は、プログラムを作って、使ってナンボ!

プログラム電卓を実際に使って気づいたこと、自作プログラム、電卓での Casio Basic, C.Basic そして Casio Python プログラミングについて書いています。

なお管理人はカシオ計算機の関係者ではありません。いつでもどこでもプログラミングができるプログラム電卓が好きな1ユーザーです。


写真: 「4駆で泥んこ遊び@オックスフォード郊外」

リンク
月別アーカイブ
Sitemap

全ての記事を表示する

ブロとも申請フォーム

この人とブロともになる

QRコード
QR