番外編 - Win8.1移行メモ(3)

番外編
e-Gadget


Winfows 8.1

以下の最低スペックを基準に、2台のPCを選定しました。

- CPU: Dual coreで1.4GHz以上
- メモり: 4GB以上(2GBは不可)
- グラフィックス: ボード搭載でなくて Intel HD Graphics (Haswell)
- HDD: 320GB以上


まずは、DELL Inspiron11 3137

- Pentium3556U 2 Core, 1.7GHz
- 4GBメモリ
- 500HB HDD
- 11.6インチのタッチパネルディスプレイ
- Win8.1

このスペックのPCに、日常使いのアプリをほぼすべてインストールしたのですが、非常に軽快に動作しています。
インストールしたアプリ類は、ほとんど同じものです。


試しに、重い動画を再生させてみると、いずれもストレスなく見ることができました。Intel HD Graphics の性能によるところが大きいと思います。

Microsoft Office も非常に軽快に起動し、動作も軽くなっています。
Visual Studio でのコンパイルやビルドもかなり速くなっています。

OS起動も高速化していますsが、これは余計な読み込みをスキップする仕様と、今回のPCはUEFIを使っていることも高速起動に一役かっていると思われます。


メモリについて、タスクマネージャでパフォーマンスをみてみると、2GBでは全く足りず、4GBが最低限必要であることが確認されました。
 
もし、windows7 か Windows8.1 かの選択肢があるならば、Windows8.1 をお勧めします。



プログラム関数電卓とは全異なる話題で、あまり定量的な話ができず、私の環境での相対比較しかできていないので、あまりお役に立たないとは思いますがご容赦ください。私自身のメモで終わってしまいました。


Windows8.1 ネタはこれにて終了です。



Casiobasic入門と違って、親切丁寧な説明もなくて、わかる人には分かるような内容でゴメンナサイ。

何か情報やご質問があれば、ご遠慮なくお寄せください。わかる範囲でお答えいたします。




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

人気ブログランキングへ


FC2ブログランキングへ


keywords: Windows8.1環境移行

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

テーマ : Windows
ジャンル : コンピュータ

番外編 - Win8.1移行メモ(2)

番外編
e-Gadget


私の場合、Win8.1 への移行ではほぼすべての作業をデスクトップで行えるようにするのが、大きな目標です。

Windowsの管理やフォルダやファイルの扱いについては、前回紹介したように、ほぼデスクトップで作業ができるようになりました。

日常的に使うデスクトップアプリを起動するには、アプリ画面で起動したいアプリを探すのが思いのほか面倒なことが分かりました。
通常のPCとして使うには、これでは作業効率が非常に低く、フラストレーションが溜まります。

やはり、Win7以前の「すべてのプログラム」のようなメニューが欲しい(^^;)

ただし、「すべてのプログラム」だと、インストールされているほとんどのアプリケーションがメニュー化されており、これをカテゴリー別に整理して使うのがコツです。XPやWin7では、このようにしています。


一方、とても頻繁に使うアプリは、タスクバーのツールバーメニューに登録して、使っていました。


自分だけのアプリ起動用メニュー: Quick メニュー

Win8.1でも、ツールバーメニューを使うことにしました。ただし、「すべてのプログラム」メニューは無いので、少し拡充しました。

また、今回はショートカットやフォルダのアイコンを変えてみました。

Quick Menu 

こんな感じです。

・最もよく使うものは、いきなり起動できるようにした
 毎日何度も起動するアプリは、たかだかこんなものですね。
 - HPソリューションセンター(HP複合機)のユーティリティ)
 - Lotus Organizer 2001 (パスワードロックかけられる、メモ帳、スケジューラ)
 - Outlook 2010 (メールソフト)
 - PC
  ※ 以前のマイコンピュータです
 - 特定フォルダのショートカット(ナイショなので墨塗)
 - Programs フォルダへのショートカット (殆どのアプリをこのフォルダにインストールしている)
  ※ Program Files や Program Files (X86) とは別に自分で作ったフォルダです

・月に1回以上使うアプリは、カテゴリー別したフォルダに整理して、起動できるようにした

ちなみに、このメニューの作り方ですが...

1) どこか好きなところに Quick フォルダを作る

2) タスクバー右クリック → [ツールバー] - [新規ツールバー] で上記 Quick フォルダを指定

3) Quick フォルダ内に、最もよく使うアプリのショートカット作成

4) それ以外の(月に1回以上使う)アプリのショートカットは、カテゴリー分けしたフォルダの中に分類して入れる


簡単です。

ちなみに、上記 1) sで Quick フォルダを指定する代わりに、
新規ツールバー - フォルダの選択 画面で、[フォルダ] の入力場所に、以下をコピペすると、おもしろいことができます。

C:\ProgramData\Microsoft\Windows\Start Menu\Programs

一度お試しください。

Win7までの、すべてのプログラム と同じメニューが出てきます。お好みなら、こちらをどうぞ(^O^)/



私は、このメニューだと大きすぎるので、上記の自分だけの Quickメニューを使っています。



SkypeとAcrobat Reader

Win8.1を導入した状態では、これら2つは、ストアアプリとして最初からインストールされています。

特にストアアプリのSkypeは、ファイルを送ったり、チャットをしたり、他のファイルやWebを見ながら通話することが全く出来ません。通話しか出来ない上に、グループ通話などの設定も引き継げず、使い物になりません。

Skype for Desktop というものがちゃんと有り、これをダウンロードしてインストールすれば、従来のSkypeを使えます。

Microsoft は Skype for Desktop の存在を全くアピールしていません。そして、SkypeアカウントとMicrosoftアカウントを統合したので、できるだけMicrosoftアカウントを移行させようと躍起になっています。ストアアプリのSkype for Win8 はMicrosoftアカウントに登録しないと使わせないようになっています。

露骨ですね。

私は、他に必要性があるのでMicrosoftアカウントには登録しましたが、このやり方には違和感を覚えます。

Skypeは絶対にデスクトップアプリを使いましょう。


Acrobato Reader については、PDFファイルの閲覧のたびにストアアプリのAcrobat Readerが起動するのが気に入りません。

ストアアプリは、タスクマネージャーからしか終了できないので、使い終わっても起動したままなので、メモり不足の原因を自ら作るのは嫌です。

従って、デスクトップアプリ版の Acrobat Readerをダウンロードして使いましょう(^O^)/



新たに購入したアプリケーションソフト

今回新たに購入したデスクトップアプリは、Aronis True Image 2014 というバックアップツールです。

PCが起動しなくなっても、元通りにできる、、いわゆるイメージバックアップアプリですが、もう何年も前から愛用しています。これに救われたことは何度とあります。何かソフトをインストールしたことがきっかけで、PC全体の動作がおかしくなった場合など、毎月とか毎週、あるいはここぞというときにバックアップしておくと、きれいに元通りになります。

他の有償のアプリは、Windows XP のものがそのまま使えるので、古いものも含めて引き続き使います。Windows 8.1 では従来の32bit アプリを問題なく使える点は、Windows7以上の下位互換性が高いと感じています。

ですから、OSをWin7にするかWin8.1にするかの選択がある場合は、迷わずWin8.1 をお勧めします。

パスワードや個人情報、PCを使う上で必要な様々な情報をパスワードプロテクト付きで、一括管理する Lotus Organizer 2001 などは、私が使っている中で最も長く使っているアプリで、これの代わりが見つかっていません。既に多くの情報が書き込まれているので、別のアプリを使う気にもなりません。これが 引き続き Win8.1 でも使えるのは、大変ありがたいです。



フリーソフトの見直し

フリーソフトについては、かなり保守的です。自分の環境で安定して使える場合は、バージョンアップしません。
従って、愛用しているフリーソフトは、自分なりに厳選したものになります。

フリーソフトの良いところは、単機能だったり、機能が明確な点です。不要な機能を持ったフリーソフトは基本的に使わないのが普通です。

今回の Win XP から Win8.1 への移行は、32bit OSから 64bit OSへの移行でもあり、愛用フリーソフトについて、最新バージョンや64bit 版を検討しました。



1) マウスユーティリティ、Logicool の SetPoint と Elecomの ホイールユーティリティ2

マウスは、Logocool製品を愛用しています。ハードウェアとして外れに出会ったことが無いのがその理由で、長く使えるのも良いです。初期不良時の対応も良いので、Logicool 品を使っています。6台あるPCはすべてLogicoolマウスを使っています。

ただし、Logicool のマウスユーティリティ: SetPoint はダメです。32bit 版も 64bit 版も意図しない動作、、いわゆるバグが多くて使い物になりません。最新バージョンもダメでした。

安定バージョンは 6.32 なので以前から 32bit 版を使い続けていますが、今回は、このバージョンの 64bit 版を使いました。

SetPoint は特に使わなくても良いかも知れません。

ところで、マウスユーティリティで私が以前から使い続け、愛用しているのがエレコム製マウスに添付されている「ホイールユーティリティ2」です。

以前はエレコムマウスを使っていたのですが、無線マウスやLEDを使った光学マウスで、何度も外れ製品を買ったことから、それ以来エレコム製品は最初から検討対象から外しています。

具体的にいえば、

・ホイールを1ノッチ動かした時のスクロール動作が不安定
・無線到達距離についてパッケージの記載がいい加減でせっかく買ったものが最初から使えなかった
・光学マウスが使える机についてのパッケージ表記がいい加減で私の環境で使えなかった

という経験が立て続けにあり、その際のメーカーの対応が悪かったことが、私のエレコム離れの原因です。
その際、同等機能の Logicool 製品に買い換え、性能に満足したので、今は Logicool びいきになっています。

今のエレコム製品が改善している可能性は十分考えられますのが、お金を払って買う気になれないのです。


ただし、そんなエレコムですが、添付の「ホイールユーティリティー2」は秀逸です。特に、マウスポイントを上に持ってくるだけで(そこをアクティブにしなくても)ホイールによるスクロールが可能になる機能は、当時は他には見当たりませんでした。その後、フリーソフトでこの機能を搭載したユーティリティが出てきましたが、安定性の面でエレコムのものが一番です。

※ 私は保守的なので、機会が無いと新しいものを検討しないところがあるので、もし他に良いものがあっても知らない可能性は十分にあります。 

ちなみに、2007年リリースのVer 1.5.1 で安定しています。
 ホイールユーティリティ2 (ここからダウンロードできます)

つまり、もう7年近くこのユーティリティを使い続けています。これはお勧めです。


ところで、ハードとユーティリティーソフトの両方が間違いなく良いマウスメーカーはあるのでしょうか?

小型で高機能のマウスを好むので、エレコムかロジクールになってしまうのです。Microsoft で小型のマウスを見なかったので、選択しから外れています。

そんなことで、Microsoftマウスはまだ試したことがありません。ひょっとして Microsoft が良いのかも...情報有れば、是非ご提供いただけるとうれしいです。



2) 動画ビュワー: VLC

動画ビュワーとして割合有名なVLCですが、64bit 版はまだ実験フェーズのようで、機能がどうも安定しません。
そこで、32bit 版 Ver 2.1.3 を使いました。このバージョンで特に問題ありません。



3) ファイルクリーナー: CCleaner

以前から、32bit 版を愛用していましたが、今回は 64bit 版 Ver 4.12 にバージョンアップしました。
最新バージョンでは、Google Chrome の各種設定ファイルをクリーニング対象から除外する機能が追加されたこと、64bit 版であることからこれを選びました。



4) 完全アンインストールアプリ: Revo Uninstaller から Geek Uninstaller へ乗り換え

Revo Uninstaller を愛用していたのでですが、64bit 版は有償版で提供して、無償版での対応の見通しがなかったことが、乗り換えの理由です。短期間で評価した範囲では、機能は同等です。日本語表記にも対応しています。

ちなみに完全アンインストーラとは、Windowsのコントロールパネルから普通にアンインストールしても、レジストリのデータや関連ファイルが残ることが殆どなのです。この残ったものが、色々と悪影響を及ぼすことが結構あります。そこで、私はアンインストールする際は、完全アンインストールしています。

