Man nennt es strukturierte Programmierung. Strukturierte Programmiertechnologie. Grundprinzipien der strukturierten Programmierung

Föderale staatliche Haushaltsbildungseinrichtung für höhere Bildung „Mordwinischer Staat“.

Pädagogisches Institut benannt nach M.E. Evsevieva"

Fakultät für Physik und Mathematik

Fachbereich Informatik und Informatik

ABSTRAKT

„Grundsätze der strukturierten Programmierung. Grundlegende algorithmische Strukturen und ihre Überlagerungen“

Abgeschlossen von: Student gr. MDM-212

Bagdanova Yana

Saransk 2016

Einführung

In den frühen 70er Jahren des 20. Jahrhunderts, als die Entwicklung von Programmiersprachen ein ziemlich hohes Niveau erreicht hatte und die erstellten Softwaresysteme ziemlich beeindruckende Größen erreicht hatten (Hunderttausende – Millionen von Befehlen), wurde es offensichtlich, dass Softwareprojekte war zu komplex geworden, als dass Design, Codierung und Debugging innerhalb eines akzeptablen Zeitrahmens erfolgreich sein könnten. Programmierer, die komplexe Probleme lösen, standen vor dem Problem, die Anzahl und Größe der Programme so stark zu steigern, dass der weitere Entwicklungsprozess kaum noch zu bewältigen war und keiner der Entwickler mit Sicherheit sagen konnte, dass das erstellte Softwareprodukt immer das tut, was erforderlich ist. und dass es nichts tut, was nicht erforderlich ist. Somit entstand das Problem radikal veränderter Ansätze zur Erstellung großer Softwaresysteme.

Basierend auf diesen Problemen haben führende Programmierer der 70er Jahre (Dijkstra , Wirth , Gab , Xoap , Jordanien , Konstantin , Myers usw.) Es wurden strenge Regeln für die Durchführung von Projekten entwickelt, die aufgerufen wurdenStrukturmethodik .

Eine wichtige Etappe in der Entwicklung dieses Ansatzes waren die internationalen Programmierkonferenzen, die 1968–69 stattfanden. Beim zweiten davonEdsger Dijkstra verwendete zuerst den Begriff „Strukturierte Programmierung “ und schlug eine grundlegend neue Art der Programmerstellung vor. Er betrachtete ein Programm als eine Reihe hierarchischer abstrakter Ebenen, die Folgendes ermöglichten:

    Strukturieren Sie das Programm klar, was das Verständnis für Programmierer verbessert.

    Beweise für seine Korrektheit durchführen und dadurch die Zuverlässigkeit des Programms erhöhen;

    Reduzieren Sie die Programmentwicklungszeit.

Ein weiterer Anstoß, die Denkweise der Programmierer zu ändern, war der veröffentlichte BriefDijkstra Herausgeber eines der wissenschaftlichen Verlage mit dem Titel „Die GOTO-Anweisung sollte als schädlich angesehen werden " Dieser Brief sorgte unter den damaligen Programmierern für heftige Kontroversen, doch am Ende setzte sich strukturelles Denken durch, was zusätzlich zuDijkstra , tatkräftig unterstützt von einem Professor der Technischen Universität ZürichWirth und Professor an der Universität OxfordXoap . Eines der Ergebnisse der Kontroverse war der Beweis, dass jedes Programm nur mit einer einfachen Folge von Anweisungen geschrieben werden kann, einem iterativen Konstrukt ähnlichwährend ( Tschüss ) und WahlkonstruktionFall ( Auswahl ) und der Operatorgehe zu ( gehe zu ) ist kein notwendiges Kontrollkonstrukt in der strukturierten Programmierung. Leider Streitigkeiten über den Betreibergehe zu hatte einen negativen „Nebeneffekt“ – oft wurde ohne programmiertgehe zu wurde mit der gesamten strukturierten Programmierung identifiziert. Allerdings sind die Ziele der strukturierten Programmierung viel globaler und ernster.

1. GRUNDLAGEN DER STRUKTURIERTEN PROGRAMMIERTECHNIK

Strukturierte Programmierung - Entwicklungsmethodik Software, die auf der Darstellung des Programms in Form einer hierarchischen Blockstruktur basiert. Vorgeschlagen in den 70er Jahren des 20. Jahrhunderts. E. Dijkstra, entwickelt und ergänzt von N. Wirth (Abb. 1).

Edsger Wiebe Dijkstra (1930 – 2002) – niederländischer Wissenschaftler, dessen Ideen die Entwicklung der Computerindustrie beeinflussten. Bekannt als Schöpfer des Algorithmus zum Finden des kürzesten Pfades in einem Diagramm, einer der Begründer der strukturierten Programmierung. 1972 gewann er den Turing Award.

Niklaus Wirth (1934) – Schweizer Wissenschaftler, Spezialist auf dem Gebiet der Informatik, einer der bekanntesten Theoretiker auf dem Gebiet der Entwicklung von Programmiersprachen, Professor für Informatik, Gewinner des Turing-Preises 1984. Führender Entwickler der Programmiersprachen Pascal, Modula-2, Oberon.

Reis. 1. Pioniere der strukturierten Programmierung – E. Dijkstra und N. Wirth.

Die Methodik der strukturierten Programmierung entstand als Folge der zunehmenden Komplexität der auf Computern gelösten Probleme und der damit verbundenen Komplikation von Software: in den 70er Jahren des 20. Jahrhunderts. Der Umfang und die Komplexität von Programmen haben ein solches Niveau erreicht, dass die „intuitive“ (unstrukturierte) Programmentwicklung mehr und mehr die Norm war frühe Zeit, entspricht nicht mehr den Anforderungen der Praxis. Da die Programme zu komplex wurden, um ordnungsgemäß gewartet zu werden, war eine Systematisierung des Entwicklungsprozesses und der Programmstruktur erforderlich.

Der härteste Kritikpunkt der Entwickler am strukturierten Programmieransatz richtete sich an den BetreiberGEHE ZU ( bedingungsloser Sprungoperator ). Der falsche und unbedachte Einsatz willkürlicher Übergänge im Programmtext führte zu unübersichtlichen, schlecht strukturierten Programmen (sogSpaghetti-Code ), aus dessen Text es fast unmöglich war, die Reihenfolge der Ausführung und die gegenseitige Abhängigkeit der Fragmente zu verstehen.

Strukturierte Programmierung basiert auf den Prinzipiensequentielle Zerlegung Aufgaben undzielgerichtet ihrStrukturierung in einzelne Komponenten zerlegen. Strukturierte Programmiermethoden sind eine Reihe technischer und organisatorischer Prinzipien des Systemdesigns von Softwareprodukten.

Typische strukturierte Programmiertechniken sind:

    Top-Down-Design (Design von oben nach unten);

    modular (verfahrenstechnisch)Programmierung ;

    Strukturkodierung .

Gemäß der strukturierten Programmiermethodik:

1. Jedes Programm ist eine Struktur, aus der es aufgebaut ist drei Typen Grundausführungen:

    sequentielle Ausführung - einmalige Ausführung von Operationen in der Reihenfolge, in der sie im Programmtext geschrieben sind;

    Verzweigung - eine einmalige Ausführung einer von zwei oder mehreren Operationen, abhängig von der Erfüllung einer bestimmten Bedingung;

    Zyklus - wiederholte Ausführung derselben Operation, solange eine bestimmte Bedingung erfüllt ist (die Bedingung für die Fortsetzung der Schleife).

Im Programm können Grundstrukturen beliebig ineinander verschachtelt werden, es sind jedoch keine anderen Möglichkeiten zur Steuerung des Ablaufs vorgesehen.

2. Sich wiederholende Programmfragmente (oder sich nicht wiederholend, sondern logisch integral darstellend). Recheneinheiten) können im Formular dargestellt werdenUnterprogramme (Prozeduren oder Funktionen). In diesem Fall wird im Text des Hauptprogramms anstelle des im Unterprogramm platzierten Fragments eine Anweisung zum Aufruf des Unterprogramms eingefügt. Wenn eine solche Anweisung ausgeführt wird, wird das aufgerufene Unterprogramm ausgeführt. Anschließend wird die Programmausführung mit der Anweisung fortgesetzt, die auf die Anweisung zum Unterprogrammaufruf folgt.

3. Das Programm wird Schritt für Schritt nach der Top-Down-Methode entwickelt.

Zunächst wird der Text des Hauptprogramms geschrieben, in dem anstelle jedes zusammenhängenden logischen Textfragments ein Aufruf einer Unterroutine eingefügt wird, die dieses Fragment ausführt. Anstelle echter, funktionierender Unterprogramme „Stubs “, die nichts bewirken. Das resultierende Programm wird überprüft und debuggt. Nachdem der Programmierer überzeugt ist, dass die Unterroutinen in der richtigen Reihenfolge aufgerufen werden (d. h. die allgemeine Struktur des Programms korrekt ist), werden die Stub-Unterroutinen nacheinander durch tatsächlich funktionierende ersetzt und die Entwicklung jeder Unterroutine wird unter Verwendung derselben durchgeführt Methode als Hauptprogramm. Die Entwicklung endet, wenn kein einziger „Stub“ mehr übrig ist, der nicht entfernt wurde. Diese Reihenfolge stellt sicher, dass der Programmierer in jeder Entwicklungsphase gleichzeitig mit einem sichtbaren und verständlichen Satz von Fragmenten zu tun hat und sicher sein kann, dass die allgemeine Struktur aller höheren Ebenen des Programms korrekt ist. Bei der Pflege und Durchführung von Programmänderungen wird deutlich, welche Vorgänge geändert werden müssen, und zwar ohne Auswirkungen auf Programmteile, die nicht direkt damit zusammenhängen. Dadurch kann gewährleistet werden, dass bei Änderungen und Fehlerkorrekturen ein Teil des Programms, der derzeit außerhalb der Aufmerksamkeit des Programmierers liegt, nicht ausfällt.

Den Prinzipien der strukturierten Programmierung folgend, wurden Programmtexte, auch große, normal lesbar gemacht. Das Verständnis von Programmen ist wesentlich einfacher geworden; es ist möglich, Programme im normalen industriellen Modus zu entwickeln, wenn das Programm nicht nur von seinem Autor, sondern auch von anderen Programmierern ohne große Schwierigkeiten verstanden werden kann. Dies ermöglichte es, mit Entwicklungsteams für die damalige Zeit recht große Softwaresysteme zu entwickeln und diese Systeme auch bei unvermeidlichen personellen Veränderungen über viele Jahre hinweg aufrechtzuerhalten.

Die strukturierte Softwareentwicklungsmethodik gilt als „die leistungsfähigste Formalisierung der 70er Jahre“. Danach kam das Wort „strukturell“ in der Branche in Mode und wurde überall dort verwendet, wo es notwendig und wo nicht notwendig war. Es erschienen Arbeiten zu „Strukturentwurf“, „Strukturprüfung“, „Strukturentwurf“ usw.

Zu den Vorteilen der strukturierten Programmierung gehören:

1. Durch die strukturierte Programmierung können Sie die Anzahl der Optionen zum Erstellen eines Programms gemäß derselben Spezifikation erheblich reduzieren, was die Komplexität des Programms erheblich verringert und es für andere Entwickler leichter verständlich macht.

2. In strukturierten Programmen sind logisch verbundene Operatoren visuell näher und lose verbundene weiter entfernt, was es ermöglicht, auf Flussdiagramme und andere grafische Formen der Darstellung von Algorithmen zu verzichten (tatsächlich ist das Programm selbst ein eigenes Flussdiagramm).

3. Der Prozess des Testens und Debuggens strukturierter Programme wird erheblich vereinfacht.

Schauen wir uns die grundlegenden Methoden der strukturierten Programmierung genauer an.

1.1. Ziele und Prinzipien der strukturierten Programmierung

Ziele der strukturierten Programmierung Sind:

    Sicherstellung der Programmierdisziplin im Prozess der Erstellung von Softwaresystemen .

    Verbesserung der Programmlesbarkeit . Die Lesbarkeit verbessert sich, wenn Sie die folgenden Regeln beachten:

    • Vermeiden Sie die Verwendung von Sprachkonstrukten mit nicht offensichtlicher Semantik.

      streben danach, die Wirkung von Kontrollstrukturen und die Verwendung von Datenstrukturen zu lokalisieren;

      Entwickeln Sie ein Programm so, dass es von Anfang bis Ende gelesen werden kann, ohne dass Kontrollübergänge zu einer anderen Seite erforderlich sind.

    Verbesserung der Programmeffektivität . Dies kann erreicht werden, indem das Programm strukturiert und in Module unterteilt wird, sodass Fehler leicht gefunden und korrigiert werden können und der Text jedes Moduls unabhängig von anderen neu geschrieben werden kann, um die Effizienz zu steigern.

    Verbesserung der Programmzuverlässigkeit . Dies kann erreicht werden, wenn das Programm einfach durchgängig getestet werden kann und keine Probleme bei der Organisation des Debugging-Prozesses verursacht. Dies wird durch eine gute Strukturierung des Programms bei der Aufteilung in Module und die Einhaltung der Regeln zum Schreiben lesbarer Programme gewährleistet.

    Reduzierter Zeit- und Kostenaufwand Software-Entwicklung . Dies geschieht, wenn jeder Programmierer im Entwicklungsteam in der Lage ist, zu schreiben und zu debuggen große Menge Programmcode als zuvor.

BasicPrinzipien der strukturierten Programmierung sind in der Tabelle zusammengefasst. 1.

Tabelle 1. Prinzipien der strukturierten Programmierung

Prinzip

Erläuterung

Abstraktion

Abstraktion ermöglicht es dem Programmierer, sich die erforderliche Lösung für ein Problem vorzustellen, ohne sofort viele Details zu berücksichtigen. Ein Programmierer kann ein Programm in Ebenen betrachten: Die oberste Ebene zeigt die größere Abstraktion, was die Betrachtung des Entwurfs erleichtert, während die untere Ebene die feineren Details der Implementierung zeigt.

Formalität

Verwendung eines strengen methodischen Ansatzes bei der Entwicklung eines Programms, der die Grundlage für die Umwandlung der Programmierung von der Improvisation in eine Ingenieursdisziplin bildet. Dieses Prinzip bietet eine Grundlage für den Beweis der Korrektheit von Programmen, da es einem ermöglicht, Programme (Algorithmen) als mathematische Objekte zu untersuchen.

"Teile und herrsche"

Aufteilen eines Programms in separate Fragmente (Module), die einfach zu verwalten sind und unabhängiges Debuggen und Testen ermöglichen.

Hierarchische Ordnung

Die Struktur der Teilung ist nicht weniger wichtig als die Tatsache einer solchen Teilung. Dieses Prinzip stellt die Forderung nach einer hierarchischen Strukturierung der Beziehungen zwischen Modulen dar Softwarepaket Dies erleichtert das Erreichen strukturierter Programmierziele.

1.2. Top-Down-Design

Die Problemspezifikation dient als Ausgangspunkt für die Erstellung eines Programms. Sie müssen verstehen, welche Maßnahmen zur Lösung des Problems durchgeführt werden müssen, diese in natürlicher Sprache und auf einem ausreichend hohen Abstraktionsniveau beschreiben.

Die Spezifikation einer Aufgabe ist ihr primäres Design. Von dort aus gehen wir zum Programm über und präzisieren nach und nach die Beschreibung.

Die schrittweise Verfeinerung des Projekts wird genanntTop-Down-Entwurfsmethode ( Schritt-für-Schritt-Detaillierung oderTop-Down-Design ).

