Dieser Ansatz ist zum Scheitern verurteilt und muss normalerweise von Grund auf neu geschrieben werden.
Um dieses Szenario zu lösen, können wir also versuchen, das Problem in mehrere Teilprobleme zu unterteilen und dann versuchen, es nacheinander zu lösen ein.
Dies erleichtert nicht nur unsere Aufgabe, sondern ermöglicht uns auch, Jetzt Die große Frage ist, wie man nicht theoretisch "zerbricht", sondern SOFTWARE. Wir werden mehrere verschiedene Arten solcher Einheiten in populären Sprachen wie C / C++ sehen, Python und Java. Zur Veranschaulichung: Nehmen wir an, wir haben alle grundlegenden verknüpften Listeneinfügungen in einem Programm. Da es viele Methoden (Funktionen) gibt, können wir das Programm nicht überladen, indem wir alle Methodendefinitionen über die erforderliche Hauptfunktion schreiben. Aber selbst wenn wir das täten, könnte es ein Problem geben, Methoden zu ordnen, wenn eine Methode vor einer anderen stehen sollte, und so weiter. Um dieses Problem zu lösen, können wir also alle Prototypen am Anfang deklarieren das Programm und dann die Main-Methode und darunter können wir sie in beliebiger Reihenfolge definieren: Program: Wechseln Sie zu C/C++
< a href = # Python> Zu Python springen
Zu Java springen
< Codeklasse ="undefinierte Leerzeichen">
< Codeklasse ="undefinierte Leerzeichen">
|
Kompilieren des Codes: können wir das obige Programm kompilieren:
gcc linkedlist.c -o linkedlist
Und es funktioniert!
Die Hauptprobleme im obigen Code:
Wir sehen bereits die Hauptprobleme mit dem Programm, es ist nicht so einfach, mit dem Code zu arbeiten, weder einzeln noch in einer Gruppe.
Falls jemand mit dem obigen arbeiten möchte Programm, dann einige der vielen Probleme, mit denen diese Person konfrontiert ist:
- Man muss die vollständige Quelldatei durchgehen. um einige Funktionen zu verbessern oder zu verbessern.
- Kann nicht einfach wiederverwendet werden das Programm als Grundlage für andere Projekte.
- Der Code ist sehr unübersichtlich und überhaupt nicht attraktiv, was es sehr schwierig macht, durch den Code zu navigieren.
Im Falle eines Gruppenprojekts oder großer Programme erhöht der obige Ansatz garantiert die Gesamtkosten, den Energieaufwand und die Ausfallraten.
Korrekter Ansatz:
Wir sehen, dass diese Zeilen in jedem C/C++-Programm beginnen, das mit "#include" beginnt.
Das bedeutet zu enthalten alle Funktionen, die im "library"-Header deklariert sind (.h-Dateien) und möglicherweise in library.c / cpp -Dateien definiert sind.
Diese Zeilen werden zur Kompilierzeit vorverarbeitet.
Wir können versuchen, eine solche Bibliothek für unsere eigenen Zwecke manuell zu erstellen.
Wichtige Dinge, die Sie beachten sollten :
- Die ".h"-Dateien enthalten nur Prototypdeklarationen (wie Funktionen, Strukturen) und globale Variablen.
- Die ".c / .cpp"-Dateien enthalten die eigentliche Implementierung (Deklarationsdefinitionen in Header-Dateien)
- Beachten Sie beim Kompilieren aller Quelldateien, dass mehrere Definitionen derselben Funktion, Variable usw. sind für dasselbe Projekt nicht vorhanden. (SEHR WICHTIG)
- Verwenden Sie statische Funktionen, um sich auf die Datei zu beschränken, in der sie deklariert sind.
- Verwenden Sie das Schlüsselwort extern , um Variablen zu verwenden, auf die verwiesen wird, und externe Dateien.
- Seien Sie bei der Verwendung von C++ vorsichtig mit Namensräumen, verwenden Sie immer namespace_name:: function (), um Kollisionen zu vermeiden. ol >
Durch Aufteilen des Programms in kleinere Codes:
Nachdem wir das obige Programm untersucht haben, können wir sehen, wie dieses große Programm in geeignete kleine Teile aufgeteilt werden kann dann leicht verarbeitet.
Das obige Programm hat im Wesentlichen 2 Hauptfunktionen:
1) Daten in Knoten erstellen, einfügen und speichern.
2) Knoten anzeigen
Auf diese Weise kann ich das Programm entsprechend aufteilen:
1) Die Hauptdatei ist > Programmtreiber, Nice Wrapper von Insertion Modules und wo wir zusätzliche Dateien verwenden.
2) Einfügen - > Hier liegt die eigentliche Implementierung.
Mit den genannten wichtigen Punkten gliedert sich das Programm in:
linkedlist.c - > Enthält Treiberprogramm
insert.c - > Enthält Code zum Einfügenlinkedlist.h - > Enthält die notwendigen Node-Deklarationen
insert.h - > Enthält die notwendigen Node Insertion Declarations
In jeder Header-Datei beginnen wir mit:
#ifndef FILENAME_H #define FILENAME_H Declarations ... #endif
Wir schreiben unsere Deklarationen zwischen #ifndef, #define und #endif, um zu verhindern, dass beim Aufruf ein und derselben Header-Datei mehrfache Deklarationen von Bezeichnern wie Datentypen, Variablen usw in einer neuen Datei, die zum selben Projekt gehört.
Für dieses Beispielprogramm:
insert.h - > Enthält die Deklaration des Insert-Knotens sowie die Deklaration des Knotens selbst.
Es ist sehr wichtig, sich daran zu erinnern, dass der Compiler Deklarationen in der Header-Datei sehen kann, aber wenn Sie versuchen, Code zu schreiben, dass include die Deklaration an anderer Stelle, führt dies zu einem Fehler, da der Compiler jede .c-Datei einzeln kompiliert, bevor er mit dem Verknüpfungsschritt fortfährt. ,
connectedlist.h - > Eine Hilfsdatei, die Node und seine Display-Deklarationen enthält, die für Dateien enthalten sein müssen, die sie verwenden.
insert.c - > Fügen Sie eine Node-Deklaration über #include "connectedlist.h", ein, die die Deklaration sowie alle anderen in insert.h deklarierten Methodendefinitionen enthält.
connectedlist.c - > Einfacher Wrapper, der eine Endlosschleife enthält, die den Benutzer auffordert, ganzzahlige Daten an den erforderlichen Positionen einzufügen, und der auch eine Methode enthält, die die Liste anzeigt.
Und das Letzte, woran man denken sollte, ist das bedeutungslos Einschluss von Dateien ineinander kann zu mehreren Überschreibungen führen und führt zu einem Fehler.
Unter Berücksichtigung des Obigen sollten Sie sorgfältig in geeignete Routinen unterteilen.
|
insert.h
|
insert.c
< ShopLatest questions Wiki |