|
|
UE AlgoDat1 - Angabe SS 99 (TU Wien) |
|||||||||||||||||||||||||
![]() |
||||||||||||||||||||||||||
|
Inhalt |
|||||||||||||||||||||||||
![]() |
Allgemeine Hinweise zu den ÜbungsbeispielenBeispielzuteilungIm Laufe des Semesters sind drei Programmieraufgaben am Computer auszuarbeiten. In jeder Beispielgruppe gibt es mehrere Beispiele, von denen Ihnen jeweils eines entsprechend Ihrer Matrikelnummer wie folgt zugeteilt ist:
Zur Erinnerung: Für natürliche Zahlen n und m versteht man unter "n mod m" den Rest, den man bei Division von n durch m erhält. Achtung: Die Beispielzuteilung ist obligatorisch! AbgaberichtlinienEin Beispiel wird von den Tutoren nur angenommen, wenn es den folgenden Anforderungen genügt.
Programmierhinweise
Weitere InformationenSehr wichtige Informationen werden in der Vorlesung bekanntgegeben. Sehr viel effizienter werden Sie jedoch über das Internet informiert. Dazu müssen Sie zunächst in den Benutzerräumen des EDV-Zentrums einen eigenen Account beantragen, sofern Sie dies nicht schon getan haben. Mit diesem Account können Sie die elektronischen Aushänge (WWW, News) lesen, und per email mit uns kommunizieren, was Ihnen unter Umständen einen Besuch in der Sprechstunde erspart. Sollten Sie - warum auch immer - keinen Account in den Benutzerräumen haben/bekommen, stehen Ihnen im großen Übungsraum des Informatiklabors (Hauptgebäude, Stiege 5, 1. Stock) einige PCs zur Verfügung, um auf die Web-Seiten des Instituts zugreifen zu können. Folgende URLs sind für Sie wichtig:
Anmerkung: Alle Personenbezeichnungen sind geschlechtsneutral zu verstehen, auch wenn in dieser Beispielsammlung aus Gründen der leichteren Lesbarkeit die männliche Bezeichnung verwendet wird. |
|||||||||||||||||||||||||
![]() |
A1 MengenlehreGegeben seien bis zu 10 Mengen, deren Elemente Zahlen sind. Schreiben Sie ein Programm, welches die Anwendung von Mengenoperatoren auf diese Mengen erlaubt. Die Mengen sind in einer Datei gespeichert, die pro Zeile eine Menge enthält. Die Elemente sind durch Leerzeichen voneinander getrennte Zahlen (Integer) in beliebiger Reihenfolge. Es sind keine doppelten Elemente in einer Menge erlaubt. Es ist aber möglich, daß eine Menge leer ist (nur Zeilenvorschub). Beispiel für das Dateiformat: 15 34 5 2 45 56 29 36 ... Das Programm soll menügesteuert folgende Funktionen bieten:
Bei der Vereinigung, dem Durchschnitt und der Differenz zweier Mengen sollen drei Mengen durch Eingabe ihrer Nummern gewählt werden können. Auf die ersten beiden soll die Operation angewendet werden, in die dritte soll das Ergebnis geschrieben werden. Danach sollen alle drei Mengen am Bildschirm ausgegeben werden. Datenstruktur Die 10 Mengen sind in einem Feld zu verwalten. Jede Menge soll durch eine aufsteigend sortierte lineare Liste repräsentiert werden. Beachten Sie, daß auch das Ergebnis einer Mengenoperation wieder eine aufsteigend sortierte Liste sein muß. |
|||||||||||||||||||||||||
![]() |
A2 ZahlenlisteSchreiben Sie ein Programm, das eine Folge von ganzen Zahlen im Bereich [-32000, 32000] verwaltet. Die Zahlen sind in einer Textdatei gespeichert (nicht notwendigerweise sortiert), jede Zahl steht in einer eigenen Zeile. Beispiel für das Dateiformat: 15 2048 111 ... Das Programm soll menügesteuert folgende Funktionen bieten:
Datenstruktur Die Zahlen sollen in einer absteigend sortierten linearen Liste gespeichert werden. Als Schlüssel eines Listeneintrags dient die Zahl selbst. |
|||||||||||||||||||||||||
![]() |
A3 WortlisteSchreiben Sie ein Programm, das eine Wortliste verwaltet. Die Wörter sind in einer Textdatei gespeichert, jedes Wort (max. 70 Zeichen, nur Buchstaben) steht in einer eigenen Zeile. Beispiel für das Dateiformat: schreiben Programm Wortliste ... Das Programm soll menügesteuert folgende Funktionen bieten:
Datenstruktur Die Wörter sollen in einer mehrfach verketteten Liste gespeichert werden, die nach zwei Suchkriterien sortiert ist:
Für jedes Suchkriterium soll die Liste doppelt verkettet werden, d.h. es soll jeweils einen Vorwärts- und einen Rückwärtszeiger geben. Es sollen keinesfalls zwei sortierte Listen verwendet werden! |
|||||||||||||||||||||||||
![]() |
A4 GruppeneinteilungDie Teilnehmer an der Übung AlgoDat 1 sollen in verschiedene Gruppen eingeteilt werden. Entwerfen Sie ein Programm, das eine solche Gruppeneinteilung nach verschiedenen Kriterien erlaubt. Die Teilnehmerdaten sind in Form einer Textdatei gespeichert. Jede Zeile enthält, mit Leerzeichen getrennt, die Matrikelnummer und den Namen (max. 22 Zeichen) eines Teilnehmers. Beispiel für das Dateiformat: 3333333 Muster Max 4444444 Beispiel Birgit ... Dem Benutzer sollen menügesteuert folgende Funktionen zur Verfügung gestellt werden:
Zur Realisierung des Programms schreiben Sie bitte neben geeigneten Funktionen bzw. Prozeduren, die die obengenannten Aufgaben erledigen, die folgenden zwei Funktionen:
Datenstruktur Als Datenstruktur für die Teilnehmerliste verwenden Sie bitte eine einfach verkettete lineare Liste, deren Elemente mit den folgenden Komponenten ausgestattet sein sollen: Name, Matrikelnummer (LongInt) und Gruppennummer (Integer). Funktionsparameterübergabe in Turbo Pascal Um eine Funktion als Parameter an eine Funktion oder Prozedur übergeben zu können, müssen Sie zunächst einen entsprechenden Funktionstyp deklarieren und die Funktionsvariable in der Parameterliste diesem Typ zuordnen. In unserem Fall könnte das dann beispielsweise so aussehen:
Ein Aufruf der Funktion map könnte jetzt z.B. folgende Form haben: gruppenliste := map(namensliste,f1); |
|||||||||||||||||||||||||
![]() |
A5 HörsaalreservierungEntwickeln Sie ein Programm zur Verwaltung von Hörsaalreservierungen. Dem Benutzer sollen folgende Möglichkeiten zur Verfügung stehen:
Beim Laden und Speichern soll folgendes Dateiformat verwendet werden: Für alle Hörsäle: Hörsaalname in einer eigener Zeile, dann Reservierungen für diesen Hörsaal jeweils in einer eigenen Zeile mit Name, Datum, Beginnzeit und Endzeit (durch Leerzeichen getrennt). Alle Reservierungszeilen beginnen dabei mit einem Tabulatorzeichen. Beispiel für das Dateiformat: HS1 Kodydek 01.01.1999 07:00 10:30 Buehler 24.12.1999 09:30 10:45 FH7 Huber 07.04.1999 14:30 16:30 ... Datenstrukturen Zur Verwaltung aller Hörsäle ist eine alphabetisch sortierte lineare Liste zu verwenden. Zu jedem Hörsaal soll jeweils eine weitere, nach Beginnzeiten sortierte lineare Liste zur Verwaltung der Reservierungsdaten eingesetzt werden. |
|||||||||||||||||||||||||
![]() |
B1 FilmdatenbankSchreiben Sie ein Programm, welches dazu dient, Filme und Schauspieler zu verwalten. Die nötigen Daten sind in einer Datei gespeichert. Dabei sind pro Zeile ein Filmtitel (max. 30 Zeichen) und der Name des mitspielenden Schauspielers (max. 30 Zeichen) durch ein Komma voneinander getrennt eingetragen. Jeder Schauspieler kann in verschiedenen Filmen mitspielen. Ebenso können jedem Filmtitel mehrere Schauspieler zugeordnet sein. Beispiel für das Dateiformat: Snake Eyes,Nicolas Cage The Rock,Nicolas Cage The Rock,Sean Connery ... Das Programm soll menügesteuert folgende Funktionen bieten:
Datenstruktur Zum Speichern der Filme bzw. Schauspieler verwenden Sie jeweils eine eigene Hashtabelle mit äußerer Verkettung. Zu jedem Film ist eine alphabetisch sortierte lineare Liste mit Verweisen auf die dazugehörigen Schauspieler zu speichern. Umgekehrt soll aber auch für jeden Schauspieler eine alphabetisch sortierte lineare Liste mit Verweisen auf die dazugehörigen Filme verwaltet werden. Beim Löschen eines Schauspielers ist zu beachten, daß auch alle Referenzen auf ihn in Filmen gelöscht werden müssen. Falls ein Film dadurch ohne Schauspieler ist, muß auch der Film entfernt werden. Alle Listen und Hashtabellen sollen auf den selben Daten operieren, es sollen keine Daten mehrfach abgespeichert werden! |
|||||||||||||||||||||||||
![]() |
B2 InterpreterEntwickeln Sie einen Interpreter für eine einfache Programmiersprache, die Berechnungen mit globalen Integer-Variablen und globalen, parameterlosen Prozeduren erlaubt. Variablen- und Prozedurnamen bestehen nur aus Buchstaben. Alle Befehle und Variablennamen werden in Großbuchstaben konvertiert. Folgende syntaktische Konstrukte sind notwendig (Argumente in eckigen Klammern sind optional, eckige Klammern mit angehängtem Pluszeichen können beliebig oft (auch gar nicht) wiederholt werden, beim senkrechten Strich muß genau eine der durch den Strich getrennten Varianten gewählt werden): Char: 'A'...'Z' Digit: '0'...'9' Int: Digit [ Digit ]+ Id: Char [ Char ]+ Expression: Id | Int | '(' Expression '+' Expression ')' | '(' Expression '-' Expression ')' | '(' Expression '*' Expression ')' | '(' Expression '/' Expression ')' Der Interpreter soll eine Sequenz von Kommandos der folgenden Art von einer Datei lesen und abarbeiten können: Command: 'LET ' Id ':=' Expression | 'WRITE ' Expression | 'CALL ' Id | 'PROCEDURE ' Id ':' | 'END' Jede Zeile enthält genau ein Command. Whitespaces (Leerzeichen, Tabulator) sind zu überlesen. Nachdem der Interpreter alle Zeilen eingelesen hat, soll das Programm interpretiert werden. Sie können davon ausgehen, daß sich das Hauptprogramm immer nach etwaigen Prozeduren befindet. Bedeutung der Befehle:
Eine mögliche Eingabedatei kann so aussehen: PROCEDURE ZWEIMAL : LET RES:=(B*2) END PROCEDURE BERECHNE : LET B:=WERT CALL ZWEIMAL LET SUM:=RES LET B:=5 CALL ZWEIMAL LET SUM:=(SUM+RES) END LET WERT=6 CALL BERECHNE WRITE SUM Die Ausgabe dieses Programms ist "22". Datenstrukturen Vor der eigentlichen Abarbeitung des Programms muß ein Verzeichnis aller Variablen- und Prozedurnamen aufgebaut werden. Verwenden Sie hierzu eine Hashtabelle, in der eine gegebene Variable oder Prozedur bei der eigentlichen Abarbeitung rasch gefunden werden kann. Bei Variablen kann der aktuelle Wert mitgespeichert werden. Im Fall von Prozeduren ist eine lineare Liste für alle ihre Anweisungen zu speichern. Jede Anweisung wird durch einen entsprechenden Parse-Tree repräsentiert. Damit während der Interpretation eines Programms nach der Abarbeitung einer Prozedur der Programmablauf an der richtigen Stelle fortgesetzt werden kann, werden Rücksprungreferenzen (Verweise auf die einem Aufruf folgende Anweisung) in Form eines Stacks verwaltet. |
|||||||||||||||||||||||||
![]() |
B3 CD VerwaltungEntwickeln Sie ein Programm zur Verwaltung von CDs. Die nötigen Daten sind in einer Datei gespeichert. Dabei sind pro Zeile der Name eines Interpreten (max. 30 Zeichen) und, durch ein Komma getrennt, der dazugehörige Titel der CD (max. 30 Zeichen) eingetragen. Zu einem Interpreten können mehrere CD-Titel existieren. Ein CD-Titel dagegen ist genau einem Interpreten zugeordnet. Beispiel für das Dateiformat: U2,Joshua Tree U2,One REM,Out of Time ... Das Programm soll menügesteuert folgende Funktionen bieten:
Datenstruktur Verwenden Sie zur Speicherung der Interpreten einen binären Baum. Die CD-Titel sollen in einer Hashtabelle mit äußerer Verkettung verwaltet werden. Bei jedem CD-Titel speichern Sie auch einen Verweis auf den jeweiligen Interpreten. Um auch effizient alle CD-Titel für einen bestimmten Interpreten zu finden, verwalten Sie noch zusätzlich bei jedem Interpreten eine alphabetisch sortierte Liste mit Verweisen auf alle seine CD-Titel. Alle Listen und Hashtabellen sollen auf den selben Daten operieren, es sollen keine Daten mehrfach abgespeichert werden! |
|||||||||||||||||||||||||
![]() |
B4 StücklistenverwaltungFür einen Fertigungsbetrieb sollen alle Komponenten, aus denen ein zu fertigendes Produkt besteht, in Form einer hierarchischen Stückliste verwaltet werden. Ein Produkt besteht dabei aus mehreren Komponenten, die selbst wiederum aus beliebig vielen anderen Komponenten zusammengesetzt werden können. Für jede Komponente wird zusätzlich vermerkt, wieviel Stück von ihr benötigt werden, um eine Einheit der übergeordneten Komponente zu fertigen. Der Einfachheit halber ist es nicht möglich, daß eine Komponente an verschiedenen Stellen in der Produkthierarchie vorkommt. Das Programm soll menügesteuert folgende Funktionen bieten:
Die Gesamtstückzahl einer Komponente ist zu ermitteln, indem die Stückzahl der Komponente mit den Stückzahlen ihrer übergeordneten Komponenten multipliziert wird. Beim Laden und Speichern sind die Daten hierarchisch (Preorder) aufgelistet. Jede Komponente steht in einer eigenen Zeile. Sie besteht aus der Hierarchieebene (Integer), die beim Produkt mit 0 beginnt, dem Namen (max. 30 Zeichen, nur Buchstaben) und der Stückzahl (Integer), die benötigt wird, um eine Einheit der übergeordneten Komponente zu fertigen. Die Informationen sind durch Leerzeichen voneinander getrennt. Beispiel für das Dateiformat: 0 Fahrzeug 1 1 Rad 4 2 Schraube 4 2 Felge 1 2 Reifen 1 1 Motor 1 ... Datenstruktur Um die Suche nach Komponenten effizient zu gestalten, sollen die Komponenten in Form eines binären Baumes gespeichert werden. Für jede Komponente ist dabei der Name, die Stückzahl, ein Verweis auf die übergeordnete Komponente (brauchbar beim Löschen einer Komponente) sowie eine lineare Liste mit Verweisen auf alle Unterkomponenten zu speichern. |
|||||||||||||||||||||||||
![]() |
B5 DateisystemImplementieren Sie eine Simulation für ein Dateisystem. Das Programm soll den Inhalt eines Verzeichnisses (in Listenform) alphabetisch sortiert anzeigen. Ein Verzeichniseintrag kann entweder eine Datei oder ein Verzeichnis sein. Über die Eingabe von Kommandos sollen folgende Operationen ausgeführt werden können:
Ist der ausgewählte Eintrag beim Kopieren, Verschieben oder Löschen ein Verzeichnis, muß die Operation auf alle Dateien bzw. Unterverzeichnisse angewendet werden. Die Quelle bezieht sich jeweils auf einen Eintrag aus dem aktuellen Verzeichnis, daher reicht der Name des Eintrags aus. Beim Ziel dagegen muß der gesamte Pfad mitangegeben werden (z.B. beim Kopieren: cp Datei1 Wurzel/VerzeichnisB/Datei3). Die Operationen Löschen, Umbenennen, Verzeichnis-Anlegen und Datei-Anlegen beziehen sich immer nur auf Einträge des aktuellen Verzeichnisses und benötigen daher keine Pfadangabe. Nach jeder Operation muß die Anzeige am Bildschirm aktualisiert werden. Nach dem Laden eines Dateisystems soll das Hauptverzeichnis angezeigt werden. Beim Laden und Speichern hat das Dateiformat wie folgt auszusehen: Das Dateisystem ist in Preorder in einer Textdatei gespeichert, d.h. übergeordnete Verzeichnisse kommen immer zuerst. Zu jedem Eintrag wird die Hierarchieebene (Integer, Wurzelebene = 0) und ein Name (max. 30 Zeichen, nur Buchstaben), mit Leerzeichen voneinander getrennt, gespeichert. Jeder Eintrag steht in einer eigenen Zeile. Beispiel: Wurzel---VerzeichnisA---Datei1 ! +------------Datei2 +------VerzeichnisB---VerzeichnisC---Datei3 +------------VerzeichnisD Ergibt folgende Datei: 0 Wurzel 1 VerzeichnisA 2 Datei1 2 Datei2 1 VerzeichnisB 2 VerzeichnisC 3 Datei3 2 VerzeichnisD Datenstruktur Von der Struktur her ist ein Dateisystem (das keine symbolischen Verweise unterstützt) äquivalent einem allgemeinen Baum. Dateien sind immer Blätter, Unterverzeichnisse im allgemeinen Zwischenknoten (ausgenommen leere Verzeichnisse). Jeder Eintrag hat einen "Backpointer" auf den Vaterknoten (Wurzel: nil), damit man den Baum auch in umgekehrter Richtung (vom Blatt zur Wurzel) durchwandern kann. Doppelte Einträge in einem Verzeichnis sind verboten (Achtung bei Kopierfunktion etc.). Der Inhalt von Dateien muß nicht repräsentiert werden. Aktueller Hinweis zum Übungsbeispiel B5 "Dateisystem"Die Spezifikation des Dateiformats dieses Beispiels hat sich leider als etwas unzureichend erwiesen: Beim Laden aus einer Datei kann unter Verwendung des gegebenen Dateiformats in der jeweils untersten Verzeichnisebene nicht unterschieden werden, ob es sich um ein leeres Verzeichnis oder einfach um eine Datei handelt. Betrachten Sie daher beim Laden aus einer Datei alle Einträge aus der jeweils untersten Ebene als einfache Dateien. Im genannten Beispiel ist VerzeichnisD also als Datei einzulesen. Erst nachher kann man (interaktiv) auch leere Verzeichnisse hinzufügen. Beim Speichern in die Datei werden dann eventuelle leere Verzeichnisse wieder wie normale Dateien gespeichert - in der Datei ist dann der Unterschied also nicht mehr ersichtlich. |
|||||||||||||||||||||||||
![]() |
C1 TabellenkalkulationEntwickeln Sie eine primitive Tabellenkalkulation. Der Arbeitsbereich sei ein einfacher Textbildschirm, der in 8 Spalten A...H und 16 Zeilen aufgeteilt ist. Ein Feld wird durch den Spaltennamen und die Zeilennummer referenziert (z.B. C6). Ein Feld kann leer sein oder eine Formel beinhalten, deren aktueller Wert immer am Bildschirm angezeigt werden soll. Formeln bestehen aus Integer-Konstanten, Referenzen auf andere Felder bzw. folgenden Funktionen, die auch beliebig geschachtelt verwendet werden können:
Über die Eingabe von Kommandos soll ein Benutzer die Tabelle manipulieren können:
Beim Laden und Speichern hat das Dateiformat wie folgt auszusehen: Jedes nicht-leere Feld wird in Form einer eigenen Textzeile abgespeichert. Die Syntax dieser Zeile entspricht dabei genau der "händischen" Formelzuweisung, d.h. z.B. 'C6:=SUM(A3..C6)/(10+G4)'. Die Reihenfolge, in der die Felder in der Datei stehen, ist beliebig. Leere Felder werden in der Datei nicht speziell vermerkt. Datenstruktur Die Tabelle kann als zweidimensionales Array effizient realisiert werden. Formeln sollen unmittelbar nach der Eingabe bzw. dem Einlesen aus einer Datei geparst und in Form eines Parse-Trees abgespeichert werden. Grundsätzlich und insbesondere bei den Parse-Trees ist auf eine saubere, objekt-orientierte Implementation zu achten. Referenzen auf Felder werden besser nicht durch Zeiger, sondern durch entsprechende Zeilen- und Spaltenindizes gespeichert. Propagieren von Änderungen Wird der Inhalt eines Feldes geändert und sein Wert neu ermittelt, so sind die aktuellen Werte aller anderen davon betroffenen Felder ebenfalls neu zu berechnen. Um dies effizient realisieren zu können, ist eine zusätzliche Adjazenzliste zu verwalten, die diese Abhängigkeiten widerspiegelt. D.h., es wird zusätzlich zu einer eventuellen Formel für jedes Feld gespeichert, in welchen anderen Feldern es referenziert wird. Jedenfalls sind unnötige Mehrfachberechnungen bereits bekannter Werte zu vermeiden. Der der Tabelle zu Grunde liegende Abhängigkeitsgraph muß zyklenfrei sein. Daher darf der Benutzer durch Eingabe neuer Formeln keine Zyklen erzeugen. Dies kann man erreichen, indem man nach Eingabe einer Formel zunächst den Graphen auf Zyklen überprüft. Bei Vorliegen eines Zyklus wird dann einfach die Annahme der Formel verweigert. Der Test auf Zyklenfreiheit erfolgt durch simples Abarbeiten und Markieren des Graphen. Trifft man bei der Suche auf einen bereits markierten Knoten, so liegt ein Zyklus vor. |
|||||||||||||||||||||||||
![]() |
C2 FlugplanerEntwickeln Sie einen einfachen Flugplaner, der Ihnen dabei hilft, eine Reise nach bestimmten Kriterien (Preis, Entfernung, Zwischenstops) zusammenzustellen. Die Flugverbindungen sind in einer Textdatei gespeichert und haben folgende Form: In jeder Zeile stehen jeweils getrennt durch ein Leerzeichen die Namen zweier Flughäfen (jeweils max. 15 Zeichen) für die eine Verbindung besteht, gefolgt vom Flugpreis in Euro (Integer) und der Meilenanzahl (Integer). Beispiel für das Dateiformat: Hamburg Wien 350 608 Wien Frankfurt 220 390 Düsseldorf Paris 99 263 ... Dem Benutzer sollen menügesteuert folgende Funktionen zur Verfügung gestellt werden:
Datenstrukturen und Algorithmen Die dem Programm zugrundeliegende Datenstruktur ist ein gewichteter, ungerichteter Graph, der in Form einer Adjazenzliste verwaltet werden soll: Jedem Flughafen entspricht ein Knoten, jeder Flugverbindung eine Kante mit Preis und Entfernung als Gewichte. Mittels Priority First Search kann man den optimalen (kürzesten bzw. billigsten) Weg zwischen zwei Flughäfen finden. Als Priority Queue soll ein Heap verwendet werden. Um den Weg am Ende der Berechnungen ausgeben zu können, ist eine Hilfsdatenstruktur notwendig: ein Feld, das für jeden Knoten den Vorgänger im optimalen Weg enthält. Die Werte in diesem Feld werden während der Suche berechnet: Beim Einordnen in den Heap wird für jeden Knoten der Vorgänger ebenfalls im Heap mitgespeichert, beim Entfernen aus dem Heap erhält man den Vorgänger und kann ihn ins Hilfsfeld eintragen. Wenn nun der kürzeste Weg gefunden wurde, können die einzelnen Knoten des schnellsten Weges in umgekehrter Reihenfolge aus dem Feld ausgelesen werden. |
|||||||||||||||||||||||||
![]() |
C3 SchedulingIn verschiedenen Bereichen wie z.B. dem Projektmanagement tritt oft das Problem auf, eine Menge von Arbeitsvorgängen, die teilweise von einander abhängen, zeitlich so einzuteilen, daß alle Abhängigkeiten erfüllt sind und ein Gesamtziel so rasch wie möglich erledigt werden kann. Entwickeln Sie ein Programm zur Unterstützung dieses Vorgangs. Das Programm soll menügesteuert folgende Funktionen bieten:
Beim Laden und Speichern besteht jede Zeile in der Datei aus: Kurzbezeichnung und ausführlicher Name eines Arbeitsvorgangs, minimale Dauer, maximale Dauer sowie Kurzbezeichnungen aller Arbeitsvorgänge, von denen der aktuelle Arbeitsvorgang abhängt (alle Daten sind durch jeweils ein Leerzeichen getrennt). Alle Arbeitsvorgänge sollen beim Speichern in einer durch eine Linearisierung (siehe oben) ermittelten Reihenfolge ausgegeben werden. Dadurch sind die in einer Zeile als abhängig angeführten Arbeitsvorgänge vorher immer bereits definiert, was das Laden der Datei erheblich erleichtert. Beispiel für das Dateiformat: DES Design 20 25 IMP Implementierung 15 20 DES DOKU Dokumentation 60 70 DES TEST Test 20 30 IMP UEB Uebergabe 5 5 TEST DOKU Für das oben angegebene Beispiel ist die maximale Gesamtdauer 100 Stunden und der kritische Pfad: DES, DOKU, UEB. Datenstruktur und Algorithmen Arbeitsvorgänge stellen die Knoten, Abhängigkeiten die Kanten eines Graphen dar. Dieser wird am besten in Form einer Adjazenzliste verwaltet. Eine Reihenfolge aller Arbeitsvorgänge, in der alle Abhängigkeiten erfüllt sind (Linearisierung), kann mit Hilfe einer Tiefensuche im Graphen gefunden werden. Man beachte jedoch, daß dabei bei den Zielknoten begonnen werden muß. Die maximale Gesamtdauer im Falle der bestmöglichen Parallelisierung sowie der kritische Pfad können ebenfalls über die Linearisierung ermittelt werden. Dazu wird für jeden Arbeitsvorgang in der Reihenfolge der Linearisierung die maximale Gesamtzeit aller davor notwendigen Arbeitsvorgänge bei bestmöglicher Parallelisierung berechnet. Gibt es für einen Arbeitsvorgang mehrere Abhängigkeiten, so muß das Maximum der Zeiten aller davor notwendigen Arbeitsvorgangssequenzen ermittelt werden. Im Fall, daß mehrere parallel ausgeführte Arbeitsvorgänge (bzw. Sequenzen dieser) gleiche maximale Gesamtzeiten benötigen, ist der kritische Pfad mitunter nicht eindeutig. Dann sind alle kritischen Arbeitsvorgänge in beliebiger Reihenfolge auszugeben, was mit einer Tiefensuche nach der Berechnung der maximalen Gesamtzeiten für alle Arbeitsvorgänge möglich ist. |
|||||||||||||||||||||||||
![]() |
Für weitere Informationen wende dich bitte an den Webmaster.
Alle Angaben ohne Gewähr.
Zuletzt aktualisiert am 2007-03-28 von MAG