FBIagent
Erfahrenes Mitglied
Na denne, wenn eurer Meinung nach nicht genügend kommentiert ist bitte bescheid
sagen.
Suche.h
UnscharfeSuche.h
UnscharfeSuche.cpp
main.cpp
sagen.
Suche.h
C++:
#ifndef __SUCHE_H__
#define __SUCHE_H__
#include <string>
#include <vector>
typedef std::vector< std::string > SuchDbVector;
/**
* Basis Klasse für suche
*/
class Suche {
public:
Suche()
: m_Datenbank() {
}
virtual ~Suche() {
}
/**
* Resultiert referenz auf die datenbank, siehe private member
*/
SuchDbVector &rDatenbank() {
return m_Datenbank;
}
/**
* Muss implementiert werden
*
* Parameter:
* Sucbegriff als std::string
* Selbsterklärend
* Suchergebnisse als std::vector< std::string >
* Hier sollten alle such treffer angehängt werden
*
* Resultiert bool:
* Sollte false bei keinen such treffern liefern, andernfalls true
*/
virtual bool Such( std::string Suchbegriff, std::vector< std::string > &Suchergebnisse ) = 0;
private:
/** datenbank mit möglichen suchergebnissen, siehe typedef */
SuchDbVector m_Datenbank;
};
#endif
UnscharfeSuche.h
C++:
#ifndef __UNSCHARFESUCHE_H__
#define __UNSCHARFESUCHE_H__
#include "./Suche.h"
class UnscharfeSuche
: public Suche {
public:
UnscharfeSuche();
virtual ~UnscharfeSuche();
/**
* Implementierung von:
* Suche::Such(), siehe Suche.h
*
* Parameter:
* Siehe Suche.h
*
* 1.
* Ruft clear() von Suchergebnisse auf
* 2.
* Geht alle Datenbankeinträge durch, wenn alle Zeichen von Suchbegriff in der gegebenen Reihenfolge im
* Datenbankeintrag vorhanden sind wird dieser an Suchergebnisse angehängt
*/
bool Such( std::string Suchbegriff, std::vector< std::string > &Suchergebnisse );
};
#endif
UnscharfeSuche.cpp
C++:
#include "./UnscharfeSuche.h"
UnscharfeSuche::UnscharfeSuche()
: Suche() {
}
UnscharfeSuche::~UnscharfeSuche() {
}
bool UnscharfeSuche::Such( std::string Suchbegriff, std::vector< std::string > &Suchergebnisse ) {
Suchergebnisse.clear();
// durch alle Datenbankeinträge
for ( SuchDbVector::size_type DbIdx = 0;DbIdx < rDatenbank().size();++ DbIdx ) {
// Wo die suche im datenbankeintrag nach einem zeichen anfängt
std::string::size_type StartFind = 0;
bool Ok = true;
// durch alle Zeichen des Suchbegriffes
for ( std::string::size_type SuchIdx = 0;SuchIdx < Suchbegriff.length();++ SuchIdx ) {
// Leerzeichen ignorieren
if ( Suchbegriff[ SuchIdx ] == ' ' ) {
continue;
}
std::string::size_type FindPos = rDatenbank()[ DbIdx ].find( Suchbegriff[ SuchIdx ], StartFind );
if ( FindPos == std::string::npos ) {
// Suchbegriff[ SuchIdx ] wurde nicht gefunden
Ok = false;
break;
}
// neuen startpunkt für die suche setzen
StartFind += FindPos - StartFind + 1;
}
if ( Ok ) {
// falls kriterien stimmen eintrag zu den ergebnissen geben
Suchergebnisse.push_back( rDatenbank()[ DbIdx ] );
}
}
if ( Suchergebnisse.size() > 0 ) {
return true;
}
return false;
}
main.cpp
C++:
#include "./UnscharfeSuche.h"
#include <fstream>
#include <iostream>
int main( int argc, char **argv ) {
if ( argc != 2 ) {
std::cout << "Bitte einen Suchbegriff angeben!" << std::endl;
std::cin.get();
return 1;
}
std::ifstream DatenbankDatei( "presidents.txt" );
if ( !DatenbankDatei.is_open() ) {
std::cout << "Datenbank datei konnte nicht geöffnet werden!" << std::endl;
std::cin.get();
return 1;
}
UnscharfeSuche Sucher;
std::string DatenbankEintrag = "";
while ( std::getline( DatenbankDatei, DatenbankEintrag ) ) {
Sucher.rDatenbank().push_back( DatenbankEintrag );
}
SuchDbVector Ergebnisse;
if ( !Sucher.Such( argv[ 1 ], Ergebnisse ) ) {
std::cout << "Keine ergebnisse gefunden!" << std::endl;
} else {
for ( SuchDbVector::size_type idx = 0;idx < Ergebnisse.size();++ idx ) {
std::cout << Ergebnisse[ idx ] << std::endl;
}
}
std::cin.get();
}
Zuletzt bearbeitet von einem Moderator: