番外編 - Dell Inspiron 3148 と外部ストレージ速度

番外編
e-Gadget

2016/12/26
追記・修正 2016/12/30

※ [2016/12/30 追記項目]
I・O Data HDPC-UT のテスト結果の更新 と フラッシュドライブ SanDisk の Ultra Fit 128GB と Cruzer Fit 16GB のテスト結果を追加


年末恒例、日頃使っているPCの清掃とHDD内のファイルの整理を行いました。

そして、ふと気になって、外付けHDDやUSBメモリの読み書き速度を調べてみました。

今まで、外部ストレージの読み書き速度は殆ど気にしたことがないので、条件をできるだけ揃えて実験してみた結果は、これらの知識が少ないこともあって、私にとっては新鮮 かつ 興味深いものになりました。以下まとめ;
  • Inspiron 3148 の内蔵HDD の読み書きが結構遅いこと(気になってはいないが...)
  • HDDはRandum Access は非常に遅くなる(HDD のデフラグが極めて有効なのは知っている...)
  • USB2のストレージを USB3のポートに繋ぐと速くなること(これは意外...)
  • USB メモリの読み込みは USB2接続の HDDなみだが、書き込みはとても遅い
  • SD (Class 10, UHS-1) のSequencial Readは USB2のメモリ並に速い(SDを見直した...)
読み書き速度測定は、Dell Inspiron 3148 に外部ストレージを繋ぎ、CrystalDiskMark64 で測定しました。

そんなの知ってたよ、という方はお読み飛ばしください。



PCの清掃

清掃は年末恒例で実施しています。
デスクトップPCの場合は、内部に埃が溜まると、冷却能力の低下や無用なショートや漏電の原因になるので、内部清掃は結構大切です。

ノートPCは、最近はあまり分解せずキーボードのキーの隙間の埃を吹き飛ばす程度の清掃です。



ファイルの整理

さて面倒なのが、HDD内のファイル、そして外付けHDDやUSBメモリ内のファイルの整理です。同じファイルや似たようなファイルが、あちこちに溜まっていて、使いもしない大きなファイルが容量を圧迫していたり、リビジョン管理から漏れたファイルなどが溜まっています。


Inspiron 3148 内蔵 HDDのファイル整理

趣味とは言えプログラムを作っていると、結構ファイルが増えます。画像関係のプログラムで遊んでいると結構大きなテストファイルなども溜まってゆきます。購入してほぼ1年ですが、500GBの内蔵HDDは、空き容量が60GB以下になっていました。

押し入れとHDDは、すぐに容量一杯になるというのは本当ですね。今回の作業では空き領域が 180GB まで復活しました。

日頃、適当に手持ちのUSBメモリや外付けHDDにファイルを分散させることも多く、どこにどんなファイルがあるのかが完全に把握できなくなっています。

そこで、今回は手持ちの全ての外部ストレージ(外付けHDD11台、USBメモリ9本)の整理をしました。過去数年溜めてきたファイルの大掃除です(^^;

先ずは、2TB の外付け2.5インチHDD をAmazonで安く入手 (Western Digital Elements Portable 2TB、¥8,980) し、必要なファイルを一括して整理保存することにし、他の手持ちの外部ストレージは極力空っぽにする作戦です。なお、イメージバックアップファイル(大きなファイル)や異常対応のためのシステム起動用 USBドライブは、手を付けずにおきました。



一番左が、¥1,000引きクーポン付きだったので最近Amazonで購入した 2TB 品です。
その右隣は、3年前に Amazon で購入して使ってるもの、真ん中のアイオーデータ品はバックアップ用に昨年から使っています。

Freecom Mobile Drive の大ファンなので、チョット一言...
ちなみに私は、Freecom の Mobile Drive XXS のデザインの大ファンで、非常に薄くて持ち運びやすく、データ専用ドライブとして7年ほど使ってトラブル無しです。また、Mobile Drive XXS Leather も持ち運んでバックアップ用に愛用しています。

残念なことに、Freecom は国内での販売を 2016年2月に停止し、国内サポートは2年保証期間が終わる 2018年2月までとなっています。実は国内販売停止のニュースを見て、記念に Mobile Drive XXS Leather 1TB を購入しました(当時の購入時は7千円台でした)。今 Amazonで探すと上記のような感じです。デザインとサイズが気に入って、これがどうしても欲しいとなれば、一番右は許容範囲かも知れません。本来の2年保証は受けられない可能性も考慮する必要がありそうです。海外で安く買える可能性や並行輸入品の登場に多少期待しています。


さて、家族の写真や動画など保管すべきデータは、500GB未満の外付け HDD(6台)にパンパンになるまで保存し、将来CDやDVDに焼いておく予定です。

これら以外のメディアを今回の読み書き速度測定の対象にしました。



各種ストレージの読み書き速度

CrystalDiskMark64 の上から2行を以下にまとめます。


HDD

外付け HDD の読み書き速度を調べた結果です。測定の前には、外付けHDD のファイルが空に近い状態にしました(イメージバックアップのファイルを保存している I・O Data HDPC-UTを除く)。
※ [2016/12/30 追記] I・O Data HDPC-UT のファイルを全て削除してテストした結果、容量50%のファイルが有る時と殆ど同じ結果が得られました。 



大まかな
メディア
容量
接続
ポート
Seq.
Read
(MB/s)
Seq.
Write
(MB/s)
Rand.
Read
(MB/s)
Rand.
Write
(MB/s)
 Freecom Mobile Drive XXS
 (Saegate)
USB2
500GB
USB224210.420.80
USB338400.420.79
 Freecom Mobile Drive XXS 3.0
 (Seagate)
USB31TBUSB31051030.530.84
 I・O Data HDPC-UT
 (Toshiba)
USB31TBUSB395920.480.91
 WD Elements Portable
 (Western Digital)
USB31TBUSB31071070.581.12
 WD Elements Portable
 (Western Digital)
USB32TBUSB31181180.571.4








 Dell Inspiron 3148 内蔵 HDD
 (Seagate)

500GB
86840.810.67

測定結果は、MB/s つまり MByte/s です。CrystalDiskMark64 での測定結果は、わりとバラつくので、だいたいの傾向を見る程度の使い方が良さそうです。そこで、上の表では100以上の数値は例外として、他は有効数字2桁にしました。

さて、USB規格の確認ですが、USB2 の通信速度の理論最大値は 480 Mb/s = 60 MB/s で、USB3 は 5 Gb/s = 640 MB/s です。 8 Mbit = 1 MByte なので、測定値の単位を合わせるために、それぞれ8で割りました。

蛇足ですが、給電能力の規格は USB2 の 500mA から USB3 の 900mA に増強されています。


 USB2 と USB3 の違い

USB3 の HDD のシーケンシャル・アクセス速度は、読み書き共に USB2 の HDD の5倍程度で、確かに USB3 の高速化は測定結果に現れています。これは、一応確認のための測定です。I・O Data HDPC-UT は、イメージバックアップのファイルで容量の 80% 程度を占めており、その分遅くなっていると思われる。
 

USB2 HDD を USB2ポートと USB3ポートに繋いだ時の違い

実は、この実験が興味深い結果になりました。


Mobile Drive XXS 500GB 
Freecom Mobile Drive XXS (USB2, 500GB)

小さく薄いので以前からパソコンと一緒に持ち歩いていたもので、まだ USB3 が普及する前に購入しました。

USB2 インターフェースのこの  HDD を Inspiron 3148 にある USB2 と USB3 のポートに繋いで比較してみました。


 MD XXS + USB2 MD XXS + USB3 
左:USB2ポートに接続、右:USB3ポートに接続(接続メディアは USB2 デバイス)



USB3 ポートに繋ぐと、シーケンシャルアクセスでは確実に速度が1.5~2倍に向上することが分かり、興味深い結果です。


Inspiron 3148 内蔵 HDD (seagate) の読み書き速度

ついでに、PC内蔵HDDの速度を調べてみると、意外に遅い数値になりました。

Inspiron3148 HDD 

そもそも、スピードを要求するつもりで購入したPCではないので、そんなものかと思うのですが、それにしても遅い感じがします。

そこで、5GB 程度の大きさのファイルをコピーしながら、タスクマネージャで転送速度を見てみると、

TaskMgr 

100 MB/秒 程度出ています。実際に使っていて速度が気になるのは、大きなファイルの転送速度ですから、特にこれで問題ないと思います。CrystalDiskMark64 の測定値は絶対ではなさそうだということです。使用されているファイル数、使用容量、デフラグ状況などの条件に依存するのでしょう。



USBメモリ

USBメモリにも、USB2 と USB3 対応のものがあります。

 USBメモリ上から...
 
  •  ・ Kingston DataTraveler 100G3 (USB3, 64GB)
  •  ・ Imation Swivel (USB2, 16GB)
  •  ・ Trancsend 型式不明(USB2, 8GB)
  •  ・ 貰いもの、メーカー不明 (USB2, 8GB)
  •  ・ ELECOM MF-STU204GWT (USB2, 2GB)





これらを Inspiron 3148 の USB2 と USB3 のポートに繋いで、速度比較もやってみました。

 Ultra Fit USB3 128GB  
[2016/12/30 追加]
・SanDisk Ultra Fit 3.0 128GB (SDCZ43-128G)
 並行輸入品で国内保証なし
 国内正規販売はしていない模様 
 
Cruzer Fit USB2 16GB 
[2016/12/30 追加]
・Sandisk Cruzer Fit 16BG  (SDCZ-016G-J57
 国内5年保証つき
 LinuxやWin PEによるPC起動用に4個持っている


SanDisk Ultra Fit は小さいので、無くさないように上のストラップを付けています。但し SanDisk Cruze Fit のストラップ取り付け孔はとても小さいので、このストラップは太すぎて使えないことは要注意です。

結果は以下のようになりました。



大まかな
メディア
容量
接続
ポート
Seq.
Read
(MB/s)
Seq.
Write
(MB/s)
Rand.
Read
(MB/s)
Rand.
Write
(MB/s
 Elecom MF-STU204GWT
USB2
2GB
USB2215.06.60.013
USB3255.6110.013
 メーカー不明
USB2
8GB
USB2189.53.70.022
USB321114.60.023
 Trancsend 型式不明
USB2
8GB
USB2206.95.20.011
USB3206.58.30.011
 Imation Swivel
USB2
16GB
USB2225.74.80.012
USB3358.38.40.012
 SanDisk Cruzer Fit ※1)
USB2
16GB
USB222123.51.5
USB339154.51.6
 Kingston DataTraveler 100G3USB364GBUSB3122259.70.11
 SanDisk Ultra Fit ※1)USB3128GBUSB3131474.02.0
※1) 2016/12/30 追加

 製品によってシーケンシャル / ランダム の Read / Write の速度傾向が大きく異なる。[2016/12/30 追記]
 
例えば、SanDisk Ultra Fit 128GB は、シーケンシャル・リード公称値 150 MB/s に対して 130 MB/s は良いと思う。シーケンシャル・ライトも良好で Kingston Data Traveler に比べても速い。しかしランダムアクセスについては、USB2 メモリなみで遅く、 個体差なのか設計通りなのかは不明。

Data Traveler 64GB Bench Ultra Fit 128GB Bench 
左:Kingston Data Traveler USB3.0 64GB、右:SanDisk Ultra Fit USB3.0 128GB


USBメモリは、シーケンシャル・リードだけが USB2 HDD なみの速度

インストールメディアに使いやすいことがわかります。


USB3 対応品は、USB2 の5倍程度速い

ここでも、USB3 の効果絶大ですね。自分で買うなら USB3 がお勧め。


USB2 品を USB2 と USB3 のポートに繋いで比較

