番外編 - 小さな時計 scClock

追加・修正 2015/11/01

e-Gadget 2周年記念として、以前作った Windows ソフトを公開します。

よろしければ、おひとつどうぞ! 


小さな時計 - scClock Ver2.1


こんなのあったらいいな!...作っちゃえ...で作ったものです。
外観だけでなく、ファイルサイズも小さい(168Kバイト)時計です。



機 能

アクティブになっているウィンドウの右上に常に張り付く、小さな時計です。



外 観

scClock 

実物大です。



特 徴

Windows PC では、複数のウィンドウを開いていることが多いと思いますが、今作業しているウィンドウの右上に常に時計が表示されます。
タスクバーを「隠れる」にしている場合、時計がいつも表示されていない時など、便利です。



効 能

アクティブウィンドウを切り替えると、小さな時計が切り替えたウィンドウに移動するので、常に時計が見えます。
何かを集中して作業している時に時間を忘れないようにしたい、予定の時間の前に作業を切り上げたい、など...で使えます。
Windows起動と同時に起動するようにして、私自身10年以上便利に使っています。



動作環境

Windows XP / VISTA / 7 / 8 / 8.1 / 10



使い方

起動方法
  • scClock.exe 自身か そのショートカットから起動するだけ。
終了方法
  • 小さな時計の上で、左ダブルクリック。
一時的に消す
  • 小さな時計の上で、右クリック
消した後、復帰させる
  • タスクバーにピン留めしておいた場合、小さな時計のアイコンを左クリック
移動方法
  • ドラッグ&ドロップで小さな時計を移動できます。但し、次にクリックしたら、そのウィンドウの右上へ自動移動。



ダウンロード

小さな時計 scClock Ver2.1

[2015/11/01] 圧縮ファイルをダウンロードするように変更
※ 圧縮ファイル scClock.zip (82,552 バイト) がダウンロードされます。
※ これを解凍して、scClock.exe (168,712 バイト) がプログラム実行ファイルです。



インストール

解凍した scClock.exe をどこか適当なフォルダにコピーするだけ。
Windows と同時起動させる方法は下記参照。
レジストリやその他初期化ファイルに書き込みしません。



アンインストール

アンインストールの必要なし。使いたくない時は、起動させなければOK.
Windows と同時起動させたくない場合は、[スタートアップ] フォルダから scClock.exe 自身か そのショートカットを削除してください。



Windows と同時起動させる方法

Windows 7 以前の場合
[スタートメニュー] - [プログラム] - [スタートアップ] に scClock.exe を登録(ショートカットをコピー)すると、Windows起動時に scClock も一緒に起動できます。

Windows 以降の場合
エクスプローラで、
[PC] - [ProgramData] - [Microsoft] - [Windows] - [スタートメニュー] - [プログラム] - [スタートアップ] 
scClock.exe のショートカットをコピーします。

或いは、ファイル名を指定して実行 を起動してから、以下を コピー&ペースト して
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp
[OK] をクリックすると、スタートアップのフォルダが開くので、そこに scClock.exe のショートカットをコピーすると楽かも知れません。



動作例

アクティブウィンドウを切り替えてみて、小さな時計が移動するのを確認してください。

例えば、

example1 

とか

example2 

とか

example3 

とか

example4 

=====

かなり昔(15年くらい前)に作ったものですが、Windows XP の頃から現在の Windows 10 まで長年問題なく使っているのものです。

※ 改造のご要望にはお応えできないので、予めご了承ください。



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


 
関連記事

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

e-Gadget 開設2周年

2015/10/30

e-Gadget は、カシオ製プログラム電卓 fx-5800P や搭載されているCasio Basicプログラミングをメインテーマとして、2013年10月30日に開設して以来、2周年を迎えました。

開設から2015年10月29日までの当ブログへの来訪者が累計 24,000人を超え、ページビューは 86,000 を超えました。数は少ないのですが、右上がりであることは、とてもうれしく思っています。

Access2015_10_29 
(開設以来、2015年10月29日までのアクセス履歴)


e-Gadget を開設した当時は、fx-5800P の Casio Basic については、まだよく分かっていませんでした。ネットで調べても、fx-5800P のCasio Basic の詳しい説明が見つからなかったので、取りあえずプログラムを色々と作りながら、取扱説明書では分からない Casio Basic の使いこなしを、メモ変わりに公開したのが当ブログの始まりでした。

調べれば調べるほど、Casio Basic が良く出来ていることが分かり、Casio basic 探索が面白くなりました。そして、Casio Basic の使いこなしについて、以下の異なる切り口で紹介するに至りました;
  • Casio Basic 入門講座
  • Casio Basic コマンドリファレンス
  • 逆引き Casio Basic
  • Casio Basic グラフィックス (fx-9860GII 専用)
