C++ Semesterarbeit WS17/18

09.01.2018 09:31 Uhr

Übersicht

  1. Vorbereitung I
  2. Vorbereitung II
  3. Ziel der Semesterarbeit
  4. Durchführung
    1. Stufe I
    2. Stufe II
    3. Stufe III
    4. Stufe IV
  5. Beispiel
  6. Mehr Bespiele
  7. Sample Data


1. Vorbereitung I

(Abgeben Sie Ihre Lösungen zu diese Vorbereitung bitte vor 23. Januar in WoMS)

  1. Umreißen Sie allein oder in einer Gruppe von bis zu 3 Personen schriftlich ein Projekt für Ihre Semesterarbeit.
    Lesen Sie dazu zunächst alle Anforderungen der Stufen, sowie den Abschnitt „Ziel der Semesterarbeit“.
  2. Legen Sie ein repository für Ihr Projekt auf GitHub.com an und fügen Sie ggf. alle Gruppenmitglieder hinzu.
  3. Entwerfen Sie einen konkreten Anwendungsfall und erstellen Sie zwei unterschiedlich strukturierte Datenquellen.
  4. Mindestens eine Quelle soll im Format XML (mit DTD) angelegt werden.
  5. Legen Sie die Datenquellen mit Blick auf Stufe IV an. Sie benötigen Daten, welche Sie im Rahmen einfacher Berechnungen verwenden können. (s. 8. & 9.)
  6. Die Komplexität Ihrer Datensätze darf die der Beispiele auf dieser Seite (5. / 6. / 7.) nicht unterschreiten.

Achten Sie unbedingt auf die Korrektheit Ihrer Datenquellen. Eine DTD hilft Ihnen dabei.
Hinweis: Wenn Sie auf Schwierigkeiten mit Ihren XML-Instanzen stoßen kann sich ein Blick in Ihre BSI-Unterlagen aus dem 1. Semester lohnen. 

 

2. Vorbereitung II

(Abgeben Sie Ihre Lösungen zu diese Vorbereitung bitte vor 30. Januar in WoMS)

  1. Bereiten Sie Parser für Ihre Datenquellen vor.
  2. Laden Sie die Inhalte Ihrer Datenquellen und speichern Sie diese als Objekt innerhalb Ihres Programms.
    Bereiten Sie dazu eine geeignete Klasse vor.
  3. Arbeiten Sie weiter an einem Entwurf für Ihre Software.
    Es kann sinnvoll sein Zeichnungen anzufertigen, um das Projekt vor der objektorientierten Implementierung gedanklich in seine Bestandteile zu zerlegen.
    Wie Sie Ihr Projekt planen bleibt Ihnen überlassen.

 


 

3. Ziel der Semesterarbeit

Ziel der Semesterarbeit ist die Programmierung eines kleinen CLI. Das Programm soll Informationen aus zwei unterschiedlichen Datenquellen auslesen, zwischenspeichern, durchsuchen und anschließend in ein neues Format überführen können. Eine der Datenquellen muss eine XML (mit zugehöriger DTD) sein. Das neue Format muss ebenfalls vom Typ XML sein und die Daten der Ursprungsdateien sinnvoll zusammenführen.
Inhaltlich können Sie sich frei bewegen: Es bleibt Ihnen / Ihrer Gruppe überlassen, ob Sie Personendaten und Geburtstage, Produktinformationen und Lagerbestände oder beliebige andere Informationen verarbeiten wollen. Die Semesterarbeit kann in 4 Stufen erfüllt werden. Sie können die in den Vorlesungsfolien beschriebenen Token– und Attributklassen anwenden, wenn Sie möchten.
Hinweis: Grundsätzlich soll nach Möglichkeit ein objektorientiertes Programm umgesetzt werden. Es empfiehlt sich eine Planung des Projektes vor seiner Implementierung.

 

4. Durchführung

  1. Ob Sie in Gruppen oder allein Arbeiten bleibt Ihnen überlassen.
    1. Bei Gruppenarbeiten muss (auch auf GitHub) ersichtlich sein, dass jede*r Teilnehmende einen Anteil geleistet hat.
  2. Verwenden Sie bei der Anfertigung der Arbeit GitHub mit dem im Rahmen des Seminars angelegten Account.
    1. Protokollieren und Dokumentieren Sie Ihre Arbeit auf GitHub in angemessener Weise. (dies ist Teil der Anforderung)
    2. In Ihrer finalen Dokumentation geben Sie Ihr Repository an.
  3. Zur Einreichung laden Sie den letzten Stand Ihrer Entwicklung als zip-Archiv von GitHub herunter.
    Reichen Sie das Archiv wie gewohnt fristgerecht in WoMS ein.