USB2品をUSB3ポートに繋いた場合、少しはスピードアップの傾向があります。外付けHDDでのテスト結果と同様に、とても興味深い結果です。



SD
Trancsend SD



 Trancsend の 32GB SDカード (Class 10, UHS-1) で、60MB/s 400x と謳っているものを Inspiron 3148 で使っているので、これも測定してみました。




大まかな
メディア
容量
Seq.
Read
(MB/s)
Seq.
Write
(MB/s)
Rand.
Read
(MB/s)
Rand.
Write
(MB/s)
 Tracsend SDXC/SDHCSD32GB26225.90.51

まぁ、最大 60MB/s と謳っているものが、この程度のシーケンシャル・アクセス速度が出れば良いのだと思います。

ここで興味深く感じたのは、

 シーケンシャル・リードは、USB2 接続の HDD や USBメモリと同等

 シーケンシャル・ライトは、USB2 接続の USBメモリよりも遙かに速い

といったところです。



今回、私としては初めて様々なストレージの読み書き速度を実際に調べて比較しました。メディアだけでなく、PC自体のバス速度の影響などもあるでしょうから、条件が変われば同じメディアでも結果が異なることはありそうです。

SSD は持っていないのでいずれ試してみたいと思います。

今回の結果から、SDカードの能力を見直しました。また、USB2 デバイスであっても繋げるなら USB3 ポートが速くなることも、意外な結果として分かりました。ネットで調べてみると、Q&Aなどでの回答などで、高速化を積極的に肯定しているものをあまり見かけません。やはり実際に比較してみると面白いですね。






応援クリックをお願いします。励みになるので...

人気ブログランキングへ


FC2ブログランキングへ


keywords: Dell Inspiron 3148、 Windows10、外部ストレージ

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

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

年末の忙しい時に、目的不明の異常アクセス

2016/12/29

 今年もあとわずかです。特に今年は仕事納めが遅いので、皆様お忙しいのではないかと思います。

そんな世間が忙しい時にアクセス解析をみてビックリ!

12/29 の 01:11:50 から 11:28:09 までの10時間程度で、2681 回のアクセス(゜Д゜)
個別のアクセス間隔を見ると、1秒間に数ページアクセスしていたり、そもそも1時間あたり 268 回もアクセスするのは人では無理ですね。

アクセス解析は、別途エクセルに記録しているのですが、このアクセスはカウントしないことに...
Aguse で調べると、東京、新宿にあるイーアクセス (ソフトバンク) のサーバーです。


いったい何が目的なのか、これをやって何の得になるのか、よく分かりません。

ネットで調べてみると リファラスパムとかフィッシング目的だとか、色々な説がありますが、当ブログのようなマイナーなところを狙っても効果は期待できないでしょう。

このように機械的にアクセスを増やして貰っても、私には有り難くないわけです。アクセス数を個々に見たり、推移を見るとき、私は画面の向こうにいらっしゃる生身の人の気持ちを想像して、個々の記事がどのように評価されているのかを自分なりに考えています。なので、生身の人によらない異常アクセスは、意味が無いどころか多少なりとも迷惑な話です。

ならば、それを見越した嫌がらせ? 少なくとも当ブログでは人様に恨みを買うことははっていないと信じていますので、嫌がらせはないでしょう。


まさか、陰の支援者による仕業ではないでしょう...


単なるロボットの試験のため、たまたま当ブログが対象になっただけ? これはありそうです。

年の暮れのお騒がせ異常アクセス、こんなのは初めての経験です。


皆様、良いお年をお迎えください (唐突ですが...)


関連記事

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

番外編 - Freecom 日本撤退記念に Mobile Drive XXS 3.0 Leather 購入

番外編
e-Gadget

2016/01/09
追記 2016/01/11
追記 2016/12/26

皆さんは、Freecom というブランドをご存じだろうか?


Freecom Mobile Drive XXS

XXS USB2 500GB 
2009年に USB2.0 500GB のものを購入して使っている。2.5インチHDDそのものと殆ど変わらないサイズ、特に薄型な点がポイント。USBコネクタの大きさと比較するとその薄さが分かるだろう。ゴムで包んだ簡素なデザインと手触り、ワンポイントの FREECOME ロゴのタブもおしゃれな感じだ。

モバイルPCと一緒に持ち歩いていて、データバックアップのために頻繁に使っているが、購入後6年ほど経っても問題なく使えている。そろそろ、USB3.0 の 1TB バージョンを買うつもりだったが、最近は量販店に置いておらず、どうしたのか?と思っていた。



Freecom 日本撤退

Freecom のホームページを久しぶりに覗いてみると、なんと日本撤退のプレスリリースに驚いた。残念である。2016年2月末で日本国内での販売を終了し、カスタマーサポートは2年後の 2018年2月末で終了し撤退完了とのことだ。

Freecom はオランダのメーカで、2009年に三菱化学メディアが買収し、高収益が見込める外付けHDDビジネスに大々的に参入したわけだが、ついに手放した。実売価格では、他社に比べて高いとは感じることは無く、むしろそのデザインに優位性があったと思う。

Freecom 自体は残るようなので、日本での商売が高コストのまま収益率が上がらなかったのだろう。海外出張時の楽しみが1つ増えたと言えるかも知れない。

[2016/01/11 追記]
Freecom の英語サイトを見てみた。外装がレザーのものは見当たらないので、日本限定品か生産中止品なのだろう。Moble Drive XXS 3.0 のページでは、日本では未発売の 2TB バージョンがある。一方で 1TB バージョンは 75ポンドとなっていて、国内に比べてとても高い設定だ。
Freecom製品が気に入っているなら、まだある市場在庫を国内で買うのが得策さろう。今買っても2年のメーカー保証期間が終わるまでは、カスタマーサポートは継続してくれるので、Freecom ファンにとっては今が最後のチャンスかも知れない。

[2016/12/25 追記]
Freecom の英語サイト を改めて見ると、外装がレザーの Mobile Drive Leather 3.0 が追加されていた。また Mobile Drive 3.0 はケースデザインが変更されているものの 2TB、3TB、4TB が追加されていた。




Freecom Mobile Drive XXS 3.0 Leather 1TB

かなり気に入っていた製品なので、そのメーカーの日本撤退記念!?ということで、上記の Mobile Drive XXS シリーズの中で、最新のちょっとプレミア感のある革製外装で USB3.0 1TB の Mobile Drive XXS 3.0 Leather 1TB を買うことにした。メーカー保証が2年であり、保証期間満了までは日本でカスタマーサポートを継続するというのも、購入の理由だ。

Freecom からのオンライン販売は、既に Sold Out となっていて、Amazon で¥7,480 で売り出されていたので、即ポチッとした。

XXS Leather 2  

まあレザーといっても合成皮革だし、細かく見るとステッチやら裁断がお粗末な感じもあるが、それでも ぱっと見 はプレミア感があって悪くない。これまで使っていた 500BG のゴム外装のものは、ゴム表面に埃が付きやすいので、ほぼ同サイズのPC周辺機器用のポーチに入れて持ち運んでいたが、コレだと剥き出しのままで良さそうだ。

XXS Leather 3 XXS Leather 1 

USB3.0 コネクタのサイズとの比較で、薄さが分かると思うが、おそらく世界でも最も薄い外付けHDDだろうと思う。USBに繋いで給電されると、コネクタ内部で青色LEDが点灯し、アクセスすると青色LEDが点滅する。

なお、購入時は、Windows用とMAC用両方のコピーユーティリティーやカタログファイルなどがプレインストールされている。これらをZipファイルにして保存後、サクッと削除した。

と言うのも、Norton Internet Security が open candy マルウェアの警告を出して迷惑この上ないからだ。コピーユーティリティーのインストーラが引っかかっている。インストール時に抱き合わせソフトをインストールするようなインストーラへの警告と見られるが、このHDDにプレインストールされたものだけでなく、問題無いと分かっているインストーラや、自作のソフトやそのインストーラでも、最近 Norton Internet Security が、うるさく警告を出すようになっていてかなり迷惑している。

検疫により自動削除するので、回復する設定を行い、検疫リストから削除しても、その後警告だけは繰り返される。当面は濡れ衣をかけられたインストーラは Zip に圧縮しておくことにしている。そんな背景から、プレインストールファイルはサクッと削除。まぁ、使わないファイルに容量を食われるのも無駄ということもある。

お約束のドライブテストをやってみた。

DriveTest 

購入時はFAT32 でフォーマットされていて、実際は 931GB。シーケンシャルアクセスで 100MB/s 以上出ているので、USB3.0 としては悪くない。

但し、4TB 以上のファイルが使えないと困るので、NTFS にフォーマットし直した。念のため NTFS フォーマット後にテストしたが同様の結果となった。

DriveTest2 

購入時(FAT32フォーマット)の状態で接続すると、エクスプローラに Freecom の2本線のロゴがアイコンとして現れる。日本撤退記念なので、NTFS フォーマット後も Freecom アイコンを表示させることにした。

Freecom HDD Icon 

プレインストールファイルを圧縮した Zip ファイルから、autorun.inf と icon.ico をコピーし、autorun.inf 内の記述を以下のように変更した。

[autorun]
icon=icon.ico


これで、日本撤退を惜しみながら使うことができる(^^;






応援クリックをお願いします。励みになるので...

人気ブログランキングへ


FC2ブログランキングへ


keywords: Windows8.1環境移行

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

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

Casio Basic入門47

Casio Basic入門
<目次>

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

修正:2016/12/24


 4. CasioBasicを使ってみる(続き)

Chapter 8 - 初級

前回: Casio Basic入門46 を見る


◆ Chapter 8 の目標: Basic コマンドを使ってみる

メニュー選択や入力にBasic コマンドたけを使って、温度の単位変換プログラムを作りました。出力には、プログラムの冒頭では簡単なため、旧来の " "(出力)命令をまだ併用しています。


温度換算プログラム TC8
0→A
Lbl 0


Cls
"1:      °C" (スペース11個)
"2:      °F" (スペース11個)
"3:      K"  (スペース12個)
If A:Then
Locate 4,1,C
Locate 4,2,F
Locate 4,3,K
IfEnd
Locate 13,1,"°C"
Locate 13,2,"°F"
Locate 13,3," K"
Locate 1,4,"MENU N°?"
Locate 11,4,"<FMLA>"

-1→M
Do
Getkey→L
LpWhile L=0
L=35⇒1→M
L=36⇒2→M
L=37⇒3→M
L=74⇒4→M

Locate 1,4,"        " (スペース16個)
If M=1:Then
4→X:1→Y:9→D:2→E
Prog "IN":Z→C
C(9÷5)+32→F
C+273.15→K
1→A
Else If M=2
Then
4→X:2→Y:9→D:2→E
Prog "IN":Z→F
5(F-32)÷9→C
C+273.15→K
1→A
Else If M=3
Then
4→X:3→Y:9→D:2→E
Prog "IN":Z→K
K-273.15→C
C(9÷5)+32→F
1→A
Else If M=4
Then
Cls
Locate 2,1,"C = 5(F-32)÷9"

Locate 2,2,"F = (9÷5)C+32"
Locate 2,3,"K = C+273.15"

Locate 11,4,"<EXIT>"
While Getkey≠73
WhileEnd

IfEnd:IfEnd
IfEnd:IfEnd

Goto 0



プログラム全体の流れをまとめてみます。プログラムは上から下へ順に処理が進んでゆくものだと理解することがとても重要です。そして、特定のコマンド、例えば If 文Do 文While 文Break コマンド 或いは ⇒ (条件ジャンプ)命令などがある時のみ例外的に処理の順序を変える、と理解することが基本になります。そして、今回のプログラムを機能ごとにまとめると、以下のような流れになっています。

プログラム全体は、Lbl 0Goto 0 により無限ループになっています。
その中では、[表示] を行うブロック、[メニュー選択とメニュー番号取得] を行うブロック、そして [温度入力と換算] を行うブロックに分けられます。

ここで、是非注目してもらいたいのは、これらの機能別の処理ブロックは、上から下へ順に処理が流れていることです。このように、各処理ブロックが上から下へ順に流れるようにプログラムを作ると、プログラムが分かりやすくなります。こうしておくと、機能変更や機能追加は、特定の処理ブロックに集中して行えば良くなり、結果的に修正、機能追加、バグ潰しが楽になります。

このように、機能ごとにまとめた処理ブロックが上から下へ流れてゆくような構造のプログラムを作る手法を構造化プログラミングと言って、一般に推奨される考え方です。Casio Basic は構造化プログラミングが出来るのです。


プログラムの構造

Lbl 0

 [表示]

 [メニュー選択とメニュー番号取得]

 [温度入力と換算]

Goto 0



さて、fx-5800P のような電卓でのプログラムは、プログラムを強制終する [AC] キーが備わっているので、プログラム終了に [AC] キーを使えば、終了のためのコードを書く必要が無いので、プログラミングは楽になります。
 
この方法が良いと思ってきたのですが、最近ちょっと考えが変わってきて、プログラムを正常終了させた方が良いのではないかと、思い始めています。その理由は前回書いていますが、どちらが正しいと言うことは無いと思います。好みの問題であり、ポリシーの問題でもあります。

どちらが正しいかは横に置いておいて、正常終了させるプログラムも作れることを紹介します。

そこで今回は、[EXIT] キーで正常終了させる方法を盛り込みます。



Chapter 8-6
[EXIT] キーで正常終了させる

プログラムのメイン画面を以下のようにします。

TC9-Main 

そして、[EXIT] キーを押したらプログラムが終了します。

まず方針を決めます。

[EXIT] キーが押されたことを検出するには、Getkey を使います。既に、計算式表示からメイン画面に戻る時に、[EXIT] キーを利用しているので、具体的には同様のコードを適用します。 

次に、どうやってプログラムを正常終了させるのか? プログラムの処理が一番下、つまりプログラムコードの最後までたどり着いたら、正常終了します。

一方で、今のプログラム TC8 は、Lbl 0Goto 0 の間を無限に繰り返す(無限ループ)構造です。そこで、[EXIT] キーで正常終了させるには、[EXIT] キーが押されたら無限ループから脱出して、プログラムの一番下に処理が進むようにします。都合の良いことに、Caso Basic には、他の Basic と同様に ループから脱出するための Break コマンドが用意されているので、それを使います。

Break コマンドは、以下のループなら、そこからから抜け出せます。
 ・While ループ
 ・Do ループ
 ・For ループ


しかし、LblGoto によるループでは、Break コマンドで脱出できません。これは、Break コマンドの仕様です。

 ⇒ Casio Baisc コマンドリファレンス - Break


そこで、現在の Lbl / Goto ループを While / WhileEnd を使った無限ループに変更します。結論から言えば、

Lbl 0
・・・
Goto 0




While 1
・・・
WhileEnd


に置き換えます。


While 文の書式
While [ループ継続条件]
[処理]
WhileEnd


While / WhileEnd ループを無限ループにするには、[ループ継続条件] が必ず成り立つ、つまり常に「真」となるようにします。

実は、0「偽」で、0 以外「真」と言うのが、プログラミング言語では標準で、Casio Basic もこれに従っています(取扱説明書には書かれていませんが...)。

そこで、

While 1
[処理]
WhileEnd


としたら、無限ループになるわけです。


次に、[EXIT] キーを検出したら Break を実行するように修正します。ここで、[メニュー選択とメニュー番号取得] のブロックを以下に抜き出します。

-1→M
Do
Getkey→L
LpWhile L=0
L=35⇒1→M
L=36⇒2→M
L=37⇒3→M
L=74⇒4→M


[EXIT] キーのキーコードは 73 なので、L73 になった時に Break を実行すれば、一気に While 1 / WhileEnd ループから脱出します。これを実現するには、

L=73⇒Break

を上のブロックの一番下に追加します。


最後に、メイン画面の一番下の行(4行目)の表示を忘れずに変更します。

Locate 1,4,"<EXIT>"
Locate 11,4,"<FMLA>"




以上をまとめて、プログラム TEMP CONV とします。

先ず、プログラム TC8 のファイル名を TEMP CONV に変更します。プログラムの修正とプログラム名の変更の具体的な操作方法は、Chapter 7Chapter 8 でこれまでに説明しているので、割愛します。

温度換算プログラム TEMP CONV
0→A
While 1


Cls
"1:      °C" (スペース11個)
"2:      °F" (スペース11個)
"3:      K"  (スペース12個)
If A:Then
Locate 4,1,C
Locate 4,2,F
Locate 4,3,K
IfEnd
Locate 13,1,"°C"
Locate 13,2,"°F"
Locate 13,3," K"
Locate 1,4,"<EXIT>"
Locate 11,4,"<FMLA>"

-1→M
Do
Getkey→L
LpWhile L=0
L=35⇒1→M
L=36⇒2→M
L=37⇒3→M
L=74⇒4→M
K=73⇒Break

Locate 1,4,"        " (スペース16個)
If M=1:Then
4→X:1→Y:9→D:2→E
Prog "IN":Z→C
C(9÷5)+32→F
C+273.15→K
1→A
Else If M=2
Then
4→X:2→Y:9→D:2→E
Prog "IN":Z→F
5(F-32)÷9→C
C+273.15→K
1→A
Else If M=3
Then
4→X:3→Y:9→D:2→E
Prog "IN":Z→K
K-273.15→C
C(9÷5)+32→F
1→A
Else If M=4
Then
Cls
Locate 2,1,"C = 5(F-32)÷9"

Locate 2,2,"F = (9÷5)C+32"
Locate 2,3,"K = C+273.15"

Locate 11,4,"<EXIT>"
While Getkey≠73
WhileEnd

IfEnd:IfEnd
IfEnd:IfEnd

WhileEnd



では、これを実行してみます。

[EXIT] キーを2回押して Program Manu 画面へ戻り、

TC7-ProgMenu 

[2]
(2:RUN)Prog List 画面に切り替え、 

TC9-PROG_ProgList 

TEMP CONV にカーソルがあるので、そのまま [EXE] キーでプログラムを起動します。

TC9_Main 

ここで、[EXIT] を押すと、プログラムは終了するはずです。

TC9-Quit_Done 

右下に Done と表示があり、プログラムが正常終了したことが分かります。

ここで、[EXIT][EXE][AC] のいずれかを押せば、Prog List 画面に戻ります。


さて、最後の仕上げを行います。右下の Done 表示だけでは、プログラム終了を示すには控えめな気がするので、終了時には以下のような画面にしようと思います。

TC9-Quit_Bye 


そこで、
WhileEnd の下に、画面消去コマンド Cls と Locate 7,2,"BYE!" を追加することにします。

!の入力方法
[FUNCTION] [1] (1:MATH) [5] (5:X!)

Cls は画面消去を行います。 



温度換算プログラム TEMP CONV
0→A
While 1


Cls
"1:      °C" (スペース11個)
"2:      °F" (スペース11個)
"3:      K"  (スペース12個)
If A:Then
Locate 4,1,C
Locate 4,2,F
Locate 4,3,K
IfEnd
Locate 13,1,"°C"
Locate 13,2,"°F"
Locate 13,3," K"
Locate 1,4,"<EXIT>"
Locate 11,4,"<FMLA>"

-1→M
Do
Getkey→L
LpWhile L=0
L=35⇒1→M
L=36⇒2→M
L=37⇒3→M
L=74⇒4→M
K=73⇒Break

Locate 1,4,"        " (スペース16個)
If M=1:Then
4→X:1→Y:9→D:2→E
Prog "IN":Z→C
C(9÷5)+32→F
C+273.15→K
1→A
Else If M=2
Then
4→X:2→Y:9→D:2→E
Prog "IN":Z→F
5(F-32)÷9→C
C+273.15→K
1→A
Else If M=3
Then
4→X:3→Y:9→D:2→E
Prog "IN":Z→K
K-273.15→C
C(9÷5)+32→F
1→A
Else If M=4
Then
Cls
Locate 2,1,"C = 5(F-32)÷9"

Locate 2,2,"F = (9÷5)C+32"
Locate 2,3,"K = C+273.15"

Locate 11,4,"<EXIT>"
While Getkey≠73
WhileEnd

IfEnd:IfEnd
IfEnd:IfEnd

WhileEnd
Cls
Locate 7,2,"BYE!" 



もう一度、動作確認します。

TEMP CONV を起動すると、

TC9_Main 

[FMLA] を押して、計算式を表示、

TC9-Formula 

ここで、[EXIT] 押すと、

TC9-Quit_Bye 

メイン画面に戻らず、プログラムが終了してしまいます。

計算式が表示されている時、[EXIT] を素早く叩いて、できるだけ短い時間だけ押すと、メイン画面に戻ることもありますが、

TC9_Main 

チョット油断すると、プログラムが終了していまいます。

その理由を考えてみます。

メイン画面から正常終了する時にも [EXIT] キーを押すので、計算式表示画面で [EXIT] キーを押す時間が少しでも長いと、メイン画面に戻っても [EXIT] キーが押されたことになるので、すぐに終了するわけです。

計算式画面からメイン画面に戻る時のキーと、正常終了するキーを、別のものにすれば、この問題は解決します。しかし、それでは面白くないので、今回は両方とも [EXIT] キーを使うことにして、問題を解決します。実は、定番の方法があります。

作戦は以下の通り;

1) 計算式画面表示中は、[EXIT] キーが押されるまで While ループが回っている

2) [EXIT] キーが押されたら、この While ループから脱出 

3) [EXIT] キーが押された状態では、プログラムが先へ進まないように、 次のループに入る

4) [EXIT] キーが離されたら、そのループから脱出する

5) メイン画面に戻るが、[EXIT] キーは押されていないことが確実なので、改めて [EXIT] キーを押さない限り終了しない


要するに、3) を実現すれば良いのですが、以下のように赤文字の2行を追加するだけです。

While Getkey≠73
WhileEnd

While Getkey
WhileEnd


緑色の上2行は、[EXIT] キーが押されるまで回り続けるループで、1) と 2) を実現しています。
赤色の下2行は、[EXIT] を含めて何かキーが離されるまで回り続けるループで、3) を実現しています。

Getkey は、それが実行された時に何もキーが押されていない時は、0 になります(0 を返す、と言います)。何かキーが押されていると、2桁のキーコードを返すので、Getkey は2桁の数値、つまり 0 以外の値を持っています。

While [ループ継続条件] 
WhileEnd

という書式で、[ループ継続条件] が 0以外 つまり「真」の時は、ループが回り続けます。[EXIT] キーがまだ押されている状態では、Getkey73 、つまり 0 以外(=「真」) なので、ループは回り続けます。

