プログラムライブラリ - 入力ボックス 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]



対応機種

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-9860GIIに移植と着実に守備範囲が広がっていますね(^^)

言語仕様的に当たり前と言えば当たり前ですが、fx-CG10では何も変更無くそのまま動作することが確認できました。

世代的に古いCFX-9850GC PLUSだと空行がNGなのとThenとElseの後に何かコマンドが必要なのでそこを修正して、EngOffとClrMatコマンドが無いのでそれを削除すれば問題なく動きます。
速度的にはfx-5800Pよりも少し速いだけなので体感速度はfx-9860GIIよりはfx-5800Pに近いですね。

fx-CG10ではテキストに変換できるので正負少数対応のINを貼り付けておきます(^^ゞ


'ProgramMode:RUN
EngOff
0->Z
{1,79}->Dim Mat Z
1->Mat Z[1,72]
2->Mat Z[1,62]
3->Mat Z[1,52]
4->Mat Z[1,73]
5->Mat Z[1,63]
6->Mat Z[1,53]
7->Mat Z[1,74]
8->Mat Z[1,64]
9->Mat Z[1,54]
If E=2:Then
Locate 11,7,"<EXE>:ENTER"
Else If E=1:Then
Locate 20,7,"_#E69E_E"
IfEnd:IfEnd
E->Mat Z[1,1]
For 1->I To D
Locate X+I-1,Y,">"
Next
0->C:0->F:1->E

Do

While Getkey
WhileEnd

Do
Getkey->K
LpWhile K=0
Mat Z[1,K]->I

If (I>=1 And I<=9) Or K=71
Then
If C<D:Then
If F:Then
Z+EI/10^(F)->Z
Isz F
Else
10Z+EI->Z
IfEnd
Locate X+C,Y,I
Isz C
IfEnd

Else If K=61
Then
If F=0:Then
Locate X+C,Y,"."
Isz C:Isz F
IfEnd

Else If K=44
Then
If C:Then
If F:Then
F-1->F
F=>Int (10^(F-1)Z)/10^(F-1)->Z
Else
Int (Z/10)->Z
IfEnd
C-1->C
C=0=>1->E
Locate X+C,Y,">"
IfEnd

Else If K=32 Or K=41
Then
If C=0:Then
Locate X,Y,"_(-)_"
(-)1->E:Isz C
IfEnd
IfEnd:IfEnd
IfEnd:IfEnd

LpWhile K<>31

For 1->I To D-C
Locate X+C+I-1,Y," "
Next
If E=2:Then
Locate 11,7," "
Else If E=1:Then
Locate 20,7," "
IfEnd:IfEnd
ClrMat
Return

List版

CFX-9850GC PLUSはClrMatコマンドが無くClrListしかないのでList版にしてみました。
あと、”▶E”は特殊文字入力できないので”>E”で代用です。
CFX-9850GC PLUSを含めたfx-9860GII全シリーズで動作するバージョンです。

CFX-9850GC PLUSは同じCasioBasicとはいえ発展途上版という印象ありますね。
そういう意味でもfx-5800Pは最初から今のCasioBasic仕様だったのは大きかったですね。


'ProgramMode:RUN
0->Z
79->Dim List 1
1->List 1[72]
2->List 1[62]
3->List 1[52]
4->List 1[73]
5->List 1[63]
6->List 1[53]
7->List 1[74]
8->List 1[64]
9->List 1[54]
If E=2:Then Locate 11,7,"<EXE>:ENTER"
Else If E=1:Then Locate 20,7,">E"
IfEnd:IfEnd
E->List 1[1]
For 1->I To D
Locate X+I-1,Y,">"
Next
0->C:0->F:1->E
Do
While Getkey
WhileEnd
Do
Getkey->K
LpWhile K=0
List 1[K]->I
If (I>=1 And I<=9) Or K=71
Then If C<D:Then If F:Then Z+EI/10^(F)->Z
Isz F
Else 10Z+EI->Z
IfEnd
Locate X+C,Y,I
Isz C
IfEnd
Else If K=61
Then If F=0:Then Locate X+C,Y,"."
Isz C:Isz F
IfEnd
Else If K=44
Then If C:Then If F:Then F-1->F
F=>Int (10^(F-1)Z)/10^(F-1)->Z
Else Int (Z/10)->Z
IfEnd
C-1->C
C=0=>1->E
Locate X+C,Y,">"
IfEnd
Else If K=32 Or K=41
Then If C=0:Then Locate X,Y,"_(-)_"
(-)1->E:Isz C
IfEnd
IfEnd:IfEnd
IfEnd:IfEnd
LpWhile K<>31
For 1->I To D-C
Locate X+C+I-1,Y," "
Next
If E=2:Then Locate 11,7," "
Else If E=1:Then Locate 20,7," "
IfEnd:IfEnd
ClrList
Return

互換性チェックありがとうございます

sentaro様

fx-CG10/20との互換性チェック、ありがとうございます。

> 入力ボックスが正負少数対応になってそしてfx-9860GIIに移植と着実に守備範囲が広がっていますね(^^)
>
> 言語仕様的に当たり前と言えば当たり前ですが、fx-CG10では何も変更無くそのまま動作することが確認できました。

これらは、fx-9860GII とキーコードも同一で問題ないのですね。取説を見れば同一キーコードであることは分かりますが、実際にチェックいただいて互換性の確認ができたので、とても有りがたいことこの上ありません。

fx-5800P以降に発売されたCasio basic搭載機で互換性があることになりますね。


> 世代的に古いCFX-9850GC PLUSだと空行がNGなのとThenとElseの後に何かコマンドが必要なのでそこを修正して、EngOffとClrMatコマンドが無いのでそれを削除すれば問題なく動きます。
> 速度的にはfx-5800Pよりも少し速いだけなので体感速度はfx-9860GIIよりはfx-5800Pに近いですね。

なるほど、CFX-9850GC PLUS のあと fx-5800P でブラッシュアップされているのがよく分かります。



> fx-CG10ではテキストに変換できるので正負少数対応のINを貼り付けておきます(^^ゞ

特殊文字はコードになってしまうのですね。テキストに出来るのは便利です。

ところで、空白がアンダーバーになっているのは、sentaro様が書き換えたのでしょうか?それともテキストに落とすとアンダーバーになるのでしょうか?

テキストに落とせると、私もCasio Basic入門講座で入力ミスが減らせて良いのですが...
これまで、Casio Basic入門32 まで見直しとチェックをしましたが、結構間違いがありました(^^;)
ソースコード以外にもとんでもない説明の間違いがあったりして、これでは初級者を混乱させるダケだと冷や汗ものです。


ありがとうございます。

Re: List版

sentaro様

おお、List版、ありがとうございます。

ところで、前々から気になっていたのですが、CFX-9850GC PLUS も入手なさったのですね。CFX-9850GC はお持ちだと聞いていたのですが...

ClirMat の代わりに、{0,0}→Mat Z とするのはダメなのでしょうか?
fx-5800P でも ClrMat が無いので同様にしています。


> CFX-9850GC PLUSは同じCasioBasicとはいえ発展途上版という印象ありますね。
> そういう意味でもfx-5800Pは最初から今のCasioBasic仕様だったのは大きかったですね。

なるほど、fx-5800Pは、Casio Basic開発において、1つの大きな節目と言えそうですね。

そういえば fx-5800P で行列とリストのアクセス速度の比較をまだやったことがありません。
fx-9860GIIでは、明らかに行列の方がリストより速い結果がでています。

fx-CG10 でテキストに落としたコードを拝見した時にも思ったのですが、減算記号と負号がきちんと区別されていますね。関数電卓としてはこれらは両方同じ動作をするので、前から気になっていました。結果としてユーザーの利便性を考えてのことでしょうが、これらをきちんと区別すべきではないかと思っています。

それにしても、空行が使えないとコードの可読性が落ちますね。

そうそう、If Then Else で、ThenやElseのあとにコマンドが無いとダメと言うのはどういうことでしょうか?
コードを拝見する限り、Then や Else のあと改行するとダメと言うことのようですが...
そうだとすると、構造化プログラミングの目で見て、可読性が悪くなりますね。

fx-5800P は色々と制限があるものの(コメントが書けないなど)一応の完成形のようです。

いつも貴重な情報を大変ありがとうございます。

No title

管理人様、こんにちは!

>特殊文字はコードになってしまうのですね。テキストに出来るのは便利です。

はい、特殊文字はアンダーバーで挟まれたコードに変換される感じですね。


>ところで、空白がアンダーバーになっているのは、sentaro様が書き換えたのでしょうか?それともテキストに落とすとアンダーバーになるのでしょうか?

あ、空白は変換後もそのまま空白のままなんですが、コメント欄で投稿する時に連続する半角スペースは削除されたっぽいです(^^;


>テキストに落とせると、私もCasio Basic入門講座で入力ミスが減らせて良いのですが...
>これまで、Casio Basic入門32 まで見直しとチェックをしましたが、結構間違いがありました(^^;)
>ソースコード以外にもとんでもない説明の間違いがあったりして、これでは初級者を混乱させるダケだと冷や汗ものです。

現状CASIOの電卓でテキスト変換できる機種がfx-CG10/20とfx-FD10Proしかないですけど、
CemetechのSourceCoder 3というオンラインアプリを使うと、
http://www.cemetech.net/sc/
fx-CG10の変換規則とは若干違いますけど、fx-9860GIIのG1M形式のファイルもテキスト変換できそうです。


>ところで、前々から気になっていたのですが、CFX-9850GC PLUS も入手なさったのですね。CFX-9850GC はお持ちだと聞いていたのですが...

んと、入手したのはCFX-9850GC PLUSの方で、CFX-9850GCではなかったのですが、PLUSとは同じものと思っていたのでCFX-9850GCとだけ書いてました(^^;


>ClirMat の代わりに、{0,0}→Mat Z とするのはダメなのでしょうか?
>fx-5800P でも ClrMat が無いので同様にしています。

試してみたところ、その表記では要素数が1以上でないとダメみたいでした。


>そういえば fx-5800P で行列とリストのアクセス速度の比較をまだやったことがありません。
>fx-9860GIIでは、明らかに行列の方がリストより速い結果がでています。

CFX-9850GC PLUSではリストが若干速いみたいなのですが、fx-CG10では逆にリストがかなり遅いという感じで一貫性がありません(^^;


>fx-CG10 でテキストに落としたコードを拝見した時にも思ったのですが、減算記号と負号がきちんと区別されていますね。関数電卓としてはこれらは両方同じ動作をするので、前から気になっていました。結果としてユーザーの利便性を考えてのことでしょうが、これらをきちんと区別すべきではないかと思っています。

普通のプログラム言語ではすべて減算記号だけの世界ですけど、電卓ではきっちり区別されているのでCasioBasicでも区別されているのですよね。
区別するのに(-)表記はなかなかいい感じではないかと思っています。


>それにしても、空行が使えないとコードの可読性が落ちますね。

そうなんです。なぜか空行がダメという謎仕様です。


>そうそう、If Then Else で、ThenやElseのあとにコマンドが無いとダメと言うのはどういうことでしょうか?
>コードを拝見する限り、Then や Else のあと改行するとダメと言うことのようですが...

はい、その通りで、ThenとElseの後ですぐ改行するとNGです。
空行NG仕様がここにも波及してる感じです。


>そうだとすると、構造化プログラミングの目で見て、可読性が悪くなりますね。

はい、この当時はプログラムの可読性ということまでは考えてなかったことがわかります(^^;


>fx-5800P は色々と制限があるものの(コメントが書けないなど)一応の完成形のようです。

CFX-9850GC PLUSまでとそれ以降でBasicの仕様以外で大きく違うのがDELキーの動作でこれが今のバックスペース仕様ではなく昔のDEL仕様なので互いに使うとややこしいことこの上ないです(^^;

fx-5800PはBS仕様ということで、CasioBasicの仕様もここから進化しているのでfx-5800Pというのはどこから見てもマイルストーン的なプログラム電卓ですね(^^)

ClrMat

sentaro様

そう言えばfx-5800 にはClrMat がありました。プログラムで記述可能です。

fx-5800P のCasio Basicコマンドリファレンスの行列の紹介で書いていなかったので、忘れていました(^^;

後で追加しておくことにします。

お久しぶりです

 管理人様へ
 1月に入り体調不良が続いていることと、電子文具として3DSの活用法など、取り組んでいてというか、硬直が激しく、お絵かきソフトでこわばりを紛らわせているところです。
 暖かくなれば、こわばりもおちついてくるため、プログラム関数電卓のプチコンと含め、電子文具活用の研究を再開していきます。

マイペースが一番ですね

藤堂様

ご無沙汰しております。

近況のご連絡ありがとうございます。

3DSのプチコン3については、当プログでコメントを頂いた方からご紹介頂いて初めて知りました。Casio Basic入門が、プチコンのBasic学習に多少なりとも参考になると聞きました。

これもCasio Basic入門の原動力の1つになっております。

藤堂様とのコミュニケーションも私には良い刺激になっております。

どうかマイペースでご自愛ください。
最新記事
最新コメント
カテゴリ
C# (3)
検索フォーム
Visitors
Online Counter
現在の閲覧者数:
プロフィール

やす (Krtyski)

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


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

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

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


人気ブログランキングへ


FC2ブログランキングへ


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

リンク
月別アーカイブ
Sitemap

全ての記事を表示する

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

この人とブロともになる

QRコード
QR