■関連コマンドと書式
【パターン1】 繰り返し
繰り返し
〈コマンド群1〉
・
・
・
条件(〈条件式〉) 繰り返し中止
〈コマンド群2〉
・
・
・
繰り返し終了
〈コマンド群1〉を実行後、 条件(〈条件式〉)を満たさなければ〈コマンド群2〉を実行した後、
再び〈コマンド群1〉を実行する。
条件を満たした時点で繰り返しを中止し、繰り返し終了コマンドの次の行以降の制御に移る。
すなわち繰り返しのループを抜け出すことになる。
■引数
〈コマンド群〉;繰り返し実行させたい一括処理コマンドを記述する。複数のコマンドを実行できる。
【注意】繰り返し中止コマンドは繰り返し範囲内で指定する。また、このコマンド単独で使用することはなく、
条件コマンドなどと一緒に使用する。
テクニック1は非常によく使われる方法であると思います。数学の公式を覚えるような感覚でマスターしましょう!!
(注;サンプルプログラムのなかで、一連の処理手順にあまり関係のないものは省いています。)
【リスト1】
1行目 | 繰り返し |
2行目 | メニュー &メニュー2,初期項目=&メニュー2,画面消去=しない,文字選択=する\
,{1,1, 1,"1:祝・祭日の編集”,白,下線}\ ,{2,1,22,"2:学校行事の編集”,白,下線}\ ,{3,1,43,"3:再編集後の印刷”,白,下線}\ ,{4,1,64,"4:処理を終了する”,白,下線} |
3行目 | ケース開始 |
4行目 | ケース (&メニュー2=1) |
5行目 | ・・・・・省略・・・・・ |
6行目 | 画面消去 (1,1)-(21,80) |
7行目 | ケース (&メニュー2=2) |
8行目 | ・・・・・省略・・・・・ |
9行目 | 画面消去 (1,1)-(21,80) |
10行目 | ケース (&メニュー2=3) |
11行目 | ・・・・・省略・・・・・ |
12行目 | 画面消去 (1,1)-(21,80) |
13行目 | ケース (&メニュー2=4) |
14行目 | 繰り返し中止 |
15行目 | ケース終了 |
16行目 | 繰り返し終了 |
【解説】
1行目;繰り返しから繰り返し終了までの処理、すなわち2行目から15行目までの範囲の処理を繰り返し行って
いきます。
2行目;メニューコマンドによって、画面には
1:祝・祭日の編集 2:学校行事の編集 3:再編集後の印刷 4:処理を終了する
と表示されています。"画面消去=しない"というのは、1〜4の数字を選択しキー入力した後も、画面を
そのまま残すということです。また、”文字選択=する”というのは、矢印キーで番号を選択する以外に、
1〜4の番号をキー入力しても選択できるということです。変数&メニュー2にはここで選択した1〜4の
どれかの数が代入されます。
3行目;ケースコマンドと15行目のケース終了コマンドで囲まれた範囲内で、変数&メニュー2に代入された数に応じて
以下で説明する処理を行います。
4行目;変数&メニュー2に1が代入されているときに4行目〜6行目までの処理を行い、
〜
6行目;再び2行目の画面表示をします。
7行目;変数&メニュー2に2が代入されているときに7行目〜9行目までの処理を行い、
〜
9行目;再び2行目の画面表示をします。
10行目;変数&メニュー2に3が代入されているときに10行目〜12行目までの処理を行い、
〜
12行目;再び2行目の画面表示をします。
13行目;変数&メニュー2に4が代入されているときに13行目〜14行目までの処理を行います。
14行目;繰り返しを中止し、16行目以降の制御に移ります。
15行目;変数&メニュー2に1〜4のどれかの番号が代入され、上述のそれぞれの処理を終える毎に16行目へ移行します。
16行目;1行目に戻ります。
【パターン2】 繰り返し:回数
繰り返し 〈変数名〉=〈初期値〉,〈最終値〉,〈増減値〉
〈コマンド群〉
・
・
・
繰り返し終了
■機能
繰り返しコマンドと繰り返し終了コマンドで囲まれた〈コマンド群〉を指定した回数だけ繰り返し処理を行う。
指定回数を実行後は繰り返し終了コマンドの次の行以降の制御に移る。
■引数
〈変数名〉 ;増減した値を代入する変数名を指定する。数値型か整数型に限る。
〈初期値〉 ;繰り返しを開始するときの数値を定数か変数で指定する。
〈最終値〉 ;繰り返しを終了させるための数値を定数か変数で指定する。
〈増減値〉 ;繰り返す毎に加算(or減算)する数を指定する。
省略すると 初期値≦最終値のとき1、初期値>最終値のとき−1となる。
【注意】【パターン1】と同様に、繰り返し範囲を強制的に終了させるときは繰り返し中止コマンドを使用する。
(注;サンプルプログラムのなかで、一連の処理手順にあまり関係のないものは省いています。)
【リスト2】
1行目 | 繰り返し &行=1,31 |
2行目 | 行追加 [日2]=&行,[日短]=&行,[日長]=&行 |
3行目 | 繰り返し終了 |
4行目 | 位置指定 行番号=31 |
5行目 | 行訂正 [日2]="",[日短]="" |
6行目 | &初期値=#日(#月末(#文字列(&年度+1)+"-2-1"))+1 |
7行目 |
繰り返し &行=&初期値,30 |
8行目 |
位置指定 行番号=&行 |
9行目 |
行訂正 [日2]="" |
10行目 |
繰り返し終了 |
【解説】
1行目;2行目の処理を変数&行で指定した1〜31までの31回を繰り返し行います。(&行=1,31,1でも良い。)
2行目;[日2](2月の日数)、[日短](30日で終わる月の数),[日長](31日で終わる月の日数)
のそれぞれの項目に、とりあえず1から31までのデータを追加してきます。
3行目;31回繰り返した時点で4行目の制御へ移行します。
4行目;31の数値が代入されているレコードの位置へ移動し、処理対象に指定します。
すなわち[日2]=31,[日短]=31,[日長]=31となっているところを処理対象行に指定します。
5行目;[日2]と[日短]のデータを未定義にします。行訂正 [日2]=""(空文字列)は行訂正
[日2]=#未定義でも可能。
結果このレコードは[日2]=未定義(データなし),[日短]=未定義(データなし),[日長]=31となりました。
6行目;まず整数である変数&年度に1を加えてから文字列に変換し、-2-1という文字を連結します。
例えば&年度に1997が代入されているときには結果として1998-2-1の日付を表す文字列になっています。
関数#月末で1998-2-1の日付の月末1998-2-28を得ます。今度は関数#日で1998-2-28の日28を数値で得ます。
最後に数値28に1を加えます。結果、変数&初期値には29が代入されました。
7行目;(&初期値)〜30までの2回(また、閏年は1回)だけ8、9行目の処理を行います。
〜
9行目;この結果、[日2]は1〜28(or29),[日短]=1〜30,[日長]=1〜31のデータが追加されたことになります。
10行目;指定回数だけ繰り返し処理を行い、10行目以降の制御へと移行します。
【パターン3】 繰り返し:条件
繰り返し (〈条件式〉)
〈コマンド群〉
・
・
・
繰り返し終了
■機能
条件を満たしているときに限り繰り返しコマンドと繰り返し終了コマンドで囲まれた〈コマンド群〉の処理を
繰り返して行う。条件が満たされていないときは、繰り返し終了コマンドの次の行以降の制御に移る。
【注意】【パターン1】と同様に、繰り返し範囲を強制的に終了させるときは繰り返し中止コマンドを使用する。
(注;サンプルプログラムのなかで、一連の処理手順にあまり関係のないものは省いています。)
【リスト1】
1行目 | 繰り返し |
2行目 | 選択解除 *
メニュー &データ,初期項目=1,文字選択=する¥ ,{0,5,19," 定期テスト 偏差値レーダー印刷 システム ",黄}¥ ,{0,7,20,"◇◇◇ 対象データを選択して下さい。 ◇◇◇",水}¥ ,{1,9,20,"1:全クラスのデータ",白},{-1, 9,42,"・・・for 学年",緑}\ ,{2,11,20,"2:指定クラスのデータ",白},{-1,11,42,"・・・for 学級",緑}\ ,{3,13,20,"3:指定生徒のデータ",白},{-1,13,42,"・・・for 個人面談用",緑}\ ,{4,15,20,"4:終了",白}\ ,{0,17,15,"矢印キーまたは番号を選んでRETキーを押して下さい。”,緑,点滅} |
3行目 | ケース開始
ケース (&データ=1) 項目集計 [組] 代入 &CMIN=&最小値,&CMAX=&最大値 ケース (&データ=2) 手続き実行 グラフィック画面 画面表示 (6, 15)-(6, 60),”中止するときはESCキーを押して下さい。”,赤 キー入力 (10, 15)-(10,60),モード=全角,終了状態=&確認,&CMIN 代入 &CMAX=&CMIN 画面表示 (16,15)-(16,60),"この選択でよろしいですか?(OK:ENT NO:ESC)”,黄 確認 ,&確認 分岐(&確認=0) 処理終了2 ケース (&データ=3) 手続き実行 グラフィック画面 キー入力 (10, 15)-(10,60),モード=全角,終了状態=&確認,&CMIN 代入 &CMAX=&CMIN キー入力 (14, 15)-(14,15),モード=全角,終了状態=&確認,&G0 代入 &BANGO=#CAT(#全角(#STR(&G0)),"番を選択しました。") 画面表示 (16,15)-(16,60),"この選択でよろしいですか?(OK:ENT NO:ESC)”,黄 確認 ,&確認 分岐(&確認=0) 処理終了2 ケース (&データ=4) 繰り返し中止 ケース終了 |
4行目 | 繰り返し &C0=&CMIN,&CMAX,1 |
5行目 | 選択
[組]=&C0
分岐(&データ=3) 指定生徒データ用1 項目集計 [] |
6行目 | 繰り返し &G0=1,&最大値,1 |
7行目 | 名札 指定生徒データ用1
選択 []=&G0 グラフ定義 "レーダ",主グラフ=標準レーダ,構図={データ転置=する}\ ,X軸={格子線=する},Y軸={名称=[生徒名]\ ,単位名称="",軸線=する,格子線=する,目盛線=する\ ,最小目盛値=20,最大目盛値=80,目盛表示間隔=10}\ ,仕上げ={データ値表示=しない},凡例={凡例=する}\ ,表題={表題=&HYOUDAI,背景色=影付,飾り=斜体} 代入 &GRA= "レーダ" グラフ作成 "レーダ",描画=しない,印刷=しない,倍率=3,グラフファイル=&GRA\ ,{[現文偏]主Y,[古典偏]主Y,[社選偏]主Y,[公民偏]主Y,[数1偏]主Y\ ,[数2偏]主Y,[理選偏]主Y,[化学偏]主Y,[英1偏]主Y,[英2偏]主Y\ ,[試験名]X軸項目名} * 帳票印刷 "偏差.FRM",部数=1,ページ番号=1 ************************************** 選択解除 1 分岐(&データ=3) 指定生徒データ用2 |
8行目 | 繰り返し終了 |
9行目 | ************************************** **********[組]=&C0の選択解除********** ************************************** 選択解除 * |
名札 指定生徒データ用2 | |
10行目 | 繰り返し終了 |
11行目 | 名札 処理終了2 |
12行目 | 繰り返し終了 |
【解説の前に...】
【リスト1】の解説をすると話が長くなりますので、それを簡略化した【リスト2】をご覧ください。
1行目 | 繰り返し |
2行目 | 処理1 |
3行目 | 繰り返し &C0=&CMIN,&CMAX,1 |
4行目 | 処理2 |
5行目 | 繰り返し &G0=1,&最大値,1 |
6行目 | 処理3 |
7行目 | 繰り返し終了 |
8行目 | 繰り返し終了 |
9行目 | 繰り返し終了 |
5〜7行目の繰り返しを3〜8行目の繰り返しが包含し、それ全体を1〜9行目の繰り返しが包含しています。
このようなプログラム処理を”入れ子(ネスト)”といいます。入れ子鍋(最近はあまり見られませんが...)のように
鍋の中にさらに小さい鍋が入っている様子と似ているところからこの表現が使われるようになりました。
入れ子のテクニックは繰り返しコマンド以外にも、関数の引数でもよく使用します。
それでは【リスト2】を中心にして【リスト1】の解説をいたします。
【解説】ここでは処理1の最初のメニューコマンドでを選択したときの解説を致します。
1行目;処理1中のメニューコマンドによって、画面には
定期テスト 偏差値レーダー印刷 システム
◇◇◇ 対象データを選択して下さい。 ◇◇◇
1:全クラスのデータ ・・・for 学年
2:指定クラスのデータ ・・・for 学級
3:指定生徒のデータ ・・・for 個人面談用
4:終了
矢印キーまたは番号を選んでRETキーを押して下さい。 と表示されています。
2行目;1行目で選んだ対象データに対して処理1を1回だけ行います。
3行目;次に処理1の中で[組]の項目集計をしていますので、”組(&C0)”が最小値(&CMIN)のときを選択します。
4行目;処理2を1回だけ行います。例えば1組から6組まで処理したい場合は、まず1組の生徒の処理を行います。
5行目;処理2の中で生徒の[No.]の項目集計をしていますので、5行目、7行目の繰り返しの範囲内で、
1組の生徒の”番号(&G0)が1番から最大値(&最大値)番まで1人ずつ選択し、(→6行目)
6行目;選択した生徒1人づつについて処理3を行います。
7行目;1組の生徒の処理が終了したら8行目の処理に移行します。。
8行目;この繰り返し終了 と対になっている繰り返しである3行目に移行し、組に”1”を加えて次の組(2組)を選択し、
1組のときと同様に4〜6行目の処理を行います。
9行目;”組(&C0)”が最小値(&CMIN)から最大値(&CMAX)まですべての組の処理が終了したら、
この繰り返し終了と対になっている1行目の繰り返しに移行します。すなわちメニュー画面へと落ち着きます。
4.終了を選択すると、この繰り返しのループを抜け出すことができます。
【注意】 繰り返しの入れ子を色分けしたのには意味があります。入れ子のテクニックを使うときには、
外側の繰り返し範囲の中に、内側の繰り返し範囲が包含されていなければなりません。
これに違反すると一括処理エラーのために処理が実行できなくなってしまいます。
すなわち、【リスト2】のように、繰り返しコマンドと繰り返し終了コマンドを必ず対にすることと、
対にした繰り返し範囲は必ず”入れ子にする”ということに留意して下さい。
【最後に】
1組が40人位として、1組から6組までだと240人。もし会話処理でこの操作を実行すると...
多分途中でいやになってしまうでしょう。何しろ印刷が終了するまでずっと付きっきりになってしまうのですから。また、ここでは解説していませんが、この一括処理では時間制約がある場合のために、指定したクラス(例えば1組だけとか)や指定した生徒(1組の1番の生徒だけ)といった処理も行えるようにしています。これらは変数をうまく使うことで一括処理に簡単に組込むことができます。
一括処理を実行すれば、パソコンにすべてお任せ。ほったらかしの全自動!!
その素晴らしさに感動するとともに、自作の一括処理に愛着さえ感じてしまいます。(笑)
繰り返し処理の入れ子というテクニックを色々と工夫して素晴らしい一括処理をつくりましょう!!
桐の初心者の皆様を対象に『一括処理のQ&Aコーナー』をここに開設致しました。
どうぞご利用下さいませ。