最初は、fx-5800P のみでしたが、グラフ電卓 fx-9860GII のグラフィックスプログラミングへ広げるようになりました。

探索結果をほぼリアルタイムで公開しているので、間違いを後から訂正したり、タイプミスや誤字脱字などお見苦しい点が多々有りますが、間違いを隠さずに訂正するようにしています。読者の方々には申し訳ありませんが、その方が楽なので、そうさせてもらっています。



fx-5800P が盗難に遭っていなければ...

Casio Basic がよく分からないまま、fx-5800P で適当に作って日常的に使っているプログラムが幾つかありました。ある日、展示会で私の fx-5800P が置き引きに遭いました。

その電卓が無くなってみると、プログラムが使えなくて、たちどころに不便に感じたので、fx-5800P を買い直して、プログラムを入れ直そうとしました。ところがプログラムのソースをきちんと残していなかったので、思い出しながらプログラムを作り直ることになりました。

プログラムを作り直すために一部残っていたソースリストを見ると、その出来の悪さに感心(?)しました。より良いプログラムにしようと思ったのですが、知りたいことは取扱説明書には殆ど書かれていないので、自分で Casio Basic の詳細仕様を調べることにしました。すると Casio Basic は、電卓用の簡易的なものではなくて、なかなか侮れない言語だと分かってきました。

fx-5800P が盗難に遭っていなければ、当ブログは誕生しませんでした。



正直ここまで続くとは...

当初は、すぐにネタ切れになる心配がありました。

ところが色々な発見があり、次々にお宝が見つかるような楽しさを味わいながら、ここまで続いたのは、Casio Basoc が実に良く出来ているためだと思います。

例えば、まさか fx-5800P でモグラ叩きのようなアクションゲームを作れるとは思いませんでした。
また、実用的なユーザーインターフェースを備えたある程度の完成度の実用プログラムが多く作れたことも大きな成果です。実際に、当ブログで紹介しているプログラム以外にも、私自身が日常的に使っているプログラムが複数あります。

なお、これまでの3大トピックスを個人的にピックアップすると、
  • fx-5800P 特有ではあるが、特定キーの二重押しで特殊なキーコードが戻ること
  • Casio Basic でキーの長押しがメニュー操作の定番として使えること
  • Casio Basic 向けの汎用サブルーチン「入力ボックス」を作れたこと
で、Casio Basic プログラミングの幅が大きく広がりました。



特に今考えていること

プログラミングは一部の人の特殊技能と思う人が多いように感じています。一方で、IT業界で仕事をしている人(プログラマやSE)から聞く限り、プログラミング適性は、男女の違い、文系・理系の違いとは無関係、というのが常識のようです。

プログラマは理系じゃないとできないの?

私自身の感覚では、プログラミングは自動車の運転と似ていて、明かに向き不向き、上手下手はあるにしても、最低限の学習と練習をすれば誰でも習得できるものです。必要性や動機さえあれば始められるはずです。

プログラミングとは、手順書を書く作業なので、普通に皆が行っていることと大きく変わらないものです。コンピュータに指示する手順を考えることが、日々の生活や仕事で段取りを考えるのと、いったいどこが違うのか? 変わらないと思います。

プログラミングは、プログラミング言語の文法や単語を多少覚えれば基本的な学習は終わります。あとは実際に作ってみて練習を積めば、少しづつ身に付くものです。


さて、プログラミング初学者は、いったい何に躓ずくのかを調べた論文があります。これは、C言語のプログラミングの例ですが、初学者はキー入力のスペルミスに気付かない、エラーメッセージが理解できない、などプログラミングの本質に至る前に躓くというのです。

プログラミングの写経型学習過程を対象としたつまずきの分析とテキスト教材の改善

ネットで調べると、そもそも開発環境の構築が難しくて分からない、という理由も出てきます。ウィンドウに Hello World と表示するだけでも、覚えることはかなり多くあり、確かに敷居が高いのでしょう。このように、初学者の敵は、プログラミングの本質以外に多くあることが分かります。


面白いことに、プログラム電卓でのプログラミングは、かなり事情が違ってきます。

カシオのプログラム電卓の場合は、開発環境の構築は、Casio Baisc を搭載したプログラム電卓を入手しるだけです。あとはキーを幾つか押すだけで、すぐにプログラミングが始められます。

コマンドの入力は、メニューから選ぶだけなので、スペルミスの可能性は全くありません。エラーメッセージは、その数が少ない上にエラーが発生したところにカーソルが表示されるので、エラーの原因は分かりやすくなっています。

最後に、Casio Basic は覚えるコマンドが圧倒的に少ないので、学習にはとても有利です。

つまり、Casio Basic は、覚えやすく誰にでもプログラミングが出来て、自分専用の実用的なプログラムを作って使う楽しみを与えてくれるものだと思うのです。