これは、自分の身を守る意味もあります。バイドゥやキングソフトのユーティリティは、意図しないのに入り込みます。たとえば、何かオンラインソフトをインストールする時に、小さな字で断り書きが入っているのとが多いのですが、何度もインストールさせようとすることが多いです。一旦入り込むと、今度はアンインストールが大変です。「本当にアンインストールしていいか?」と確認するし、アンインストールしたら、代わりに別のソフトをインストールします [OK] [Cancel] なんてのもあります。

そして仮にアンインストールの成功したと見えても、実は多くのファイルが残っており、レジストリにも多くのデータが残っています。何かのタイミングで、再びインストールする機会を伺っているのではないかと、思います。あるいは、この残ったデータを手がかりに、勝手に何かソフトをインストールする可能性だって否定できません。

とにかく、やり口がひつこいのです。

万一うっかりインストールしてしまった場合、完全アンインストーラを使うべきです。これでも完璧ではないかも知れませんが、それでも無いよりはまし。また私と同じように思っている人は多いでしょうから、その要望をくみ取っている可能性だってあります。

従って、完全アンインストーラは、今や必需品だと思います。



5) ファイルバックアップ: FreeFileSync

ハードディスクのイメージバックアップは、深刻なトラブルに備えたものですが、データファイルは日常的なバックアップが必要です。これには FreeFileSync というオンラインソフトを愛用しています。色々なバックアップソフトがある中で、これが1番私に合っています。

ファイル1つのバックアップから複数フォルダの自動一括バックアップまでに対応して、いずれの使い方でも分かりやすくて使いやすいのです。

自動一括バックアップで、あらかじめ決めておくバックアップルールに合わない何か不整合が発生したときは、ファイル個別のバックアップに切り替えて手動で対処し、それが終われば、自動一括バックアップが継続するので、極めて柔軟でもあります。

FreeFileSyncは、動作が安定しているのも愛用の理由です。従って古いバージョン(Ver3)のまま使い続けていました。今回新しいバージョンを探したらVer 6.3 になっていました。操作性が少し良くなりコピー速度も向上していました。

日本語対応しているので、お勧めです。



※ オンラインソフトのダウンロードは、そのソフト制作者のオリジナルのホームページからのダウンロードを強く勧めます。仮に英語のサイトであったとしても、そこからダウンロードすべきです。

というのも、色々なダウンロードサイトでは、バイドゥ品を抱き合わせにインストールさせるような、インストールファイルになっていることが多いのです。




Win8.1 とは直接関係無いフリーウェアの話になってしまいましたが、ご容赦ください。XP から Win8.1 への環境移行の話なので、私には関係の深い話なのです。


多くのソフトをインストールしましたが、スタートアップでPC起動と同時に起動する常駐アプリや、ブラウザのアドオンは、PCの動作を極端に重くするものがありまっす。たとえば、HPプリンタ関連の常駐アプリは重くなるので有名です。またブラウザに組み込まれるアドオンは、本当に必要でないものが多くあります。これらを無効にしておくことで、PC動作やブラウザ動作が大きく異なります。

私は、本当に必要と思うもの以外は、無効化するようにしています。これで不便を感じることはほとんどありません。つまり、大きなお世話でPCがどんどん重くなるというわけです。ただし、Windowsの動作に関連するところは、極力触らないようにして、確実に関係ないとわかるもの、つまり何かをインストールした時のそのアプリの制作者に関連するものから、無効化するようにしています。

これはなんだろう?と思ったら、検索すると大抵わかりますので、多少時間がかかっても検索して調べると良いと思います。






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

人気ブログランキングへ


FC2ブログランキングへ


keywords: Windows8.1環境移行

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

テーマ : Windows
ジャンル : コンピュータ

Casio Basic入門17

Casio Basic入門
<目次>

誤字脱字・記載ミスや分かりにくい表現は随時追記・修正します
2014/12/23: 入力桁数の制限に関して追記
最終: 2015/01/17


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


Chapter 3

◆ Chapter 3 の目標: 自由自在な入力をする

前回: Casio Basic入門16


「入力ボックス」プログラムの動作確認のためのメインプルーチン CH3M を作りました。

プログラム名 CH3M

Locate 1,1,"0:"

While 1

-1→M
Do
Getkey→K
K=25⇒0→M
LpWhile K=0

If M=0:Then
3→X:1→Y
Prog "CH3-0S"
        (ゼロ・エス)
Z→A

IfEnd

If M=0: Then
Locate 3,2,"              "
    (スペース14個)
Locate 3,2,A

IfEnd

WhileEnd


================

プログラム構造

[初期化処理]初期設定と初期表示

While 1

    [メニュー番号取得]今はメニュー番号0が1つだけ

    [入力処理]入力プログラム"CH3-0S"の呼出しと入力値の取得

    [出力処理]換算計算と表示

WhileEnd

================


「入力ボックス」プログラムの基本機能を作り、プログラム名 CH3-0S (ゼロ・エス)としました。

プログラム名 CH3-0S (ゼロ・エス)

0→Z
37→DimZ
1→Z[35]:2→Z[36]
3→Z[37]:4→Z[21]
5→Z[22]:6→Z[23]
7→Z[31]:8→Z[32]
9→Z[33]:0→Z[25]

Lbl 0


Do
Getkey→K
LpWhile K=0

If (K≧21 And K≦23) Or K=25 Or (K≧21 And K≦23) Or (K≧31 And K≦33) Or (K≧35 And K≦37)
Then
10Z+Z[K]→Z
Locate X,Y,Z
IfEnd

K≠47⇒Goto 0

0→DimZ
Return



「入力ボックス」プログラムの構造

[初期化処理]

[キーコードからキーの数への変換]

Lbl 0

        [キーコード取得]

        [戻り値 Z の算出と表示]

K≠47⇒Goto 0

[後処理]

Return




Chapter CH3-1
「入力ボックス」プログラムの改良

メインルーチンの画面構成を崩さずに入力させるために、入力範囲を指定したい。そこで、メインルーチンで入力桁数を指定すると、それに従って入力範囲を制限する機能を追加します。

入力開始位置の X と Y を指定したのと同様に、入力桁数 D をパラメータとして指定することにします。桁=Digit (デジット)なので、変数 D です。

メインルーチンから呼び出す時には、以下のようにします。

3→X:2→Y:9→D
Prog #CH3-1S"
Z→A



入力範囲の表示

入力範囲を >>>>> と表示して、桁数が分かるようにしようと思います。

For [開始]→I To [終了]
Locate [X座標], [Y座標], ">"
Next


このようにFor文を使うことにします。X, Y, D、そして制御変数(インデックス) I をうまく使って、これを完成させます。

">" の表示を始めるのは、入力開始位置なので、For文で最初に実行するのは、

Locate X,Y,">"


です。

For文での2回目は、1つ右に ">" を表示するので、

Locate X+1,Y,">"
 

です。続いて...

Locate X+2,Y,">"
Locate X+3,Y,">"
  ・
  ・
Locate X+D,Y,">"


となれば良いので、

For 1→I To D
Locate X+I-1,Y,">"
Next


とすれば良いことが分かります。このコードを、[初期化処理] に追加します。

このコードを追加することで、

>>>>>>>>>>

と入力範囲が表示され、そこへ入力してゆくと...

12345>>>>>

">" に数字が上書きされて、入力値が表示されます。


入力モードの表示

入力範囲の表示があれば、入力モードであることが分かります。しかし入力範囲一杯に入力されていると、">" が無くなるので、入力モードかどうか分からなくなります。そこで、画面右下に入力モードであることを別途表示させることにします。

入力確定すれば入力モードが終了するので、確定をうながす「インジケータ」を表示します。

・パターン2: インジケータ大を表示
・パターン1: インジケータ小を表示
・それ以外: インジケータを表示しない


このように、3種類から選べるようにしておきます。

<パターン2>
Birthday_2 

<パターン1>
PressureConv_2 

インジケータ設定のために、変数E を新たなパラメータとして使用することにし、Eが2でパターン2、Eが1でパターン1、Eが0のときはこれら以外でパターン0とします。

インジケータは初期画面で表示するので、[初期化処理] に以下のコードを追加します。

If E=2:Then
Locate 6,4,"<EXE>:ENTER"
Else If E=1
Then
Locate 15,4,"►t"
    ( [FUNCTION] [7] [3] [4] )
Locate 16,4,"E"
IfEnd;IfEnd


インジケータは、入力モードが終われば消えるべきなので、[後処理] に以下のコードを追加して、この表示を消去します。

If E=2:Then
Locate 6,4,"           "
    (スペース11個)
Else If E=1
Then
Locate 15,4,"  "
    (スペース2個)
IfEnd:IfEnd



入力桁数の制限

今のままだと、入力範囲が表示されるだけで、実際に入力する場合は何桁でも入力できてしまうので、パラメータDで指定した桁数を超えて入力できないように、制限をかける必要があります。

そこで、実際にキー入力する際に桁数をカウントし、それが最大入力桁数パラメータ D を超えないようにします。

プログラムの構造をもう一度みてみると、キー入力を1回行うたびに Lbl / Goto ループを1回通るので、[戻り値 Z の算出と表示] ブロックを一回通るたびに、桁数カウント C をインクリメント(1つ増やす)し、C が D 以下になるか D 未満になるようにすれば、桁数を管理できます。C が D 以下にするか、D 未満にするかの細かいことは、実際のコードで正しい方を選択しますが、今は考え方のみを決めます。

桁数カウンタCの初期値を0とし(初期化処理に 0→C を追加しておく)、このブロックに Isz C を追加します。

If (K≧21 And K≦23) Or K=25 Or (K≧21 And K≦23) Or (K≧31 And K≦33) Or (K≧35 And K≦37)
Then
10Z+Z[K]→Z
Locate X,Y,Z
Isz C
IfEnd


(追加部分を赤文字で示した)


その上で、桁数カウンタC が入力桁数D 以下の時だけ、このブロック内の処理を実行するようにします。

If (K≧21 And K≦23) Or K=25 Or (K≧21 And K≦23) Or (K≧31 And K≦33) Or (K≧35 And K≦37)
Then
If C<D:Then
10Z+Z[K]→Z
Locate X,Y,Z
Isz C
IfEnd:IfEnd


(追加部分を赤文字で示した)


入力桁数D=10と設定されているとします。

桁数カウンタC は0で初期化されます。初めてこのブロックに入ってきた時は C=0 です。
1文字入力されると、Isz C でCが1つ増えて、C=1 となります。9回通れば(通り終われば)、Cは9になります。
次にこのブロックへ入る時は、C<D が真(成立)なので、このブロック内の処理を行い、C=10 になります。

さらに次の入力を行うと、C<D が偽(成立しない)ため、ブロック内の処理は行われません。つまり、C が D 未満になるように制限をかければ良いことが確認できました。これで桁数制限機能が追加されました。


以上をまとめて、プログラム CH3-1S とします。

プログラム名 CH3-1S

0→Z
37→DimZ
1→Z[35]:2→Z[36]
3→Z[37]:4→Z[21]
5→Z[22]:6→Z[23]
7→Z[31]:8→Z[32]
9→Z[33]:0→Z[25]
If E=2:Then
Locate 6,4,"<EXE>:ENTER"
Else If E=1
Then
Locate 15,4,"►t"
    ([FUNCTION] [7] [3] [4])
Locate 16,4,"E"
IfEnd;IfEnd

For 1→I To D
Locate X+I-1,Y,">"
Next


0→C    (桁数カウンタの初期化)
Lbl 0


Do
Getkey→K
LpWhile K=0

If (K≧21 And K≦23) Or K=25 Or (K≧21 And K≦23) Or (K≧31 And K≦33) Or (K≧35 And K≦37)
Then
If C<D:Then
10Z+Z[K]→Z
Locate X,Y,Z
Isz C
IfEnd:
IfEnd

K≠47⇒Goto 0