[EXIT] キーが離されたら、Getkey0 になるので、[ループ継続条件]0 (=「偽」になるので、ループから脱出します。

この2行の赤文字While ループは、キーが離されるまでプログラムの実行が先へ進まないようにする関所の役割を果たしています。

ちなみに、

While Getkey
WhileEnd




While Getkey≠0
WhileEnd


は、全く同じ動作をします。これは、Getkey が戻り値を返すと言う性質を利用しています(詳細は前回説明しています)。
そして、≠0 が無い方が動作は速くなるので、上の表記を用いるほうが良いでしょう。


以上のように、Getkey と ループを使いこなすことで、キー操作をうまく制御することができ、Casio Basic を含めた Basic プログラミング習得のための重要ポイントです。そのようなわけで、Casio Basic入門の最初の Chapter 1 では、GetkeyLocate コマンドを使いこなすことを目標にしているわけです。

 ⇒ Casio Basic入門3 Chapter 1 - Getkey と Locate を使いこなす



ここまでをまとめます。

温度換算プログラム TEMP CONV
0→A
While 1


Cls
"1:      °C" (スペース11個)
"2:      °F" (スペース11個)
"3:      K"  (スペース12個)
If A:Then
Locate 4,1,C
Locate 4,2,F
Locate 4,3,K
IfEnd
Locate 13,1,"°C"
Locate 13,2,"°F"
Locate 13,3," K"
Locate 1,4,"<EXIT>"
Locate 11,4,"<FMLA>"

-1→M
Do
Getkey→L
LpWhile L=0
L=35⇒1→M
L=36⇒2→M
L=37⇒3→M
L=74⇒4→M
K=73⇒Break

Locate 1,4,"        " (スペース16個)
If M=1:Then
4→X:1→Y:9→D:2→E
Prog "IN":Z→C
C(9÷5)+32→F
C+273.15→K
1→A
Else If M=2
Then
4→X:2→Y:9→D:2→E
Prog "IN":Z→F
5(F-32)÷9→C
C+273.15→K
1→A
Else If M=3
Then
4→X:3→Y:9→D:2→E
Prog "IN":Z→K
K-273.15→C
C(9÷5)+32→F
1→A
Else If M=4
Then
Cls
Locate 2,1,"C = 5(F-32)÷9"

Locate 2,2,"F = (9÷5)C+32"
Locate 2,3,"K = C+273.15"

Locate 11,4,"<EXIT>"
While Getkey≠73
WhileEnd
While Getkey
WhileEnd

IfEnd:IfEnd
IfEnd:IfEnd

WhileEnd
Cls
Locate 7,2,"BYE!"



プログラム修正が終わったら、[EXIT] キーを2回押して、Program Menu 画面に戻ります。

TC7-ProgMenu 

[2] (2:RUN) で、Prrog List を表示さると、TEMP CONV にカーソルが合っているので、

TC9-PROG_ProgList 

そのまま [EXE] キーを押せば、TEMP CONV が起動します。

TC9_Main 

[FMLA] キーで計算式画面を表示

TC9-Formula 

[EXIT] キーを押したままにしてみると、何も変化は起こらず、

TC9-Formula 

[EXIT] キーを離すと、画面が切り替わり

TC9-Main 

メイン画面に戻ります。つまり、[EXIT] キーを離したら先に進むようにプログラムを書いたので、その通りの動作になっていることが確認できまし。計算式表示画面で、普通に [EXIT] キーをポンッと叩けば、違和感無くメイン画面に戻ると思います。

メイン画面で、改めて [EXIT] を押すと正常終了します。

TC9-Quit_Bye 

ここで、[EXIT]、[EXE][AC] のいずれかのキーを押せば、Prog List 画面に戻ります。

TC9-PROG_ProgList 

[EXE] で再び起動します。

TC9-Main 


ところで、バナナを液体窒素に漬けて凍らせると、釘が打てる...と言うのを見たことがあると思います。液体窒素はとても低温で、絶対温度で77度です。そこで、絶対温度77Kは、摂氏何度か? 調べて見ましょう。

[3] キーを押すと、入力ボックスが現れるので、

TC9-Press_Menu3 

ここで、77 と入力し、

TC9_Press_77K 

インジケータ <EXE>:ENTER に従って、[EXE] を押すと、入力が確定され、

TC9_result_77K 

摂氏と華氏の換算温度が表示されます。液体窒素温度は、-196.15℃ なのですね。



これで温度換算プログラム TEMP CONV が完成です。完成したプログラムは、COMP モードから実行することをお勧めします。COMP モードから実行すると、強制終了した時に、うっかりプログラムを触ってしまう危険性が無いからです。

但し、TEMP CONV は強制終了ではなくて、正常終了するようにしていますので、この心配はありません。念のため、COMP モードからプログラムを起動してみます。

[MODE] [1] (1:COMP)COMPモードに戻ります。

[FILE] キーを押して、Prog List を表示

TC9-COMP_ProgList_TimeZone 

[▼] [▲] キーで TEMP CONV にカーソルを合わせ

TC9-COMP_ProgList_TempConv 

[EXE] キーで TEMP CONV を起動します。

TC9-Main 

色々と操作してから、[EXIT] キーで終了させます。

TC9-Quit_Bye 

さて、本当に終了させるには、ここで [AC] キーを押す。

[EXIT] キーを押しても、何も変化はありません。

ここで [EXE] を押すと、再び TEMP CONV が起動します。これは以前も紹介している COMP モードでの特徴ですね。

プログラム終了時は、PROGモードで起動したか、COMPモードで起動したかで、多少異なることが確認できました。



温度換算プログラムを Chapter 7 では、 旧来の?(入力)命令を使って作り、それを Capter 8 では、Basic コマンドに置き換えました。

既に Basic を使いこなしている人には、Chapter 8 の内容は簡単だと思います。そして 構造化プログラミングが可能な 新世代Casio Basic の能力を再認識できたと思います。

プログラミング経験の少ない人には、Chapter 8 の内容は慣れない部分もあると思います。ループを使いこなすことはプログラミング習得の第一歩です。Casio Basic で習得すれば、次に パソコンなどで Basic プログラミングを行う時にそのまま役立ちます。


さて、新世代 Casio Basic は fx-5800P だけでなく、他のグラフ関数電卓にも搭載されています。そこで、次回は ここまで作った温度換算プログラムを fx-9860GII に移植することにします。





つづく...

Casio Basic入門48 / 目次




応援クリックをお願いします。励みになるので...

人気ブログランキングへ


FC2ブログランキングへ



 



keywords: fx-5800PCasioBasic、入力ボックス, プログラミング入門プログラム関数電卓

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



関連記事

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

Casio Basic入門44

Casio Basic入門
<目次>

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

2015/03/15
2016/12/24 修正

 4. CasioBasicを使ってみる(続き)

Chapter 8 - 初級

前回: Casio Basic入門43 を見る


◆ Chapter 8 の目標: Basicコマンドを使ってみる

前回作ったプログラム TC6 では、温度入力画面と温度出力画面が異なる画面構成となっています。

例えば、以下のような温度出力画面になっているとします。

TC5 6 

ここで、摂氏温度を 20℃ に変更したらどうなるかを見るためには、一旦以下のような入力画面で入力します。

TC6 4 

入力を確定すると、以下の出力画面になります。

TC6 5 

これでもプログラムとして全く問題ないのですが、出力画面のまま、摂氏表示ののところで、別の値を入力したいと思うわけです。

と言うのも、スマホやパソコンのプログラムではそうなっているので、電卓プログラムでの同様の機能を実現できないだろうか?と言うのが今回のテーマです。



Casio Basic には、位置を指定して、そこで入力させるようなコマンドが用意されていません。そこで、この機能を実現させるために、入力ボックス を作りました。

 ⇒ fx-5800P プログラムライブラリ - 入力ボックス

 ⇒ fx-9860GII プログラムライブラリ - 入力ボックス

入力ボックスは、汎用サブルーチンとして作っていて、他のプログラムから呼びだして使うことを前提にしています。従って、Basic コマンドとは少し使い方が異なります。

Basic コマンドの使い方は、

[コマンド] [設定1],[設定2],[設定3], ...

といった使い方になります。

入力ボックスはサブルーチンです。サブルーチンを呼びだす時に色々な設定を一緒に指定することができません。そこで、

[入力ボックスの設定]
Prog "入力ボックス"
[結果の受け取り]


といった書式になります。

今回は、温度換算プログラムで、入力ボックスを使ってみようと思います。



Chapter 8-2
入力ボックスを使ってみる

入力ボックスには、使い勝手を考えて複数のバージョンがあります。

入力する数値の種類応答性が速い
バージョン(Ver2.0)
キーリピート抑制が
バージョン(Ver2.1)
プログラム名
0以上の整数(INPI Ver2.0)INPI Ver2.1INPI
0以上の小数と政数INP Ver2.0(INP Ver2.1)INP
正負の小数と整数IN Ver2.0(IN Ver2.1)IN

入力ボックスには、fx-5800P で使うために、大きく Ver 2.0Ver 2.1 の2種類があります。fx-5800P はCasio Basic プログラムの実行速度が比較的遅いので、できるだけキー入力の応答性を高める必要があり、その目的で作ったのがVer 2.0 で、応答性を高めるために、キーを押したままにするとその数字が繰り返し入力される(キーリピートが発生する)仕様になっています。

一方、キーリピートを抑制したものが Ver2.1 です。

Ver 2.0 / Ver 2.1 それぞれについて、入力する数値の種類に応じて3つのバージョン、INPI、INP、IN を用意しています(上の表参照)。

実際に使用してみると、Ver 2.0INPI の処理が軽いのでキーリピートが発生しやすいと思います。そこで INPI を使う場合はキーリピートを抑制した Ver 2.1 をお勧めします。

INPIN については、INPI に比べて相対的に処理が少し重く、キーリピートがあまり問題になりません。むしろキーリピートを抑制すると応答性の悪化を感じるので、Ver 2.0 の利用を勧めます。

上の表で赤文字で示したように、INPI Ver2.1INP Ver2.0IN Ver2.0 を使えば、間違いないと思います。なお、今回、温度換算プログラムで利用する場合は、温度値は正負の小数と整数なので IN Ver2.0 を使うことにします。


IN Ver2.0 の準備

fx-5800P は、パソコンとのリンク機能がないので、プログラムをパソコンから転送することが出来ません。最初は面倒でもプログラムをキー入力する必要があります。

fx-5800P に入力ボックス IN Ver 2.0 が保存されていない場合
もし、あなたの fx-5800P に入力ボックスが保存されていない場合は、面倒でも最初はキー入力する必要があります。
入力するソースコードは、fx-5800P プログラムライブラリ - 入力ボックス の プログラム- IN Ver2.0: プログラム名 IN に掲載していますので、間違えないように入力してください。

fx-5800P に入力ボックスが保存されている場合
入力ボックスは、既に Casio Basic入門で扱っているので、既にプログラムが保存されているかも知れません。今回は、正負小数対応の IN を使います。もし、バージョンに応じて異なったファイル名で保存している場合は、今回使う IN Ver2.0 のファイル名を IN にしてください。

先ずは、fx-5800P で入力ボックスを導入して温度換算プログラムを作りますが、後で fx-9860GII へ移植する予定です。そこで、fx-9860GII で入力ボックスを準備する方法も書いておきます。fx-9860GII はPCリンク機能を使ってプログラムを簡単に転送できるので、準備が楽です。

fx-9860GII で入力ボックスを準備する場合
もし、fx-9860GII をお使いの場合は、fx-9860GII 専用入力ボックス Ver 2.1GG1M ファイルをダウンロードできるようにしています。このファイルを一旦パソコンにダウンロードすれば、専用リンクソフトを使って fx-9860GII へ転送できるので、入力の手間はありません。
 ⇒ e-Gadget アーカイブ - Archaive ページ - fx-9860GII Casio Basic から IN.G1M をダウンロード  
あるいは、
 ⇒ ここ から IN.G1M をダウンロード



入力ボックス IN 2.0 の使い方

入力ボックスは、汎用サブルーチンです。サブルーチンを呼びだすには、Prog コマンドを使い、呼びだすプログラム名を " " で括ります。正負小数に対応した IN を使うので、

Prog "IN"

と書きます。

ちなみに、Prog の入力は、[SHIFT] [FILE] です。

入力ボックスを呼びだす前に、以下の4つの変数の設定を行います。

・ 入力ボックスを表示する桁(X座標): 変数X
・ 入力ボックスを表示する行(Y座標): 変数Y
・ 入力ボックスの桁数: 変数D
・ 入力ボックスの確定インジケータの種類の設定:
変数E

具体的には、以下の書式で使います。

入力ボックスの書式
△→X:△→Y:△→D:△→E (入力ボックスの設定)
Prog "IN"          (入力ボックスの呼出し)
Z→▽              
(入力値の受け取り)


は任意の数、は任意の変数、但し使用機種の画面範囲内に収まるように設定する。
  参考 fx-5800P: 1≦X≦16、1≦Y≦4、X+D≦16

- X: 入力ボックス表示開始桁
- Y: 入力ボックス表示開始行
- D: 入力ボックス桁数
- E: 入力ボックスインジケータの選択
   E=2: 画面右下に <EXE>:ENTER と表示
   E=1: 画面右下に ▶E と表示
   E=(上記以外): インジケータ非表示
- Z: 入力ボックスで確定した数値が代入される



入力ボックスの動作確認
入力ボックス IN をキー入力した場合は、入力ミスの可能性もあるので、テストプログラムで入力ボックスの動作テストを行います。併せて、入力ボックスの使い方を紹介します。

以下のテストプログラムを使います。

プログラム TEST
0→Z
"1:"
"2:"

While 1

-1→M
Do
Getkey→K
LpWhile K=0
L=35⇒1→M
L=36⇒2→M

Locate 1,4,"        " (スペース16個)

If M=1:Then
3→X:1→Y:10→D:2→E
Prog "IN"
Else If M=2
Then
3→X:2→Y:6→D:1→E
IfEnd:IfEnd

Locate 1,4,"Z="

Locate 3,4,Z

WhileEnd


==========

<裏技>

代入命令 → を入力する良い方法を紹介します。

4→X を速く入力する方法
[4] キー
[SHIFT] [RCL] キーで が入力され、この時 アルファベット入力モードになる
[0] キー を押すと、アルファベットモードなので X が入力される

入力ボックスを使う書式では、代入命令を多く使うので、この方法を知っていると入力が楽になります。

ちなみに、Prog の入力は、[SHIFT] [FILE] です。

==========

では、テストプログラム TEST 作成の操作です。

[MODE] [5] (5:PROG]Program Menu を表示

IB-ProgramMenu 

新たにプログラム TEST を作るので、[1] (1:NEW) を押し、File Name 入力画面へ...

IB-FileName 

ここで、プログラム名 TEST を入力し、[EXE] で確定。File Mode 設定画面が現れる。

IB-FileMode 

[1] (1:COMP) を選択すると、プログラム入力画面に切り替わります。

ここで、プログラム TEST を入力します。

入力が終わったら、[EXIT] を押して、Program Menu 画面に戻ります。

IB-ProgramMenu 

では、プログラム TEST を実行してみます。

[2] (2:RUN) を押して、Prog List を表示させ、

IB-ProgList  

[EXE] キーで、プログラム TEST を実行します。

TEST-1 

[1] キーを押すと、1: の右に10桁の入力ボックスが表示されます。

TEST-2 

入力ボックス表示の左端は3桁目(X座標が3)、1行目(Y座標が1)で、桁数は10です。つまり、X に 3、Y に 1 、D に 10 を指定しています。さらに右下に、<EXE>:ENTER と表示されていますが、これがインジケータで、E に 2 を指定するとこの表示になります。

つまり、

3→X:1→Y:10→D:2→E
Prog "IN"


と書いておき、これが実行されると、上のような入力ボックスが表示され、入力モードになります。

ここで、項目1 に、-12.345678 を入力すると、以下のようになります。

TEST-3 

右下のインジケータは、入力モードにあることを示し、[EXE] キーを押して確定することを示す操作案内です。
入力モード中に [DEL] キーを押せば入力した数字が削除され、内容を編集できます。

[EXE] で入力確定すると、変数 Z に 確定した値が格納されてから、入力ボックスが終了します。

TEST-4 

一番下の行で変数 Z の値を表示しています。
これは、プログラム TEST の以下のコードによるものです。

Locate 1,4,"Z="
Locate 4,4,Z


このように、希望の位置に希望の桁数で入力させることができます。色々な入力を試して、Z の値が正しいことを確認します。


さて、次に項目2に、入力してみます。[2] を押すと、以下のようになります。

TEST-5 

入力ボックスの左端は、3桁目(X=3)、2行目(Y=2)で、桁数が6(D=6)です。そして、インジケータは簡略化した表示(E=1)です。

プログラムに書く場合は、以下のようにします。

3→X:2→Y:6→D:1→E
Prog "IN"


ここで、-9.876 と入力すると、

TEST-6 

正しい位置に入力中の内容が表示されています。[DEL] で削除できて、入力内容の編集ができます。
右下のインジケータ ▶E は、[EXE] で確定、との操作方法を示しています。

[EXE] で確定すると、変数 Z に入力値が代入され、入力ボックスが終了します。

TEST-7 

Locate 1,4,"Z="
Loxate 3,4,Z


によって、4行目に、Z の値を表示しています。


では、ここで [1] を押して、再び入力ボックスを表示させ、

TEST-8 

このまま、[EXE] を押す、つまり何も入力しないで確定すると、変数 Z には 0 が代入され、入力ボックスが終了するので、

TEST-9 

このように表示されます。

テスト用プログラムをもう一度掲載しますが、赤文字で示した部分、つまり入力ボックスの桁数とインジケータの種類を変更してみて、色々と試してみてください。

プログラム TEST
0→Z
"1:"
"2:"

While 1

-1→M
Do
Getkey→K
LpWhile K=0
L=35⇒1→M
L=36⇒2→M

Locate 1,4,"        " (スペース16個)

If M=1:Then
3→X:1→Y:10→D:2→E
Prog "IN"
Else If M=2
Then
3→X:2→Y:6→D:1→E
Prog "IN"  [2016/12/24] 追加修正
IfEnd:IfEnd

Locate 1,4,"Z="

Locate 3,4,Z

WhileEnd




今回は、入力ボックスを使う準備と、使い方を紹介しました。

次回は、温度換算プログラムに入力ボックスを導入してゆきます。






つづく...

Casio Basic入門45 / 目次




応援クリックをお願いします。励みになるので...

人気ブログランキングへ


FC2ブログランキングへ


 


keywords: fx-5800PCasioBasic、入力ボックス, プログラミング入門プログラム関数電卓

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



関連記事

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

プログラムライブラリ - 入力ボックス 2.1G

プログラムライブラリ
<目次>

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

2015/01/23
2015/08/05 記述修正
2016/12/24 追記修正





入力ボックス 2.1G - fx-9860GII、fx-CG20、fx-CG50 専用
INPI、INP、IN 2.1G - 汎用サブルーチン

※  g1mファイルのダウンロード・リンクを追加 [2015/02/28]

※ g3mファイルのダウンロード・リンクを追加 [2016/04/17]



著作権者

やす (Krtyski)
[当ブログ管理人]



対応機種

Casio fx-9860GII / fx-CG20 / fx-CG50 専用
(fx-FD10 Proでも動作すると思われます)

Casio fx-5800P 専用は こちら



プログラムの説明

INPI / INP / IN 2.1G (fx-9860GII & fx-CG20 専用) は、fx-9860GII や fx-CG20 Casio Basic プログラミングで、好みの位置に好みの桁数で数値を入力させる機能を実装する、汎用サブルーチンです。

画面構成を崩さずに数値を入力させるプログラムを簡単に作れるので、換算プログラムなどに最適です。

Casio Basic の入力命令 ? は、入力行を選べず、入力結果は改行されて右端に表示され、入力するたびに画面がスクロールするので、入力位置と入力結果の表示位置を選べません。もう一つの入力コマンド Getkey はキー1つが押されたことを検出するものなので、そのままでは複数桁の入力や編集に使えません。

そこで画面設計をしたプログラムで使うため、Windows などの Edit Box に近い入力機能をCasio Basic に提供するのが入力ボックスです。

以下の3種類の入力ボックスを用意しました。

1. INPI 2.1G
0以上の整数入力のみに対応。0以上の整数入力のみを行わせたいプログラムで使うことを想定しており、負数や小数入力のエラーチェックが不要になる。

2. INP 2.1G
0以上の整数/小数入力のみに対応。0と正の小数のみの入力を行わせたいプログラムで使うことを想定し、負数入力のエラーチェックが不要になる。

3. IN 2.1G
正負小数/整数の入力に対応、最も汎用性のある入力ボックス。


INPI、INP、IN 2.1G (fx-9860GII & fx-CG20 専用) の詳しい説明は、Casio Basic入門37 を参照。



入力ボックスの概要

Basic コマンドの使い方は、

[コマンド] [設定1],[設定2],[設定3], ...

といった使い方になります。

一方、入力ボックスはサブルーチンです。サブルーチンを呼びだす時に色々な設定を一緒に指定することができません。そこで、

[入力ボックスの設定]
Prog "入力ボックス"
[結果の受け取り]


といった書式になります。

入力ボックスには、使い勝手を考えて複数のバージョンがあります。

入力する数値の種類応答性が速い
バージョン(Ver2.0)
キーリピート抑制が
バージョン(Ver2.1)
プログラム名
0以上の整数(INPI Ver2.0)INPI Ver2.1INPI
0以上の小数と政数INP Ver2.0(INP Ver2.1)INP
正負の小数と整数IN Ver2.0(IN Ver2.1)IN

入力ボックスには、fx-5800P で使うために、大きく Ver 2.0Ver 2.1 の2種類があります。fx-5800P はCasio Basic プログラムの実行速度が比較的遅いので、できるだけキー入力の応答性を高める必要があり、その目的で作ったのがVer 2.0 で、応答性を高めるために、キーを押したままにするとその数字が繰り返し入力される(キーリピートが発生する)仕様になっています。

一方、キーリピートを抑制したものが Ver2.1 です。

Ver 2.0 / Ver 2.1 それぞれについて、入力する数値の種類に応じて3つのバージョン、INPI、INP、IN を用意しています(上の表参照)。

実際に使用してみると、Ver 2.0INPI の処理が軽いのでキーリピートが発生しやすいと思います。そこで INPI を使う場合はキーリピートを抑制した Ver 2.1 をお勧めします。

INPIN については、INPI に比べて相対的に処理が少し重く、キーリピートがあまり問題になりません。むしろキーリピートを抑制すると応答性の悪化を感じるので、Ver 2.0 の利用を勧めます。

上の表で赤文字で示したように、INPI Ver2.1INP Ver2.0IN Ver2.0 を使えば、間違いないと思います。



プログラムの使い方

メインルーチンから以下の書式で呼び出します。

→X:→Y:→D:→E
Prog "INPI"
Z→■


□ は任意の数、■ は任意の変数、但し使用機種の画面範囲内に収まるように設定する。
  参考 fx-9860GII、fx-CG20: 1≦X≦21、1≦Y≦7、X+D≦21

- X: 入力ボックス表示開始桁
- Y: 入力ボックス表示開始行
- D: 入力ボックス桁数
- E: 入力ボックスインジケータの選択
   E=2: 画面右下に <EXE>:ENTER と表示
   E=1: 画面右下に ▶E と表示
   E=(上記以外): インジケータ非表示
- Z: 入力ボックスで確定した数値が代入される

入力ボックス内部では、上記5つの変数以外に、CIF (F は、INPIN の場合のみ)、行列を用いています。これらの変数は、入力ボックスを呼び出すたびに格納されている数値が変更されます。メインルーチンでこれらと同じ変数を使う場合は、入力ボックスを呼び出すたびに変更されても良い変数として使ってください。特に行列は、入力ボックス内で 領域確保を行い、メインルーチンに戻る前に領域解放を行いますので、それを念頭に置いて使ってください。



使用例

呼び出しルーチンのプログラム例を掲載します。
・ 予約変数は S, T, U, V
これを元に色々なプログラムを作ってみると、楽かも知れません。

0→S:0→T:0→U:0→V  [予約変数の初期化]

Locate 1,1,"1:"      [初期画面表示]
Locate 1,2,"2:"
Locate 1,3,"3:"
Locate 1,4,"4:"

While 1            [無限ループ、[AC] キーでプログラム終了]

-1→M             [メニュー選択] 
Do:Getkey→K
LpWhile K=0
K=35⇒1→M
K=36⇒2→M
K=37⇒3→M
K=21⇒4→M

Locate 1,4,"        " (スペース16個)

If M=1:Then        [INPIを使った入力処理]
3→X:1→Y:8→D:2→E
Prog "INPI":Z→S
Else If M=2         [INPを使った入力処理]
Then
3→X:2→Y:6→D:2→E
Prog "INP":Z→T
Else If M=3         [INを使った入力処理]
Then
3→X:3→Y:4→D:1→E
Prog "INPI":Z→U
Else If M=4
Then
3→X:4→Y:2→D:1→E
Prog "INPI":Z→V
IfEnd:IfEnd
IfEnd:IfEnd

Locate 1,4,"Z="
Locate 3,4,Z

WhileEnd

※ 仕様例プログラムファイル (INTEST) のダウンロード
 - input_test.g1m (fx-9860GII用)
 - input_Test.g3m (fx-CG20 用) 



プログラムファイル

ファイル一式のダウンロード

fx-9860GII用プログラムファイル一式 (ZIPファイル)
  INPI.g1m, INP.g1m, IN.g1m, INTEST.g1m を含む

fx-CG20用プログラムファイル一式 (ZIPファイル)
  INPI.g3m, INP.g3m, IN.g3m, INTEST.g3m を含む


プログラム - INPI Ver 2.1G: プログラム名 INPI

プログラムファイル INPI.g1m (fx-9860GII用)のダウンロード [2015/02/28 追加]
プログラムファイル INPI.g3m (fx-CG20 / fx-CG50用)のダウンロード [2016/04/17 追記]
fx-9860GIIへの転送方法の簡単な説明

INPI Ver2.1G for fx-9860GII 

注1) 下から9行目の Locate X+C+I-1,Y, " " の " " は、スペース1個
注2) 下から6行目の Locate 6,4, "           " の " " は、スペース11個
注3) 下から4行目の Locate 15,4,"  " の " " は、スペース2個


