判定・繰返し・優先順位の設計
要点と定義
アルゴリズムは、入力を受け取り、条件に応じて処理を選び、必要な値を更新しながら結果を得る手順です。流れ図や擬似言語は、その順次処理、判定、繰返しを明確に表します。設計では、各判定が何を比べ、成立したときにどの処理へ進むかを対応づけます。
判定条件と出力の対応
ファイル更新可否のように複数条件で出力先を決める処理では、条件を段階的に評価する流れ図と、条件の組合せ・動作を並べる決定表を対応させます。例えば、対象IDが既存ファイルにない場合は「新規登録」だけを更新対象にします。既存IDがあり、状態が受付中または見積中なら、変更または削除を更新対象にします。流れ図で先に「変更」を判定しているなら、その判定が不成立の後に残る対象は「削除」です。各分岐を条件と動作に照らして確かめることで、条件漏れや誤出力を防げます。
テストでは、分岐を通る代表例を用意します。たとえば、既存ID・受付中・削除なら更新対象へ、既存ID・見積中・登録なら対象外へ進むことを確かめます。既存IDがあっても状態が発注後なら、変更や削除の種類だけで更新対象にはできません。分岐ごとの入力条件と出力を決定表に記しておけば、どの組合せを確認したかが追いやすくなります。
繰返しの中で最小値を選ぶ
複数窓口の次の担当先を選ぶような処理では、配列を順に調べ、最小値とその添字を一緒に保持します。最初の要素を仮の最小値にし、各要素について「現在の最小値より小さいか」を判定します。小さければ最小値と添字を更新します。走査後の添字が選んだ窓口番号になります。値だけを更新して添字を更新し忘れると、時刻と窓口番号の対応が崩れます。
選んだ窓口の空き時刻と到着時刻を比べ、空き時刻が到着より前なら到着時刻を開始時刻にし、それ以外なら空き時刻を開始時刻にします。処理後は、その窓口の配列要素を今回の終了時刻で更新します。ここでは「処理中の行番号」「走査中の添字」「最小値を持つ添字」を区別します。配列の更新先は最小値を持つ添字で、更新する値は処理行の終了時刻です。
括弧を含む式の優先順位
式を演算子と値に分け、各演算子に優先順位を付けてから、最も優先順位の高い演算を順に実行する方法があります。加減算には低い順位、乗除算には高い順位を与え、括弧の内側では順位を上げます。括弧の深さを nest とし、加減算の順位を nest + priLow、乗除算を nest + priHigh とするなら、内側の加減算が括弧外の乗除算より先になるには、括弧による増分 b が b + priLow > priHigh を満たす必要があります。整数値なら b ≥ priHigh − priLow + 1 です。
同じ優先順位の演算子が複数ある場合、走査条件と更新方法で実行順が決まります。左から最初の最大順位を保持する設計なら、同順位の後続演算子では添字を更新せず、左側から処理します。括弧による順位の増分が不足すると、括弧外の演算が先に選ばれることがあります。
この節の続き
- 適用条件と例
- 誤りやすい点
ここまでが冒頭部分です。ログインすると、無料でも1日2節まで全文をお読みいただけます。
アプリでこの節を読む