Programmieren 7
Aufgabe 16: Tour de France
Bei der Tour de France werden die Etappenergebnisse in der jeweiligen Reihenfolge des Zieleinlaufs täglich direkt in ein und dieselbe Textdatei namens touretap.dat
mit folgender Zeilenstruktur eingegeben:
Das erste Feld mit maximal 30 Zeichen enthält den Namen des jeweiligen Radsportlers (in Anführungsstriche eingeschlossen), **die Felder h, m und s **die von ihm gefahrene Etappenzeit in Stunden, Minuten und Sekunden. Alle Eingabefelder sind voneinander durch mindestens ein Leerzeichen getrennt. Dabei sind die Stunden als nichtnegative ganze Zahl, die Minuten als ganze Zahl im Intervall [0, 59] und die Sekunden als reelle Zahl im halboffenen Intervall [0, 60) angegeben. Diesen Bedingungen müssen auch während der Ausführung des Programms alle Zeitangaben genügen.
Im Laufe der Tour de France werden in dieser Datei die Etappenergebnisse aller Teilnehmer gesammelt. Am Ende der Tour werden die Einzelzeiten für jeden Teilnehmer zu dessen
Gesamtzeit aufsummiert. Auf der Basis dieser Ergebnisliste könnte man dann beispielsweise den Sieger ermitteln, eine sortierte Rangliste erstellen oder eine statistische Auswertung
vornehmen.
Man schreibe ein Fortran 95–Modul, in dem ein Datentyp für die Fahrzeit mit den ganzzahligen Komponenten h (Stunden) und m (Minuten) sowie der reellen Komponente s (Sekunden)
und für diesen Datentyp die dyadischen Operatoren + zur Addition zweier Fahrzeiten und zum Größenvergleich zweier Fahrzeiten definiert werden. Die zugehörigen Modulfunktionen
sind mit Eingabeargumenten von diesem Datentyp zu definieren.
Man schreibe außerdem ein Fortran 95–Hauptprogramm, welches
- die maximal zu erwartende Teilnehmerzahl n einliest und ein dynamisches Feld (die Ergebnisliste) mit n Komponenten (Elementen), die geeignet sind, ein Etappen- oder Endergebnis (d.h. Name und Fahrzeit des Teilnehmers) zu speichern, anlegt (der Elementtyp dieses Feldes muss zuvor definiert werden),
- die Datei
touretap.dat
zeilenweise bis zum Ende der Datei einliest und entweder einen neuen Eintrag in die Ergebnisliste macht (falls dieser Sportler bisher noch nicht in der Liste zu finden ist) oder die gerade gelesene Etappenfahrzeit zu der bisher in der Ergebnisliste gespeicherten Zwischenzeit für diesen Sportler addiert (hierbei muss nach dem jeweiligen Namen des Sportlers im bereits belegten Teil der Ergebnisliste gesucht werden, also Anzahl der bisher gemachten Einträge merken!), - die tatsächliche Teilnehmerzahl und die erstellte Ergebnisliste (unsortiert) mit erklärendem Text ausgibt.
Es werden die folgenden vereinfachenden Annahmen gemacht: - Der Name eines Sportlers ist in der Eingabedatei immer identisch geschrieben und identifiziert diesen eindeutig. Lexikalische Vergleichsoperatoren für Zeichenketten sind in Fortran vordefiniert.
- Während der gesamten Tour gibt es keine Ausfälle oder Disqualifikationen.
- Man gebe die Ergebnisliste nach Gesamtfahrzeiten sortiertn unter Angabe des jeweils erzielten Platzes im Gesamtklassement aus.
Aufgabe 17: Bandmatrizen
Sei eine quadratische Matrix. A heißt
**Bandmatrix**
, falls alle von Null verschiedenen Elemente in der Hauptdiagonale und in einigen dazu benachbarten Nebendiagonalen liegen. Bezeichnen hierbei
die Anzahl der unteren Nebendiagonalen einschließlich der
Hauptdiagonale, welche alle Nichtnullelemente des unteren Dreiecks beinhalten, und
die Anzahl der oberen Nebendiagonalen einschließlich der Hauptdiagonale, welche alle Nichtnullelemente des oberen Dreiecks beinhalten, so besitzt die Matrix A das Bandbreitentupel
(p, q). So hat beispielsweise eine vollbesetzte untere Dreicksmatrix das Bandbreitentupel (n, 1)
oder eine sogenannte Tridiagonalmatrix das Bandbreitentupel (2, 2), die folgende Matrix das
Bandbreitentupel (3, 4):
Definieren Sie hierzu in einem Fortran 95–Modul eine Funktion unterebandbreite, welche die untere Bandbreite p einer als Argument übergebenen quadratischen reellen Matrix unbekannter Größe bestimmt. Hierfür sollen sukzessive die Diagonalen von links unten beginnend nach dem ersten Nichtnullelement abgesucht werden. Beachten Sie den Sonderfall der Nullmatrix!
Schreiben Sie ein Fortran 95–Hauptprogramm, welches in einer Schleife die Dimension n einer (dynamischen) quadratischen reellen Matrix von der Tastatur einliest, diese im Speicher alsMatrix anlegt, ihre Werte von der Tastatur einliest und sodann das** Bandbreitentupel(p, q)** dieser Matrix bestimmt und kommentiert ausgibt. Die Schleife soll so lange wiederholt werden, bis ein **n ≤ 0 **eingegeben wird.
Hinweis: Zur Berechnung der oberen Bandbreite q kann man die transponierte Matrix verwenden. Achten Sie auf eine korrekte Speicherverwaltung für die Matrizen.