If E=2:Then
Locate 6,4,"           "
 
  (スペース11個)
Else If E=1
Then
Locate 15,4,"  "
    (スペース2個)
IfEnd:IfEnd

0→DimZ
Return


================

変更部分を赤文字で示しました。


「入力ボックス」プログラム CH3-1S を呼び出すメインルーチンも以下のように変更します。変更部分を赤文字で示します。
(ここでは、CH3-1S 実行時の入力桁数D を10にしています)


プログラム名 CH3M

Locate 1,1,"0:"

While 1

-1→M
Do
Getkey→K
K=25⇒0→M
LpWhile K=0

If M=0:Then
3→X:1→Y
:10→D:2→E
    (パラメータ D と E を追加)
Prog "CH3-1S"
Z→A

IfEnd

If M=0: Then
Locate 3,2,"              "
    (スペース14個)
Locate 3,2,A

IfEnd

WhileEnd



CH3M を実行してみてください。

メニュー番号0を選ぶために、[0] キーを押すと、プログラムCH3-1S が呼び出されて入力モードに入ります。
入力後、[EXE]キーを押すと入力が確定され、入力値が改めて表示されます。


次に、メインルーチン CH3M を変更して、入力桁数を12桁に変更してみます。

3→X:1→Y:12→D:2→E
Prog "CH3-1S"
Z→A


CH3M を実行し、入力モードで、以下を入力してみてください。

12345678901

11桁目の "1" を入力したところで、指数表示に変化してしまいました。

1.23456789×1010

fx-5800P は内部桁数15桁ですが、表示桁数は10桁なので、10桁を超えると指数表示になる仕様です。
[2014/12/23 修正]
fx-5800P の指数表示には、Norm 1Norm 2 の2つの設定があります。
1) Norm 1
  できるだけ指数表示にしたいときに設定する

2) Norm 2
  できるだけ指数表示したくないときに設定する。
  この場合は、小数点を含めて表示桁数が10桁までは、小数 / 整数表示となる

 ⇒ Casio Basic コマンドリファレンス: Norm

fx-5800P は工場出荷状態では Norm 2 となっています。もし上の実験通りにならず、3桁入力すると指数表示になってしまう場合は、Norm 1 に設定されていることになるので、Norm 2 を設定する必要があります。

桁数カウンタ C を使って桁数管理を行っているので、表示形式が指数に変化すると桁数管理が厄介になります。従って、「入力ボックス」プログラムの入力範囲は10桁以下にする、と言う仕様にします。さらに、入力ボックス のプログラム冒頭の初期設定部分で、Norm 2 を指定することにします。プログラムにより電卓の表示形式を勝手に変更することはしたくありませんが、しかたありません。

と言うのも、Casio Basic では Norm の状態を取得するコマンドが無いからです。もしあれば、プログラムの最初で現在の Norm の状態を取得し、それを記録しておけば、プログラム終了時に Norm 設定を記録に従って戻せます。それができないので、強制的に Norm 2 と設定するしかありません。

ここで、メインルーチン CH3MCH3-1S を呼び出す部分の入力桁数Dの指定を 10→D に戻しておいてください


表示形式への対応

万一、仕様外の使われ方をされた場合への対応として、D>10 のとき Dを 10 に強制設定するための桁数制限をプログラムで行います。

[初期化処理]

D>10⇒D=10

を追加します。

さらに、ENG記号(μ、m、K、M など)を使った表示になると、この場合も桁数管理が厄介です。
123456789 を表示するとき、ENGモードが ON になっていると、123.456789M と表示されてしまいます。

従ってENGモードも強制的に OFF にするしかなく、プログラム冒頭の [初期化処理]EngOff コマンドを実行せざるを得ません。


表示形式へ対応した「入力ボックス」プログラム CH3-1S は以下のようになります。ここで変更した部分を赤文字で示します。

プログラム名 CH3-1S

EngOff:Norm 2
0→Z:D>10⇒10→D
37→DimZ
1→Z[35]:2→Z[36]
3→Z[37]:4→Z[21]
5→Z[22]:6→Z[23]
7→Z[31]:8→Z[32]
9→Z[33]:0→Z[25]
If E=2:Then
Locate 6,4,"<EXE>:ENTER"
Else If E=1
Then
Locate 15,4,"►t"
    ([FUNCTION] [7] [3] [4])
Locate 16,4,"E"
IfEnd;IfEnd

For 1→I To D
Locate X+I-1,Y,">"
Next


0→C
    (桁数カウンタの初期化)
Lbl 0


Do
Getkey→K
LpWhile K=0

If (K≧21 And K≦23) Or K=25 Or (K≧21 And K≦23) Or (K≧31 And K≦33) Or (K≧35 And K≦37)
Then
If C<D:Then
10Z+Z[K]→Z
Locate X,Y,Z
Isz C
IfEnd:IfEnd

K≠47⇒Goto 0

If E=2:Then
Locate 6,4,"           "
    (スペース11個)
Else If E=1
Then
Locate 15,4,"  "
    (スペース2個)
IfEnd:IfEnd

0→DimZ
Return



「入力ボックス」プログラムの構造

[初期化処理]

[キーコードからキーの数への変換]

Lbl 0

        [キーコード取得]

        [戻り値 Z の算出と表示]

K≠47⇒Goto 0

[後処理]

Return




現状では、入力はできても、打ち間違いの修正ができません。そこで次回は、[DEL]キーを使った削除機能を追加します。




つづく...


CasioBasic入門18 / 目次




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

人気ブログランキングへ


FC2ブログランキングへ



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

商品詳細を見る



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

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

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

番外編 - Win8.1移行メモ(1)

番外編
e-Gadget

2014/04/13 追記

Win8.1機に更新

メインで使っているPCは、Windows XP搭載機なので、これを 2014/4/8 のXPサポート打ち切りに合わせて Windoes 8.1 64bit 機に更新しました。

実はXP機が3台あり、メインのノートPCは上記のように買い換え、一番古いXPミニノートはLinux機にし、家族共用のXPデスクトップもこの際ショップブランド品のカスタマイズで Win8.1 64bit DSP搭載機に更新することにしました。2台の更新なので、できるだけ安く抑えたいわけです。

但し、安ければ良いというわけにもいきません。以前、ドコモで通信端末を買ったときにおまけでついてきたネットブックが、使いものにならなかった経験から、今回は、事前に時間をかけて調べて、最低スペックを決めた上で、機種選定を行いました。

- CPU: Dual coreで1.4GHz以上
- メモり: 4GB以上(2GBは不可)
- グラフィックス: ボード搭載でなくて Intel HD Graphics (Haswell)
- HDD: 320GB以上


その結果、ノートPCは、DELLのInspiron11 3137 にしました。5万円台の買い物、新品ではコストパフォーマンスが良いほうだと思います。

- Pentium3556U 2 Core, 1.7GHz
- 4GBメモリ
- 500HB HDD
- 11.6インチのタッチパネルディスプレイ
- Win8.1

1.4Kgとチョッと重いが、その分安い。DELLを買うのは今回初めてです。納期が大幅に遅れ、一昨日届きました。納期に関しては、自然な日本語での会話ができない最悪のカスタマーサポートでした(明らかに日本語ができる外国人による)。あまり込み入った話は日本語では無理だと感じました。

納品された物はPC本体とACアダプターのみ、あとは紙っぺら2枚だけ。

必要な情報はWebにあると言っているらしいが、DELLのホームページは欲しい情報が載っていないし、あったとしてもなかなか辿り着けない。PCが初めての人は、DELLをお勧めしません。周りに詳しい人が居れば話しは別ですが...


デスクトップは 以下のものを注文しました。

- CeleronG2800 Dual Core 2.7GHz
- 4GBメモリ
- 320GB HDD
- Win8.1

これで5万円以下。これは家族が使うPCで、各自のデータはUSBや外付けHDDを使っているのでHDD容量は少なくてOK。

前振りが長くなってしまいましたが、Win 8.1 は見かけ上、これまでとはかなり違って見えます。そこで、気になったことなどを備忘録として書き留めようと思って、番外編としました。





32bit アプリの動作について

まだWin8.1初心者ですが、最初に感じたのは、64bit OS なのに 32bit アプリケーションがかなりよく使えることです。

Windowsフォルダを覗いてみると、systemフォルダと system32フォルダがあり、32bitアプリケーションがsystem32を使っているのはこれまでのWindowsと同じです。しかし、System では64bit アプリを扱っているようです。Win8.1では、アプリケーションの32bitを前提にして書かれている部分の多くを、うまくエミュレート(騙して)しているようです。

ハードウェアに直接アクセスするような特殊なアプリケーションを除けば、これまで使ってきた32bitアプリケーションをそのまま使える確率が高そうです。つまり、OS更新に付き物のアプリケーションのバージョンアップ費用がかなり抑えられると期待できます。



ユーザーインターフェース

Win8.1から、起動直後にスタート画面が現れるようになり、そこからアプリ画面へ切り替えてアプリケーションを起動するようなユーザーインターフェースに変更されました。

さらに、アプリケーションが「ストアアプリ」と「デスクトップアプリ」の2種類に分類されるようになりました。アプリ画面では、これらの2つのカテゴリーがで一元管理されているので、それが分かりにくさの原因ではないかと思います。

このユーザーインターフェースの変化は、Win8.1がタブレットOSの性格を併せ持った結果だと考えると、うまく整理して理解できそうです。


「ストアアプリ」と「デスクトップアプリ」

ストアアプリは使い終わったらそのプロセスを終了させるという考えが薄いようです。タブレットではメモりに制限があり導入して使うアプリが限られるので、それで良いのでしょう。

一方PCとして使う場合は、従来からのデスクトップアプリも同時に多く起動するので、メモりに余裕が無いとスグに動作が重くなると思われます。

Win8.1の64bit化は、データアクセスが 64bit 単位で行うことを意味するのでその分動作が速くなりますが、一方でメモりアクセスが 64bi t単位で使われるため、32bit 版と同じパフォーマンスにするには単純に考えて倍のメモりが必要です。

但し、Win8.1 は起動時に読み込むプロセスが大幅に減っているようで、その分起動は速くなり、必要な時に必要なプロセスを呼び出す設計に大幅にシフトしているようです。つまり、起動後しばらくは、単純計算の2倍のメモリでなくても、必要なメモリ容量に多少の余裕を確保しているとも言えます。

タブレット風の使い方が多いのなら2GBメモりでも良いのでしょうが、これまでと同じアプリを同じように使う場合は、確実に倍のメモリが必要となります。従って、これまでのメモリ容量が 2GB なら、間違いなくメモリ不足になり、動作低下を招くと思います。
そこで、最低でも4GB以上のメモりが必要だと考えて、今回はこれを条件としたわけです。

ストアアプリは、その画面では終了させる機能を呼び出せないようです(まだ知らないだけかも...)。なので、ストアアプリは使い終わったら、タスクマネージャーを呼び出して、プロセスを終了させたくなります。従って、よほど有用なモノ以外は、ストアアプリはなるべく使いたくないのです。

[2014/04/13 追記]
2014年4月9日に配布開始された、Windows8.1 Update1 では、ストアアプリを終了させるの [X] ボタンが追加されたので、多少は改善されました。但し、デスクトップアプリ中心のアプリ(ソフト)を使う場合は、ストアアプリは不要なものですから、デスクトップでのより一層の作業性改善が望まれます。今回の1連の「番外編」で紹介した方法を使えば、Windows8.1 Update1 を適用しようとしまいと、さほど大きな違いはありません。言い換えれば、私にとっては、Windows8.1 Update1 はあまり意味の無いものといえます。



当面覚えておくと便利なショートカットキーなど

[Windows]キー+[X]は便利です。このショートカットキーにより以下のメニューが表示されます。
このメニューは、Windows アイコンをマウスの右クリックしても出てきます。