最近の Casio Basic は、一昔前の Basic 風言語から大きく進化していて、構造化プログラミングが出来ます。Casio Basic で実際にプログラミングしていない人が取扱説明書を読むだけで大きな誤解をしているケールを、Q&Aサイトで多く見うけます。

実にもったいないと思います。



謝 辞

fx-5800P のみを扱っていたところに、fx-9860GII の面白さや価値を見い出すきっかけを頂いた sentaro様にもお礼を言わなければなりません。sentaro様の アドインプログラム: Ftune2は、fx-9860GIIをオーバークロックするツールですが、これにより、fx-9860GII を高速マシンに変身させます。コーディングが楽な Casio Basic でプログラムを書き、それを高速で実行する環境が手に入れられ、私の興味の対象を大きく広げてくれました。

また、高機能電卓の情報 ブログの管理人 akatuki様との交流で、私はインスパイアされ、まさに同行の士として気持ちの支えになっています。この場を借りて感謝の気持ちを伝えたいと思います。主にHPやTI製プログラム電卓の知見をお持ちで、広い視点から高機能電卓を俯瞰するスタンスで、エンドユーザー・コンピューティングの重要性、必要性にいつも言及されています。

そして、なによりも当ブログにお越し頂く皆様に感謝しています。大いに励みになっています。

ありがとうございます。



2周年記念プレゼント

ご希望の方に、Windows PC で使う "小さな時計 scClock Ver2.1" を差し上げます。
番外編 - 小さな時計 scClock



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


 

関連記事

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

逆引き Casio Basic - 目次 -

逆引き Casio Basic

新しい記事の公開に合わせて随時追記・修正します
更新: 2018/01/07

"逆引き Casio Basic" の連載は、"Casio Basicプログラミング" の "実用編" の連載に引き継ぎます。

Casio Basicプログラミング






以下は、以前の記述です。


逆引き Casio Basic
では、やりたいことに対して、その方法をサンプルプログラムと共に紹介してゆく。

新世代 Casio Basic を搭載した fx-5800P と fx-9860GII を前提にするが、新世代 Casio Basic  を搭載した他の Casio 高機能電卓(下記参照)への移植性は高く、移植に伴う修正部分は少ないと思う。

<新世代Casio Basic搭載機>
  - fx-5800P
  - fx-9860G (OS Ver 2 以降)
  - fx-9860GII
  - fx-CG10
  - fx-CG20
  - fx-FD10 Pro
  - fx-CG50



逆引き Casio Basic - 目次

  逆引き Casio Basic について


電卓操作

   (代入)命令の入力方法 [fx-5800P]

   ' (コメント) の入力方法 [fx-9860GII]


入力処理
      
  
キーリピート抑制 [fx-5800P / fx-9860GII / fx-CG20 / fx-CG50]
    キーリピートを抑制する 

  矢印キーの判別 [fx-5800P / fx-9860GII / fx-CG20 / fx-CG50]
    4つの矢印キーのうち、どれが押されたかを判別する 

  矢印キーで項目選択(1) [fx-5800P / fx-9860GII / fx-CG20 / fx-CG50]
    矢印キーを使って項目を選択する(1) 

  矢印キーで項目選択(2) [fx-5800P / fx-9860GII / fx-CG20 / fx-CG50]
    矢印キーを使って項目を選択する(2) 

  キー押下でプログラムをコントロールしたい [fx-5800P / fx-9860GII / fx-CG20 fx-CG50]
    プログラムの一旦停止や実行をキー押下でコントロールしたい

  テンキーでメニュー選択させたい [fx-5800P / fx-9860GII / fx-CG20 / fx-CG50]
    テンキーでメニュー選択させるプログラムを作りたい

  キー長押しでメニュー選択させたい [fx-5800P / fx-9860GII / fx-CG20 / fx-CG50]
    メニュー選択機能で、同じキーの長押しにより2つ目の選択肢を与えたい


出力処理

   命令を Basic コマンドに置き換えたい [fx-5800P / fx-9860GII / fx-CG20 / fx-CG50]  
     命令 を Basic コマンドに置き換えて、fx-5800 と fx-9860GII 互換のコードを書く


計算

  fx-5800P で Mod を使いたい [fx-5800P]
    fx-9860GII (グラフ関数電卓)の 除算の余りが得られる Mod 関数を fx-5800P で実現する

  整数の桁数を求めたい [fx-5800P / fx-9860GII / fx-CG20 / fx-CG50]
    Locate コマンドを用いて、正しい場所に数値を表示するために 「整数の桁数」 を求める


処理速度

  プログラムを速くしたい [fx-5800P]
    Casio Basic特有の内部処理に基づいて、プログラムを速くする対策を行う




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


 



keywords: CasioBasicプログラミング入門プログラム関数電卓

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

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

キー長押しでメニュー選択させたい - Casio Basicプログラミング

Casio Basicプログラミング
<目次>

