構造プログラミングについて

goto演算子に関する投稿のコメントの多くは同じ意見を表明しており、次のように聞こえます。「n年間プログラムを書くためにgotoは必要ありませんでした。今後も使用しません。」 そして、それらは絶対に正しい、構造化定理は長い間証明されており、単純なプログラムは機能的には元のプログラムの関数と述語を使用して構成され、追加のカウンターを使用して構成された構造化プログラムと機能的に同等であると述べています。 証明は、非常に構造化されたプログラムをコンパイルするためのアルゴリズムです。

  1. バイパス順序は任意ですが、回路のすべてのノードに番号を付けます。
  2. 回路のすべてのアークに次のように番号を付けます。回路の出力アークに番号0を割り当て、他のすべてのアークにこのアークが入る頂点の番号を割り当てます。
  3. 番号iおよび出力アークjを持つソースプログラムの各機能ノードについて、入力アークiの番号を持つ新しい単純な順次プログラムGiを作成します。

  4. 番号iの各述語ノードに対して、新しい単純なプログラムを作成します

  5. whileのようなプログラムを、Lの値をチェックする構造の形式のdoパートでビルドします。




したがって、ある日、次のようなものを書いた場合( goto投稿のプログラム):



if (p1) { f1; goto L3; } L1: if (p2) { L2: f2; L3: f3; goto L1; } else if (p3) { f4; goto L2; } f5;
      
      







このコードを書き直してください。 賢い人が言ったのは無理ではありません:「あなたが住んでいる場所を知っている暴力的なサイコパスが同伴するかのようにコードを書いてください。」 ほとんどのプログラマーがgotoを好まないことを考えると、これは関連性以上のものです。



定理を使用し、構造プログラミングの原則に従ってこのコードを変換します。 まず、このアルゴリズムのブロック図を作成し、定理に従ってブロックとアークに番号を付けます。



画像



ここで、述語ブロックと関数ブロックを置き換えてwhile doループを構築します。



画像



構造化されたプログラムスキームが判明しましたが、余計なものが多すぎます。 次のアルゴリズムに従って変換します。

j> 0ごとに、すべての割り当てL = jを対応するサブルーチンGj(L = 1を含む)に置き換えようとします。 Lに再び値jが割り当てられない場合、プログラム構造からチェックL = j(対応する実行ブランチと一緒に)を削除できます。



画像



このスキームを使用すると、構造プログラミングの原則に準拠したコードを簡単に作成できます。



 if p1: f1 f3 l = 3 while l > 0: if p2: f2 f3 elif p3: f4 f2 f3 else: f5 l = 0;
      
      







または、 eigradここで行っように、フラグを完全に取り除きます



また、最初にプログラムのブロック図をいわゆるE-diagramに変換することにより、再帰的なコードを作成することもできました。



画像



コード:

 def F1(): if p2: F2() elif p3: f4 F2() else: f5 def F2(): f2 F3() def F3(): f3 F1() if p1: f1 F3() else: F1()
      
      







実際のプログラミングでは、関数は実行するアクションに従って名前が付けられるため、このコードはgotoを使用したコードよりも読みやすくなります。



トピックを書くとき、NSTUの方法論「情報学。 構造プログラミングの理論と実践。” T.A。Shaposhnikova。



PS質問と訂正をしてくれたfuncaに感謝します。



All Articles