Beispiel 1. Betrachten Sie als Beispiel das Projekt, ein Kind anzuziehen.

Lösung:

1. Primäres Ziel :

Kleid.

2. Im ersten Schritt das Ziel festlegen :

Setzen Sie die untere Hälfte auf.

Obere Hälfte auflegen.

2.1. Die untere Hälfte kann in zwei Stufen bekleidet werden:

Hose anziehen.

Socken und Stiefel anziehen.

2.2. Auch die obere Hälfte kann in zwei Etappen bekleidet werden:

Zieh ein Hemd an.

Zieh eine Jacke an.

3. Abschlussprojekt sieht so aus:

Hose anziehen.

Socken anziehen.

Zieh deine Stiefel an.

Zieh ein Hemd an.

Zieh eine Jacke an.

Top-Down-Entwurfsmethode beinhaltet die sequentielle Zerlegung der allgemeinen Datenverarbeitungsfunktion in einfache Funktionselemente („top-down“). Als Ergebnis wird ein hierarchisches Diagramm erstellt -funktionale Struktur des Algorithmus ( FSA ), was die Zusammensetzung und gegenseitige Unterordnung einzelner Funktionen widerspiegelt (Abb. 2).

Anhang 1

Anwendung N

Funktion 1

Funktion 2

Funktion M

Unterfunktion 11

Unterfunktion 1 k

Unterfunktion M 1

Unterfunktion M 2

Unterfunktion Abgeordneter

Ziel 1

Unterziel 11

Unterziel 1S

Ziel2

Unterziel2 1

Unterziel2 Q

Reis. 2. Funktionsstruktur der Anwendung

Die Reihenfolge der Schritte zur Entwicklung einer FSA-Anwendung ist wie folgt:

    werden bestimmtAutomatisierungsziele Fachgebiet und deren Hierarchie (Ziel-Unterziel);

    ist installiertZusammensetzung der Bewerbungen (Bearbeitungsaufgaben) Sicherstellung der Umsetzung der gesetzten Ziele;

    TBCArt der Beziehung Anwendungen und ihre Hauptmerkmale (Informationen zur Lösung von Problemen, Zeitpunkt und Häufigkeit der Lösung, Ausführungsbedingungen usw.);

    zur Problemlösung notwendigen Maßnahmen ermittelt werdenDatenverarbeitungsfunktionen ;

    durchgeführtZerlegung von Verarbeitungsfunktionen auf die erforderliche strukturelle Komplexität, die durch die vorgeschlagenen Werkzeuge realisiert wird.

Diese Bewerbungsstruktur spiegelt das Wichtigste wider –Verbindung UndZusammenschaltung von Funktionen Verarbeitung von Informationen zur Implementierung der Anwendung, wobei jedoch nicht die Ausführungslogik jeder einzelnen Funktion, die Bedingungen oder die Häufigkeit ihrer Aufrufe offengelegt werden.

1.3. Modulare Programmierung

Modulare Programmierung ist eine natürliche Folge des Top-Down-Designs und besteht darin, das Programm in Teile zu zerlegen -Module , separat entwickelt.

Modul ist ein unabhängiger Teil des Programms, der einen bestimmten Zweck hat und Folgendes bietet spezifizierte Funktionen unabhängig von anderen verarbeiten Softwaremodule. Ein Modul besteht aus einem logisch miteinander verbundenen Satz funktionaler Elemente.

In der Programmierung bedeutet ein Modul ein separates ModulSubroutine , und Unterprogramme werden oft aufgerufenVerfahren oderProzedurfunktionen . Deshalb wird auch modulare Programmierung genanntverfahrenstechnisch .

Bei der Erstellung von Softwareprodukten heben wir hervorwiederverwendbare Module , sie werden typisiert und vereinheitlicht, wodurch der Zeit- und Arbeitsaufwand für die Entwicklung des Softwareprodukts als Ganzes reduziert wird.

Einige Softwareprodukte nutzen Module aus vorgefertigten Bibliotheken mit Standardroutinen, Prozeduren, Funktionen, Objekten und Datenverarbeitungsmethoden.

Zu den zahlreichen Modulen zählen:

    Kopfmodul – steuert die Einführung eines Softwareprodukts (existiert im Singular);

    Kontroll Modul – stellt Aufrufe an andere Module zur Verarbeitung bereit;

    Arbeitsmodule – Verarbeitungsfunktionen ausführen;

    Servicemodule und Bibliotheken , Dienstprogramme – Servicefunktionen implementieren.

Beim Betrieb des Softwareprodukts werden die notwendigen Softwaremodule aktiviert. Steuermodule legen die Aufrufreihenfolge für die Ausführung des nächsten Moduls fest. Die Informationskommunikation zwischen Modulen wird durch die Verwendung einer gemeinsamen Datenbank oder die Datenübertragung zwischen Modulen über Austauschvariablen sichergestellt.

Jedes Modul kann als unabhängig gespeicherte Datei konzipiert werden; Damit das Softwareprodukt funktioniert, sind vollständige Softwaremodule erforderlich.

Das Modul muss über Folgendes verfügenEigenschaften :

    ein Eingang und ein Ausgang – Am Eingang empfängt das Softwaremodul einen bestimmten Satz Ausgangsdaten, führt eine sinnvolle Verarbeitung durch und gibt einen Satz Ergebnisdaten zurück, d. h. Das Standardprinzip wird umgesetztBörsengang ( Eingabe–Prozess–Ausgabe Eingabe-Prozess-Ausgabe );

    funktionale Vollständigkeit – Das Modul führt eine Liste regulierter Vorgänge aus, um jede einzelne Funktion in ihrer Gesamtheit zu implementieren, die ausreicht, um die gestartete Verarbeitung abzuschließen.

    logische Unabhängigkeit – Das Ergebnis des Betriebs eines Softwaremoduls hängt nur von den Ausgangsdaten ab, hängt jedoch nicht vom Betrieb anderer Module ab.

    schwache Informationsverbindungen mit anderen Softwaremodulen – Der Informationsaustausch zwischen Modulen sollte so gering wie möglich gehalten werden.

    Programmcode von überschaubarer Größe und Komplexität .

Module enthalten:

    Ermittlung der für die Verarbeitung verfügbaren Daten;

    Datenverarbeitungsvorgänge;

    Diagramme der Verbindung mit anderen Modulen.

Jedes Modul besteht ausSpezifikationen UndKörper . Spezifikationen Definieren Sie die Regeln für die Verwendung des Moduls undKörper – Art und Weise der Durchführung des Verarbeitungsprozesses.

Funktionen desselben Typs werden von denselben Modulen implementiert. Die Funktion der obersten Ebene wird vom Hauptmodul bereitgestellt. Es steuert die Ausführung von Funktionen auf niedrigerer Ebene, denen untergeordnete Module entsprechen.

Bei der Bestimmung einer Reihe von Modulen, die die Funktionen eines bestimmten Algorithmus implementieren, muss Folgendes berücksichtigt werden:

    jedes Modul wird von einem übergeordneten Modul zur Ausführung aufgerufen und gibt nach Abschluss seiner Arbeit die Kontrolle an das Modul zurück, das es aufgerufen hat;

    Wichtige Entscheidungen werden im Algorithmus auf der höchstmöglichen Ebene in der Hierarchie getroffen.

    Um dieselbe Funktion an verschiedenen Stellen des Algorithmus zu verwenden, wird ein Modul erstellt, das bei Bedarf zur Ausführung aufgerufen wird.

Als Ergebnis einer weiteren Verfeinerung des Algorithmus, afunktional-modulares Diagramm ( FMS ) Anwendungsalgorithmus, der die Grundlage für die Programmierung bildet (Abb. 2).