・プログラムと機能: アンインストール
・モビリティセンター: ディスプレイ、マウス、サウンドなどの機能切り替え
・電源オプション: 省電力機能設定
・イベントビュアー: 障害などのイベント履歴の確認
・システム: OS全体の管理の入り口
・デバイスマネージャー: ハードウェアやデバイスの管理
・ネットワーク接続: ネットワーク管理の入り口
・ディスクの管理: パーティションなどの管理
・コンピューターの管理: システム管理の入り口
・コマンドプロンプト
・コマンドプロンプト(管理者)
・タスクマネージャ: プロセスの管理やHDD / メモリのパフォーマンスチェック
・コントロールパネル
・エクスプローラ
・検索
・ファイル名を指定して実行
・シャットダウンまたはサインアウト
・デスクトップ

アプリの呼び出し以外のほとんどのメニューがここに集中しています。


さらに、以下のショートカットも大変便利です。

[Windows]キー+[E]でエクスプローラが起動するので、これも便利です。

[Ctrl]+[Shift]+[ESC]でタスクマネージャを呼び出せます。

[Windows]キー+[D]でデスクトップに切り替わります。


これだけで、一見分かりにくい Win8.1 が格段に使いやすくなります。



タブレット向けの特有の操作について

Win8.1特有のタッチパネル動作、ピンチ、ピンチアウト、スワイプなどは、タッチパッドでできる機種もあり、これも大変便利です。今回入手したDELLのInspiron 11 3137もタッチパネル以外にもタッチパッドでこれが可能です(これも選定理由の1つ)。デスクトップ機では、同等機能を持ったタッチパッドを追加するのも良いと思います。

ピンチやピンチアウトは、表示の拡大や縮小が簡単です。

但しこれらの動作は、マウスアクション(タッチ動作とはチョッと違う)でもできるので、慣れの問題かも知れません。



起動時にデスクトップ画面にする

これが可能なことを見つけました。
一番下に表示される タスクバーのプロパティを変更することで可能になります。
具体的には、タスクバーでマウスを右クリックすると現れるメニューから「プロパティー」を選ぶと、「タスクバーとナビゲーションのプロパティ」が現れ、[ナビゲーション]タブを開いて、[スタート画面]の1番上の項目にチェックを入れます。、

とりあえず、以上から従来からのインターフェース(操作環境)を簡単に呼び出せるので、格段と便利になります。


今後、気付いたことがあれば、紹介しようと思います。




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

人気ブログランキングへ


FC2ブログランキングへ


keywords: Windows8.1環境移行

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

テーマ : Windows
ジャンル : コンピュータ

Casio Basic入門16

Casio Basic入門
<目次>

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

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

Chapter 3

◆ Chapter 3 の目標: 自由自在な入力をする

前回: Casio Basic入門15

「入力ボックス」プログラムの動作確認のために、、メインルーチン CH3M を作成しました。

プログラム名 CH3M

Locate 1,1,"0:"

While 1

-1→M
Do
Getkey→K
K=25⇒0→M
LpWhile K=0

If M=0:Then
3→X:1→Y
Prog "CH3-0S"
Z→A

IfEnd

If M=0: Then
Locate 3,2,"              "
    (スペース14個)
Locate 3,2,A

IfEnd

WhileEnd


================

プログラム構造

[初期化処理]初期設定と初期表示

While 1

    [メニュー番号取得]今はメニュー番号0が1つだけ

    [入力処理]入力プログラム"CH3-1S"の呼出しと入力値の取得

    [出力処理]換算計算と表示

WhileEnd

================


入力ボックスの雛形

「入力ボックス」のプログラムの構造を以下のように考えました。

「入力ボックス」プログラムの構造

[初期化処理]

[キーコードからキーの数への変換]

Lbl 0

        [キーコード取得]

        [戻り値 Z の算出と表示]

K≠47⇒Goto 0

[後処理]

Return



[戻り値 Z の算出と表示]

連続して押されたテンキーから、複数桁の入力値を算出してリアルタイムで表示するのがこのプログラムの基本になりますが、

Z+[新たな入力値]→Z
Locate X,Y,Z


と、うまく出来そうなことを確認しました。これから、入力ボックス CH3-0S (ゼロ・エス) を具体的に作ってゆきます。



Chapter 3-0 (続き)
「入力ボックス」プログラム CH3-0S

各ブロックごとに、プログラムコードを作ってゆきます。


[初期化処理]

共有変数 X, Y, Z のうち、戻り値の機能を持つ Z を初期化します。

0→Z


[キーコードからキーの数への変換]

キー入力は、Getkeyコマンドを用いて押されたキーを判定します。このプログラムでは、Getkeyが返すキーコードから、キーの数字への変換が必要になります。

キーを押した時に得られるキーコードとキーの数字の関係は以下の表になりますが、簡単な式で表現できるような規則性が見つかりません。

キーの数字キーコード
35
36
37
21
22
23
31
32
33
25

そこで、配列変数 Z[ ] を利用します。


表1 キーコードからキーの数字への変換
キーの数字キーコード配列変数変換
Z[K]Z[K]の初期化
35Z[35]1→Z[35]
36Z[36]2→Z[36]
37Z[37]3→Z[37]
21Z[21]4→Z[21]
22Z[22]5→Z[22]
23Z[23]6→Z[23]
31Z[31]7→Z[31]
32Z[32]8→Z[32]
33Z[33]9→Z[33]
25Z[25]0→Z[25]

変換の列に示した通りに、配列変数を初期化しておきます。

こうしておくと、Getkeyコマンドで得られるキーコード K に対して、Z[K] は押されたキーの数になります。例えば、[6] キーを押すと、Getkeyコマンドで得られるキーコードは23、Z[23] は 6 になります。

配列変数を使用する前に、配列変数の領域を確保しなくてはなりませんが、その際の領域を 37 個分で確保します。

37→DimZ

こうすると、Z[1] ~ Z]37] が確保され、その中の上の表のにある必要なものが全て含まれます。

また、プログラムの最後では、確保した領域を開放します。

0→DimZ

配列変数は、プログラムの必要性に応じて、fx-5800P のメモリから必要な量のメモリ領域を確保して使う仕様なので、必要でなくなった時にメモリから解放しなければ、fx-5800P で使えるメモリ量が減ってしうので、領域解放は忘れずに行うようにします。

プログラムでは、配列変数 Z[1] から Z[37] までのうち、テンキーに対応する10個のみを使います。
 ⇒ CasioBasicコマンドリファレンス
      - 配列変数: Z[ ]

コマンドリファレンスに書いているように、配列変数の読み書きは通常変数よりも4倍ちかい時間がかかり、かなり遅いことが分かっています。そんなことから、私は配列変数を積極的に使わないようにしています。

しかし、キーコードからキーの数へ変換する簡単な式が見つからないので、配列変数を使うことにしました。と言うのも、If 文や 条件ジャンプ命令 ⇒ を使ってキーコードから押されたキーの数を判定する場合は、最低でも10回の判定が必要で、その場合は配列変数を使うよりも遙かに多くの処理時間が必要になり想定される時間は10倍以上になります。処理時間を考えた場合、配列変数が最良なわけです。

具体的なキーコードからキーの数への変換は、以下のように書けば良いですね。今回追加した部分を赤文字で示します。

37→DimZ
0→Z
1→Z[35]:2→Z[36]
3→Z[37]:4→Z[21]
5→Z[22]:6→Z[23]
7→Z[31]:8→Z[32]
9→Z[33]:0→Z[25]



[キーコード取得]

このブロックには特別なことは何もありません。

Do
Getkey→K
LpWhile K=0


これについては、CasioBasic入門 の Chapter 1 で詳しく取り扱っています。


[戻り値 Z の算出と表示]

例えば、[2] [0] [1] [4] と順に入力されたとします。

1回のキー入力のたびに、Getkeyコマンドで取得したキーコードから数へ変換します。

[2] が押された時、Z2 にします。続いて [0] が押された時、Z20 とします。さらに [1] が押された時、Z201 とし、[4] が押されると、Z2014 とする...このような作戦にします。

何かキーが押された時、それまでに得られている Z を10倍して、今得た数を足せば、Z を更新できます。[新たな入力値] は Z[K] なので、

10Z+Z[K]→Z

これで、キーが押されるたびに Z の更新を行います。

そして、この Z を表示するには、

Locate X,Y,Z 

とします。

X と Y は、入力開始位置として、メインルーチンから渡されるものです。従ってメインルーチンで、

3→X:2→Y
Prog "CH3-0S"

と記述すると、このProgコマンドで呼び出されたプログラム CH3-0S (ゼロ・エス)では、この XY をそのまま使えます。

Locate X,Y,Z は、メインルーチンで指定した位置 (X, Y)Z を表示します。


そこで、このブロックのプログラムコードは以下のようになります。

If [押されたキーがテンキーの時]
Then
10Z+Z[K]→Z
Locate X,Y,Z
IfEnd


押されたキーがテンキー、つまり0~9のキーである条件は、キーコード K が 表1 に記載されている値であることです。改めて記載すると、

Kが、「21≦K≦23」 または 「K=25」 または 「31≦K≦33」 または 「35≦K≦37」 であること

または と言うのは、数学用語、プログラミング用語で、CasioBasic には、「または」を意味する論理演算コマンド Or があります。

従って、上の条件を、この論理演算コマンドを使えば、

(21≦K≦23) Or K=25 Or (31≦K≦33) Or (35≦K≦37)

となります。


キーコード
・・・212223242526272829303132333435363738

赤く塗った部分が、上の条件を示しています。Or理論和とも言いますが、「全体の広がり」のイメージです。


さて、21≦K≦23 と言う表記はCasioBasicでは正しく動作しません。「K≧21 かつ K≦23」 と、2つに分けた表現が必要です。

論理演算コマンドを使えば、

K≧21 And K≦23 

となります。

← ←  ← ← K≦23
181920212223242526
K≧21 → → → →

K≦23 を青く塗りつぶし、K≧21 を緑で塗りつぶしています。
これらの重なる部分が、K≧21 And K≦23 です。And理論積と言いますが、「重なり」のイメージです。

31≦K≦33 や 35≦K≦37 も同様です


従って、上の If 分の条件は、以下のようになります。

(K≧21 And K≦23) Or K=25 Or (K≧21 And K≦23) Or (K≧31 And K≦33) Or (K≧35 And K≦37)

論理演算コマンド Or And については、以下で少し詳しく説明します。

このブロックのプログラムコードは、以下のようになります。

If (K≧21 And K≦23) Or K=25 Or (K≧21 And K≦23) Or (K≧31 And K≦33) Or (K≧35 And K≦37)
Then
10Z+Z[K]→Z
Locate X,Y,Z
IfEnd




[後処理]

後処理で重要なのは、配列変数の領域を開放することです。確保したままだとプログラム領域が減ったままになります。

0→DimZ

を実行しておきます。

このプログラムはサブルーチンとして機能するので、動作が終了するとメインルーチンの呼び出し部分へ戻ります。しかし明示的に Return コマンドを実行するようにします。

後処理は以下のようになります。

0→DimZ
Return



以上を一旦まとめておきます。

プログラム名 CH3-0S (ゼロ・エス)

0→Z
37→DimZ
1→Z[35]:2→Z[36]
3→Z[37]:4→Z[21]
5→Z[22]:6→Z[23]
7→Z[31]:8→Z[32]
9→Z[33]:0→Z[25]

Lbl o


Do
Getkey→K
LpWhile K=0

If (K≧21 And K≦23) Or K=25 Or (K≧21 And K≦23) Or (K≧31 And K≦33) Or (K≧35 And K≦37)
Then
10Z+Z[K]→Z
Locate X,Y,Z
IfEnd

K≠47⇒Goto 0

0→DimZ
Return


この入力ボックス プログラクを作成した上で、メインルーチン CH3-0M を実行してみてください。

メインルーチン起動後、メニュー番号0を押すと、入力モードになります。実際にテンキーで入力が可能なことを確認してください。そして[EXE]キーを押すと入力が確定され、表示されます。

先ずは、最低限必要な基本動作ができました。



論理演算について