誤字脱字・記載ミスや分かりにくい表現は随時追記・修正します

修正:2015/10/13
[純正] [5800P / FX / CG]
メニュー選択機能で、同じキーの長押しにより2つ目の選択肢を与えたい。



1つのキーを普通に押すだけでなく、同じキーの長押しで別の動作ができれば、1つのキーに2つの異なるメニュー機能を与えられる。これによって、プログラム電卓の限られた広さの画面を有効に使える。

そこで、定石として使える汎用性の高いコードを紹介する。

以下のようなサンプルプログラムを作る。

[1] キーと [2] キーには、普通に押した時と長押しで異なる処理を割り当て、
[3] キーには、普通に押した時のみ処理を割り当て、
[4] キーには、長押しした時のみに処理を割り当てる

このサンプルプログラムは、テンキーでメニューを選択させたい - 逆引き Casio Basic のサンプルプログラムを拡張したものだ。


画面に、

1:ONE      2:TWO
3-THREE  4.FOUR


と表示させる。

数字の後ろに : があれば普通に押す時と長押しの両方に対応し、数字の後ろが . になっていれば長押しのみの対応、数字の後ろが - なら普通に押すことのみに対応する...と意味を持たせてある。

ここでは、汎用性のある fx-5800P 用のコードを示す。fx-9860GII や fx-CG50 / CG20 に対応するには、後述するように4カ所のキーコードの記述を変更するだけで良い。

サンプルプログラムの動作仕様;
  • [1] を押せば 3行目に HIT [1] と表示
  • [2] を押せば 3行目に HIT [2] と表示
  • [3] を押せば 3行目に HIT [3] と表示
  • [1] の長押しで、3行目に LONG PUSH [1] と表示
  • [2] の長押しで、3行目に LONC PUSH [2] と表示 
  • [4] の長押しで、3行目に LONG PUSH [4] と表示
  • 3行目の表示と同時に、4行目右端にガイド表示 <EXE> を示し、[EXE] で再入力できることを示す
  • [1][4] 以外のキーを押したり、[1][2][4] 以外の長押しでも誤動作しない。

サンプルコード
Locate 1,1,"1:ONE"
Locate 9,1,"2:TWO"
Locate 1,2,"3-THREE"
Locate 9,2,"4.FOUR"

While 1

0→M
Do
Getkey→K
LpWhile K=0
K=35⇒1→M
K=36⇒2→M
K=37⇒3→M

0→C
While Getkey=35
Isz C:C=9⇒Break
WhileEnd
C=9⇒11→M

0→C
While Getkey=36
Isz C:C=9⇒ Break
WhileEnd
C=9⇒12→M

0→C
While Getkey=21
Isz C:C=9⇒Break
WhileEnd
C=9⇒14→M


If M=1
Then Locate 1,3,"HIT [1]"
Else If M=2
Then Locate 1,3,"HIT [2]"
Else If M=3
Then Locate 1,3,"HIT [3]"
Else If M=11
Then Locate 1,3,"LONG PUSH [1]"
Else If M=12
Then Locate 1,3,"LONG PUSH [2]"
Else If M=14
Then Locate 1,3,"LONG PUSH [4]"
IfEnd:IfEnd
IfEnd:IfEnd
IfEnd:IfEnd