Die Zusammensetzung und Art der Softwaremodule, ihr Zweck und die Art ihrer Verwendung im Programm werden maßgeblich von den Werkzeugen bestimmt.

Zweite Hierarchieebene Programme

Erste Hierarchieebene Programme

Kopfmodul

(Serverprogramm)

Steuermodul 1

(Steuerprogramm 1)

Steuermodul n

(Steuerprogramm n)

Modul 1A

(Unterprogramm 1A)

Modul 1B

(Unterprogramm 1B)

Modul 1W

(Unterprogramm 1 W )

Modul 0A

(Unterprogramm 0A)

Modul 0B

(Unterprogramm 0B)

nA-Modul

(Unterprogramm nA)

nB-Modul

(Unterprogramm nB)

nW-Modul

(Unterprogramm nW)

Dritte Hierarchieebene Programme

Reis. 3. Funktional-modularer Aufbau des Anwendungsalgorithmus

Die meisten modernen endbenutzerorientierten Anwendungsprogramme arbeiten in einem interaktiven Modus der Interaktion mit dem Benutzer, sodass Nachrichten ausgetauscht werden, die sich auf die Datenverarbeitung auswirken. Im interaktiven Modus werden unter dem Einfluss des Benutzers Verarbeitungsfunktionen gestartet, Objekteigenschaften geändert, Informationsausgabeparameter konfiguriert usw. Der Dialogprozess wird entsprechend dem erstellten Szenario gesteuert, für das Folgendes definiert ist:

    Punkte (Moment, Zustand) des Beginns des Dialogs;

    der Initiator des Dialogs ist eine Person oder ein Softwareprodukt;

    Parameter und Inhalt des Dialogs – Nachrichten, Menüzusammensetzung und -struktur, Bildschirmformen usw.;

    Reaktion des Softwareprodukts auf das Ende des Dialogs.

Am besten geeignet für die Erstellung von Dialogprozessen und Endbenutzeroberflächenobjektorientierte Werkzeuge Programm Entwicklung .

1.4. Strukturkodierung

Die Programmierpraxis hat gezeigt, dass eine wissenschaftlich fundierte Methodik zur Entwicklung und Dokumentation von Algorithmen und Programmen erforderlich ist. Diese Methodik sollte die Analyse des ursprünglichen Problems, die Aufteilung in ausreichend unabhängige Teile und die Programmierung dieser Teile so unabhängig wie möglich voneinander betreffen. Diese Methodik istStrukturkodierung ( Programmierung ).

Strukturkodierung ist eine Methode zum Schreiben von Programmen, die eine bestimmte Struktur haben und daher leicht zu verstehen, zu testen, zu modifizieren und zu verwenden sind.

Diese Methode basiert auf der Verwendung einer kleinen Menge einfacher Kontrollstrukturen (Strukturoperatoren ), deren korrekte Funktionsweise leicht zu analysieren und festzustellen ist. Darüber hinaus bestehen einige Operatoren aus anderen darin verschachtelten Operatoren.

Das ist die strukturierte Eigenschaft von OperatorenJeder Operator hat einen Eingang und einen Ausgang . Ein aus Strukturoperatoren aufgebautes Programm wird aufgerufenstrukturiert .

Die Grundlage der strukturierten Programmierung istStrukturierungssatz , 1966 von den italienischen Mathematikern K. Bohm und G. Jacopini formuliert.

Der Satz besagt, dass der Algorithmus zu seiner Lösung (und dementsprechend das Programm) unabhängig von der Komplexität des Problems immer als eine Zusammensetzung aus drei Arten verschachtelter Blöcke dargestellt werden kann:

    folgende (Anfang-Ende Anfangsende ),

    Verzweigung (Wenn - Dann - anders Wenn-dann-sonst ),

    Schleifen mit Vorbedingung (während Tschüss ).

Mit anderen Worten, diese elementaren Strukturen habenfunktionale Vollständigkeit , d.h. Jeder Algorithmus kann als Zusammensetzung dieser drei Strukturen implementiert werden.

In der Praxis dies Der Satz ermöglicht es uns, die Verwendung von Übergangsoperatoren zu vermeidengehe zu , wodurch Algorithmen und Programme visuell und leicht verständlich werden.

Die Arten der Hauptkontrollstrukturen des Algorithmus sind in Abb. dargestellt. 4.

1. Struktur wie „folgende » (Abb. 4, A) – wird durch eine Abfolge von Aktionen gebildet, S 1, S 2, …, Sn, nacheinander folgend:

ausführenS 1;

ausführenS 2;

ausführenSn .

Bei einem linearen Rechenprozess werden alle Operationen nacheinander in der Reihenfolge ausgeführt, in der sie geschrieben wurden. Ein typisches Beispiel für einen solchen Prozess ist ein Standard-Rechenschema, das aus drei Phasen besteht:

    Eingabe der Ausgangsdaten;

    Berechnung anhand von Formeln;

    Ausgabe des Ergebnisses.

In der SprachePascal Diese Struktur ist in Operatorklammern eingeschlossenBeginnen ... Ende :

Beginnen

S 1;

S 2;

...

Sn ;

Ende

Reis. 4. Grundlegende algorithmische Strukturen:

A) folgende (Beginnen Ende ); B) Verzweigung (Wenn Dann Anders ); V) Schleife mit Vorbedingung (Während Tun )

2. Struktur wie „ Verzweigung » (WENN – DANN – SONST ) (Abb. 4,B ) – liefert je nach Ergebnis der Prüfung die BedingungenR und nimmt einen von zwei logischen Werten anJa (WAHR ) oderNein (FALSCH ), Auswahl einer der alternativen Methoden des Algorithmus:

Wenn R

dann ausführen S 1

andernfalls ausführen S 2 .

Jeder Pfad führt zu einem gemeinsamen Ausgang, sodass der Algorithmus unabhängig vom gewählten Pfad weiter ausgeführt wird.

In der SprachePascal

Wenn P

Dann S 1

Anders S 2;

3. Struktur wie „Schleife mit Vorbedingung » (Abb. 4, V) – sorgt für die wiederholte Ausführung einer Aktion S abhängig davon, welchen Wert die logische Bedingung annimmt R:

bisR

erfüllenS .

Die Schleife endet, wenn die Bedingung erfüllt ist R wird nicht ausgeführt.

In der Sprache Pascal Diese Struktur hat das folgende Format:

Während P Tun

S ;

Der erweiterte Satz elementarer algorithmischer Strukturen umfasst zusätzlich die folgenden Kontrollstrukturen (Abb. 5).

4. Struktur wie „ abgekürzte Verzweigung » (WENN, DANN ) (Abb. 5,A ) – wenn das Ergebnis der Überprüfung der BedingungR nimmt den Wert anJa (WAHR ), dann wird die Aktion ausgeführtS ; Andernfalls wird diese Aktion übersprungen und die Steuerung an die folgende Struktur übergeben:

Wenn R

dann ausführen S 1 .

In der SprachePascal Diese Struktur hat das folgende Format:

Wenn P

Dann S ;

5 . Struktur wie „ Wahl - sonst » (Abb. 5,B ) sind eine erweiterte Version der TypstrukturWENN – DANN – SONST . Hier ist die zu überprüfende BedingungR kann nicht zwei logische Werte, sondern mehrere Ordnungswerte annehmen, zum Beispiel 1, 2, ...,N . WennR = ich , dann wird die Aktion ausgeführtSi . Wenn der WertR außerhalb des akzeptablen Wertebereichs liegt, wird die Aktion ausgeführtS (gekürzte Version „Auswahl » Es wird keine Aktion ausgeführt und die Steuerung wird an die nächste Struktur übergeben. In der SprachePascal Diese Struktur hat das folgende Format:

Fall P Von

1: S1;

2: S2;

n: Sn

Anders S

Ende;

Reis. 5. Zusätzliche elementare algorithmische Strukturen:

A) abgekürzte Verzweigung (Wenn Dann ); B) Wahl - sonst (Fall Von Anders );
V) Schleife mit Nachbedingung (Wiederholen Bis ); G) Schleife mit Parameter (Für Zu ( Bis zu ) – Tun )