プログラム - INP Ver 2.1G: プログラム名 INP

プログラムファイル INP.g1m (fx-9860GII用)のダウンロード [2015/02/28 追加]
プログラムファイル INP.g3m (fx-CG20 / fx-CG50用)のダウンロード [2016/04/17 追記]

 INP Ver2.1G for fx-9860GII 

注1) 下から9行目の Locate X+C+I-1,Y," "  の " " はスペース1個
注2) 下から6行目の Locate 6,4,"      " の " " はスペース11個
注3) 下から4行目の Locate 15,4,"  " の " " はスペース2個


プログラム - IN Ver 2.1G: プログラム名 IN

プログラムファイル IN.g1m (fx-9860GII用)のダウンロード [2015/02/28 追加]
プログラムファイル IN.g3m (fx-CG20 / fx-CG50用)のダウンロード [2016/04/17 追記]

IN Ver2.1G for fx-9860GII 

注1) 下から10行目の Locate X+C+I-1,Y," "  の " " はスペース1個
注2) 下から6行目の Locate 6,4,"      " の " " はスペース11個
注3) 下から4行目の Locate 15,4,"  " の " " はスペース2個





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



  



keywords: fx-9860GIICasioBasic、プログラムライブラリ入力ボックスプログラム関数電卓

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


