プログラムライブラリ
誤字脱字・記載ミスや分かりにくい表現は随時追記・修正します
2015/01/23
2015/08/05 記述修正
2016/12/24 追記修正
2017/11/06 修正
2020/11/28 追記
入力ボックス 2.1G - グラフ関数電卓専用
<fx-9860G / SD / Slim, fx-9860GII / SD, fx-9860GIII, fx-9750GIII, fx-7400GIII >
< fx-CG20, fx-CG50 >
INPI、INP、IN 2.1G - 汎用サブルーチン
※ g1mファイルのダウンロード・リンクを追加 [2015/02/28]※ g3mファイルのダウンロード・リンクを追加 [2016/04/17]著作権者やす (Krtyski)
[当ブログ管理人]
対応機種fx-9750GIIIfx-9860Gシリーズ(G, GII, GIII) ※ モノクロ液晶モデル用は、
fx-FC10 Pro でも動作すると思われます
fx-CGシリーズ
fx-7400GIII (専用プログラムを追加)
[2020/11/28]Casio fx-5800P 専用は
こちらプログラムの説明INPI /
INP /
IN 2.1G (グラフ関数電卓 モノクロ液晶モデル、カラー液晶モデル用) は、fx-9860G, fx-9860GII, fx-9860GIII, fx-9750GIII, fx-740GIII や fx-CG20、fx-CG50 のCasio Basic プログラミングで、好みの位置に好みの桁数で数値を入力させる機能を実装する、汎用サブルーチンです。
画面構成を崩さずに数値を入力させるプログラムを簡単に作れるので、換算プログラムなどに最適です。
Casio Basic の入力命令
? は、入力行を選べず、入力結果は改行されて右端に表示され、入力するたびに画面がスクロールするので、入力位置と入力結果の表示位置を選べません。もう一つの入力コマンド
Getkey はキー1つが押されたことを検出するものなので、そのままでは複数桁の入力や編集に使えません。
そこで画面設計をしたプログラムで使うため、Windows などの Edit Box に近い入力機能をCasio Basic に提供するのが入力ボックスです。
以下の3種類の入力ボックスを用意しました。
1. INPI 2.1G0以上の整数入力のみに対応。0以上の整数入力のみを行わせたいプログラムで使うことを想定しており、負数や小数入力のエラーチェックが不要になる。
2. INP 2.1G0以上の整数/小数入力のみに対応。0と正の小数のみの入力を行わせたいプログラムで使うことを想定し、負数入力のエラーチェックが不要になる。
3. IN 2.1G正負小数/整数の入力に対応、最も汎用性のある入力ボックス。
INPI、INP、IN 2.1G の詳しい説明は、
Casio Basic入門37 を参照。
入力ボックスの概要Basic コマンドの使い方は、
[コマンド] [設定1],[設定2],[設定3], ...といった使い方になります。
一方、入力ボックスはサブルーチンです。サブルーチンを呼びだす時に色々な設定を一緒に指定することができません。そこで、
[入力ボックスの設定]
Prog "入力ボックス"
[結果の受け取り]といった書式になります。
入力ボックスには、使い勝手を考えて複数のバージョンがあります。
入力する数値の種類 | | キーリピート抑制が バージョン(Ver2.1G) | プログラム名 |
0以上の整数 | | INPI Ver2.1G | INPI |
0以上の小数と政数 | | INP Ver2.1G | INP |
正負の小数と整数 | | IN Ver2.1G | IN |
入力する数値の種類により使い分けると、入力制限にうまく利用できます。
プログラムの使い方メインルーチンから以下の書式で呼び出します。
□→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つの変数以外に、
C、I、F (F は、INP と IN の場合のみ)、行列を用いています。これらの変数は、入力ボックスを呼び出すたびに格納されている数値が変更されます。メインルーチンでこれらと同じ変数を使う場合は、入力ボックスを呼び出すたびに変更されても良い変数として使ってください。特に行列は、入力ボックス内で 領域確保を行い、メインルーチンに戻る前に領域解放を行いますので、それを念頭に置いて使ってください。
使用例呼び出しルーチンのプログラム例を掲載します。
・ 予約変数は
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 "IN":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 を含む
※ fx-7400GIII用プログラムファイル一式 (ZIPファイル) [2020/11/28 追記]
INPI.g1m, INP.g1m, IN.g1m, INTEST.g1m を含む
- 実装されていない行列機能の代わりにリストを使用
- g1mファイルが動作する他のグラフ関数電卓からfx-7400GIIへ 3Pinケーブルを使って転送する
プログラム - INPI Ver 2.1G: プログラム名 INPI
※ プログラムファイル INPI.g1m (fx-9860GII用)のダウンロード [2015/02/28 追加]
※ プログラムファイル INPI.g3m (fx-CG20 / fx-CG50用)のダウンロード [2016/04/17 追記]
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 追記]
注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 追記]
注1) 下から10行目の Locate X+C+I-1,Y," " の " " はスペース1個
注2) 下から6行目の Locate 6,4," " の " " はスペース11個
注3) 下から4行目の Locate 15,4," " の " " はスペース2個
応援クリックをお願いします。励みになるので...
- 関連記事
-
テーマ : プログラム関数電卓
ジャンル : コンピュータ
藤堂様
ご無沙汰しております。
近況のご連絡ありがとうございます。
3DSのプチコン3については、当プログでコメントを頂いた方からご紹介頂いて初めて知りました。Casio Basic入門が、プチコンのBasic学習に多少なりとも参考になると聞きました。
これもCasio Basic入門の原動力の1つになっております。
藤堂様とのコミュニケーションも私には良い刺激になっております。
どうかマイペースでご自愛ください。
管理人様へ
1月に入り体調不良が続いていることと、電子文具として3DSの活用法など、取り組んでいてというか、硬直が激しく、お絵かきソフトでこわばりを紛らわせているところです。
暖かくなれば、こわばりもおちついてくるため、プログラム関数電卓のプチコンと含め、電子文具活用の研究を再開していきます。
sentaro様
そう言えばfx-5800 にはClrMat がありました。プログラムで記述可能です。
fx-5800P のCasio Basicコマンドリファレンスの行列の紹介で書いていなかったので、忘れていました(^^;
後で追加しておくことにします。
管理人様、こんにちは!
>特殊文字はコードになってしまうのですね。テキストに出来るのは便利です。
はい、特殊文字はアンダーバーで挟まれたコードに変換される感じですね。
>ところで、空白がアンダーバーになっているのは、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というのはどこから見てもマイルストーン的なプログラム電卓ですね(^^)
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 は色々と制限があるものの(コメントが書けないなど)一応の完成形のようです。
いつも貴重な情報を大変ありがとうございます。
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 まで見直しとチェックをしましたが、結構間違いがありました(^^;)
ソースコード以外にもとんでもない説明の間違いがあったりして、これでは初級者を混乱させるダケだと冷や汗ものです。
ありがとうございます。
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
管理人様、こんにちは!
入力ボックスが正負少数対応になってそして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