(現在 過去ログ84 を表示中)

HOME HELP 新規作成 新着記事 トピック表示 ファイル一覧 検索 過去ログ

[ 最新記事及び返信フォームをトピックトップへ ]

■12582 / inTopicNo.21)  Re[8]: 繰り返し
  
□投稿者/ ONnoji -(2020/08/12(Wed) 22:55:38)
    > それで先ほど、ケース終了、end、が繰り返しに戻っていなくて、もしかして何処かに飛んでいるのかな?と思った次第でした。

    [制御文]=[構造化]コマンドを正確に理解していないのが原因で、そのような疑問が生じていると思います。

    別途、投稿しましたので詳しくはそちらを読んでください。



引用返信 [メール受信/OFF] 削除キー/
■12583 / inTopicNo.22)  Re[9]: 繰り返し
□投稿者/ ONnoji -(2020/08/13(Thu) 08:43:48)
    気になる点を…

    まず、空行(くうぎょう:空の行)を使うようにしましょう。

    格好だけの字下げ(インデント)よりも、重要だと思いますよ。

    プログラムは文書と同じなので、上から下までビッシリと文字を並べた場合には非常に読みにくいです。

    空行を適当に使うと読みやすくなります。

    空行は、{ 繰り返し,繰り返し終了,if,else,end,ケース開始,ケース,ケース終了}の前後に挿入します。
    ※なお、ケース開始の直後にはケースがくるので空行を挿入する必要はありません。

    そうすることで、制御構造とそれ以外の処理のまとまり(ブロック)が際立ってきます。

    長くなりますが、全文を以下に示します。

     ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇

     変数宣言 共通,文字列{ &いつ,&伝票NO,&借方コード,&借方科目,&借方補助コード,&借方補助科目,&貸方コード,&貸方科目,&貸方補助コード,&貸方補助科目}
     変数宣言 共通,数値{&借方本体金額, &貸方本体金額,&差額金額,&残額}

    ┌繰り返し

    │  表 ”01022-3資金繰仕訳.tbx”
    │  絞り込み  [借方貸方差額]{=0}   /*借方、貸方同じ額のものを選んで*/
    │  **絞り込み  [借方貸方差額]{=0}   /*借方から貸方引いて*/

    │ ┌if (#空ファイル=0)    /*それが空で無いなら*/
    │ │
    │ │  **if (#空ファイル=0)    /*それが0なら*/
    │ │  表 ”01022-4資金繰仕訳.tbx”   /*この表に読み込み*/
    │ │  読み込み条件登録 表,条件名="","01022-3資金繰仕訳.tbx",ファイル名変更=しない,編集表=する,*
    │ │  読み込み 表,条件名=""
    │ │  編集表 ”01022-3資金繰仕訳.tbx”
    │ │  行削除 *             /*読み終えたら要らないのでその分は削除*/
    │ │  絞り込み解除  1     /*最初の状態へ*/
    │ │  表形式編集
    │ │
    │ ├else if (#空ファイル=1) /*差額0が無い空ファイル状態なら*/
    │ │
    │ │  絞り込み解除  1       /*解除で最初の状態へ*/
    │ │  代入 &いつ=[日付変換]
    │ │  代入 &伝票NO=[伝票No.]
    │ │  代入 &差額金額=[借方貸方差額]
    │ │  検索条件登録 "日付伝票",{[日付変換]{&いつ},[伝票No.]{&伝票NO}}
    │ │  絞り込み 条件名="日付伝票"
    │ │  絞り込み 行数=1
    │ │
    │ │ ┌ケース開始
    │ │ ├─ケース (#空ファイル=0)   /*真の空ファイルになったらここで終了*/
    │ │ │
    ←─┼─┼───繰り返し中止
    │ │ │
    │ │ ├─ケース (&差額金額<0)           /*貸方の金額が大きい時は*/
    │ │ │
    │ │ │   代入 &貸方コード=[貸方勘定科目コード]
    │ │ │   代入 &貸方科目=[貸方勘定科目名]
    │ │ │   代入 &貸方補助コード=[貸方補助科目コード]
    │ │ │   代入 &貸方補助科目=[貸方補助科目名]
    │ │ │   代入 &貸方本体金額=[貸方本体金額]
    │ │ │   絞り込み 補集合
    │ │ │   検索 [借方本体金額]{ <>0,<>#U }
    │ │ │   絞り込み 行数=1             /*借方の1行を呼び出し*/
    │ │ │   代入 &借方本体金額=[借方本体金額]
    │ │ │   代入 &残額=&貸方本体金額×-1-&借方本体金額
    │ │ │   置換 [貸方勘定科目コード]=&貸方コード   /*以下、空白になっている行に貸方の同じ値を複写*/
    │ │ │   置換 [貸方勘定科目名]=&貸方科目
    │ │ │   置換 [貸方補助科目コード]=&貸方補助コード
    │ │ │   置換 [貸方補助科目名]=&貸方補助科目
    │ │ │   置換 [貸方本体金額]=&借方本体金額     /*貸方が大きかったので借方の額に合わせる*/
    │ │ │   絞り込み解除  1
    │ │ │   絞り込み解除  1
    │ │ │   置換 [貸方本体金額]=&残額         /*最初の大きかった額から借方分を除いた残額に*/
    │ │ │
    │ │ ├─ケース (&差額金額>=0)           /*以下は貸方と逆のパターン*/
    │ │ │
    │ │ │   代入 &借方コード=[借方勘定科目コード]
    │ │ │   代入 &借方科目=[借方勘定科目名]
    │ │ │   代入 &借方補助コード=[借方補助科目コード]
    │ │ │   代入 &借方補助科目=[借方補助科目名]
    │ │ │   代入 &借方本体金額=[借方本体金額]
    │ │ │   絞り込み 補集合
    │ │ │   検索 [貸方本体金額]{ <>0,<>#U }
    │ │ │   絞り込み 行数=1
    │ │ │   代入 &貸方本体金額=[貸方本体金額]
    │ │ │   代入 &残額=&借方本体金額-&貸方本体金額
    │ │ │   置換 [借方勘定科目コード]=&借方コード
    │ │ │   置換 [借方勘定科目名]=&借方科目
    │ │ │   置換 [借方補助科目コード]=&借方補助コード
    │ │ │   置換 [借方補助科目名]=&借方補助科目
    │ │ │   置換 [借方本体金額]=&貸方本体金額
    │ │ │   絞り込み解除  1
    │ │ │   絞り込み解除  1
    │ │ │   置換 [借方本体金額]=&残額
    │ │ │
    │ │ ├─ケース (#空ファイル=1)         /*貸借が0のものは移動させてるので空になるまで繰り返し*/
    │ │ │
    │ │ └ケース終了
    │ │
    │ └end

    └繰り返し終了

     表


引用返信 [メール受信/OFF] 削除キー/
■12584 / inTopicNo.23)  Re[10]: 繰り返し
□投稿者/ ONnoji -(2020/08/13(Thu) 08:55:15)
    2020/08/13(Thu) 11:39:48 編集(投稿者)
    2020/08/13(Thu) 09:29:05 編集(投稿者)

    空行を使用していれば次のようになります。

    > ヘルプも見ましたけど、ケースはケース終了までとしか書いて無いんです
    > 終了したら何処へ行くのかは書かれていませんね

    ヘルプには次のように何処に行くか書いてあります。

    ・[ケース]コマンドの<条件式>が真であれば、つぎの[ケース]コマンドまたは[ケース終了]コマンドまでのコマンドを実行します。
    ・[ケース]コマンドの<条件式>が偽であれば、つぎの[ケース]コマンドまたは[ケース終了]コマンドに移ります。

    これを読めば、

    [ケース終了]コマンドへ進み、次の行以降に記述されている有効なコマンドが実行されます。

    と理解できるハズです。

    提示された内容からすると、

    │ │ └ケース終了  (1)※[ケース終了]コマンドへ進み
    │ │     ←───(2)ここへ進みます! ただし空行なので注釈同様に何もしません
    │ └end    ←───(3)ここへ進みます! ※[end]コマンドの次の行へ進みます
    │       ←───(4)ここへ進みます! ただし空行なので注釈同様に何もしません
    └繰り返し終了 ←───(5)ここへ進みます! ※無限ループなので[繰り返し]コマンドの次の行へ進みます

     表

    ですね。

    空行があれば、上から順に実行していくという「順次」という流れで、動作の理解が容易になります。


    p.s.

    空行を用いないことに違和感を感じない人は、桐の履歴しか見たことがない人かもしれません。

    桐の履歴には、履歴開始 ... 履歴終了 の範囲に空行がありません。

    これをスタンダード(標準)だと思ったならばとんでもない誤りです。

    なぜならば、桐の履歴は「人間が内容を読む事を考慮していない」からです。

    桐が実行できればよいのですから、空行も注釈行も不要なわけです。

    つまり、空行も注釈行も無いプログラムは、人間が読むプログラムとしては、ちょっとネということです。

    さらにp.s.

    これは潜在意識の問題かもしれませんが、空行があるとプログラムが遅くなると思っている人もいますね。

    確かに、大昔の、それもCP/M や MS-DOS2.11 の頃にはハードウェアが鈍足だったので体感出来たかもしれません。

    しかし、Windowsの時代には、高速なハードウェアが使われているので、もはや空行があるから遅くなるなんてことはあり得ません。

    遅いと感じる場合には、必ず別の原因が存在しています。


引用返信 [メール受信/OFF] 削除キー/
■12585 / inTopicNo.24)  Re[2]: 繰り返し
□投稿者/ ONnoji -(2020/08/13(Thu) 10:50:15)
    2020/08/14(Fri) 17:57:40 編集(投稿者)
    2020/08/13(Thu) 18:50:19 編集(投稿者)
    2020/08/13(Thu) 11:52:05 編集(投稿者)

    > しかしながら、DOS桐からの利用者は、世の中で言うところの「構造化プログラミング」を知らない人が多いです。
    > 今回はそこがネックであると断言しますよ。

    まず、用語を整理します。

    世の中で言うところの「構造化プログラミング」ですが、非常に広範囲な概念になっています。

    なので、「論理の構造化」手法に限定して話を進めます。

    なお、書籍でもwebでも、「論理の構造化」は疑似コード(または高級言語)、またはフローチャートを用いて解説していますが、

    それでは理解できないと思いますので、桐言語のコマンドで解説します。

    まず基本中の基本は、順次です。※高田純次ではありません。

    ■順次(SEQUENCE:シーケンス)

     これは上の行から順番に実行してくということです。

     つまり、横書きの本を読んでいくのと同じす。

     誰も、途中を飛ばして読んだり、下から読んだりしないでしょ。それと同じです。

     この時、空行も実行します。ただし、[注釈 *]コマンドと同じで何事も起きないだけです。

     これが基本ですが、順次だけでは、条件ごとの処理や、繰り返し処理ができませんね。

     そこで、

      ・選択  (IFTHENELSE:イフゼンエルス) ※ケース(CASE:ケース)は選択のバリエーションです
      ・繰り返し(DOWHILE  :ドゥーホワイル)

     があります。

    ■選択(IFTHENELSE:イフゼンエルス)

     桐言語の場合には、if (条件式) ... else ... end になります。


     if (条件式)
       ↑
       :
      条件式が真の場合にこの範囲を順次実行します:A
       :
       ↓
     else
       ↑
       :
      条件式が偽の場合にこの範囲を順次実行します:B
       :
       ↓
     end
     AまたはBの範囲を実行した後は end の次の行から順次実行します。

     ※if (条件式) ... end のように else節 がない場合には、
      条件式が真の場合には、Aの範囲を順次実行します
      条件式が偽の場合には、Aの範囲を順次実行しません。
      その後は end の次の行から順次実行します。

     ※if (条件式) ... else if (条件式) ... end は、見かけ上のネスト(入れ子)が浅くなるだけで、if (条件式) ... else ... end のネスト(入れ子)と同じです。

     ※ケース(CASE:ケース)は選択のバリエーションです。見かけ上のネスト(入れ子)が浅くなるだけで、if (条件式) ... else ... end と同じです。

    ■繰り返し(DOWHILE:ドゥーホワイル)

     桐言語の場合には、繰り返し (条件式) ... 繰り返し終了 になります。

     繰り返し (条件式) は、if (条件式) ... end を何度も繰り返すことと同じです。

     つまり、

      ┌繰り返し ( .not #eof )
      │  ↑
      │  :
      │ この範囲を順次実行します
      │  :
      │  ↓
      │ ジャンプ 行番号 = 次行
      └繰り返し終了

      ↓次のように if ... end を繰り返すのと等価です。

      ┌if ( .not #eof )      ┌if ( .not #eof )      ┌if ( .not #eof )
      │              │              │
      │              │              │
      │            → │            → │
      │              │              │
      │              │              │
      │ジャンプ 行番号 = 次行   │ジャンプ 行番号 = 次行   │ジャンプ 行番号 = 次行
      └end             └end             └end

     前判断型の 繰り返し (条件式) ... 繰り返し終了 で重要なポイントは、

     繰り返し (条件式)の条件式が偽の場合には、繰り返し (条件式) ... 繰り返し終了 の範囲を実行しないということです。

     そのために、(条件式)の評価次第で、繰り返し (条件式) ... 繰り返し終了 の範囲を一度も実行しない場合もあります。

     これは、繰り返し (条件式) は、if (条件式) ... end を何度も繰り返すことと同じだからです。

     順次実行して、[繰り返し終了]に到達した段階で、条件式を再び評価します。

     この時、条件式の値が偽であれば、[繰り返し終了]コマンドの次の行から順次実行します。

     この時、条件式の値が真であれば、[繰り返し]コマンドの次の行から順次実行します。※つまり繰り返しを続行します。


     なお、無条件で実行する場合には、繰り返し (条件式)の条件式を恒真式にすればOKです。

     つまり、

      ┌繰り返し ( 1 ) /* イチ(1)は真:恒真式 */
      │  ↑
      │  :
      │ この範囲を順次実行します
      │  :
      │  ↓
      └繰り返し終了

     これは、桐言語の場合の、繰り返し ... 繰り返し終了 です。※ (条件式)がありません。

      ┌繰り返し /* 無条件 */
      │  ↑
      │  :
      │ この範囲を順次実行します
      │  :
      │  ↓
      └繰り返し終了

     ただし、無条件(または恒真式)で繰り返す場合には、無限ループになりますので、[繰り返し中止]コマンドを使ってループから脱出します。

    ■繰り返し(DOUNTIL:ドゥーアンティル)

     [if ( 条件式 )][繰り返し中止][end]コマンドをセットにしたものを、[繰り返し終了]コマンドの直前に置くと、後判断型の繰り返しが作れます。

      ┌繰り返し ※DOWHILE の(条件式)を ───┐←ここに(条件式)を置くと前判断型DOWHILE
      │  ↑                 │
      │  :                 │
      │ この範囲を順次実行します       │
      │  :                 │
      │  ↓                 │
      │┌if (条件式)   ←─ここへ移動する ─┘←ここに(条件式)を置くと後判断型DOUNTIL
     ←┼┼─繰り返し中止
      │└end
      └繰り返し終了

     
    ■カウント制御ループ ※for文 の繰り返し

     繰り返しにはもうひとつのパターンがあります。

     それは、繰り返し 回数 … 繰り返し終了 です。

     これは、配列変数の要素を順番に取り出す場合などに使用します。

       変数宣言 整数{ &i, &loop, &step }

       &loop = #配列要素数( "variableName" )  /* 配列の場合には1以上の要素数、配列でない場合にはゼロ、変数が存在しなければマイナスイチ(-1) */
       &step = 1
      ┌繰り返し &i = 1,&loop,&step
      │  ↑
      │  :
      │ この範囲を順次実行します
      │  :
      │  ↓
      └繰り返し終了

     構文は、繰り返し <変数名> = <開始値>,<終了値>,<加算値> である。

     上の例では、配列でない場合には<終了値>:&loop の値はゼロなので、

     繰り返し &i = 1,0,1 になります。これはすで<開始値>:イチが<終了値>:&loop を超えているので、繰り返し ... 繰り返し終了 の範囲を実行しません。

     同様に、変数が存在しない場合には<終了値>:&loop の値はマイナスイチ(-1)なので、やはり 繰り返し ... 繰り返し終了 の範囲を実行しません。

     という具合にややこしくなりますが、手を抜いて<加算値>を省略しなければ失敗はしません。

     ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇

     なお、「論理の構造化」では、必ず条件式が必要になります。初級者は条件式に非常に弱いので拙作HPも参考にしてください。

     桐の釣魚大全 http://silicon7565.html.xdomain.jp/
     フォームアプリケーション教書 第2部
     30 論理と条件式


引用返信 [メール受信/OFF] 削除キー/
■12586 / inTopicNo.25)  Re[3]: 繰り返し
□投稿者/ hiro -(2020/08/13(Thu) 16:16:23)
    ONnojiさん、解説どうもありがとうございます

    その後、私も四苦八苦して、繰り返しの条件付きのコマンドを利用する事にしました
    その条件で空ファイルを除くにしてあげれば、以下の繰り返しは必ずデータのある表なので、それをケースで=0、<0、>0の3パターンに振り分ける事で
    思った通りの結果が出せるようになりました。
    出来てしまえば 振り返ると当たり前のような処理なのに、こういうコマンドもあるよという知識が不足していました。
    ありがとうございました。
解決済み!
引用返信 [メール受信/OFF] 削除キー/
■12587 / inTopicNo.26)  Re[10]: 繰り返し
□投稿者/ hiro -(2020/08/13(Thu) 16:22:06)
    ONnojiさん、どうもありがとうございました
    下の方にも書きましたが、条件の条件と言いますか今のこの文法ではどうしても無理があり、繰り返し(条件式)のコマンドを使う事により、残りをケースで振り分ける事で解決しました。色々ありがとうございました。
解決済み!
引用返信 [メール受信/OFF] 削除キー/
■12588 / inTopicNo.27)  Re[4]: 記述の局部的添削プラスアルファ
□投稿者/ hiro -(2020/08/13(Thu) 16:35:40)
    ちなみにですが
    #空ファイル=0は今、表が開いてる見た目状態で、補集合で
    裏にデータがあるとしても空ファイルと言う事でした。これは初めて知りました。
    #終端行=0はデータが見えてても最後の行の次の行の何もない状態の行で
    #総件数<>0ですが、処理方法によっては削除行も数えると言う事です

引用返信 [メール受信/OFF] 削除キー/

<前の20件

トピック内ページ移動 / << 0 | 1 >>

このトピックに書きこむ

過去ログには書き込み不可

Mode/  Pass/

HOME HELP 新規作成 新着記事 トピック表示 ファイル一覧 検索 過去ログ

- Child Tree -
- Antispam Version -