論理演算 OrAnd が出てきましたが、これらを1度きちんと理解しておかないと、あとで困ることになります。そこで、少し行数を使って解説しておきます。

Or は「あるいは」で、And は「かつ」 と言うことは上で紹介しました。このような論理演算を 言葉、特に日本語で考えてはいけません。絶対に分からなくなります。

論理演算はキチンと規則があり、それに従えば、悩むことも、間違えることもなくなります。

fx-5800P 搭載の CasioBasicの論理演算コマンドには、OrAndNot の3種類あります。(fx-9860GII では、これらに加えて Xor が追加されています。これらの論理演算は他のプログラミング言語でも同じです)。

これらの書式は、

X Or Y

X And Y

Not X


です。

論理演算結果は、「真」「偽」かのどちらかになります。
論理演算で使う X と Y (上記の書式の場合)も、「真」「偽」のどちらかの値を持ちます。

これまで、色々なコマンドの条件にも、「真」と「偽」が出てきて、「0でない」=「真」で、「0である」=「偽」でした。
「真」True「偽」False とも言いますが、ここでは真と偽を使います。

先ずは、以下の表を見て下さい。

X Or Y
XYX Or Y
X と Y のどちらか1つが真ならば、X Or Y の結果は真となり、
両方が偽の時、偽となります。


X And Y
XYX And Y
X と Y の両方が真ならば、X And Y の結果は真となり、
どちらかに偽があれば、偽となります。


Not X
XNot X

Not X は、Xの真と偽を入れ替えます。

これらの表を「真理表」といい、論理演算を確かめるために使えます。



ド・モルガンの法則

ここで、覚えておくと便利な法則:ド・モルガンの法則 を紹介します。

Not (X And Y) = (Not X) Or (Not Y)     ・・・ (式1)

Not (X Or Y) = (Not X) And (Not Y)     ・・・ (式2)

これを真理表で確かめてみます。

XYX And YNot (X And Y)

XYNot XNot Y(Not X) Or (Not Y)

それぞれの表の一番右の結果が等しくなっていることから、(式1)が正しいことが分かります。

(式2)についても同様に確かめられますので、やってみてください。


さて、ド・モルガンの法則 が役立つ事例を紹介します。

例えば、A=1 と B=2 が同時になり立つ」時、Dsz C を実行せず、それ以外の場合に Dsz Cを実行したい、と言う内容をプログラムでスッキリと書きたい時、どうするか?

「A=1 と B=2が同時に成り立つ」のではない時(=それ以外の場合)、Dsz C を実行する、でも論理的に正しいですね。

A=1 And B=2」ではない は、Not (A=1 And B=2) です。

ド・モルガンの法則を使えば、

Not (A=1 And B=2) = A≠1 Or B≠2

なので、

A≠1 Or B≠2 の時 Dsz C を実行する、と書けば良いので、

A≠1 Or B≠2⇒Dsz C

と、うまく書けました。

ド・モルガンの法則 は、プログラミングで役立つことが多いので、覚えておくと良いと思います。


※ CasioBasicコマンドリファレンス
      - 論理演算: Or / And / Not



次回は、入力ボックスとしての完成度を上げてゆきます。



つづく...


CasioBasic入門17 / 目次




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

人気ブログランキングへ


FC2ブログランキングへ



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

商品詳細を見る



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

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

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

Casio Basic: Or/And/Not

Casio Basic
コマンドリファレンス

Casio fx-5800P、fx-9860GII、fx-CG20 で確認をとっています。Casio fx-FD10 Pro では互換性はあると考えられますが、実機で確認していないので「可能性」としてご覧ください。


fx-5800P / fx-9860GII / fx-CG20 (fx-9860GII / fx-CG20 では、これらの加えて Xor があります)
Or / And / Not

◆ 概 要:論理演算を行う。

◆ 書 式:
     [事象1] Or [事象2]
     [事象1] And [事象2]
     Not [事象1]

◆ 引 数: Or と And は2項演算子として、Not は単項演算子として機能する

◆ 戻り値: 論理演算の結果、真か偽かいずれかを返す


※ [事象1]、[事象2] には、数値、変数、式、戻り値のあるコマンド を指定でき、かどちらかの値をとる。

※ 数値や変数、式、戻り値のあるコマンドでは、0でない場合0の場合となる。

真 = True (トゥルー)偽 = False (フォールス) と呼ぶこともある。



論理演算は、真理表を用いると理解が楽になります。以下に OrAndNot の真理表を示します。


X Or Y の真理表
XYX Or Y
X と Y のどちらか1つが真ならば、X Or Y の結果は真となり、
両方が偽の時、偽となります。


X And Y の真理表
XYX And Y
X と Y の両方が真ならば、X And Y の結果は真となり、
どちらかに偽があれば、偽となります。



Not X の真理表
XNot X

Not X は、Xの真と偽を入れ替えます。



ド・モルガンの法則

プログラミングに役立つので、紹介します。


Not (X And Y) = (Not X) Or (Not Y)     ・・・ (式1)

Not (X Or Y) = (Not X) And (Not Y)     ・・・ (式2)

これを真理表で確かめてみます。

XYX And YNot (X And Y)

XYNot XNot Y(Not X) Or (Not Y)

それぞれの表の一番右の結果が等しいので、(式1)が正しいことが分かります。


XYX Or YNot (X Or Y)

XYNot XNot Y(Not X) And (Not Y)


それぞれの表の一番右の結果が等しいので、(式2)が正しいことが分かります。


ド・モルガンの法則の適用例

A=1 と B=2 が同時になり立つ」時、コマンドC を実行せず、それ以外の場合に Dsz C を実行する、と言う内容を簡潔に書きたい場合...

「A=1 と B=2が同時に成り立つ」のではない時(=それ以外の場合)に Dsz C を実行する、は論理的に等価です。

A=1 And B=2」ではないは、Not (A=1 And B=2) です。

ド・モルガンの法則を使えば、

Not (A=1 And B=2) = A≠1 Or B≠2

なので、

A≠1 Or B≠2 の時 Dsz C を実行する、と書けば良い、つまり...

A≠1 Or B≠2⇒Dsz C

と、簡潔に書けます。


ド・モルガンの法則は、プログラミングで役立つことが多いので、覚えておくと良いでしょう。



排他的論理和: Xor

プログラミングで使うことの多い排他的論理和: Xor は、fx-5800P のCasioBasicで準備されていません(fx-9860GII にはあります)。しかし、Or と And を利用して Xor と同等の演算が可能です。

X xor Y の真理表
XYX xor Y
X と Y の真偽が一致するならば、X xor Y は真となり、真偽が一致しない場合 X xor Y は偽となります。


X Xor Y = ((Not X) And Y) Or (X And (Not Y))

xor を Or と And で表せることの証明
XYNot XNot Y(Not X)
And Y
X And
(Not Y)
((Not X) And Y)
Or (X And (Not Y))






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

人気ブログランキングへ


FC2ブログランキングへ


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

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

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

楽屋裏 - fx-5800Pで換算プログラム

楽 屋 裏
e-Gadget

更新: 2015/01/23

有用な電卓プログラムの代表格が換算プログラムではないかと思っています。

・年齢換算
・和暦・西暦換算
・割り勘計算
・海外時間の換算
・各種通貨換算
・消費税計算
・様々な技術的な単位の換算


いくらでも、ありそうですね...

これらは、パソコンをいちいち起動しないで、出先やフィールドで電卓をサッと出して、パッと使えると便利なことが多いものです。



貧弱な標準入力命令:?

換算するパラメータが全て1画面に表示されていて、1つを変更すると、他が同時に変更される...そんな一覧性の高い変換プログラムは、fx-5800Pでは意外に作りづらいものです。

その最大のネックが、入力命令が貧弱なことにあります。CasioBasic標準の入力命令だと、要らぬ所に入力結果を表示したり、勝手にスクロールしたり、入力したい位置に入力できず...

標準の入力命令は、画面構成を破壊するので、一覧性の高い換算プログラムを作れません。



ついに公開

換算プログラムを作るために、fx-5800P用「入力ボックス」プログラム(サブルーチン)を、長らく暖めていました。