6. Struktur wie „ Schleife mit Nachbedingung » (Abb. 5,V ) – sorgt für die wiederholte Ausführung einer AktionS bis die Bedingung erfüllt istR .

In der SprachePascal Diese Struktur hat das folgende Format:

Wiederholen

S

Bis P ;

7. Struktur wie „ Schleife mit Parameter » (Abb. 5,G ) – sorgt für eine vorgegebene wiederholte Ausführung einer AktionS . In diesem Fall werden die folgenden typischen Vorgänge nacheinander ausgeführt:

    Festlegen des Anfangswerts des zu verwendenden Schleifenparameters (z. B. wenn die Schleifenvariable ist ich, dann wird ihm der Wert zugewiesen ich 1, d.h. ich:=ich 1);

    Aktionen ausführen S im Körper der Schleife bereitgestellt;

    Ändern eines Schleifenparameters, der sicherstellt, dass das Ergebnis mit neuen Anfangsdaten berechnet wird (z. B. wenn der Schleifenparameter ichÄnderungen in Schritten ich 3, ich:=ichich 3);

    Überprüfen des aktuellen Werts eines Schleifenparameters mit einem gegebenen Endwert ( ich<=ich 2);

    Übergang zur Wiederholung des Schleifenkörpers, wenn der Schleifenparameter den Endwert nicht überschritten hat, andernfalls - Ausführen der folgenden Aktionen oder Ausgeben des Ergebnisses.

In der SprachePascal Diese Struktur hat das folgende Format:

Für Variable := ich 1 Bis (Downto) ich 3 Tun

S ;

Wenn Sie das Programmdiagramm betrachten, können Sie darin Teile (Fragmente) identifizieren, die recht einfach und verständlich aufgebaut sind. Die Darstellung dieser Fragmente in vergrößerten Blöcken erleichtert die Wahrnehmung des Algorithmus (und anschließend des Programms) als Ganzes erheblich.

Strukturoperatoren werden normalerweise zu Beginn des Top-Down-Entwurfs eines Programms verwendet.

Auf diese Weise,Strukturierte Programmierung bezogen aufmodularer Aufbau Softwareprodukt undtypisch (Basic ) Managementstrukturen Algorithmen zur Verarbeitung von Daten aus verschiedenen Softwaremodulen.

SCHLUSSFOLGERUNGEN

    Strukturierte Programmierung ist eine Softwareentwicklungsmethode, die auf der Darstellung eines Programms in Form einer hierarchischen Blockstruktur basiert. Vorgeschlagen in den 70er Jahren des 20. Jahrhunderts. E. Dijkstroy, entwickelt und ergänzt von N. Wirth. Typische Methoden der strukturierten Programmierung sind: Top-Down-Design (Top-Down-Design); modulare (prozedurale) Programmierung; Strukturkodierung.

    Die Ziele der strukturierten Programmierung sind: Gewährleistung der Programmierdisziplin, Steigerung der Effizienz und Zuverlässigkeit von Programmen sowie Reduzierung von Zeit und Kosten für die Softwareentwicklung. Grundprinzipien der strukturierten Programmierung: Abstraktion, Formalität, Teile und herrsche, hierarchische Ordnung.

    Die Top-Down-Entwurfsmethode beinhaltet die sequentielle Zerlegung der gesamten Datenverarbeitungsfunktion in einfache Funktionselemente („Top-Down“). Die Mittel zur Erreichung von Zielen auf der vorherigen Ebene werden zu Zielen auf der niedrigeren Ebene.

    Strukturkodierung ist eine Methode zum Schreiben von Programmen, die eine bestimmte Struktur haben. Es basiert auf der Verwendung einer kleinen Menge von Strukturoperatoren, deren Korrektheit leicht analysiert und festgestellt werden kann. Darüber hinaus bestehen einige Operatoren aus anderen darin verschachtelten Operatoren.

    Die Grundlage der strukturierten Programmierung ist der Strukturierungssatz, der 1966 von den italienischen Mathematikern C. Bohm und G. Iacopini formuliert wurde. Der Satz besagt, dass der Algorithmus zu seiner Lösung (und dementsprechend das Programm) immer sein kann, egal wie komplex das Problem ist Als Komposition werden drei Arten verschachtelter Blöcke dargestellt: Folge (Anfang-Ende), Verzweigung (Wenn-Dann-Sonst), Schleifen mit einer Vorbedingung (While).

* E. Dijkstra gab die folgende Definition: „ Strukturiertes Programmieren ist eine Disziplin, die sich der Programmierer selbst auferlegt».

Strukturierte Programmierung - einer der größten Fortschritte in der Programmiertechnologie. Obwohl fast jeder eine allgemeine und eher vage Vorstellung von strukturierter Programmierung hat, gibt es keine allgemein akzeptierte klare Definition dafür. Ziel der strukturierten Programmierung ist es, Programme mit minimaler Komplexität zu schreiben, den Programmierer zu klarem Denken zu zwingen und das Programm leichter verständlich zu machen.

Der Text des Programms muss so gestaltet sein, dass er von oben nach unten gelesen werden kann. Die uneingeschränkte Verwendung von unbedingten Sprungoperatoren (GO TO) verstößt gegen diese Bedingung, weshalb strukturierte Programmierung oft als Programmierung ohne GO TO bezeichnet wird.

Sie können Beispiele für Programme nennen, die kein GO TO enthalten und entsprechend der Verschachtelungsebene der Anweisungen übersichtlich in einer Leiter angeordnet sind, aber völlig unverständlich sind, und es gibt andere Programme, die GO TO enthalten und dennoch verständlich sind. Daher ist das Vorhandensein oder Fehlen von GO TO ein schlechter Indikator für die Qualität des Programms (Abbildungen in D. Knuth). Und doch: Am schwierigsten zu kontrollieren und potenziell instabil ist der bedingungslose Sprungoperator – GO TO.

Die Struktur des Modulkörpers und die verwendeten grundlegenden Programmierkonstrukte müssen potenziell resistent gegen Hardwarefehler, Beschädigung von Quelldaten und Fehler in Programmen sein.

Jedes Programm kann auf der Grundlage elementarer Grundstrukturen dreier Typen synthetisiert werden:

1. Einfache Reihenfolge. 2. Bedingungen (Alternativen).

3. Wiederholung (Zyklen, Iterationen). Es sind zwei oder beide Typen möglich:

„noch“ tun „noch nicht“ tun

4. Sie können ein viertes Design hinzufügen – Auswahl (Schalter).

Blöcke werden rekursiv definiert: Rechtecke stellen verschachtelte Bausteine ​​dar, die anstelle eines Rechtecks ​​verwendet werden.

Die aufgeführten Elementarkonstruktionen werden beispielsweise in der Pascal-Sprache wie folgt implementiert:

Bedingter Operator WENN Protokoll. vyr. DANN Betreiber 1 ANDERS Operator2;

WENN Protokoll. Ausdruck DANN Operator;

Wiederholung (Zyklen, Iterationen)

a) Tun Sie „vorerst“ WHILE Fortsetzungsbedingung TUN Operator;

b) „Noch nicht“ WIEDERHOLEN Operator BIS Beendigungsbedingung;

c) Schleife mit Suche FOR K:=B1 TO B2 DO Operator;

FOR K:=B2 DOWNTO B1 DO Operator;

Auswählen (wechseln) FALL Zustand VON

N1,...Nk: Betreiber 1;

Ni,...Nm: Betreiber nn;

ENDE ;

In der FoxBASE-Sprache werden diese Konstrukte wie folgt implementiert:

Bedingter Operator WENN Protokoll. Ausdruck

