IN2, Übungsblatt 4 Durch Die Start- Und Endkennungen Können Die Felder in Beliebiger Rei- Henfolge Stehen
Total Page:16
File Type:pdf, Size:1020Kb
Dipl.Phys. Gerald Kempfer Beuth Hochschule für Technik Berlin - University of Applied Sciences - Fachbereich VI – Informatik und Medien Studiengang Technische Informatik Bachelor Lehrveranstaltung "Informatik II für TI-Bachelor" Übungsblatt 4 Hinweise: Dieses Übungsblatt ist zur Zulassung zu der Klausur erfolgreich zu bearbeiten ("Erfolg- reich" bedeutet: Keine Programmabstürze bzw. Endlosschleifen, Aufgabenstellung ein- schließlich der Nebenbedingungen müssen eingehalten sowie Kommentierung und Ein- rückung korrekt sein!). Für die Abgabe der Lösung laden Sie bitte Ihre erstellen Quelltextdateien in Moodle hoch (nur Dateiendungen *.c, *.h, *.zip und *.rar erlaubt). Der Abgabetermin für diese Aufgabe ist der 04. Juni 2021; letzte Abgabemöglichkeit ist der 18. Juni 2021. Aufgabe: In der vierten Übungsaufgabe des Projektes “Mannschafts-Verwaltung“ sollen die Daten beim Beenden des Programms in einer Datei gespei- chert werden, damit sie beim nächsten Programmstart wieder eingelesen werden können. Für das Laden und Speichern der Daten sollen einige Funktionen in ei- nem neuen Modul database.c erstellt werden. Erzeugen Sie das Modul (C- und Headerdatei) und passen Sie das Projekt an. Das Speichern der Daten soll im neuen Modul die Funktion save über- nehmen. Hier soll nach dem erfolgreichen Öffnen der Datei die erste Zei- le mit der Startkennung der Daten (<Data>; siehe Beispiel) geschrieben werden. Dann werden in einer Schleife die Daten der einzelnen Mann- schaften geschrieben; das Schreiben einer Mannschaft kann eine Funkti- on namens saveTeam übernehmen (diese Funktion erhält als Parameter den Datenstrom der offenen Datei). Nach der Startkennung einer Mann- schaft (<Team>) werden die Daten der Mannschaft (Mannschaftsname und Trainername) jeweils mit Start- und Endkennung in eine Zeile ge- schrieben (z.B. <Name>Hertha BSC</Name>). Anschließend werden die Spieler in einer Schleife gespeichert, z.B. mit einer Funktion save- Player. Nachdem alle Spieler geschrieben wurden, wird die Endkennung der Mannschaft (</Team>) in eine eigene Zeile geschrieben; nach der letzten Mannschaft noch die Endkennung der Daten (</Data>). Für das Laden der Daten soll eine Funktion load geschrieben werden. In dieser Funktion sollen nach dem erfolgreichen Öffnen der Datei die Da- ten eingelesen werden. Immer wenn die Startkennung einer Mannschaft gefunden wird, soll die Funktion loadTeam aufgerufen werden. Diese liest die Daten der einen Mannschaft ein – also bis zur Endkennung </Team>. Wird in dieser Funktion loadTeam die Startkennung einer Spielers gefun- den, so soll die Funktion loadPlayer aufgerufen werden, die die Daten ei- nes Spielers einliest – also bis zur Endkennung </Player>. Seite 1 von 4 G. Kempfer, BHT Berlin, TI-B IN2, Übungsblatt 4 Durch die Start- und Endkennungen können die Felder in beliebiger Rei- henfolge stehen. Ferner kann darüber beim Einlesen geprüft werden, ob die Struktur der Daten gültig ist. Um die Datenbank kontrollieren zu kön- nen, sollte auf eine Verschlüsselung der Daten verzichtet werden. Über- legen Sie sich, welche Maßnahmen noch nötig sind, um angemessen auf eine fehlerhafte Datenbank zu reagieren. Was muss getan werden, wenn in einem Datensatz ein Feld fehlt (z.B. fehlen in der Beispieldatenbank mehrere Felder), damit dieser Datensatz trotzdem noch korrekt eingele- sen und angezeigt werden kann. Wem diese ganze Beschreibung zu kompliziert ist, guckt sich am besten erst das unten stehende Beispiel an; dies sollte vieles erklären. Noch ein paar Hinweise: 1. Nach dem Laden und Speichern sollte die Datei natürlich jeweils wie- der geschlossen werden. 2. Das Laden der Daten erfolgt bei Programmstart; das Speichern (optio- nal mit Benutzerabfrage) bei Programmende. Wer möchte, kann alterna- tiv Laden und Speichern als Menüpunkte einbauen (das Laden sollte dann die Daten zu den bereits eingegebenen Daten hinzufügen!). 3. Vor dem Einlesen eines jeden Datensatzes sollten die Felder mit Nul- len (0 bzw. NULL) gefüllt werden. 4. Bei Programmende müssen natürlich (sofern nicht bereits in der vori- gen Übungsaufgabe erledigt) alle reservierten Speicherbereiche wieder freigegeben werden! 5. Beim Einlesen kann immer eine ganze Zeile eingelesen werden. Um herauszufinden, welche Daten in der Zeile stehen (dieser Vorgang wird „parsen“ genannt), kann z.B. die Funktion strncmp aus der string.h verwendet werden; z.B. wird mit if (strncmp(Zeile, "<Date>", 6) == 0) geprüft, ob die ersten 6 Zeichen in der Zeichenkette Zeile gleich <Date> sind. 6. Am Anfang einer Zeile können beliebig viele Leerzeichen oder Tabula- toren stehen. 7. Innerhalb eines Datensatzes können Tags mehrfach vorkommen; ent- sprechend müssen die Speicherbereiche der bereits eingelesenen Daten wieder freigegeben werden. 8. Ihr Programm muss die mitgelieferte Beispieldatei einlesen können. Generell soll immer mit Zeigern anstelle von Arrays gearbeitet wer- den! Oder anders ausgedrückt: Das Verwenden von eckigen Klam- mern ist tabu (außer bei der Definition von Arrays). Vergessen Sie nicht, dass bei Programmende alle reservierten Speicher- bereiche wieder freigegeben werden müssen! Kommentieren Sie das Programm. Dazu gehört auch ein Modulheader und zu jeder Funktion ein Funktionsheader (siehe Skript “Grundlagen der Informatik“ Kapitel 5.3 und 5.4)! Achten Sie auch auf Ihre Programm- struktur (Einrückungen, Leerzeichen und -zeilen). Seite 2 von 4 G. Kempfer, BHT Berlin, TI-B IN2, Übungsblatt 4 Auszug der Beispieldatei: <Daten> <Team> <Player> <Name>Andreas Luthe</Name> <Birthday>10.03.1987</Birthday> <TricotNr>1</TricotNr> <Goals>0</Goals> </Player> <Name>1. FC Union Berlin</Name> <Player> <Name>Marvin Friedrich</Name> <Birthday>13.12.1995</Birthday> <TricotNr>5</TricotNr> <Goals>0</Goals> </Player> <Trainer>Urs Fischer</Trainer> <Player> <Name>Robin Knoche</Name> <Birthday>22.05.1992</Birthday> <TricotNr>31</TricotNr> <Goals>0</Goals> </Player> <Player> <Name>Christopher Trimmel</Name> <Birthday>24.02.1987</Birthday> <TricotNr>28</TricotNr> <Goals>0</Goals> </Player> <Player> <Name>Nico Schlotterbeck</Name> <Birthday>01.12.1999</Birthday> <TricotNr>4</TricotNr> <Goals>0</Goals> </Player> <Player> <Name>Robert Andrich</Name> <Birthday>22.09.1994</Birthday> <TricotNr>30</TricotNr> <Goals>0</Goals> </Player> <Player> <Name>Sebastian Griesbeck</Name> <Birthday>03.10.1990</Birthday> <TricotNr>33</TricotNr> <Goals>0</Goals> </Player> <Player> <TricotNr>34</TricotNr> <Name>Christian Genther</Name> <Birthday>14.08.1985</Birthday> </Player> ... <Player> <Name>Matheus Cunha</Name> <Birthday>27.05.1999</Birthday> <TricotNr>10</TricotNr> <Goals>0</Goals> </Player> <Player> <Name>Jhon Cordoba</Name> <Birthday>11.05.1993</Birthday> <TricotNr>15</TricotNr> <Goals>0</Goals> </Player> <Trainer>Pal Dardai</Trainer> <Name>Hertha BSC</Name> </Team> </Daten> Seite 3 von 4 G. Kempfer, BHT Berlin, TI-B IN2, Übungsblatt 4 Ausgabe der Beispieldaten: Liste der Mannschaften ====================== Name : 1. FC Union Berlin Trainer : Urs Fischer Anzahl Spieler : 11 Spieler: 01. Andreas Luthe (1; * 10.03.1987) 02. Marvin Friedrich (5; * 13.12.1995) 03. Robin Knoche (31; * 22.05.1992) 04. Christopher Trimmel (28; * 24.02.1987) 05. Nico Schlotterbeck (4; * 01.12.1999) 06. Robert Andrich (30; * 22.09.1994) 07. Sebastian Griesbeck (33; * 03.10.1990) 08. Christian Genther (34; * 14.08.1985) 09. Taiwo Awoniyi (14; * 12.08.1997) 10. Max Kruse (10; * 19.03.1988) 11. Joel Pohjanpalo (9; * 13.09.1994) Name : Hertha BSC Trainer : Pal Dardai Anzahl Spieler : 11 Spieler: 01. Alexander Schwolow (1; * 02.06.1992) 02. Niklas Stark (5; * 14.04.1995) 03. Maximailian Mittelstaedt (17; * 18.03.1997) 04. Peter Pekarik (2; * 30.10.1986) 05. Marvin Plattenhardt (21; * 26.01.1992) 06. Lukas Kluenter (13; * 26.05.1996) 07. Dodi Lukebakio (11; * 24.09.1997) 08. Vlademir Darida (6; * 08.08.1990) 09. Krzysztof Piatek (9; * 01.07.1995) 10. Matheus Cunha (10; * 27.05.1999) 11. Jhon Cordoba (15; * 11.05.1993) Seite 4 von 4.