〜繰り返しについて〜


■関連コマンドと書式

【パターン1】 繰り返し

   繰り返し
          〈コマンド群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】 繰り返し:回数

   繰り返し 〈変数名〉=〈初期値〉,〈最終値〉,〈増減値〉


■機能

■引数

【注意】【パターン1】と同様に、繰り返し範囲を強制的に終了させるときは繰り返し中止コマンドを使用する。


テクニック2【繰り返しを使って日付をつける(カレンダーや行事予定表等で使用)】

サンプルプログラム(抜粋)

(注;サンプルプログラムのなかで、一連の処理手順にあまり関係のないものは省いています。)

【リスト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】と同様に、繰り返し範囲を強制的に終了させるときは繰り返し中止コマンドを使用する。


テクニック3【繰り返しコマンドの入れ子の利用例】

サンプルプログラム3(抜粋)

(注;サンプルプログラムのなかで、一連の処理手順にあまり関係のないものは省いています。)

【リスト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

    **************************************
    **********[]=&G0の選択解除**********
    **************************************

    選択解除 1

    分岐(&データ=3) 指定生徒データ用2

8行目     繰り返し終了
9行目   **************************************
  **********[組]=&C0の選択解除**********
  **************************************

  選択解除 *

  名札 指定生徒データ用2
10行目   繰り返し終了
11行目 名札     処理終了2
12行目 繰り返し終了

【解説の前に...】

【リスト1】の解説をすると話が長くなりますので、それを簡略化した【リスト2】をご覧ください。

【リスト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中のメニューコマンドによって、画面には

             定期テスト 偏差値レーダー印刷 システム

          ◇◇◇ 対象データを選択して下さい。 ◇◇◇

           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コーナー』をここに開設致しました。
どうぞご利用下さいませ。


目次に戻る



ホームページに戻る