Klassen und ihre Formen

07.05.2017 04:31 Uhr

Szenario

In einem Softwareprojekt soll innerhalb eines Moduls folgende Funktionalität zur Verfügung stehen:

  • Aus einer Textbasis werden Personenangaben extrahiert.
  • Eine Person besteht im Kontext der Anwendung aus einem Namen, einem Geburtsort und einem Geburtsdatum.
  • Leider benutzt die Textbasis unterschiedliche Schreibweisen für die angegebenen Attribute.
  • Da es sich um eine Anwendung aus dem Kontext der Geschichtswissenschaften handelt, sollen die Originalschreibweisen aus dem Text prinzipiell auch innerhalb der Applikation zur Verfugung stehen.
  • Auf der anderen Seite ist es wichtig gleichzeitig auch eine normalisierte Darstellung zu haben, um z.B. Abstände zwischen Geburtstagen errechnen zu können.

Aufgabe

Sie sollen nun zur Verwaltung der Geburtsdaten eine Datenstruktur entwickeln, die es

  • einerseits erlaubt festzuhalten in welcher Schreibweise ein Geburtsdatum innerhalb der Textbasis auftauchte,
  • andererseits soll die Datenstruktur einen Vergleich aller eingelesen Geburtsdaten unterstützen, d.h. sie müssen gleichzeitig eine normalisierte Darstellung vorsehen.

Wichtige Punkte:

  • Machen sie es dem Entwickler der Personenklasse so leicht wie möglich, einheitliche Schnittstelle, Datenkapselung, etc.
  • Schreiben sie möglichst gut wartbaren Code, erweiterbar, redundanzfrei, etc.

Lösung

Stufe 1

#include 
using namespace std;
#include "datum1.h"

int main(){
ClDatum datum1(1,7,2001);
ClDatum datum2(17,3,2000);

cout << "Zwischen dem " << datum1.astext() << " und dem " << datum2.astext() <<
		" liegen " << datum1.asnumber() - datum2.asnumber() << " Tage" << endl;
}

Stufe 2

#include 
using namespace std;
#include "datum2.h"

int main(){
	ClDatum datum1(1,7,2001);
	ClDatum datum2(17,"märz",2000);

	cout << "Zwischen dem " << datum1.astext() << " und dem " << datum2.astext() <<
			" liegen " << datum1.asnumber() - datum2.asnumber() << " Tage" << endl;
}

Stufe 3

#include 
using namespace std;
#include "datum3.h"

int main(){
	ClDatum datum1(1,7,2001);
	ClDatum datum2(17,"märz",2000);

	cout << "Zwischen dem " << datum1.astext() << " und dem " << datum2.astext() <<
			" liegen " << datum1.asnumber() - datum2.asnumber() << " Tage" << endl;
}

Stufe 4

#include 
using namespace std;
#include "datum4.h"

int main(){
	ClNDatum datum1(1,7,2001);
	ClZDatum datum2(17,"märz",2000);

	cout << "Zwischen dem " << datum1.astext() << " und dem " << datum2.astext() <<
			" liegen " << datum1.asnumber() - datum2.asnumber() << " Tage" << endl;
}

Stufe 5

#include 
using namespace std;
#include "datum5.h"

int main(){
	ClNDatum datum1(1,7,2001);
	ClZDatum datum2(17,"märz",2000);

	cout << "Zwischen dem " << datum1.astext() << " und dem " << datum2.astext() <<
			" liegen " << datum1.asnumber() - datum2.asnumber() << " Tage" << endl;
}

Stufe 6

#include 
using namespace std;
#include "datum6.h"

int main(){
	ClDatum *datum1 = new ClNDatum(1,7,2001);
	ClDatum *datum2 = new ClZDatum(17,"märz",2000);

	cout << "Zwischen dem " << datum1->astext() << " und dem " << datum2->astext() <<
	        " liegen " << datum1->asnumber() - datum2->asnumber() << " Tage" << endl;
}

Rätsel

#include 
#include 

using namespace std;


int main()
{
    string x = "aaa.bbb";
    int demo;

    cout << "A:" << x.find(".") << endl;

    demo = x.find(".");
    cout << "B:" << demo << endl;

    if (demo = x.find(".") != string::npos)
        cout << "C:" << demo << endl;

    if ((demo = x.find(".")) != string::npos)
        cout << "D:" << demo << endl; { /* bitte ignorieren; nur bis zu Ihrer Anmeldung notwendig */ int x; cin >> x;
    }

}

Download: Klassen_Formen_examples.zip

Download: raetsel.cpp.zip