Betreiber1

[ANDERS

Operatoren2]

ENDIF

Zyklus TUN SIE WÄHREND Ausdruck

Betreiber

ENDDO

Auswählen (wechseln) FALL MACHEN

FALL Protokoll. Ausdruck 1

Betreiber

FALL Protokoll. Ausdruck2

Betreiber

FALL Protokoll. Ausdruck n

Betreiber

ENDE

Jede Struktur zeichnet sich durch einen einzigen Punkt für die Übertragung der Kontrolle in die Struktur (einzelner Eintritt) und einen einzelnen Austrittspunkt aus der Struktur aus.

Diese Strukturen haben systematisierende und disziplinäre Bedeutung. Die Einfachheit der ursprünglich strukturierten Programmierkonstrukte verhindert komplexe Informationsverbindungen und einschüchternde Kontrollübertragungen.

Durch die Erhöhung der Struktur der Module verringert sich die Komplexität der Programme und ihre Sichtbarkeit erhöht sich, was dazu beiträgt, die Fehleranzahl zu reduzieren. Um die Qualität von Programmen zu verbessern, muss jedoch mit zusätzlichem Speicher und Zeit für deren Implementierung auf einem Computer bezahlt werden.

Der Aufbau des Programms hängt von der verwendeten Programmiersprache ab. Moderne Softwareentwicklungstools sind die „besten“ strukturierten Programmiersprachen. Von den gängigen Programmiersprachen gelten Pascal, Basic und FoxBASE als am besten geeignet. Eine strukturierte Programmierung beispielsweise in Assembler ist nahezu unmöglich. Allein die Tatsache, dass Assembler verwendet wird, weist darauf hin, dass das Programm hauptsächlich in Maschinensprache geschrieben ist.

Strukturierte Programmierung konzentriert sich auf die Kommunikation mit Menschen und nicht mit Maschinen und fördert das Schreiben von Programmen, die eine einfache und klare Lösung für ein Problem darstellen.

Es ist wichtig, dass der Programmierer, auch wenn er mit der Programmierung der Logik beginnt, in Bezug auf die wichtigsten grundlegenden Strukturstrukturen denkt.

Der Standpunkt bezüglich der GO TO-Anweisung sollte sein: Vermeiden Sie die Verwendung von GO TO wann immer möglich, aber nicht auf Kosten der Programmklarheit. Es ist oft ratsam, GO TO zu verwenden, um eine Schleife oder ein Modul zu verlassen, um in ON-Konstrukte zu springen (z. B. in der Basic-Sprache) oder um eine zu tiefe Verschachtelung von Verzweigungen zu vermeiden, insbesondere da der Übergang zu nachfolgenden (siehe unten) erfolgt ) Programmanweisungen und die Struktur des Programms sind weiterhin von oben bis unten gut lesbar. Als schlechteste Verwendung der GO TO-Anweisung gilt die Übergabe der Kontrolle an eine Anweisung, die sich weiter oben (früher) im Programmtext befindet.

Um das Lesen des Programms zu erleichtern, muss der Text außerdem physisch in Teile unterteilt werden, wobei zwischen den Abschnitten und Unterteilungen Leerzeilen eingefügt werden. Der Programmtext muss mit den richtigen Verschiebungen geschrieben werden, damit Unterbrechungen in der Ausführungsreihenfolge leicht nachvollzogen werden können. Die ausführbaren Einzelzwecksätze jedes Moduls müssen auf eine Seite des Druckgeräts passen.

Die ersten Programme bestanden aus mehreren Dutzend bis Hunderten von Maschinenanweisungen. Softwaresysteme und Informationssysteme umfassen mehrere Zehntausend bis Millionen Betreiber in Hochsprachen. Als die Menge an Softwaretools zunahm, gewann der Prozess an erster Stelle bei der Beeinflussung der Geschwindigkeit ihrer Entwicklung. debuggen, diese. Erkennung und Korrektur von Fehlern. Die Praxis hat gezeigt, dass es nahezu unmöglich ist, ein mehr oder weniger großes Programm fehlerfrei zu schreiben. Darüber hinaus werden auch beim Betrieb vorgefertigter Programme Fehler entdeckt, die beim Debuggen übersehen wurden. Fehler lassen sich in mehrere Kategorien einteilen.

Der einfachste Grund sind Syntaxfehler. Sie hängen mit fehlerhaftem Schreiben von Sprachkonstrukten zusammen und werden sofort erkannt, wenn der Compiler versucht, das Programm in Maschinensprache zu übersetzen

Wenn alle Syntax- und Layoutfehler korrigiert sind, beginnt das Programm mit der Ausführung (Stufe Laufen). Diese Phase kann jedoch durch eine unzulässige Operation (z. B. eine Division durch Null) unterbrochen werden. In diesem Fall treten Laufzeitfehler auf. (Laufzeitfehler). Oder das Programm hat bis zum Ende gezählt, aber die erzielten Ergebnisse sind falsch. Dies kann durch Algorithmusfehler oder Fehler bei der Organisation von Intermodulverbindungen, Fehler bei der Datentypkonvertierung oder einfache Fehler verursacht werden (z. B. wurde beim Schreiben der Zahl 100 eine Null übersehen und das Programm hat bei den Berechnungen 10 verwendet).

Laufzeitfehler werden durch das Lösen einer Reihe von Testfällen erkannt (das Programm ausführen), Das Ergebnis ist im Voraus bekannt. In der Regel übersteigt der Zeitaufwand für die Suche nach solchen Fehlern den Zeitaufwand für das Schreiben des Programms selbst und die Korrektur von Syntaxfehlern deutlich. Die Entwicklung des Programmierkonzepts steht in engem Zusammenhang mit dem Problem der Fehlerreduzierung beim Schreiben eines Programms.

Es werden die theoretischen Grundlagen der strukturierten Programmierung, die Theorie des Beweises der Korrektheit eines Programms und die evidenzbasierte Programmierung entwickelt.

Das Konzept der strukturierten Programmierung setzt einen solchen wissenschaftlich fundierten Ansatz zum Aufbau eines Programms und zu den Fähigkeiten einer Programmiersprache voraus, bei dem die Menge möglicher Fehler deutlich reduziert wird. Eine wesentliche Weiterentwicklung des Konzepts wurde in der strukturierten Programmiersprache erreicht Pascal. Der Kern der strukturierten Programmierung besteht darin, dass Daten in erster Linie Abstraktionen realer Objekte sind und vorzugsweise als abstrakte Strukturen formuliert werden, die möglicherweise keine konkrete Implementierung in einer Programmiersprache haben. Beim Erstellen eines Programms wird die Datendarstellung nach der Verfeinerung des Algorithmus schrittweise verfeinert.

Eine strukturierte Programmiersprache sollte die Möglichkeit bieten, eigene Datentypen zu erstellen. Auf der untersten Ebene sind die grundlegenden Strukturen in der Sprache vordefiniert (z. B. Skalartypen, Datensatz, Array und Menge). Komplexe Strukturen werden aus Grundstrukturen wie Molekülen aufgebaut. Grundlegende Strukturvariablen können nur den Wert ändern und dabei den Typ oder die Menge gültiger Werte und die Größe, die sie einnehmen, beibehalten. Komplizierte Strukturen zeichnen sich durch eine Veränderung nicht nur der Bedeutung, sondern auch der Darstellungsform selbst und der Zusammensetzung der darin enthaltenen Grundstrukturen aus. Die dynamische Speicherverwaltung wird auf Zeigerebene implementiert und dynamische Daten werden zu einer Baumstruktur (Bäumen) zusammengefasst.

Darüber hinaus gibt es bestimmte Anforderungen an die Datentypisierung, aufgrund derer der Typ eines beliebigen Ausdrucks oder einer Variablen ohne Berechnungen bestimmt werden kann, d.h. auf der Sendebühne. In diesem Fall können Sie eine große Anzahl schwer auffindbarer Laufzeitfehler vermeiden, indem Sie sie bereits in der Phase der Programmübersetzung identifizieren.