とても便利なので、いよいよCasioBasic入門で公開することにしました。もっと良い名前がありそうですが、暫定的に「入力ボックス」と命名しました...(´д`)

CasioBasic入門15 から連載します。

実際に私が作った「換算プログラム」の一例を、CasioBasic入門15 で紹介しています。

Casio Basic入門15 から「入力ボックス」の作成方法を紹介していますが、ここで完成したものは動作が遅いので、より高速化して実用的改造しています(以下参照)。


優れたアルゴリズムによる高速化、と言う課題は残っているのですが、一人で暖めておくよりも、いっそ公開することで、凄いアルゴリズムがあれば是非知りたいと言う思いもあります。

[2015/01/23 追記]
入力応答の大幅な改善を行いました。以下をご参照ください。
 ⇒ Casio Basic入門32
 ⇒ fx-5800P プログラムライブラリ - 入力ボックス

併せて、fx-9860GII 用の入力ボックスも公開しています。
 ⇒ Casio Basic入門37

ここで作った最終版「入力ボックス」は、プログラムライブラリでも紹介しています;
 ⇒ 入力ボックス 2.0 / 2.1 - fx-5800P専用
 ⇒ 入力ボックス 2.1G - fx-9860GII & fx-CG20専用




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

人気ブログランキングへ


FC2ブログランキングへ


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

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

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

Casio Basic入門15

Casio Basic入門
<目次>

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

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

前回: Casio Basic入門14 - Chapter 2

Chapter 3

◆ Chapter 3 の目標: 自由自在に入力する

Windows のエクスプローラで、ファイル名を変更する場合

InputBox 
このように、入力範囲が現れて、そこで入力や編集を行い、最後のEnterキーで確定します。

あるいは、以下のように最初から入力ボックスが表示されている場合もあります。

InpurBox2 

[ サンプル ] 入力ボックスをクリックするとカーソルが現れ、入力や編集を行い、入力ボックスの外側を適当にクリックすると内容が確定されます。


このような機能を使うことで有用なプログラムを簡単に作れるので、私は多くのプログラムを気楽に作っています。そこで、CasioBasic入門でも紹介しようと思います。


CasioBasicで入力ボックスを使いたい...これが Chapter 3 のテーマです。


CasioBasicでは、さすがにウィンドウ表示は無理ですが...

・入力範囲を表示する
・入力桁数を指定する
・入力と編集を行う
・[EXE]キーで確定する


これくらいの機能は、fx-5800P の遅いプロセッサでもなんとかなりそうです。


百聞は一見にしかず、でサンプルをみてもらいます。

今年の西暦年を 0.This Yr の右に入力しておき...
(今年 = This year

Birthday_1 
 
メニュー番号1の 1.Born in に生まれ年を入力するために、 [1] キーを押します。
(1970年生まれ = Born in 1970


すると、入力範囲が >>>> で表示され、入力モードに入ったことが分かります。

Birthday_2 

右下に、<EXE>:ENTER と表示され、入力モードであること、[EXE]キーで確定...とガイドがでます

ここで、テンキーを押せば自由に数字を入力でき、[DEL] キーで右から1文字づつ削除できて、入力内容の修正・編集ができます。


Birthday_3 

右下の <EXE>:ENTER は、確定前の入力モードであることを示しています。


1988 で確定すると...

Birthday_4 

2.Age の項目に 26 と表示されます。
(年齢 = Age)

1988年生まれだと、2014年では 26歳だとわかります。
これは、機能面で言えば、一種の換算プログラムです。


次に、和暦と西暦を換算するプログラムです。

YearConv_2_convert_20140312192315.jpg 

項目が多いですね。

0:AD (西暦)
1:M (明治)2:T (大正)
3:S (昭和)4:H (平成)
5:At (この西暦では...) 6: y (この歳...)

1画面に、7項目を押し込んでいます。

和暦と西暦を換算するプログラムですが、おまけ機能として、項目5と6を追加しています。

各項目への入力は、上の例と全く同じです。

0:AD1990 と入力すると、明治、大正、昭和、平成の年が表示されます。
4:H に 2 と入力すると、西暦、明治、大正、昭和の年が表示されます。

どちらも表示結果は同じですが、1カ所を変更すると、残りの項目が連動して変化します。

YearConv_4_convert_20140312192354.jpg 
西暦1990年は、明治123年、大正79年、昭和65年、平成2年と表示されます。
項目0から4まで、好きな項目に好きな値を入力でき、入力値に応じて全ての項目が更新されます。


この状態で、5:At に別の西暦を入力してみます。

YearConv_5_convert_20140312192414.jpg 

[5]キーを押すと、入力モードになって、4桁の入力範囲が示されています。
右下には 三角マークとE の表示がありますが、これも 確定を促すサインです。これが表示されていれば入力モードと言うわけです。


平成2年生まれの人は、東京オリンピック開催の2020年では...?

そこで、2020 と入力。

YearConv_6_convert_20140312192433.jpg 

右下のEマークが残っているので、まだ入力モード、確定前です。そこで、[EXE]キーで確定すると...

YearConv_7_convert_20140312192456.jpg  

6:30y  と表示されました。

東京オリンピック開催時には30歳になっている、と教えてくれています。

項目 5:At に過去の西暦を入れたり、項目 6: y に過去の年齢を入れると、それぞれ過去の年齢や西暦が換算されるので、履歴書を書いたり、自分の過去の年を思い出すのに役立っています。

これも、一種の換算プログラムです。


「入力ボックス」サブルーチンの活用

上で紹介した2つのプログラムでは、入力ボックス機能として、全く同じサブルーチンを使い回しています。つまり、一旦このサブルーチンを作っておけば、入力モードについてはプログラミングの必要がありません。

これらのメインルーチンは、項目数が違っていて、具体的な計算(換算)は異なりますが、実はほぼ同じプログラム構造で作れます。換算プログラムを作るには、基本構造は同じなので、実際に考えるのは具体的な計算(換算)部分のみです。

自由自在に入力するための1つの方法として、このような「入力ボックス」サブルーチンを活用すれば、必要な換算プログラムを簡単かつ短時間で作れるます。そのメリットは大きいのではないでしょうか?


同じサブルーチンを使った他のプログラム事例をもう少し紹介します。


温度単位換算プログラム

摂氏温度(°C)、華氏温度(°F)、絶対温度(K)の換算プログラムです。

TempConv_1


項目が3つで、どれかに入力すれば、他の単位の値が表示されます。
華氏(°F)はアメリカで使われていて、日本の摂氏温度(°C)の感覚とはとても異なる値です。

TempConv_4 
アメリカ南部の夏の温度は、現地の天気予報を見ると100度とか105度と言っていますが、我々日本の温度では40度程度だと分かります。気温100度と聞いてビックリしますが、40度でも相当熱いですね...

絶対温度は、高校の物理や化学で初めて出てくると思いますが、理工系では必ず使う温度単位です。液体窒素でバナナを凍らせると釘が打てる....その液体窒素の温度は、絶対温度で77Kです。

TempConv_7 
換算結果を見ると、だいたい-196℃ だと分かります。感覚を超えた低い温度ですね。

画面の左下に <RCL> とありますが、[RCL]キーを押すと計算式を表示するオマケ機能です。

TempConv_16 


圧力単位換算プログラム

PressureConv_2 

圧力単位は、普通にはあまり馴染みの無いものですが、私はこのプログラムを仕事で愛用してます。この画面は、psi という単位で入力しようとしているところ(入力モードに入っている)です。

PressureConv_4 
500psi は、他の単位では....

ちなみに、psi は、1平方インチあたりのポンド...なんとも分かりづらい単位です。  



入力ボックス・サブルーチン
各種換算プログラムへの適用


1画面に全ての項目が表示された換算プログラムは、どれか1つを変えると、他がどのように変わるのか?が1画面で把握できるので、非常に使いやすくなります。

ちなみに、CasioBasicの「入力命令:?」を使うと、このようなプログラムを作ることは困難です。入力命令:? は、入力する位置や桁数を自由に決められず、入力結果が勝手に表示され、さらに画面が勝手にスクロールします。

以前は、入力命令:?を使って、スクロールする画面の換算プログラムを作って、それを使っていました。しかし1画面で全ての換算結果を把握できるプログラムを使ってしまうと、もう元に戻れません。

CasioBasicには、入力ボックス相当のコマンドが準備されていません。そこで、Chapter 3 では、サブルーチンとして使い回しができる「入力ボックス」プログラムを作ります



Chapter 3-0
動作確認用メインルーチン CH3M


Chapter 3 では、メインルーチンと入力ボックスの両方を並行して作ることになります。

先ずは、以下のメインルーチンを入力して、準備して下さい。


プログラム名 CH3M

Locate 1,1,"0:"

While 1

-1→M
Do
Getkey→K
K=25⇒0→M
LpWhile K=0

If M=0:Then
3→X:1→Y
Prog "CH3-0S"
        (-ゼロ・エス)
Z→A

IfEnd

If M=0: Then
Locate 3,2,"              "
    (スペース14個)
Locate 3,2,A

IfEnd

WhileEnd


================

プログラム構造

[初期化処理]初期設定と初期表示

While 1

    [メニュー番号取得]今はメニュー番号0が1つだけ

    [入力処理]入力プログラム"CH3-0S"の呼出しと入力値の取得

    [出力処理]換算計算と表示

WhileEnd

プログラム名 CH3MM は、メインルーチンの M です。プログラム終了は [AC] キーです。


さて、このメインルーチンから呼び出す「入力ボックス」のプログラム名を CH3-0S (ゼロ・エス)とします。末尾の S は、サブルーチンの S で、これがこれから作る入力ボックスです。いまの段階では、「入力ボックスプログラム: CH3-0S 」は、想定した機能を持つブラックボックスとして扱います。

話をメインルーチンに戻します。

Casio Basicでは、サブルーチンを呼びだす時は、プログラム名を指定します。具体的には CH3-0S を呼びだすために、

Prog "CH3-0S"

と書きます。

サブルーチンを呼びだす時、Casio Basicのコマンドのように引数を設定したり、戻り値を設定したりしたいところですが、残念ながらできません。一方で、Casio Basicでは、変数が全てのプログラムで共通して使えると言う性質を利用します。

メインルーチンで 変数 X に数値 123 を代入した後で入力ボックスを呼びだすと、呼びだされた入力ボックスでは 123 が代入された変数 X をそのまま使えます。

入力ボックスで変数 Z に 456 を代入してから終了すると、戻ってきたメインルーチンでは、456 が代入された変数 Z をそのまま使えます。そこで、引数として渡したい変数は入力ボックスを呼びだす直前に設定し、戻り値として受け取りたい変数は入力ボックスの直後に受け取るようにします。


メインルーチンプログラムの説明

[初期化処理]
初期表示を行います。
今は、1つだけしかないメニューを表示します。メニュー番号は0です。

Locate 1,1,"0:"


[メニュー番号取得]
このブロックでは、Getkey コマンドを使って、メニュー選択の処理をしています。

-1→M
Do
Getkey→K
K=25⇒1→M
LpWhile K=0


[0] キーが押されると、Getkey はキーコード 25 を返します。
そこで、キーコードが 25 の時、メニュー変数Mに、1を代入します。
キーが押されない間は、このDoループが回り続け、何かキーがおされたら、キーコードに応じた番号をメニュー変数Mに代入する動作をします。今後メニューを増やすときは、メニュー番号を2、3、...と増やします。

なお、-1→-M の初期化は重要です。

[0] キー以外が押されたときを考えます。何かキーを押してDoループから出てくると、[0]キーを押したときは M=0 になっています。しかし、[0]キー以外を押したとき、Mには何も代入されません。

もしMを初期化していないと、M
の値がどうなっているか全く不明です。他のプログラムを走らせた時にMを使っていれば、何かの値がMに入っています。プログラムが込み入ってくると、管理されない変数はバグの原因となります。Mを -1 で初期化すれば、は -1 か 0 以外にはならず、完全に管理された状態になります。バグ予防措置として重要です。


[入力処理]
まだブラックボックス扱いですが、「入力ボックス」プログラム CH3-0S (ゼロ・エス)を呼び出します。メインルーチンと「入力ボックス」プログラムで、変数 X, Y, Z を共有させます(このように「入力ボックス」プログラムを作ってゆきます)。

CasioBasicでは、変数は全てのプログラムからアクセス可能なので、変数は共有されます。

X, YCH3-0S (ゼロ・エス)への引数、ZCH3-0S (ゼロ・エス)からの戻り値として扱うことにします。

If M=0:Then
3→X:1→Y
Prog "CH3-0S"
        (ゼロ・エス)
Z→A
IfEnd


メニュー番号の時、If文による分岐処理を行っています。「入力ボックス」プログラム CH3-0S は、これから作ります。

「入力ボックス」プログラムでは、入力開始位置である X と Y が引き渡され、それに基づき動作します。動作が終了すると、入力結果が変数 Z に格納されているので、メインルーチンでは Z を変数 A に代入しています。Z は「入力ボックス」プログラムの中で使われる変数なので、次に入力ボックスを呼び出すと、その値は変更されます。従って、入力ボックスから戻ってきた直後に変数 A に代入しておきます。こうすれば、Z が変化しても問題ありません。


[出力処理]
メニュー番号に対応した内容を表示します。

If M=1:Then
Locate 3,2,"              "
    (スペース14個)
Locate 3,2,A
IfEnd


この出力は何度でも繰り返されるので、表示前にスペースで上書きして、前の出力を消去し、その後新たな表示を行っています。これまでにも使って来た手法です。



「入力ボックス」プログラムの作成準備

今回のメインテーマ「入力ボックス」プログラムの作成準備をします。

例えば、[2] [0] [1] [4] と順にキー入力した時、「入力ボックス」プログラムからの戻り値 Z をどのようにするか? を考えてみます。

1回のキー入力のたびに、Getkeyコマンドで取得したキーコードからキーの数へ変換します。

[2] が押された時、Z2 にします。続いて [0] が押された時、Z20 とします。さらに [1] が押された時、Z201 とし、[4] が押されると、Z2014 とする...

キーが押されるたびに、Zを10倍してそれに新たな数を足して Z へ代入する、こうして正しく Z を得られそうです。

10Z+[新たな入力値]→Z

そして、キー入力時にリアルタイムで表示を更新するには、Z が更新されるたびに、Locateコマンドで Z を表示します。こうすると、キー入力時にリアルタイムで 表示に反映させられます。

入力開始位置の X と Y はマインルーチンから 入力ボックスへ渡されます。従ってZの表示は、

Locate X,Y,Z


で良いわけです。


さて、プログラム全体の構造を以下のように想定します。


「入力ボックス」プログラムの構造

[初期化処理]

[キーコードからキーの数への変換]

Lbl 0

        [キーコード取得]

        [戻り値 Z の算出と表示]

K≠47⇒Goto 0

[後処理]

Return



入力モードに入っている時は Lbl / Goto ループの中にあり、入力確定のために [EXE] キーを押すと、ループから抜けるようにします。 [EXE] のキーコードは 47 なので、キーコードが 47 でない時はループを継続して、47 の時ループから抜けます。

Lblb 0
[入力モードでの処理]
K≠47⇒Goto 0



次回は、具体的にプログラム CH3-0S を作ります。



つづく...


CasioBasic入門16 / 目次




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

人気ブログランキングへ


FC2ブログランキングへ



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

商品詳細を見る



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

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

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

Casio Basic入門14

Casio Basic入門
<目次>

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

最終:
2015/01/11 Casio Basic 特有の問題について重要な追記を一番最後に行いました

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


Chapter 2 - 初級

◆ Chapter 2 の目標: 動きのあるプログラムを作る
簡単なアクションゲームを作る

前回: Casio Basic入門13

Chapter 2-9 で、ゲーム機能の実装が終わりました。

プログラム名 CH2-9

While 1

0→P:3→T:0→B
Locate 1,1,"P:0"
Locate 1,3,"L:"
Locate 10,1,"TRY:"

Locate 14,1,T
Locate 1,4,"B:0"

Lbl M

0→E
TankInt#(7,25)→L
Locate 3,3,"    "
    (スペース4個)
Locate 3,3,L
Locate 6,4,"<EXE>:START"◢
Locate 6,4," <(-)>:STOP"
      (頭にスペース1個)
Locate 1,2,"                "
    (スペース16個)

RanInt#(2,50)→C
Do
If C-4Int(C÷4)≦1
Then
Locate 8,2,"×"
Else
Locate 8,2,"+"
IfEnd
Getkey=57⇒1→E
Dsz C
LpWhile E=0
Locate 8,2," "
    (スペース1個)

0→C
Do
E=1⇒Break
C>L⇒Break
Isz C
LpWhile Getkey≠57
C>L⇒2→E
Locate 8,2,C

If E=2
Then
P-L→P:Dsz T
Locate 5,2,"TIME OUT"
Else If E=1
Then
P-L+C→P:Dsz T
Locate 3,2,"FALSE START"
Else If E=0
Then
P+L-C→P
If P≧50(B+1)
Then
Isz B:Isz T
Locate 3,4,B
IfEnd
IfEnd
IfEnd
IfEnd
Locate 3,1,"    "
Locate 3,1,P
Locate 14,1,T

T⇒Goto M

Locate 1,2,"                "
    (スペース16個)
Locate 4,2,"GAME OVER"
Locate 8,3,"<AC>:QUIT"
    (頭のスペースはない)
Locate 6,4,"<EXE>:RETRY"◢
Cls


WhileEnd


プログラムブロック構造

While 1  (大ループ)

    [プログラム全体の初期化]

    Lbl M

        [繰り返し処理の初期化]

        [アニメーション表示]

        [反応速度の測定&表示]

        [例外処理]

    Goto M

    [ゲームオーバー時の処理]

WhileEnd



チョットした動きを付けて「反射ゲーム」を完成させます。



Chapter2-10
For文とProgコマンドを使ってみる

CasioBasic入門では、Doループ、Whileループ そして Goto/Lbl ループを紹介してきました。今回は、Forループを紹介します。

例えば、ディスプレイの左から右へ "." を並べて表示しようと思います。

Locate 1,2,"."
Locate 2,2,"."
Locate 3,2,"."
    ・
    ・
    ・
Locate 15,2,"."
Locate 16,2,"."


とすれば良いわけですが、これではプログラムを書くだけでも大変です。

では、Locate I,2,"." をみてください。"." を表示する位置が、(x, y) = (I, 2) になっています。大文字の I を変数として使っています。

そして、I を 1~16まで変化させながら、Locate I,2,"." を実行すれば、単純作業を自動化できてプログラムらしくなります。これを実現するのが、For 文 です。


具体的な記法は、以下のようになります。

For 1→I To 16
Locate I,2,"."
Next


I に1を代入 (I の初期化)
I を 1から16まで変化させながらループをまわす
・ループの中では Locate I,2,"." を実行する
が16の時の処理が終わればループを抜ける


...と言う動作をします。

プログラムを入力する時、For や To そして Next は、Do や While と同じページのメニューから選べば入力できます。
ここで、使った変数 I を制御変数やインデックスと言うこともあります。

さて、実際に、プログラム実行してください。点が左から右へ増えてゆきます。fx-5800P は動作が遅いので、For文を使えばアニメの表示に使えるわけです。

では、次のプログラムを入力して、実行してみてください。

Program Menu で、1:NEW を選び、プログラム名を S1RE としてください。

プログラム名 S1RE
For 1→I To 7
Locate 8-I,2,"<"
Locate 9+I,2,">"
Next


どうですか?

画面中央から < > が広がってゆくアニメーション になっていますね。


このアニメーションを GAME OVER の表示に重ねてみることにします。

反射ゲームのゲームオーバー時に、Locate 4,2,"GAME OVER" を実行しています。そこで、この表示の直前に上のアニメーションを実行すると、< > が広がるアニメの後、真ん中に GAME OVER と表示されますね。


Casio Basicでは、他のプログラムを呼び出して使うことができます。呼び出すプログラムをサブルーチンと言います。
他のプログラムを呼び出すには、Prog コマンドを使って、呼び出すプログラム名を " " で挟みます。

Prog "S1RE"

と書くと、プログラム S1RE を呼び出し、S1RE の実行が終わると、この記述の直後へ戻ってきて、次の処理が続きます。

そこで、プログラムCH2-9 の [ゲームオーバー時の処理] ブロックを以下のように変更しましょう。

Locate 1,2,"                "
Prog "S1RE"
Locate 4,2,"GAME OVER"
Locate 8,3,"<AC>:QUIT"
Locate 6,4,"<EXE>:RETRY"◢

Cls

(追加した部分を赤文字で示した)


プログラムCH2-9 のゲームオーバー時:







もう1つ、動きのあるギミックを追加しようと思います。

プログラムの起動時に、プログラムの説明画面が現れることがありますが、これをスプラッシュ画面といいます。そこで、反射ゲームにも動きのあるスプラッシュを表示させて、Chapter 2 の仕上げとします。

先ずは、完成動画を見て下さい。




先ず、アニメーションで React!! と表示しています。そして、e-Gadgetby Krtyski と表示されます。

ここで、小文字のアルファベットを使っていることに注目してください。fx-5800P の Casio Basic では、普通にアルファベットを表示するには大文字に限られますが、それでは面白くない。



スプラッシュと小文字表示については、Ku さんによる 小文字表示プログラムのご提案があり、とても面白いので、 このアイディアを盛り込みました。小文字の表示方法についての詳細は、「楽屋裏 - スプラッシュ」のコメント欄を参考にしてください。e-Gadget と表示する具体的なプログラムの記載があります。


小文字を使うには、以下の方針で工夫すれば良いと思います。

・ 欲しい小文字を1文字目或いは2文字目に含んだ文字列を、探す

・欲しい小文字以外は、他の文字で上書きするかスペースで上書きして消す



スプラッシュ画面は、サブルーチン S2RE で作成し、プログラムCH2-9 から呼び出して使うことにします。


React!! の動画は以下のように、For 文を使っています。

3→W

For 1→I To 16
Locate 17-I,2,"R"
     ([Function] [4] [▼] [▼] [▼] [3])
Next
For 1→I To 15
Locate 17-I,2," "
Next
For 1→I To 15
Locate 17-I,2,"e^("
   
([SHIFT] [In])
Next
For 1→I To 14
Locate 17-I,2," "
Next
For 1→I To 14
Locate 17-I,2,"ao"
   
([Function] [4] [5])
Next
For 1→I To 13
Locate 17-I,2," "
Next
For 1→I To 13
Locate 18-I,2,"co"
   
([Function] [4] [▼] [▼] [▼] [4])
Next
For 1→I To 12
Locate 17-I,2," "
Next
For 1→I To 12
Locate 17-I,2,"t"
   
([Function] [4] [▼] [▼] [▼] [▼] [6])
Next
For 1→I To 11
Locate 17-I,2," "

Next
For 1→I To 11
Locate 17-I,2,"!"
     
([i])
Next
For 1→I To 9
Locate 17-I,2," "
Next

For 1→I To 7
W→C
Lbl 0
Dsz C
Goto 0
Locate 8-I,2," "
Next



ここで、React!! の最初の文字 R のアニメーションを見てみましょう。

For 1→I To 16
Locate 17-I,2,"R"
Next


文字 R は、特殊文字を使っています。普通に 大文字の R でも良いのですが、次にくる e とのバランスを考えて、この文字にしているだけです。ここは好みの問題ですから、気にしないでくさだい。

For文が実行される時、
最初は、I=1 なので、17-I は 16 となり、Locate 16,2,"R" と同じことになります。
次に、I=2 になるので、17-I は 15 となり、Locate 15,2,"R" と同じ、
これを繰り返し、
最後に、I=16 になるので、17-I は 1 となり、Locate 1,2,"R" と同じになります。
ここで、For文が終わります。

このアニメーションの視覚効果は、R を2行目の1番右に表示し、次に1つ左に表示し、さらに1つ左に表示...と繰り返し、1桁目に表示するまで繰り返しています。この表示が終わった段階では、2行目の左端から右端まで R がズラズラと並んでいます。

次に、以下のFor文で、右から R を順に消してゆき、最後の1文字を残します。

For 1→I To 15
Locate 17-I,2," "
Next


この For文が実行されると、
最初は、I=1 なので、17-I は 16 となり、Locate 16,2," " と同じになります。
次に、I=2 になるので、17-I は 15 となり、Locate 15,2," " と同じ、
これを繰り返し、
最後に、 I=15 になるので、17-I は 2 となり、Locate 2,2," " と同じになります。
ここで、For文が終わります。

全ての文字が同じように動くと、視覚的には、右から文字がやってきて、React!! ができあがるようなアニメーションに見えます。


React!! をアニメーションで表示した後、2ブロック目のFor文で、右から1文字づつ消すアニメーションにしています。
文字を右から順に消すのは、Locate 8-I,2," " で順にスペースで上書きしています。

ここでは、以下のループを使って待ち時間を作っています。時間はカウンタCで決まります。

Lbl 0
Dsz C
Goto 0


For文をまわるたびに、Cを初期化する必要があり、Wの値で初期化しています。Wの値はプログラムの一番最初で3にしています。

以上がアニメーション部分です。


上のプログラムの1つめのブロックと2つめのブロックの間で、

e-Gadgetby Krtyski の表示を入れます。そのプログラムは以下のようになります。

Locate 8,1,"e^("    ([SHIFT] [In])
Locate 11,1,"ao"    ([Function] [4] [5])
Locate 12,1,"d/dX("    (Function] [1] [2])
Locate 13,1,"g"    ([Function] [1] [▼] [▼] [▼] [▼] [3])
Locate 14,1,"e^("    ([SHIFT] [In])
Locate 9,1,"-G"    (普通に "-G")
Locate 15,1,"t"    ([Function] [1] [▼] [▼] [▼] [▼] [6])
Locate 16,1," "    (普通にスペース)

Locate 6,4,"Abs("
    ([Function [1] [▼] [1])
Locate 6,2," "
    (普通にスペース)
Locate 6,4,"yσn"
    ([Function] [7] [2] [6])
Locate 9,4," "
    (普通にスペース)
Locate 10,4,"K"
    (普通に"K")
Locate 11,4,"re"
    ([Function [4] [▼] [3])
Locate 12,4,"t"
    ([Function] [4] [▼] [▼] [▼] [▼] [6])
Locate 13,4,"yσn"
    ([Function] [7] [2] [6])
Locate 14,4,"sin("
    ([sin])
Locate 15,4,"k"    ([Function] [1] [▼] [▼] [▼] [6])
Locate 16,4,"i"    ([i])


以上のアニメーションと表示が終わると、最後に画面をクリア(消去)する必要があります。そこで、Cls コマンドを使います。

このプログラムはサブルーチンとして呼び出されるので、終了すると呼び出された位置へ戻ります。
一方、Returnコマンドを実行しても、サブルーチンを強制終了して、呼び出された位置へ戻ります。

今後、このサブルーチンを変更する可能性を考えて、最後に明示的に Return を書いておきます。このままですと、特にReturnは不要ですが、念のためです。

※ CasioBasicコマンドリファレンス
      - Cls
      - Return


スプラッシュ画面表示のプログラムをまとめます。


プログラム名 S2RE

3→W

For 1→I To 16
Locate 17-I,2,"R"
     ([Function] [4] [▼] [▼] [▼] [3])
Next
For 1→I To 15
Locate 17-I,2," "
  (スペース1個)
Next
For 1→I To 15
Locate 17-I,2,"e^("
   
([SHIFT] [In])
Next
For 1→I To 14
Locate 17-I,2," "
  (スペース1個)
Next
For 1→I To 14
Locate 17-I,2,"ao"
   
([Function] [4] [5])
Next
For 1→I To 13
Locate 17-I,2," "
  (スペース1個)
Next
For 1→I To 13
Locate 18-I,2,"co"
   
([Function] [4] [▼] [▼] [▼] [4])
Next
For 1→I To 12
Locate 17-I,2," "
  (スペース1個)
Next
For 1→I To 12
Locate 17-I,2,"t"
   
([Function] [4] [▼] [▼] [▼] [▼] [6])
Next
For 1→I To 11
Locate 17-I,2," "
  (スペース1個)
Next
For 1→I To 11
Locate 17-I,2,"!"
     
([i])
Next
For 1→I To 9
Locate 17-I,2," "  (スペース1個)
Next

Locate 8,1,"e^("    ([SHIFT] [In])
Locate 11,1,"ao"    ([Function] [4] [5])
Locate 12,1,"d/dX("    (Function] [1] [2])
Locate 13,1,"g"    ([Function] [1] [▼] [▼] [▼] [▼] [3])
Locate 14,1,"e^("    ([SHIFT] [In])
Locate 9,1,"-G"    (普通に "-G")
Locate 15,1,"t"    ([Function] [1] [▼] [▼] [▼] [▼] [6])
Locate 16,1," "    (スペース1個)

Locate 6,4,"Abs("
    ([Function [1] [▼] [1])
Locate 6,2," "
    (スペース1個)
Locate 6,4,"yσn"
    ([Function] [7] [2] [6])
Locate 9,4," "
    (スペース1個)
Locate 10,4,"K"
    (普通に"K")
Locate 11,4,"re"
    ([Function [4] [▼] [3])
Locate 12,4,"t"
    ([Function] [4] [▼] [▼] [▼] [▼] [6])
Locate 13,4,"yσn"
    ([Function] [7] [2] [6])
Locate 14,4,"sin("
    ([sin])
Locate 15,4,"k"    ([Function] [1] [▼] [▼] [▼] [6])
Locate 16,4,"i"    ([i])

For 1→I To 7
W→C
Lbl 0
Dsz C
Goto 0
Locate 8-I,2," "
  (スペース1個)
Next

Cls
Return


ここで作ったスプラッシュプログラム S2RE をメインプログラムから呼び出します。
プログラム CH2-9 の1番最初で、スプラッシュプログラムを呼び出すので、プログラムの1番上に

Prog "S2RE"

を追加します。

これで、反射ゲームが完成です。



これまで作ってきた反射ゲームを React!と命名しましょう。そこで、プログラム名 CH2-9REACT に変更します。

Program Menu で、3:EDIT を選ぶ(2;RUN でも良い)と、Program List が表示されます。そこで、CH2-9 にカーソルを合わせ([EXE]キーは押さずに...)、[FUNCTION]キーを押すと、File Commands 画面が現れます。ここで 2:Rename を選び、File Name を REACT に変更します。


プログラム名 REACT

Prog "S2RE"

While 1

0→P:3→T:0→B
Locate 1,1,"P:0"
Locate 1,3,"L:"
Locate 10,1,"TRY:"

Locate 14,1,T
Locate 1,4,"B:0"

Lbl M

0→E
RanInt#(7,25)→L
Locate 3,3,"    "
    (スペース4個)
Locate 3,3,L
Locate 6,4,"<EXE>:START"◢
Locate 6,4," <(-)>:STOP"
      (頭にスペース1個)
Locate 1,2,"                "
    (スペース16個)

RanInt#(2,50)→C
Do
If C-4Int(C÷4)≦1
Then
Locate 8,2,"×"
Else
Locate 8,2,"+"
IfEnd
Getkey=57⇒1→E
Dsz C
LpWhile E=0
Locate 8,2," "
    (スペース1個)

0→C
Do
E=1⇒Break
C>L⇒Break
Isz C
LpWhile Getkey≠57
C>L⇒2→E
Locate 8,2,C

If E=2
Then
P-L→P:Dsz T
Locate 5,2,"TIME OUT"
Else If E=1
Then
P-L+C→P:Dsz T
Locate 3,2,"FALSE START"
Else If E=0
Then
P+L-C→P
If P≧50(B+1)
Then
Isz B:Isz T
Locate 3,4,B
IfEnd
IfEnd
IfEnd
IfEnd
Locate 3,1,"    "
Locate 3,1,P
Locate 14,1,T

T⇒Goto M

Locate 1,2,"                "
    (スペース16個)
Prog "S1RE"
Locate 4,2,"GAME OVER"
Locate 8,3,"<AC>:QUIT"
    (頭のスペースはない)
Locate 6,4,"<EXE>:RETRY"◢
Cls


WhileEnd


プログラムブロック構造

[スプラッシュ呼び出し]

While 1  (大ループ)


    [プログラム全体の初期化]

    Lbl M

        [繰り返し処理の初期化]

        [アニメーション表示]

        [反応速度の測定&表示]

        [例外処理]

    Goto M

    [ゲームオーバー時の処理]

WhileEnd



そこそこ遊べる「反射ゲーム」になったと思います。
スピードが必要なところは、コンパクトなループにし、ゲームの得点計算などは別のところで行う作戦にしたので、機能追加してもスピードが犠牲になっていないと思います。


皆さんは、どのくらいの最高得点になりますか?
簡単すぎる、あるいは難しすぎる場合は、タイムアウトカウンタ L を決める RanInt#(7,25)→L を調整したり、ボーナスポイントを貰える条件( If P≧50(B+1) : 50点おき)を変更すると良いでしょう。


CasioBasicのコマンド類を覚えてもらいながら、ブロック構造でプログラムを作るメリットも紹介してきました。慣れないうちは、プログラムコードを紙やエクセルなどに書いて全体を眺めるほうが、分かりやすいと思います。



プログラムの保存

fx-5800P はメモリ内にしかプログラムを保存できません。もう一台fx-5800Pを持っていれば、オプションのリンクケーブルを使ってプログラムを転送してバックアップできます。

私は、いつもエクセルに書いて保存しています。スペースの数を確認できる、色々なメモを書いておけるのがその理由です。
フォントには、電卓のフォントに近い Consolas を使っています。このフォントでは、0(ゼロ)は斜め線がついて、O(オー)との区別が明確なので、お勧めです。

私は、いつも変数のメモを付けるようにしています。
必要に応じて、プログラムの構造のメモなども追加しています。


REACT_desc REACT_Main_src 

REACT_Sub1 

REACT_Sub2_src 



重要な追記 2015年1月11日

Do ループや While ループからの脱出に Dsz 命令や Isz 命令、⇒ 命令を使うと異常動作の可能性があります。

具体的には、以下の条件を満たす記法が異常動作の可能性の条件となります;

Dsz/Isz/⇒で偽の場合に、次のコマンドをスキップするという
仕様のため、次の条件の場合にSynERRORとなります。
・条件1: DoやWhileを用いたループがあること
・条件2:ループ脱出に Dsz/Isz/⇒を利用すること
・条件3:Dsz/Isz/⇒ の次のコマンドが、LpwileかWhileEndであること


これは、カシオお客様センターに確認したもので、ユーザーから見ればバグですが、メーカーとしては非公開の内部実装に沿った仕様通りの動作ということです。その背景には、古い命令である Dsz, Isz, ⇒ に慣れ親しんだユーザーへの配慮から、敢えてこれら古い命令を残したということです。

但し、必ずエラーになるかといえば、そうではないことは今回のプログラムが正常動作することが示しています。

この部分です;

RanInt#(2,50)→C
Do
If C-4Int(C÷4)≦1
Then
Locate 8,2,"X"
Else
Locate 8,2,"+"
IfEnd
Getkey=57⇒1→E

Dsz C
LpWhile E=0
Locate 8,2," "


細かいことをいえば、ループ構造を正しく制御するためには、ループが継続される時と継続されない時で、ジャンプ先が異なるので、プログラムの内部動作として、スタックという特殊なメモリを使ってジャンプ先アドレスの管理を行っています。このスタック制御に関して、古い Dsz / Isz / ⇒ 命令と後から追加した Do / While ループで整合性がとれていないのが、現在の Casio Basic です。古くからのユーザーが慣れ親しんだ古い命令を敢えて残した際、後から追加した Do / While ループとの整合性が不完全なままになっていると言うことは、確認がとれています。

逆に言えば、制御構造のスタック管理を意識して使えば、今回のように必ずしもエラーとはならないわけです。

カシオが正常動作を保証している記法に準拠して、一番簡単に書き直すのなら、上記のコードの場合は

Dsz C 



C-1→C:C=0⇒Break

に修正することになり、これで万全なプログラムとなります。

この問題については、改めて別エントリーにまとめていますので、ご参照ください。
 ⇒ 楽屋裏 - Dsz によるループ脱出



これで、Chapter 2 を終了します。


初級者の方は、次に Chapter 7 Casio Basic入門 38  へ進むことを勧めます。
Chapter 7 の次には Chapter 8 Casio Basic入門 43  へ進んでください。


次の Chapter 3 では、論理演算、配列変数サブルーチンの使いこなしなどを紹介する予定です。

これまでに、CasioBasicに備わっている入力命令:? や、リアルタイム入力ができる Getkey コマンドを紹介しています。Getkey については、使いこなしを紹介してきましたが、入力命令 ? の使い方はあまり紹介していません。

と言うのも、入力命令:? が使いにくいからです。画面の中の好きな位置で入力させることはできないし、入力した結果は勝手に改行して表示される、などと、その動作が自由にならないからです。

Locate コマンドを使えばとても柔軟に出力できるのに、残念ながら柔軟な入力コマンドがありません。そこで、Chapter 3 では自由自在に入力できる方法を紹介する予定です。特製の入力コマンドをサブルーチンで作ってしまおうと言う計画です。



つづく...


CasioBasic入門15 / 目次




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

人気ブログランキングへ


FC2ブログランキングへ



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

商品詳細を見る



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

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

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

Casio Basic: Norm

Casio Basic
コマンドリファレンス

Casio fx-5800P、fx-9860GII、fx-CG20 で確認をとっています。Casio fx-FD10 Pro では互換性はあると考えられますが、実機で確認していないので「可能性」としてご覧ください。
2015/01/09 更新

fx-5800P / fx-9860GII / fx-CG20
Norm

◆ 概 要:指数表示する数の範囲を切り替える

◆ 書 式: Norm 1 あるいは Norm 2 のどちらか

◆ 引 数: なし

◆ 戻り値: なし


※ Norm 1
  X が -10-2 < X < 10-2 0に近い あるいは
     X ≦ -1010、 X ≧ 1010 (0から遠い) 時に、指数表示する

※ Norm 2
  X が -10-9 < X < 10-9 0に非常に近い あるいは
     X ≦ -1010、X ≧ 10100から遠い) 時に、指数表示する


Norm 設定は、Sci 設定 (有効桁数設定)をキャンセルできる
1.235X62.28 の結果(76.9158) を表示させるとき、
Sci 3 とすると、7.69x10 1 と表示される。
ここで、Norm 1 あるいは Norm 2 とすると、Sci設定が解除され 76.9158 と表示される




Norm 1 で指数表示される数の範囲 (10-2 = 0.01)
Norm1 

Norm 2 で指数表示される数の範囲 (10-9 = 0.000000001)
Norm2 

こうしてみると、Norm 1Norm 2 は、指数表示する条件のうち、0に近い範囲を切り替える。

要するに、

※ Norm 1: できるだけ指数表示したいときに用いる。

※ Norm 2: できるだけ指数表示を避けたいときに用いる。
       小数点を含めて表示桁数が10桁以内なら、小数 / 整数表示となる




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

人気ブログランキングへ


FC2ブログランキングへ


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

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

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

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

やす (Krtyski)

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


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

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

おもしろい・役に立つならクリックしてください。励みになります。

人気ブログランキングへ


FC2ブログランキングへ


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

リンク
月別アーカイブ
Sitemap

全ての記事を表示する

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

この人とブロともになる

QRコード
QR