関連記事

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

fx-5800P プログラムライブラリ - 入力ボックス

プログラムライブラリ
<目次>

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

最終更新:
2016/12/24

入力ボックス 2.0 / 2.1
INPI、INP、IN 2.0/2.1 for fx-5800P - 汎用サブルーチン


著作権者

やす (Krtyski)
[当ブログ管理人]



対応機種

Casio fx-5800P 専用
Casio fx-9860GII、fx-CG20、fx-CG50 用は こちら



プログラムの説明

INPI / INP / IN は、fx-5800P Casio Basic プログラミングで、好みの位置に好みの桁数で数値を入力させる機能を実装する、汎用サブルーチンです。

画面構成を崩さずに数値を入力させるプログラムを簡単に作れるので、換算プログラムなどに最適です。

Casio Basic の入力命令 ? は、入力位置が左端で、入力結果は改行されて右端に表示され、入力するたびに画面がスクロールするので、入力位置や入力結果の表示位置を選べません。もう1つの入力コマンド Getkey はキー1つが押されたことを検出するものなので、そのままでは複数桁の入力や編集に使えません。

そこで画面設計をしたプログラムで使うため、Windows などの Edit Box に近い入力機能をCasio Basic に提供するのが入力ボックスです。

以下の Ver 2.02.1 を用意したので、好みと必要性に応じて使い分けてください。
・Ver 2.0
キーをゆっくりと入力すると、キーリピートすることがありますが、Ver 2.1 よりも応答性が良いです。
・Ver 2.1
キーリピートを抑制していますので、ゆっくりキー入力してもキーリピートが発生しません。


それぞれのバージョンごとに、以下の3種類の入力ボックスを用意しました。

1. INPI 2.0 / 2,1
0以上の整数入力のみに対応。0以上の整数入力のみを行わせたいプログラムで使うことを想定していて、負数や小数入力のエラーチェックが不要になる。

2. INP 2.0 / 2.1
0以上の整数/小数入力のみに対応。0と正の小数のみの入力を行わせたいプログラムで使うことを想定していて、負数入力のエラーチェックが不要になる。

3. IN 2.0 / 2.1 
正負小数/整数の入力に対応、最も汎用性のある入力ボックス。

入力ボックスは、汎用サブルーチンとして作っていて、他のプログラムから呼びだして使うことを前提にしています。従って、Basic コマンドとは少し使い方が異なります。



入力ボックスの概要

Basic コマンドの使い方は、

[コマンド] [設定1],[設定2],[設定3], ...

といった使い方になります。

一方、入力ボックスはサブルーチンです。サブルーチンを呼びだす時に色々な設定を一緒に指定することができません。そこで、

[入力ボックスの設定]
Prog "入力ボックス"
[結果の受け取り]


といった書式になります。

入力ボックスには、使い勝手を考えて複数のバージョンがあります。

入力する数値の種類応答性が速い
バージョン(Ver2.0)
キーリピート抑制が
バージョン(Ver2.1)
プログラム名
0以上の整数(INPI Ver2.0)INPI Ver2.1INPI
0以上の小数と政数INP Ver2.0(INP Ver2.1)INP
正負の小数と整数IN Ver2.0(IN Ver2.1)IN

入力ボックスには、fx-5800P で使うために、大きく Ver 2.0Ver 2.1 の2種類があります。fx-5800P はCasio Basic プログラムの実行速度が比較的遅いので、できるだけキー入力の応答性を高める必要があり、その目的で作ったのがVer 2.0 で、応答性を高めるために、キーを押したままにするとその数字が繰り返し入力される(キーリピートが発生する)仕様になっています。

一方、キーリピートを抑制したものが Ver2.1 です。

Ver 2.0 / Ver 2.1 それぞれについて、入力する数値の種類に応じて3つのバージョン、INPI、INP、IN を用意しています(上の表参照)。

実際に使用してみると、Ver 2.0INPI の処理が軽いのでキーリピートが発生しやすいと思います。そこで INPI を使う場合はキーリピートを抑制した Ver 2.1 をお勧めします。

INPIN については、INPI に比べて相対的に処理が少し重く、キーリピートがあまり問題になりません。むしろキーリピートを抑制すると応答性の悪化を感じるので、Ver 2.0 の利用を勧めます。

上の表で赤文字で示したように、INPI Ver2.1INP Ver2.0IN Ver2.0 を使えば、間違いないと思います。


INPI、INP、IN 2.0 / 2.1 の詳しい説明は、Casio Basic入門32 ~ 36 を参照。
 ・ Casio Basic入門32  (入力ボックス応答性向上)
 ・ Casio basic入門33  (INPI 2.0 作成)
 ・ Casio Basic入門34  (INP 2.0 作成)
 ・ Casio Basic入門35  (IN 2.0 作成)
 ・ Casio Basic入門36  (キーリピート抑制)



プログラムの使い方

具体的な使い方については、Casio Basic入門44 、Casio Basic入門51 を参照。

メインルーチンから以下の書式で呼び出します。

→X:→Y:→D:→E
Prog "INPI"
Z→■


□ は任意の数、■ は任意の変数、但し使用機種の画面範囲内に収まるように設定する。
  参考 fx-5800P: 1≦X≦16、1≦Y≦4、X+D≦16

- X: 入力ボックス表示開始桁
- Y: 入力ボックス表示開始行
- D: 入力ボックス桁数
- E: 入力ボックスインジケータの選択
   E=2: 画面右下に <EXE>:ENTER と表示
   E=1: 画面右下に ▶E と表示
   E=(上記以外): インジケータ非表示
- Z: 入力ボックスで確定した数値が代入される

入力ボックス内部では、上記5つの変数以外に、CIF (F は、INPIN の場合のみ)、配列変数を用いています。これらの変数は、入力ボックスを呼び出すたびに格納されている数値が変更されます。メインルーチンでこれらと同じ変数を使う場合は、入力ボックスを呼び出すたびに変更されても良い変数として使ってください(Casio Basicでは変数が全てのプログラムで共用されるため)。特に配列変数は、入力ボックス内で領域確保を行い、メインルーチンに戻る前に領域解放を行いますので、それを念頭に置いて使ってください。



使用例

呼び出しルーチンのプログラム例を掲載します。
・ 予約変数は S, T, U, V
これを元に色々なプログラムを作ってみると、楽かも知れません。

0→S:0→T:0→U:0→V  [予約変数の初期化]

Locate 1,1,"1:"      [初期画面表示]
Locate 1,2,"2:"
Locate 1,3,"3:"
Locate 1,4,"4:"

While 1            [無限ループ、[AC] キーでプログラム終了]

-1→M             [メニュー選択] 
Do:Getkey→K
LpWhile K=0
K=35⇒1→M
K=36⇒2→M
K=37⇒3→M
K=21⇒4→M

Locate 1,4,"        " (スペース16個)

If M=1:Then        [INPIを使った入力処理]
3→X:1→Y:8→D:2→E
Prog "INPI":Z→S
Else If M=2         [INPを使った入力処理]
Then
3→X:2→Y:6→D:2→E
Prog "INP":Z→T
Else If M=3         [INを使った入力処理]
Then
3→X:3→Y:4→D:1→E
Prog "INPI":Z→U
Else If M=4
Then
3→X:4→Y:2→D:1→E
Prog "INPI":Z→V
IfEnd:IfEnd
IfEnd:IfEnd

Locate 1,4,"Z="
Locate 3,4,Z

WhileEnd


プログラム例

Birthday_2 
INPI 使用 - 0と自然数入力 - 年齢換算プログラム


YearConv_5_convert_20140312192414.jpg
 
INPI 使用 - 0と自然数入力 - 和暦西暦換算プログラム


PressureConv_2
 
INP 使用 - 0と正野小数入力 - 圧力単位換算プログラム