Das Konzept der strukturierten Programmierung umfasst nicht nur die Verwendung spezieller Sprachen und die Anwendung eines bestimmten Programmierstils. Dies ist zunächst einmal eine Programmierphilosophie, die auch einen Aspekt wie die Methodik für die Ausbildung von Programmierern betrifft.

Es wird darauf hingewiesen, dass das Programmieren eine umfassende und abwechslungsreiche Tätigkeit ist, die oft komplexe mentale Arbeit erfordert. Es ist falsch zu glauben, dass sich die Programmierung auf die Verwendung vorgefertigter Rezepte reduzieren lässt, die auf einer systematischen Beschreibung der einfachsten Blöcke basieren. Die Schüler müssen die Fähigkeit zum kreativen Denken entwickeln, und die Rolle des Lehrers ist hier äußerst wichtig, indem er zeigt, wie er dies und das tut. Kreativität unterliegt keinen Regeln, Methoden und Technologien. Als Lehrmethode wird die sorgfältige Auswahl und Prüfung repräsentativer Beispiele übernommen. Es ist notwendig, komplexe und lange Programme zu berücksichtigen, die in der Praxis häufig anzutreffen sind und sich am besten zur Identifizierung dieser schwer fassbaren, aber wichtigen Eigenschaft namens „ Stil Programmierung. Das Parsen langer Programme dient als Übung in der Kunst, sie zu lesen, was nicht weniger wichtig ist als die Fähigkeit, Programme zu schreiben.

Testfragen und Aufgaben

5.1. Benennen und beschreiben Sie kurz die Teile des Programmbefehls.

5.2. Die Basis für das ODSI-Betriebsprogramm ist ____; definiere es.

5.3. Was versteht man unter Programmierung in Codes?

5.4. Was wissen Sie über Assemblersprache?

5.5. Welche Programmiersprachen werden als maschinenunabhängig bezeichnet?

5.6. Wie wird ein in einer algorithmischen Sprache geschriebenes Programm in für einen Computer verständlichen Objektcode „übersetzt“?

5.7. Was versteht man unter modularer Programmierung und Einzelmodul?

5.8. Was wissen Sie über strukturierte Programmierung?

Strukturierte Programmierung– eine Programmiermethodik, die darauf abzielt, logisch einfache und verständliche Programme zu erstellen. Der strukturierten Programmierung liegt die Annahme zugrunde, dass die Logik und Verständlichkeit eines Programms die Entwicklung, den Nachweis der Korrektheit und die anschließende Wartung des Programms erleichtert und darüber hinaus seine Zuverlässigkeit gewährleistet.

Die charakteristischen Prinzipien der strukturierten Programmierung sind:

· Top-Down-Programmierung – eine Methode zur Entwicklung von Programmen, bei der die Programmierung von oben nach unten erfolgt, vom Allgemeinen bis ins Detail;

· Modulare Programmierung, bei dem relativ unabhängige Teilaufgaben als separate Softwaremodule programmiert werden;

· Verwendung von drei Kontrollstrukturen beim Programmieren (Folgen, Auswählen, Wiederholen). Die folgende Struktur geht von einer natürlichen Reihenfolge der Ausführung von Anweisungen aus. Die Auswahlstruktur wird durch das „if-then-else“-Schema (bedingte if-Anweisung) festgelegt. Der Wiederholungsstruktur ist ein Schleifenoperator zugeordnet.

· Verweigerung bedingungsloser Kontrollübertragungen und eingeschränkter Nutzung globaler Variablen.

Die strukturierte Programmierung basiert auf einem Theorem, das in der Programmiertheorie umfassend bewiesen wurde. Sein Wesen besteht darin, dass ein Algorithmus zur Lösung eines logischen Problems nur aus „folgenden“ Strukturen bestehen kann , Verzweigung, Zyklus.“ Diese werden grundlegende algorithmische Strukturen genannt. Tatsächlich haben wir uns bisher bei allen betrachteten Programmbeispielen an die Prinzipien der strukturierten Programmierung gehalten.

Es folgt eine lineare Abfolge von Aktionen (Abb. 2.6):

Reis. 2.6. Nachfolgend

Jeder Block kann entweder einen einfachen Befehl oder eine komplexe Struktur enthalten, muss jedoch über einen Eingang und einen Ausgang verfügen.

Verzweigung algorithmische Alternative. Abhängig davon, ob die Bedingung wahr oder falsch ist, wird die Kontrolle an einen von zwei Blöcken übergeben. Dann erfolgt die allgemeine Fortsetzung (Abb. 2.7):

Reis. 2.7. Verzweigung

Zyklus Wiederholung einer bestimmten Gruppe von Aktionen entsprechend einer Bedingung. Es gibt zwei Arten von Zyklen. Erste Schleife mit Vorbedingung (Abb. 2.8):

Reis. 2.8. Schleife mit Vorbedingung

Während die Bedingung wahr ist, wird die Reihe ausgeführt, die den Schleifenkörper bildet.

Zweiter Typ einer zyklischen Struktur Zyklus mit Nachbedingung (Abb. 2.9):

Reis. 2.9. Schleife mit Nachbedingung

Hier steht der Schleifenkörper vor der Schleifenbedingung. Der Schleifenkörper wiederholt seine Ausführung, wenn die Bedingung falsch ist. Die Wiederholung endet, wenn die Bedingung wahr wird.

Theoretisch ist nur die erste Zyklusart notwendig und ausreichend Schleife mit Vorbedingung. Damit kann jeder zyklische Algorithmus konstruiert werden. Dies ist eine allgemeinere Version einer Schleife als eine Before-Schleife. Tatsächlich wird der Rumpf der To-Schleife auf jeden Fall mindestens einmal ausgeführt, da die Bedingung nach Abschluss ihrer Ausführung überprüft wird. Bei einer Schleife ist es jedoch möglich, dass der Schleifenkörper nicht einmal ausgeführt wird. Daher wäre es in jeder Programmiersprache möglich, uns auf eine While-Schleife zu beschränken. In einigen Fällen ist die Verwendung eines Loop-Do jedoch praktischer und wird daher verwendet.

In der Literatur wird strukturiertes Programmieren manchmal als Programmieren ohne Goto bezeichnet. Tatsächlich gibt es bei diesem Ansatz keinen Platz für einen bedingungslosen Übergang. Die ungerechtfertigte Verwendung des goto-Operators in einem Programm beraubt es seiner Struktur und damit aller damit verbundenen positiven Eigenschaften: Transparenz und Zuverlässigkeit des Algorithmus. Obwohl dieser Operator in allen prozeduralen Programmiersprachen vorhanden ist, sollte seine Verwendung aufgrund eines strukturellen Ansatzes vermieden werden.

Ein komplexer Algorithmus besteht aus miteinander verbundenen Grundstrukturen. Diese Strukturen können auf zwei Arten verbunden werden: konsistent Und verschachtelt. Diese Situation ähnelt der, die wir in der Elektrotechnik beobachten, wo jeder noch so komplexe Stromkreis in in Reihe und parallel geschaltete Abschnitte zerlegt werden kann.

Verschachtelte algorithmische Strukturen sind nicht mit parallel geschalteten Leitern vergleichbar. Die Analogie mit ineinander gesteckten Nistpuppen ist hier passender. Wenn der Block, der den Schleifenkörper bildet, selbst eine zyklische Struktur ist, dann gibt es verschachtelte Schleifen. Die innere Schleife kann wiederum eine weitere Schleife enthalten usw. In diesem Zusammenhang wird eine Vorstellung von der Tiefe der Verschachtelung von Schleifen vorgestellt. Ebenso können Zweige ineinander verschachtelt werden.