If M
Then Locate 12,4,"<EXE>"◢
Locate 1,3,"       " (スペース13個
Locate 12,4,"   " (スペース5個)
IfEnd

WhileEnd



定石として使えるのは、赤文字のブロック紫文字のブロック、そして青文字のブロックだ。


サンプルプログラムをブロック構造で示すと、

 [初期表示]

 While 1

   [メニュー選択]

   [キー長押しによるメニュー選択]

   [選択したメニュー番号に応じた分岐処理]

   [後処理]

 WhileEnd


このように構造化され、初期表示を行ったのち、While 1 / WhileEnd で構成された無限ループ内で、メニュー選択→分岐処理→後処理 が繰り返される。

==========

メニュー選択のためのキー入力は、赤文字の部分が定石として使える。

Do
Getkey→K
LpWhile K=0


は、何もキー入力が無い時はこのループをグルグルまわっていて、何かキーが押された時に押されたキーのキーコードを変数 K に格納してからこのループを抜けて、次の処理へ進む。この部分は、テンキー以外のキー入力にも対応できる。

このループに続く以下の部分、

K=35⇒1→M
K=36⇒2→M
K=37⇒3→M


ここで、押されたキーのキーコードに応じて、メニュー変数 M にメニュー番号を格納する。

実は、赤文字の部分の冒頭にある 0→M が極めて重要だ。今回はテンキー [1][3]、つまりメニュー番号が 1 ~ 3 のみで、それ以外のキーを押しても、誤動作しないようにしたい。そこで、操作上メニュー番号が 0 になることが無いので、最初にメニュー変数 M に 0 を入れておく。そしてメニュー選択により M が 1、2、3 のいずれかになる。つまり、変数 M は、0 ~ 3 のいずれかの値になって、絶対に他の値にならないことを保証しているわけた。そのため、0→M は誤動作防止のために極め重要になる。

長押しに関するコードは、この部分からは独立していることも重要ポイントで、汎用性のあるコードになっている。

==========

次に、紫文字のブロックでは、特定キー長押しの検出とメニュー番号への割り振りを行っている。

0→C
While Getkley=35
Isz C:C=9⇒Break
WhileEnd

C=9⇒11→M

この場合は、[1] の長押しの検出と、[1] 長押しに対応するメニュー番号を 11 として、メニュー変数 M に 11 を格納している。この5行のコードに続いて、赤文字の 3511 を変更しただけの While 以降の4行のコードを3回繰り返している。

さて、While 以下の4行のコードを詳しくみてみる。

While Getkey=35
Isz C:C=9⇒Break
WhileEnd


これは、Getkey が実行される時にキーコード 35 に対応する [1] キーが押されていれば、While ループを回るようにしている。ループを1回まわると、Isz C でカウンタ変数 C を1つ増やす。カウンタ変数 C は、While ループに入る前に 0→C で 0 に初期化されている。

そして、C=9 になったとき、つまりループを9回まわると、C=9⇒Break によりループから強制的に抜けて、次の処理へ続く。
その次の処理が、C=9⇒11→M になっていて、きちんとループを9回まわって抜けてきた場合のみメニュー変数 M に 11 を格納する。
普通に [1] を押した時のメニュー番号 M を 1 にしたので、長押しは 10 を足して 11 としている。この値は、他と重複しなければ何でも良い。

ところで、Break コマンドは、それが記述されているループから強制脱出する。
Casio Basic コマンドリファレンス: Break 参照

2カ所ある C=9 の部分が、ループを抜けるまでに回る回数を示していて、長押しと判定されるための時間(=ループ回数)を指定している。この値を大きくすれば、長押しとして判定される時間が長くなり、小さくすればチョット長押しするだけで長押しとして判定される。

fx-5800P だと C=9 くらいが丁度良いと思って 9 にしてるが、9 である必要はない。fx-9860GII で使う場合は、処理速度が速いので 15 くらい丁度良いかも知れない。


キーコード 36 の [2] キーの長押し判定とメニュー番号指定(M=12とする)は、以下のようになる。

0→C
While Getkey=36
Isz C:C=9⇒Break
WhileEnd
C=9⇒12→M


キーコード 21 の [4] キーの長押し判定とメニュー番号指定(M=14とする)は、以下のようになる。

0→C
While Getkey=21
Isz C:C=9⇒Break
WhileEnd
C=9⇒14→M


このように、汎用性の高いコードになっている。

==========

さて、得られらたメニュー番号に応じて、分岐処理を行う青文字の部分は、上のメニュー選択部と対になる重要な骨組みだ。
If / Else / IfEnd を使っている。 詳しくは、Casio Basic コマンドリファレンス: If 文 を参照。

メニュー変数 M が 1, 2, 3, 11, 12, 14 の6通りで分岐処理を行っている。

If M=1
Then Locate 1,3,"HIT [1]"
Else If M=2
Then Locate 1,3,"HIT [2]"
Else If M=3
Then Locate 1,3,"HIT [3]"
Else If M=11
Then Locate 1,3,"LONG PUSH [1]"
Else If M=12
Then Locate 1,3,"LONG PUSH [2]"
Else If M=14
Then Locate 1,3,"LONG PUSH [4]"
IfEnd:IfEnd
IfEnd:IfEnd
IfEnd:IfEnd



この分岐処理を行うブロックで、If 文での分岐にキーコードを使わす、一旦代入したメニュー変数 M を使うには理由がある。
  • 理由1: 上のfx-5800P 用のコードを fx-9860GII へ移植する場合、赤文字部のメニュー選択部の一部を変更するだけで、青文字の分岐処理のブロックを変更する必要が無い。
  • 理由2: テンキー選択が多い場合や、テンキー以外のキー入力に対応して、分岐処理を増えた場合は、メニュー変数で整理する方がプログラムの可読性が増して、分かりやすくバグが入り込みにくい。
  • 理由3: 長押し検出による機能追加にも、対応するメニュー番号を使って拡張できる。

fx-9860GII / fx-CG20 / fx-CG50 への対応

なお、上のコードをグラフ関数電卓 fx-9860GII / fx-CG20 / fx-CG50用に変更する場合は、赤文字部を以下のように変更するだけば良い。

0→M
Do
Getkey→K
LpWhile K=0
K=72⇒1→M
K=62⇒2→M
K=52⇒3→M


0→C
While Getkey=72
Isz C:C=9⇒Break
WhileEnd
C=9⇒11→M

0→C
While Getkey=62
Isz C:C=9⇒ Break
WhileEnd
C=9⇒12→M

0→C
While Getkey=73
Isz C:C=9⇒Break
WhileEnd
C=9⇒14→M


変更箇所は、赤文字のキーコードのみにな、プログラムの他の部分を変更する必要がない。

==========

話を元に戻して...

青文字のブロックに続く後処理は、

If M
Then Locate 12,4,"<EXE>"◢
Locate 1,3,"    " (スペース7個)
Locate 12,4,"   " (スペース5個)
IfEnd


となっている。

[EXE] で元に戻るための使用方法の表示 <EXE> を行って、 命令で一旦停止。[EXE] で一旦停止を解除したら、全ての表示をスペースで上書き消去している。なお、これら後処理は、有効なメニュー番号が選択された時のみ実行する。
有効なメニュー番号は 0  以外の整数なので、M が 0 でない時のみ実行するために、If M / IfEnd の中に記述している。ここでも、最初に変数 M を 0 で初期化していることが活きてくる。

If [分岐条件] / IfEnd の書式で、[分岐条件] は、それが 0 以外なら If 内の処理(If と IfEnd の間の処理)へ分岐する。0 なら処理を行わず、次へ進む。従って、If M という記述が可能になる。

詳しくは、Casio Basic コマンドリファレンス: If 文 参照。




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


 



keywords: プログラム関数電卓、Casio Basic、C.Basic、プログラミング

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

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

テンキーでメニュー選択させたい - Casio Basicプログラミング

Casio Basicプログラミング
<目次>

誤字脱字・記載ミスや分かりにくい表現は随時追記・修正します

修正:2016/10/12
[純正] [5800P / FX / CG]
テンキーでメニュー選択するプログラムを作りたい。



画面に、

1:ONE      2:TWO
3:THREE


と表示し、テンキー [1][2] か [3] を押して、それぞれに対応した異なる処理を行うサンプルプログラムを作る。

ここでは、汎用性のある fx-5800P 用のコードを示す。グラフ関数電卓 fx-9860GII や fx-CG50 / fx-CG20 に対応するには、後述するように3カ所のキーコードの記述を変更するだけで良い。

サンプルプログラムの動作仕様;
  • [1] を押せば 3行目に HIT [1] と表示
  • [2] を押せば 3行目に HIT [2] と表示
  • [3] を押せば 3行目に HIT [3] と表示
  • 3行目の表示と同時に、4行目右端にガイド表示 <EXE> を示し、[EXE] で再入力できることを示す
  • [1][3] 以外のキーを押しても誤動作しない
サンプルコード
Locate 1,1,"1:ONE"
Locate 9,1,"2:TWO"
Locate 1,2,"3:THREE"

While 1

0→M
Do
Getkey→K
LpWhile K=0
K=35⇒1→M
K=36⇒2→M
K=37⇒3→M

If M=1
Then Locate 1,3,"HIT [1]"
Else If M=2
Then Locate 1,3,"HIT [2]"
Else If M=3
Then Locate 1,3,"HIT [3]"
IfEnd:IfEnd
IfEnd


If M
Then Locate 12,4,"<EXE>"◢
Locate 1,3,"    " (スペース7個)
Locate 12,4,"   " (スペース5個)
IfEnd

WhileEnd



定石として使えるのは、赤文字のブロック青文字のブロックだ。


サンプルプログラムをブロック構造で示すと、

 [初期表示]

 While 1

   [メニュー選択]

   [選択したメニュー番号に応じた分岐処理]


   [後処理]

 WhileEnd


このように構造化され、初期表示を行ったのち、While 1 / WhileEnd で構成された無限ループ内で、メニュー選択→分岐処理→後処理 が繰り返される。

※ 無限ループを Casio Basicで使う場合、[AC]キーでいつでも強制終了できる。

==========

メニュー選択のためのキー入力は、赤文字の部分が定石として使える。

Do
Getkey→K
LpWhile K=0


は、何もキー入力が無い時はこのループをグルグルまわっていて、何かキーが押された時に押されたキーのキーコードを変数 K に格納してからこのループを抜けて、次の処理へ進む。この部分は、テンキー以外のキー入力にも対応できる。

このループに続く以下の部分、

K=35⇒1→M
K=36⇒2→M
K=37⇒3→M


ここで、押されたキーのキーコードに応じて、メニュー変数 M にメニュー番号を格納する。

実は、赤文字の部分の冒頭にある 0→M が極めて重要だ。今回はテンキー [1][3]、つまりメニュー番号が 1 ~ 3 のみで、それ以外のキーを押しても、誤動作しないようにしたい。そこで、操作上メニュー番号が 0 になることが無いので、最初にメニュー変数 M に 0 を入れておく。そしてメニュー選択により M が 1、2、3 のいずれかになる。つまり、変数 M は、必ず 0 ~ 3 のいずれかの値になって、絶対に他の値にならないことを保証している。そのため、0→M は誤動作防止のために極め重要になる。

除算の[-] キーと 負数の[(-)] キーがあるが、これらのどちらを押しても同じ処理動作をしたい場合は、例えば
K=67⇒4→M
K=57⇒4→M
というように、複数のキー入力でメーニュー番号4に対応させることもできる。これは、キー入力取得部分と分岐処理部分を分ける利点の1つに挙げられる。

==========

次に、得られらたメニュー番号に応じて、分岐処理を行う青文字の部分は、上のメニュー選択部と対になる重要な骨組みだ。
If / Else / IfEnd を使っている。 詳しくは、Casio Basic コマンドリファレンス: If 文 を参照。

メニュー変数 M が 1, 2, 3 の時に分岐処理を行っている。

If M=1
Then Locate 1,3,"HIT [1]"
Else If M=2
Then Locate 1,3,"HIT [2]"
Else If M=3
Then Locate 1,3,"HIT [3]"
IfEnd:IfEnd
IfEnd


この分岐処理を行うブロックで、If 文での分岐にキーコードを使わす、一旦代入したメニュー変数 M を使うには理由がある。
  • 理由1: 上のfx-5800P 用のコードを グラフ関数電卓 (fx-9860GII、fx-CG20 / fx-CG50) へ移植する場合、赤文字部のメニュー選択部の一部を変更するだけで、青文字の分岐処理のブロックを変更する必要が無い。
  • 理由2: テンキー選択肢が多い場合や、テンキー以外のキー入力に対応して分岐処理を増やす場合、そして1つの分岐処理に複数のキー入力を対応させる場合は、メニュー変数1つに対して1つの分岐処理を記述でき、プログラムの可読性が増して、分かりやすくバグが入り込みにくい。

fx-9860GII / fx-CG20 への対応


上のコードを fx-9860GII や fx-CG50 / fx-CG20 向けに変更する場合は、赤文字部を以下のように変更すれば良い。

0→M
Do
Getkey→K
LpWhile K=0
K=72⇒1→M
K=62⇒2→M
K=52⇒3→M


変更箇所は、赤文字のキーコードのみにな、プログラムの他の部分を変更する必要がない。

==========

青文字のブロックに続く後処理は、

If M
Then Locate 12,4,"<EXE>"◢
Locate 1,3,"    " (スペース7個)
Locate 12,4,"   " (スペース5個)
IfEnd


となっている。

[EXE] で元に戻るための外と表示 <EXE> を行って、 命令で一旦停止。[EXE] で一旦停止を解除したら、全ての表示をスペースで上書き消去している。なお、これら後処理は、有効なメニュー番号が選択された時のみ実行する。
有効なメニュー番号は 0  以外の整数なので、M が 0 でない時のみ実行するために、If M / IfEnd の中に記述している。ここでも、最初に変数 M を 0 で初期化していることが活きてくる。

If [分岐条件] / IfEnd の書式で、[分岐条件] は、それが 0 以外なら If 内の処理(If と IfEnd の間の処理)へ分岐する。0 なら処理を行わず、次へ進む。従って、If M という記述が可能になる。

詳しくは、Casio Basic コマンドリファレンス: If 文 参照。




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


 



keywords: プログラム関数電卓、Casio Basic、C.Basic、プログラミング

リンク集 | ブログ内マップ



関連記事

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

◢ 命令を Basic コマンドに置き換えたい - Casio Basicプログラミング

Casio Basicプログラミング
<目次>

誤字脱字・記載ミスや分かりにくい表現は随時追記・修正します

2015/10/11
[純正] [5800P / FX / CG]
命令を Basic コマンドに置き換えて、fx-5800P や fx-9860GII 互換のコードを書く。



Casio Basic の Basic コマンドは、fx-5800P と グラフ関数電卓 (fx-9860GII や fx-CG20 / fx-CG50) との間でほぼ互換性がある。しかし、意外にも旧来の命令は、詳細動作において互換性が得られない。

fx-9860GII への移植 - 厄介な旧来の命令 参照
※ fx-CG20 / fx-CG50 でも同じ問題がある.

そこで、例えば (出力)命令の機能を Basic コマンドで置き換えられれば、互換性の問題を回避できる。

と置き換える Basic コード:

fx-5800P 用
While Getkey
WhileEnd
While Getley≠47
WhileEnd


fx-9860GII / fx-CG20 用
While Getkey
WhileEnd
While Getkey≠31
WhileEnd


※異なるのはキーコードのみ.

==========

実際に使ってみる;

0→C
While 1
Isz C
Locate 1,1,C

WhileEnd

と同じ機能を fx-5800P で実現する。

0→C
While 1
Isz C
Locate 1,1,C
While Getkey
WhileEnd

While Getkey≠47
WhileEnd

WhileEnd


==========

While Getkey≠47
WhileEnd


このループは、キーコード 47 のキー、つまり [EXE] キーが押されない限り、繰り返しを継続して、処理が先に進まない。[EXE] キーが押される時のみ、処理が先へ進む。

命令を使う時は、[EXE] キーを1回押せば、そして [EXE] を長押ししても、Locate 1,1,C を1回だけ実行する(キーリピートはしない)ので、

While Getkey
WhileEnd


により キーリピートを抑制している。

キー押下でプログラムをコントロールしたい - 逆引き Casio Basic



fx-9860GII / fx-CG20 / fx-CG50 への対応

上記のコードで、キーコード 47 を 31 に書き換えるだけで良い。



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


 



keywords: プログラム関数電卓、Casio Basic、C.Basic、プログラミング

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

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

テンキーの数字からキーコードへの変換(2)

テンキーの数字からキーコードへの変換 について、続報です。

計算式に拘っていたのがよくありませんでした。数行のコードで高速変換する方法が見つかったので、記録として書いておきます。



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

そこで、配列変数を使って、以下のように対応を付ける方法を使っています。
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 の時間がかかります。実際はこの程度の時間を許容するしかないと思っています。

テンキーの数字からキーコードを簡潔かつ高速に変換する方法が思いつかなかったのですが、高速な方法がありました。

基本的なアイディアは、前回と同じで、以下の変換表をそのまま使います。

テンキー 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 と B を高速に求める方法が、意外に簡単に見つかりました。式1つで変換する方法に拘っていたのがいけません。

いきなりコードを示します。

0→A:0→B
4-N>0⇒1→A
Abs(N-5)>1⇒1→B
17+N+10A+7B→K


テンキーの数字は N、換算して得るキーコードは K です。

A と B を高速に求めるのは最初の3行で、4行目の加算と乗算の式まで加えも十分高速です。

ついでに、テンキーの [0] からキーコード 25 を得る部分を追加すると、

0→A:0→B
4-N>0⇒1→A
Abs(N-5)>1⇒1→B
17+N+10A+7B→K
N=0⇒25→K


でOKです。


これを検証するプログラムは以下です。

ファイル名:N2KC
Lbl 0
Cls
"Ten Key"?→N
0→A:0→B
4-N>0⇒1→A
Abs(N-5)>1⇒1→B
17+N+10A+7B→K
N=0⇒25→K
K◢
Goto 0




テンキー以外のキーを押すとエラーになりますが、これについては必要に応じて考えようと思います。

上の変換表を利用して、キーコードからテンキーの数字を求める際は、テンキー以外を押した時の対処を考えると、配列変数を使うメリットがあります。と言うのも、配列変数の領域確保を行うと、確保した全ての配列変数が0で初期化されるため、それが0でないことを条件に簡単にエラーを排除できるからです。

さて、今回の変換表を生かして、逆方向の変換、つまりキーコードからテンキーの数字を得る方法も、別途考えようと思います。




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


 


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

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

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

あなたの Best One カシオ電卓は?

 
akatuki様のブログ「高機能電卓の情報」のエントリ:10月になりました で、カシオが電卓発売50周年のキャンペーンをやっていると知りました。

あなたが選ぶカシオの電卓 No1 キャンペーン

そして50周年記念のプレミアム電卓 S100 も登場しました。持つ喜びを感じる嗜好品として設計されたとのこと。実売想定価格2万7千円とは記念モデルならではです。

S100 

フラッグシップモデルと称されていますが、プログラム電卓愛好者としては、真のフラッグシップモデルは、プログラム電卓であるべきと思うところです。キートップ印刷の代わりに金太郎飴にしたり、キー形状を配列ごとに変えるといったものは、既に昔からあって、それを殊更強調して改めて紹介しているだけです。ちょっと舐められた感じがします。改めて既存の技術やデザインを宣伝する目的があるとしか思えません。

以前あった、カシオミニ復刻版と大差ないくせに、大騒ぎしているだけと言うのは言い過ぎでしょうか?

関数電卓では、fx-JP900 が持つ喜びをコンセプトに開発されたわけですが、それだけでなく演算速度の大幅な向上という内容も伴っていました。S100 に道具の機能としての新しさはいったいどこにあるのでしょうか?

単なる無駄遣いに見えてなりません。まぁ、お祭り騒ぎに無駄云々というのは、興ざめとおしかりを受けそうですが...


あなたが選ぶカシオの電卓 No.1 キャンペーンでは、私は fx-5800P を投票しました。

皆様もぜひ、プログラム電卓を投票して欲しいものです。


関連記事

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

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

やす (Krtyski)

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


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

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

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


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

リンク
月別アーカイブ
Sitemap

全ての記事を表示する

ブロとも申請フォーム

この人とブロともになる

QRコード
QR