3-JST_inputBox 
INPI 使用 - 0と自然数入力 - 世界時間換算プログラム


TEMP_CONV_P3 
IN 使用 - 正負小数入力 - 温度単位換算プログラム



入力ボックス 2.0

Ver 1.0Ver 1.2 よりも大幅に応答性を向上させ、速いキー入力でも取りこぼしがないと思います。


プログラム - INPI Ver 2.0: プログラム名 INPI

INPIv20src_fx-5800P 

注1) 下から10行目の Locate X+C+I-1,Y, " " の " " は、スペース1個
注2) 下から7行目の Locate 6,4, "           " の " " は、スペース11個
注3) 下から4行目の Locate 15,4,"  " の " " は、スペース2個


プログラム - INP Ver 2.0: プログラム名 INP

INPv20src_fx-5800P 

注1) 下から10行目の Locate X+C+I-1,Y," "  の " " はスペース1個
注2) 下から7行目の Locate 6,4,"      " の " " はスペース11個
注3) 下から4行目の Locate 15,4,"  " の " " はスペース2個


プログラム - IN Ver 2.0: プログラム名 IN

INv20src1_fx-5800P 

注1) 下から11行目の Locate X+C+I-1,Y," "  の " " はスペース1個
注2) 下から7行目の Locate 6,4,"      " の " " はスペース11個
注3) 下から4行目の Locate 15,4,"  " の " " はスペース2個



入力ボックス 2.1

Ver 2.0 にキーリピート抑制機能を追加しています。但し、INP と IN については、僅かですが応答性の低下が体感されます。

プログラム - INPI Ver 2.1: プログラム名 INPI

INPI Ver2.1 for fx-5800P 

注1) 下から10行目の Locate X+C+I-1,Y, " " の " " は、スペース1個
注2) 下から7行目の Locate 6,4, "           " の " " は、スペース11個
注3) 下から4行目の Locate 15,4,"  " の " " は、スペース2個


プログラム - INP Ver 2.1: プログラム名 INP

INP Ver 2.1 for fx-5800P 

注1) 下から10行目の Locate X+C+I-1,Y," "  の " " はスペース1個
注2) 下から7行目の Locate 6,4,"      " の " " はスペース11個
注3) 下から4行目の Locate 15,4,"  " の " " はスペース2個


プログラム - IN Ver 2.1: プログラム名 IN

IN Ver 2.1 for fx-5800P  高機能テキストエディタ

注1) 下から11行目の Locate X+C+I-1,Y," "  の " " はスペース1個
注2) 下から7行目の Locate 6,4,"      " の " " はスペース11個
注3) 下から4行目の Locate 15,4,"  " の " " はスペース2個





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



 


keywords: fx-5800PCasioBasicプログラムライブラリプログラム関数電卓

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


関連記事

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

楽屋裏 - fx-5800P のPCデータリンク

楽 屋 裏
e-Gadget


2016/12/18

以前の記事 fx-5800P プログラムのバックアップ のコメントで、通信フォーマットや中間コードの解析に話がふくらみました。

最後にコメントされた AkSd様が、ご自身で主催されている 関数電卓ファン掲示板 で、fx-5800P のデータ通信の解析の状況をアップされています。

腕に覚えのある方々が参加され、具体的に実施した実験的な取り組みの結果などの情報交換が進んでいます。

そして、データをPCに取り込む(まだ一方通行ですが)目処がたった模様...(゜Д゜)

fx-5800P 最大の欠点である、プログラムのバックアップの問題に光が見えたようで、凄いことになっています。

この分野がお得意な方は、是非ご覧になってはどうでしょうか?







応援クリックをお願いします。励みになるので...

人気ブログランキングへ


FC2ブログランキングへ





keywords: プログラム関数電卓、fx-5800P、データリンク

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

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

e-Gadget Web 新装オープン

Copyright 2013 e-Gadget by Krtyski

2016/12/17

e-Gadget の常にトップに表示する記事では、主なテーマの記事の目次の役目を持たせています。

一方、プログラムを簡単に整理して保管する書庫として、ホームページを利用しています。

さて、開設以来かなり多くのサンプルプログラムを作ってきて、どのプログラムがどこにあるのか自分でも分かりづらくなりました。さらにホームページに未収録のプログラムが多くなって整理しきれなくなっています。

そこで、書庫として使ってきたホームページ を e-Gadget Web として新装オープンして、分かり易くしようと思います(Web データをPCにバックアップすれば管理も楽です)。

これまでのブログでの Casio Basic 探索の結果を辞書的にまとめた Inside Casio BaicC.Basic のマニュアル&コマンドリファレンス を作り始めているのが、ホームページ新装オープンのきっかけです。日本語と英語の両方でもまとめようと思っています。

ブログの良さは、新しく書いた記事の順に表示されるところにあるので、今後もブログメインで新しいネタを提供してゆくつもりですが、情報そのものも e-Gadget Web で整理できたら良いな、と思っています。




keywords: プログラム関数電卓、 e-Gadget WebCasio Basic、 C.Basic、C:Basic

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

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

Casio Basic入門3

Casio Basic入門
<目次>

誤字脱字・記載ミスや分かりにくい表現は随時追記・修正します
最終修正:2016/12/17


4. CasioBasicを使ってみる


これまでのプログラミングの経験(無しを含む)に合わせて、最適な読み進め方が分かるかも知れないので、<目次>に目を通しておくと良いと思います。


Chapter 1 - 初級
GetkeyLocate コマンドを使いこなす

◆ Chapter 1 の目標: キーコードを調べるプログラムを作る


新世代Casio Basicが優れている理由の1つが、GetkeyコマンドLocateコマンドの機能にあります。

Getkeyコマンドは、押されたキーをリアルタイムに識別するものです。ゲームを作ろうと思ったら間違いなく必要になりそうです。Getkey が実行されると、どのキーが押されたかの判別結果を2桁の数で返します。返ってくる値を「戻り値(もどりち)」と言います。

Locateコマンドは、画面の好きな位置に数字や文字を出力するものです。fx-5800P の画面は、横16桁、縦4行なのでその範囲内で表示位置を指定して使います。Locate には、3つの設定値が必要です。この設定値を「引数(ひきすう)」と言います。


Chapter 1-1

ここで、事前準備として、ENGモードをOFF にしてくだたい。

1) fx-5800P の電源を入れて、COMPモード(通常に関数電卓として使えるモード)にする

Compモード 

2) [SHIFT] [MODE]SETUP) でセットアップメニューに切り替え、

Setup_Menu 

3) [▼] を一回押して、メニューの次画面を表示

Setup_Menu2 

4) 3:ENG を選択 ([3] を押す)

ENG_Menu 

5) 2:EngOff を選択 ([2] を押す)

COMPモードの画面に戻ります。

もし、ENGモードが ON になっていると、画面上部に ENG サインが現れます。

ENG_ON 

今回は、ENGモードを OFF にしますので、COMPモードで画面上部に ENG サインが無いことを確認してください。


プログラムの入力

では、2行の簡単な例題プログラムを作ります。

COMPモード(通常の電卓画面)で [MODE] キーを押して、モード選択画面にします。

ch1-ModeSelect 

プログラムモードに移行するために、[5] (5:PROG) を選ぶと、Progra Menu が表示されます。

IB-ProgramMenu 

新たにプログラムを作るので、[1] (1:NEW) を選ぶと、File Name 画面が現れます。

ch1-FileName_blank 

この画面の左上に、小さく A と表示されています。これはアルファベットモードになっていることを示していて、テンキーなどを押すと赤く印字されているアルファベットが入力されます。この File Name 入力画面ではアルファベットモードがロックされていて、連続してアルファベットを入力できます。もし数字を入力したい時は、[ALPHA] キーを1回押すとアルファベットモードが解除されます。もう一度 [ALPHA] を押すとアルファベットモードになりますが、1つ入力するとアルファベットモードが解除されます。連続してアルファベットモードにするには、[SHIFT] [ALPHA] を押してロックします。

これから作るプログラムの名前を CH1-1 とします。
アルファベットモードで、 CH と入力し、アルファベットモードを解除して、1-1 を入力しましょう。

ch1-FileName 

ここで、プログラム名 CH1-1 を入力したら、[EXE]キーで確定。すると File Mode 画面になるので、

IB-FileMode 

[1] (1:COMP) を入力。すると以下のプログラム編集画面が表示されます。

Progra編修_Blank 

まだ何も入力していないので、カーソルが点滅しているだけです。

ここで、次の2行のプログラムを入力しましょう。

Getkey→K
Locate 1,1,K


ch1-Program  

Getkey の入力
[FUNCTION] [3] (3:PROG) [▼] [▼] [▼] [▼] [4] (4:Getkey) 

→ の入力
[FINCTION] [3] (3:PROG) [2] (2:→)

K の入力
[ALPHA] [7] (K)

改行マークの入力
[EXE]

Locate の入力
[FUNCTION] [3] (3:PROG) [▼] [▼] [4] (4:Locate)

続いて、1,1,K を入力します。


プログラムの入力は、ある程度慣れると、どこに何があるのか分かってくるので、大変なのは最初だけです。私の経験では、fx-9860GII よりも fx-5800P の方が遙かに早く慣れます(これが fx-5800P の良い点だと思います)。


入力が終われば、[EXIT] キーを1回押します。すると、Prog Edit 画面が表示されます。

ch1-ProgEdit 

もし、[EXE] キーを押せば、プログラム編修画面に戻ります。

ここでは、[EXIT] キーを押して、Progman Menu 画面に戻ってください。

TC7-ProgMenu 



プログラムの実行

では、今作ったプログラムを実行してみましょう。

[2] (2:RUN) を選択すると Program List が現れます。

ch1-ProgList 

今作ったプログラム CH1-1 にカーソルが合っています。ここで [EXE] キーを押すと CH1-1 が実行されます。

ch1-1 

実行すると、このように左上に

47

と表示されました。



プログラムの説明

1行目: Getkey→K

Getkey コマンドは、押されたキーのキーコードを取得してから返します。fx-5800P の全てのキーには2桁の異なる数が割り振られていて、この2桁の数をキーコードといいます。但し [AC] キーだけはキーコードが割り振られていません。

例えば、[ 1 ]キーのキーコードは35[ 2 ]キーのキーコードは36[EXE]キーのキーコードは47です。

このプログラムを実行した時の操作を思い出してください。[EXE] を押しましたね。だから Getkey[EXE] が押されたと認識して、キーコード 47 を取得します。

Getkey は、キーコードを取得した後、その値を返します。「返す」というのは、Getkey がその値を持つと言うことです。つまり、

Getkey→K

とすると、取得したキーコードを変数 K に代入します。

は代入命令でした。 の左の値を右の変数に格納するわけです。

これが実行されると、変数 K に は 47 が格納されます。


2行目: Locate 1,1,K

見て分かるように、Locate の引数 (ひきすう) は3つあり、それぞれを "," (コンマ)で区切っています。左から順に第1引数、第2引数、第3引数と言います。

Locate [X座標],[Y座標],[出力内容]

X座標とは左端からの桁数で、Y座標とは上端からの行数です。

一般的に言えば、座標とは、横方向の位置や縦方向の位置のことです。2つの数の組で、位置を特定できるので、座標を(7, 2)のような表記にすることもあります(横は7の位置、縦は2の位置と言う意味になります)。なお、引数とコンマの間にスペースを入れてはいけません。不要なところにスペースが入るとエラーになるので、注意が必要です。

ところで、座標を決めるためには、基準になる位置(原点)が必要です。左下が原点になっているグラフをよく見ますが、プログラミングの世界では、歴史的に画面の左上を原点にします。CasioBasicでも同様です。