Der strukturelle Ansatz erfordert die Einhaltung eines Standards bei der Darstellung von Flussdiagrammen von Algorithmen. Sie müssen wie in allen Beispielen gezeichnet werden. Jede Grundstruktur muss einen Eingang und einen Ausgang haben. Ein nicht standardmäßiges Flussdiagramm ist schwer zu lesen und die Klarheit des Algorithmus geht verloren.

Die Programmiersprachen Pascal und C werden als strukturierte Programmiersprachen bezeichnet. Sie enthalten alle notwendigen Kontrollstrukturen für den strukturellen Aufbau des Programms. Durch die Strukturierung des Erscheinungsbildes des Programmtextes wird dieser Aufbau verdeutlicht. Die hierfür verwendete Haupttechnik Zeilenverschiebungen, die den folgenden Regeln entsprechen müssen:

Konstruktionen derselben Verschachtelungsebene werden auf derselben vertikalen Ebene geschrieben (beginnend an derselben Position in der Zeile);

Die verschachtelte Struktur wird entlang der Linie mehrere Positionen nach rechts verschoben geschrieben, relativ zu der Struktur, die außerhalb davon liegt.

Strukturelle Algorithmisierungstechnik Dies ist nicht nur eine Form der Beschreibung eines Algorithmus, sondern auch eine Denkweise eines Programmierers . Wenn Sie einen Algorithmus erstellen, sollten Sie versuchen, ihn aus Standardstrukturen zusammenzusetzen. Mithilfe einer Konstruktionsanalogie können wir sagen, dass die strukturelle Methodik zur Konstruktion eines Algorithmus dem Zusammenbau eines Gebäudes aus Standardabschnitten ähnelt, im Gegensatz dazu, es Stein für Stein zu errichten.

Eine weitere wichtige technologische Technik der strukturierten Programmierung ist die Zerlegung des zu lösenden Problems in Teilaufgaben einfachere Teile des ursprünglichen Problems aus Programmiersicht. Algorithmen zur Lösung solcher Teilprobleme werden Hilfsalgorithmen genannt. Diesbezüglich gibt es zwei Möglichkeiten, den Algorithmus zu konstruieren:

„top-down“: Zuerst wird der Hauptalgorithmus erstellt, dann Hilfsalgorithmen;

„bottom-up“: Zuerst werden Hilfsalgorithmen kompiliert, dann der Hauptalgorithmus.

Der erste Ansatz wird auch als Sequential-Detailing-Methode bezeichnet, der zweite Montagemethode.

Die Assemblermethode beinhaltet die Anhäufung und Verwendung von Bibliotheken von Hilfsalgorithmen, die in Programmiersprachen in Form von Unterprogrammen, Prozeduren und Funktionen implementiert sind. Bei der sequentiellen Detaillierung wird zunächst der Hauptalgorithmus erstellt und anschließend werden ihm Aufrufe an Hilfsalgorithmen der ersten Ebene hinzugefügt. Danach werden Hilfsalgorithmen der ersten Ebene kompiliert, die Aufrufe an Hilfsalgorithmen der zweiten Ebene usw. enthalten können. Die Hilfsalgorithmen der untersten Ebene bestehen nur aus einfachen Befehlen.

Die Methode der sequentiellen Detaillierung wird bei jedem Entwurf komplexer Objekte verwendet. Dies ist eine natürliche logische Denkfolge für einen Designer: schrittweises Eintauchen in Details. In unserem Fall geht es auch um Design, allerdings nicht um technische Geräte, sondern um Algorithmen. Es ist nahezu unmöglich, auf andere Weise einen ausreichend komplexen Algorithmus zu konstruieren.

Bei der sequentiellen Detaillierungsmethode wird zunächst das ursprüngliche Problem analysiert. Es identifiziert Teilaufgaben. Es wird eine Hierarchie solcher Teilaufgaben aufgebaut. Dann werden Algorithmen (oder Programme) kompiliert, beginnend mit dem Hauptalgorithmus (Hauptprogramm), dann Hilfsalgorithmen (Unterprogramme) mit einer sequentiellen Vertiefung der Ebene, bis wir Algorithmen erhalten, die aus einfachen Befehlen bestehen.

Erster Schritt der Detaillierung. Zunächst skizzieren wir alle notwendigen Unterprogramme und geben nur deren Überschriften (Spezifikationen) an. Anstelle des Hauptteils der Unterroutine schreiben wir erläuternde Kommentare (diese Art von Unterroutine wird „Stub“ genannt). Schreiben wir den Hauptteil des Programms. Und dann kehren wir zur detaillierten Programmierung von Prozeduren und Funktionen zurück. In der ersten Phase der Programmierung beschreiben wir anstelle des Hauptteils der Unterroutine ihren Zweck in Form eines Kommentars.

Durch die Verwendung strukturierter Programmierung können Sie die Geschwindigkeit beim Schreiben von Programmen erhöhen und das Debuggen des geschriebenen Programms erleichtern. Strukturierte Programmierung ist auch in Assembler-Programmiersprachen möglich, die keine strukturierten Operatoren ähnlich den strukturierten Operatoren der Programmiersprachen C, PASCAL und PL/M bereitstellen.

Die Programmierung für Universalcomputer begann mit der Programmierung in Maschinencodes, dann erschienen Hochsprachen und begannen sich zu entwickeln, dann entwickelte Dijkstroy die Prinzipien der strukturierten Programmierung, die strukturierte Programmierung wurde durch die Objektprogrammierung ersetzt und die visuelle Programmierung entwickelt sich derzeit aktiv weiter.

Die Programmierung für Mikrocontroller folgt weitgehend dem gleichen Weg. Der Übergang von Stufe zu Stufe hängt von den verfügbaren internen Ressourcen der Mikrocontroller ab. Noch vor wenigen Jahren war der Einsatz von Hochsprachen aufgrund des geringen internen Programmspeichers unmöglich. (Bei günstigen Modellen von Mikrocontrollern besteht diese Situation immer noch.) Mit dem Aufkommen von Mikrocontrollern und einer internen Speicherkapazität von mehreren zehn Kilobyte entsteht derzeit die Möglichkeit des Objektdesigns.

Derzeit gibt es zwei Möglichkeiten, Programme zu schreiben: Bottom-Up und Top-Down. Wenn Sie ein Programm von Grund auf schreiben, ist es unmöglich, mit dem Debuggen des Programms zu beginnen, ohne das gesamte Programm zu schreiben. Beim Schreiben eines Programms von oben nach unten, was bei der strukturierten Programmierung obligatorisch ist, kann das Programm in jeder Phase des Schreibens übersetzt und ausgeführt werden, und alle bis zu diesem Zeitpunkt geschriebenen algorithmischen Aktionen des Programms können verfolgt werden. Der Prozess des Schreibens eines Programms unterscheidet sich nicht vom Prozess der Erstellung eines Algorithmus. Darüber hinaus können diese Phasen der Programmerstellung kombiniert werden. Die ausgeführte algorithmische Aktion wird im Namen des Unterprogramms angezeigt. Zum Beispiel:

Die Grundidee der strukturierten Programmierung besteht darin, dass es nur vier Strukturoperatoren gibt. Mit diesen Strukturoperatoren können Sie ein beliebig komplexes Programm erstellen.

Der erste Strukturoperator wird aufgerufen lineare Kette von Operatoren. Jede Aufgabe kann in mehrere Teilaufgaben unterteilt werden. Die Ausführung von Unteraufgaben kann einem Unterprogramm anvertraut werden, dessen Name die Unteraufgabe widerspiegeln kann (und sollte), die dieses Unterprogramm lösen muss. Zum Zeitpunkt des Schreibens des Algorithmus (und Programms) der obersten Ebene sind wir nicht daran interessiert, wie dieses Problem gelöst wird, daher werden wir anstelle dieser Unterroutine Folgendes einsetzen