Termine

Die Semesterarbeit muß bis zum 6. April 2018 bei uns eingetroffen sein.


 

4.1 Stufe I

  1. Lesen Sie Ihre Daten in Objekte ein. Nutzen Sie dazu Ihre Parser und Klassen aus der Vorbereitung II.
  2. Ermöglichen Sie folgende Operationen
    1. Menüführung: Sie können im Menü des Programms zwischen den verschiedenen Optionen wählen. Eine Auswahl löst einen bestimmten Ablauf innerhalb der Software aus. Nach dessen Ende kehren Sie in das Menü zurück.
    2. Option „Konvertieren„: Es wird nach dem Namen einer Ausgabedatei gefragt und die Daten beider Datensätze werden in eine gemeinsame XML Instanz überführt.

Wird keine weitere Funktionalität realisiert, gilt Stufe I als erfüllt.

Hinweise für die Bearbeitung:

  1. Definieren Sie eine Klasse „XYZ“ für Ihren Datensatz.
    Ein Objekt des Typs „XYZ“ ist eine Karteikarte für genau einen Datensatz.
  2. Diese Klasse hat eine Methode „laden(…)“ mit der die Daten aus den zwei Eingabedateien (XML und TXT) geladen werden.
    Man könnte hier – wenn gewünscht – die Token- sowie Attributklassen verwenden.

 

4.2 Stufe II

Ergänzen Sie die Lösung von Stufe I durch die folgenden Operationen:

  1. Option „Suchen“: Ermöglichen Sie eine Suche nach einer Kategorie innerhalb Ihrer Datenstruktur. (Property einer Class).
    Beispiel:
Category: type
Search for: Smartphone

Ihr Programm bietet zunächst die Eingabe einer Kategorie an, danach werden Sie zur Eingabe eines Suchbegriffs aufgefordert. Ihr Programm gibt anschließend das Ergebniss / die Ergebnisse der Suche in gut lesbarer Form aus. Danach ist das Programm für eine neue Abfrage bereit.

Hinweise für die Bearbeitung:

  1. Es reicht, wenn eine Kategorie eine eingetippte Zeichenkette an beliebiger Stelle enthält um eine Bedingung zu erfüllen.
  2. Erfüllen mehrere Datensätze eine Bedingung, werden alle ausgewählten hintereinander ausgegeben.
  3. Erfüllt kein Datensatz die Bedingung, wird eine entsprechende Meldung ausgegeben.
  4. Die Daten müssen so gespeichert werden, dass sie jeweils nur bei Beginn des Programmaufrufs aus der Datei gelesen werden, nicht nach jeder Anfrage von BenutzerIn nochmals.

 

4.3 Stufe III

Ergänzen Sie die Lösung von Stufe II durch die folgenden Operationen:

  1. Erweitern Sie den Dialog aus Aufgabenstellung II so, dass nach ZWEI Paaren von Kategorien / Inhalten gefragt wird und angegeben werden kann ob diese beiden Bedingungen mit „und“ oder „oder“ verknüpft werden sollen. Gibt BenutzerIn nur ein Kriterium an, wird nur danach gesucht.
  2. eine Methode „sucheXYZ(…)“ mit der zwei Felder gesucht werden und
    („zwei Felder gesucht werden“ = „Property1 soll ‚x‘ enthalten, Property2 soll ‚y‘ enthalten“)
  3. eine Methode „zeigeXYZ(…)“ mit der alle Informationen in einem Datensatz ausgegeben werden.
  4. eine Methode „exportiere(…)“ mit der wahlweise die ganze gelesene Datei oder nur die durch den letzten Suchbefehl gefundenen Datensätze als XML-Auszug exportiert werden.

4.4 Stufe IV

Ergänzen Sie die Lösung von Stufe III durch die folgenden Operationen:

  1. Erweitern Sie die Software um eine Berechnung über mehrere Datensätze hinweg (zB Anzahl oder Werte addieren)
  2. Ermöglichen Sie einen Export der berechneten Daten
  3. Erweitern Sie Ihr CLI um eine Prüfung der gegebenen XML-Instanz anhand Ihrer DTD

 


 

5. Beispiel

In einem Technikversand wird eine Inventur durchgeführt. In einer XML-Instanz sind Produkte hinterlegt. Ein Handscanner erzeugt eine TXT, welche die Kennung der vorrätigen Artikel, deren Lagerplatz und eine Anzahl beinhaltet. Eine Software führt die Datensätze zusammen und zeigt im Menü den Wert der im Lager befindlichen Waren als Summe an. Die Gesamtbestände der einzelnen Produkte können mit Ihrem Wert exportiert werden.

 

 