横方向が軸で、座標の値は、1番左が1、右にゆくほど大きくなります。
縦方向が軸で、座標の値は、1番上が1、下に行くほど大きくなります。

特に縦方向は慣れるまで違和感があるかも知れません。この原点と座標の決め方は CasioBasicに限らず、パソコンで使うプログラミング言語にほぼ共通したものです。

Casio Basic では、原点の座標:(x,y) = (1,1)となっています。

16桁 x 4行のディスプレイ
 1 2 3 4 5 6 7 8 910111213141516
 2














 3














 4















fx-5800Pのディスプレイは、横16桁、縦4行なので、
x = 1, 2, 3,・・・,15, 16
y = 1, 2, 3, 4
のいずれかになります。

Locate コマンドで、この範囲外の値を指定するとエラーになります。

例えば、Locate 15,1,123 は、15桁目-1行目から 数字 123 を表示しなさい、と言う命令になります。15桁目の 1 と16桁目の 2 は表示できますが、1行に16桁しかないので、17桁目の 3 は表示されません。

Locate 15,1,123 を実行すると、1行におさまらず、3 があふれてしまいます。
                            12
                 
 
 

この場合、X座標の値(桁数)が範囲内 (1~16) なので、エラーにはなりません。

さて、上のプログラムでは、Locateコマンドの第3引数の[出力内容]に、変数Kを指定しています。この場合は、K に代入されている値が表示されます。Kに47が代入されているので、表示は 47 となります。

K=47 の時に Locate 1,1,K を実行した時の表示
47                            
                 
 
 

第3引数に、K ではなくて 47 を指定した場合、

Locate 1,1,47 を実行した時の表示
47                            
                 
 
 

座標(1, 1)に 4 が、座標(2, 1)に 7 が表示され、これらは同じ結果になります。


第3引数には、文字や文字列も指定できます。文字や文字列は、頭とお尻に "String" のようにタブルクォーテーションで挟みます(ちなみにStringは文字列という意味です)。

Locate 4,3,"STRING" を実行したときの表示
                 
 
      STRING            
 

Locate の引数、[x座標]、[y座標]、[出力内容] には、式、関数、さらには戻り値のあるコマンド (Getkey)を指定することもできます。但し、座標や出力内容の結果でエラーが出ないように留意しなくてはいけません。


戻り値のあるコマンドとして、Getkey を指定してみましょう!

Locate 1,1,Getkey

は、上の2行のプログラムCH1-1

Getkey→K
Locate 1,1,K


と同じ結果になります。


最後に、もう一つ悪乗りします。

Locate 1,1,Getkey2
これもOK。一度実際に上のプログラムを変更して試してみてください。


脱線しましたが、プログラム CH1-1 へ戻ります。



プログラム実行結果

プログラム CH1-1 を実行すると、常に 47 しか表示しません。プログラムを起動する時、Getkey が [EXE] のキーコードを拾ってしまい、それ以外は受け付けません。

そこで、このプログラムを改造して、他のキーのキーコードも調べられるようにしてゆきます。


※ CasioBasicコマンドリファレンス
  - (代入命令)
  - Getkey
  - Locate



Chapter 1-2

プログラム CH1-1 は、Getkey が一回働いたら、スグにプログラムが終了してしまうので、最初に押される [EXE] のキーコードを取得して終わってしまいます。

これではつまらないので、色々なキーを押した時に、そのキーコードを表示するように変更したいと思います。そこで、CH1-1 の2行の処理を繰り返えすように、変更してみます。


プログラム名: CH1-2
Lbl 0
Getkey→K
Locate 1,1,K
Goto 0


赤文字が追加した部分で、Lbl / Goto コマンドを使いました。



プログラムの説明

Lbl は、Label (ラベル)の略で、Goto は Go to (~へ行く) の意味です。一番下の行の Goto 0 は、「ラベル0まで行く」 と言うコマンドで、一番上の行の Lbl 0 は 「ラベル0 はここだよ」 と位置を示しています。

前に、「特別な指示が無い限りプログラムは上から下へ連続的に実行される」、と書いたことを思い出して下さい。今回のプログラムは、原則通りに一番下まで実行されます。そして、Goto 0 に出くわし、「Lbl 0 へジャンプしなさい」と指示を受けます。だからプログラムは原則を破って、一番上へ戻ります。これ以外にプログラムの流れを変える指示が無いので、エンドレスで繰り返すことになります。



プログラム実行結果

実際にプログラム CH1-2 を実行して、色々とキーを押してみると、確かにキー入力を次々に受け付けていますが、画面表示が妙な結果になります。
押したキーに応じたキーコードが表示する筈ですが、左端の数字がチカチカして、最後は必ず0になってしまいますね。



例えば、[7] を押します。キーを押したまだと 31と表示し、キーを離すと表示が01に変化します。どのキーを叩いても、キーを離すと左端が必ず0になります。つまり、Getkey が 0 を返して、それが左端に表示されているわけです!

Getkey は、キーが押されている時に実行されるとそのキーのキーコードを返し、キーが押されていない時に実行されると 0 を返す、そいういう仕様になっています。


※ Getkey の説明は、fx-5800P 取扱説明書 の99ページにあるので、確認してください。


この現象は、Getkey が正しく仕様通りに動いていることを示しています。キー [7] を押すと、確かにGetkey がキーコード 31 を返し、それが表示されます。キーを離した時は、キーが押されていないので、左端に0 が表示されるわけです。

では、Locate 1,1,K によって、31と01が表示される時の様子を細かくみてみます。


K=31 の時の Locate 1,1,K の表示結果
             
                
                
                
16桁x4行のディスプレイ


次に、K=0 の時の Locate 1,1,K の表示結果
             
                
                
                
16桁x4行のディスプレイ

左端だけ0に書き換えられるものの、隣の1が書き換えられずに残っています。キーを離した時は、本来 「0」 と表示されるべきところが、「01」 となる理由が分かりました。

この問題を解決するためには、Locate 1,1,K が実行される直前に、左から2桁の表示を消せば良いことになります。
つまり、

Locate 2,1,"  "     (スペース1つを " " でかこむ: 2014/11/19 追記)
Locate 1,1,K

とプログラムを変更すれば良いわけです。


以上を反映したプログラムの修正版は、以下のようになります。

プログラム名: CH1-2-2
Lbl 0
Getkey→K
Locate 2,1,"  "    (" " の中は、スペース1つ)
Locate 1,1,K
Goto 0



※ CasioBasicコマンドリファレンス
  - Lbl / Goto 



これで、Getkeyの動作に忠実に結果を表示するプログラムができました。
これからは、キーコード表示プログラムの完成度を上げてゆきます。




重要な補足

冒頭で、プログラムを作る前にENGモードをOFFにしましたが、それには深い理由があります。

プログラム CH1-2 では表示の問題があり、それを改善したものが プログラム CH1-2-2 でした。

実は、ENGモードをON にすると、プログラム CH1-2 は上記のような問題が発生しないのです。
一方、改善プログラムCH1-2-2 は、どちらでも問題が発生しません。

電卓の設定によって、異常になったり正常になったりするプログラムは作ってはいけなので、本来あるべき姿として、CH1-2-2 を作りました。

ここで、ENGモード と Locate コマンドの関わりについて、説明しておきます。


ENGモードと Locate コマンドの関係

fx-5800P の設定の1つに、ENGモードと言うのがあります。
ENGモードをONにすると、数を表示するとき、2000 と表示する代わりに 2k と表示します。同様に、0.03 と表示する代わりに 30m、6,500,000 の代わりに 6.5M、0.00005 の代わりに 5μ などとなります。

ENGモードは、プログラム中で ON / OFF を切り替えることが出来ます。
・EngOn コマンド: ENGモードをONにする
EngOff コマンド: ENGモードをOFFにする



そして、プログラム CH1-2 の改善方法として、以下のように ENGモードをON にする方法があります。

プログラム名: CH1-2
EngOn
Lbl 0
Getkey→K
Locate 1,1,K
Goto 0


一方、プログラム CH1-2-2 はそのままで問題ありません。

プログラム名: CH1-2-2
Lbl 0
Getkey→K
Locate 1,1,"  "
Locate 1,1,K
Goto 0


もし、関数電卓として使う際に、ENGモードをOFFにして使っている場合、CH1-2 を実行すると勝手に EngOn されてしまうので、プログラムとしてはチョット問題です。

プログラムが実行される時、一番最初に現在の ENGモードを調べておき、プログラム中で ENG On として、上記の表示の問題を回避し、プログラムが終了する直前に、調べておいた ENGモードに戻しておくべきです。こうすれば、プログラム中で、ENGモードを自由に変更しても問題ありません。

ところが、実はこの作戦が使えません。ENGモードを切り替えるコマンド EngOn や EngOff は準備されていますが、現在の ENG モードを調べるコマンドは準備されていないのです。従って、プログラムで勝手にENGモードを切り替えるのは、できるだけ避けるべきです。

やはり、プログラム CH1-2-2 の方が素性の良いプログラムと言えます。


それはさておき、なぜこのように プログラム動作が、ENGモードの影響を受けるのかを、調べてみます。そのために以下のようなプログラムを作って、走らせてみましょう。

EngOn
Locate 1,1,"ENGON"◢
Locate 1,1,100◢
EngOff
Locate 1,1,"ENGOFF"◢
Locate 1,1,100◢


の入力
[SHIFT] [X2] (Xの2乗)


・ 1行目: EngOn
 このコマンドで、ENGモードをONにします。

・2行目: Locate 1,1,"ENGON"◢
 画面の左上に
 ENGON
 と表示され、プログラムが一時停止。[EXE] を押すと次へ進む。

・3行目: Locate 1,1,100◢
 画面の左上に 100 と上書きされプログラムが一時停止。
 表示結果は、
 100 N
 と、100の後にスペースが入ります。[EXE] を押すと次へ進む。

・4行目: EngOff
 ENGモードをOFFにします。

・5行目: Locate 1,1,"ENGOFF"
 画面の左上に
 ENGOFF
 と表示され、プログラムが一時停止。[EXE] を押すと次へ進む

・6行目: Locate 1,1,100
 画面の左上に 100 と上書きされプログラムが一時停止。
 表示結果は、
 100OFF
 と、100の後にスペースは入りません。

このように、ENGモードがON の場合、1桁~3桁の整数を表示する場合は k や m といった記号が末尾に付きません。記号の代わりにスペースが1つだけ末尾に付くのです。これは、ENGモードON の時の仕様だと分かります。

今回のプログラムは、2桁の数を表示するので、0 + [スペース] と表示される仕様が、うまく働きましたが、4桁の表示を行う場合は、この効用は役に立ちません。

Locate コマンドと ENGモード の関係は覚えておくとして、今後はそれに依存しないプログラムを書くようにしてゆきます。

※ CasioBasicコマンドリファレンス
  - Getkey
  - Locate
  - Lbl / Goto
  - EngOn / EngOff
 


つづく...

⇒ CasioBasic入門4 / 目次




応援クリックをお願いします。励みになるので...

人気ブログランキングへ


FC2ブログランキングへ


カシオプログラム関数電卓 FX-5800P-Nカシオプログラム関数電卓 FX-5800P-N
(2006/09/22)
CASIO(カシオ)

商品詳細を見る


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

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

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

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

やす (Krtyski)

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


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

実際に触って気づいたこと、自作プログラム、電卓プログラミングについて書いています

おもしろい・役に立つならクリックしてください。励みになります。
にほんブログ村 IT技術ブログ 開発言語へ
にほんブログ村


人気ブログランキングへ


FC2ブログランキングへ


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

リンク
月別アーカイブ
Sitemap

全ての記事を表示する

RSSリンクの表示
最新トラックバック
ブロとも申請フォーム

この人とブロともになる

QRコード
QR