web-dev-qa-db-ja.com

パラダイムを実際に構造化と呼ばれるものとして認定するもの

によると、ウィキペディアは構造化プログラミングパラダイムについて述べています

以下は、Structuredと呼ばれる言語を修飾します。

  1. 「シーケンス」;順番に実行される順序付きステートメントまたはサブルーチン。
  2. "選択";プログラムの状態に応じて、1つまたは複数のステートメントが実行されます。これは通常、if..then..else..endifなどのキーワードで表現されます。
  3. 「反復」;ステートメントまたはブロックは、プログラムが特定の状態になるか、コレクションのすべての要素に操作が適用されるまで実行されます。これは通常、while、repeat、for、do..untilなどのキーワードで表現されます。
  4. サブルーチン;プロシージャ、関数、メソッド、サブプログラムなどの呼び出し可能な単位を使用して、1つのステートメントでシーケンスを参照できるようにします。
  5. ブロックは、ステートメントのグループを1つのステートメントであるかのように処理できるようにするために使用されます。

これらの条件のすべてまたは一部が存在している必要があります。

それがルールの一部である場合。これは、以下の非構造化BASICコードにif/thenがあるため、Structuredと呼ばれる資格があることを意味しますか?

5 LET S = 0
10 MAT INPUT V 
20 LET N = NUM 
30 IF N = 0 THEN 99 
40 FOR I = 1 TO N 
45 LET S = S + V(I) 
50 NEXT I 
60 PRINT S/N 
70 GO TO 5 
99 END

すべてのルールを含める必要がある場合、関数型プログラミングは反復/ループをサポートしていないため構造化されていないと言えますか?


ちなみに、私はこのフローチャートをプログラミングパラダイムをよりよく理解するために作成しましたが、それは正しいですか?

Programming Paradigm Chart


回答後に編集します。

クリストフの回答を経た後。

下の図は彼の修正を反映しています

enter image description here

......... /////////////////////////////// .......... ........................

enter image description here

2
EdgeDev

いいえ、例で使用されている従来の [〜#〜] basic [〜#〜] は構造化言語とは見なされません。

  • 最初に、単純なステートメントでサブルーチンを呼び出すことはできません。パラメーターを渡すには、グローバル変数と追加のステートメントを使用する必要があるためです。
  • GOTOでは、高度に構造化されていないスパゲッティコードを使用できます。理論が教えてくれるものは何でも。 GOTOはシーケンスを壊します(番号付きの行は、直前の行が実行されたことを確認できません。直接GOTOがそこにつながる可能性があるためです)。GOTOは、他のステートメントとの組み合わせでのみ選択または反復を許可します。
  • 最後に、言語はフラットです。明確なコードブロックを定義することはできません。ブロックは、任意のサイズの別のブロックで置き換えることができるステートメントのグループです。 BASICの行番号付けはこれを許可しません。

[〜#〜] fortran [〜#〜] は最初は構造化されていませんでしたが、どこか(1966?)でブロック構造が追加され、後で選択(1990)されました。しかし、多くのコードは構造化されていません。

したがって、構造化言語は少なくとも以下を提供する必要があります。

  • ブロック(どこでも制御の流れを壊す可能性のある行番号なし:明確な方法でブロックに出入りする)
  • モジュール性を確保するためにブロックにローカルな変数、
  • パラメータを渡すサブルーチンをクリーンアップし、
  • gOTOなしでプログラムを記述できる制御フローステートメント(このステートメントが便宜上言語に含まれている場合でも)。

最も初期の構造化言語は [〜#〜] algol [〜#〜] および Pascal でした。 Simula はオブジェクト指向でしたが、構造化プログラミングのすべてのプロパティを備えていました。

私は言語理論家ではありませんが、分類グラフは正しくないと思います。

  • 構造化されていない言語は不可欠な場合があります
  • OOPは直交です。たとえば、関数が特別な種類のオブジェクトと見なされる場合、関数型言語もオブジェクト指向になることを妨げるものはありません。
  • 宣言型言語が必ずしも構造化されているかどうかはわかりません。なぜなら、宣言型言語と関数型プログラミング言語は、制御フローの定義を避けようとするからです。したがって、ループ、選択、およびブロックは、それらの構造上の目的で使用されていません。
4
Christophe

文字通り言葉をとってもいいと思います。構造化言語と非構造化言語はなく、構造化コードと非構造化コードだけがあることに注意することが重要です。

構造とは、ビルディングブロックで構成された建物です。ブロックは、一連の操作またはスイッチにすることができます。スイッチはコードパスをリダイレクトし、実行をa(nother)ブロックの先頭に転送します。

ポイントは、理解しやすく、言語に依存しない一般的なブロックタイプがあることです。そして、プログラムの流れをグラフィカルに描くことができるはずです。

私が学校にいたとき、構造化されたコードを作成せざるを得なかったため、コードを書く前に、いわゆる Nassi-Shneiderman Diagrams を描画してソリューションを表現する必要がありました。描画するものは本質的に構造化されているため、図を取得したらコードを入力するのは簡単です。

NSダイアグラムは学外では人気がなく、放課後に使用したことはありませんが、構造化プログラミングの優れたデモンストレーターであると私は思います。

2
Martin Maat