5.1 Datenquelle 1: XML

<listProducts>
 <product xml:id="123">
   <type>Smartphone</type>
   <model gen='Early 2018'>Smarty X</model>
   <desc>Lorem Ipsum.</desc>
   <price>500.00</price>
 </product>
 <product xml:id="678">
   <type>Simplephone</type>
   <model gen='Late 2016'>Mobile 2</model>
   <desc>Dolor sit amet.</desc>
   <price>95.00</price>
 </product>
 <product xml:id="564">
   <type>Laptop</type>
   <model gen='Mid 2017'>WorkBench Pro</model>
   <desc>Lorem Ipsum.</desc>
   <price>389.99</price>
 </product>
</listProducts>

5.2 Datenquelle 2: TXT

678 A1 233
123 A1 1000
678 A3 217
678 A4 125
564 A4 267

 

5.3 Zielformat: XML

...
<product id="678">
   <meta>
    <type>Simplemobile</type>
    <model>Mobile 2</model>
    <gen>Late 2016</gen>
    <desc>Dolor sit amet.</desc>
    <price>95.00</price>
   </meta>
   <stock>
    <package place="A1">233</package>
    <package place="A3">217</package>
    <package place="A4">125</package>
   </stock>  
 </product>
...

 

5.4 Menü

**** stocktaking cli 2018 ****
******************************
$: 658.752,33

(s)earch
(c)onvert data
(e)xport report
(h)elp

machine: ~User$

Das Menü besteht in diesem Beispiel aus einer Text-Darstellung möglicher Befehle. Gibt der Benutzer den string ’search‘ oder ’s‘ ein, so wird die dahinter implementierte Funktion aufgerufen. 
Hinweis: Es empfiehlt sich ggf. eine (h) elp-Funktion zu implementieren, welche die möglichen Optionen und anzugebenden Parameter beschreibt.

 

6. Mehr Beispiele

 

5.1 Datenquelle 1: XML

<listDrinks>
 <drink xml:id="1">
 <title></title>
 <ingredients>
 <ingredient amount='4' unit='cl'>Batida de Côco</ingredient>
 <ingredient amount='2' unit='cl'>Karamellsirup</ingredient>
 <ingredient amount='8' unit='cl'>Milch</ingredient>
 <ingredient amount='4' unit='cl'>Erdbeerpüree</ingredient>
 </ingredients> 
 <decoration>n/V</decoration>
 <text>Alle Zutaten shaken, ins Glas seihen und mit Strohhalm verzieren.</text>
 </drink>
 <drink xml:id="2">
 <title>Feuerzangenbowle</title> 
 <ingredients>
 <ingredient amount='1' unit='l'>Rotwein (trocken)</ingredient>
 <ingredient amount='1' unit='Stk'>Zimtstange</ingredient>
 <ingredient amount='3' unit='Stk'>Nelken</ingredient>
 <ingredient amount='1' unit='Stk'>Zitronen</ingredient>
 <ingredient amount='2' unit='Stk'>Orangen</ingredient>
 <ingredient amount='1' unit='Stk'>Zuckerhut</ingredient>
 <ingredient amount='500' unit='ml'>Stroh 80</ingredient>
 </ingredients> 
 <decoration>n/V</decoration>
 <text>Trockenen Rotwein in einen Topf gießen. Mit Zimtstange und Nelken würzen. Die Schale von unbehandelten Zitronen und Orangen dünn in dünne Streifen schneiden und zusammen mit dem Rotwein erhitzen – nicht kochen. Zuckerhut vollständig in Rum tränken, mit Feuerzange über den Topf legen und mit einem Streichholz anzünden. Achtung: Stichflamme!</text>
 </drink>
 <drink xml:id="3">
 <title>Monaco Mojito</title> 
 <ingredients>
 <ingredient amount='4' unit='cl'>Wodka</ingredient>
 <ingredient amount='2' unit='cl'>Limettensaft</ingredient>
 <ingredient amount='2' unit='cl'>Holundersirup</ingredient>
 <ingredient amount='1' unit='Stk'>Minzezweig</ingredient>
 <ingredient amount='10' unit='cl'>Sekt</ingredient>
 </ingredients> 
 <decoration>Minzzweig zum Dekorieren nutzen.</decoration>
 <text>n/V</text>
 </drink>
</listDrinks>

 

7. Sample Data

Falls Sie sich Beispiele für Datenquellen ansehen möchten, haben wir etwas für Sie vorbereitet.
Download: SampleData.zip