[QUIZ#1] FBIagent (C++)


FBIagent

Erfahrenes Mitglied
Na denne, wenn eurer Meinung nach nicht genügend kommentiert ist bitte bescheid
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:

OnlyFoo

Erfahrenes Mitglied
Abgesehen von Variablennamen, die mit einem Großbuchstaben beginnen (brr ;) ), hab ich nicht viel auszusetzten. Du könntest allerdings in den Parametern statt: "std::string Suchbegriff" lieber "const std::string& Suchbegriff" benutzen. Und die Methode selbst könnte ebenfalls als "bool Such( std::string Suchbegriff, std::vector< std::string > &Suchergebnisse ) const" implementiert werden...
Und noch ein Tipp, für die Rückgabe empfielt sich:
Code:
return Suchergebnisse.size() > 0;
 

FBIagent

Erfahrenes Mitglied
Abgesehen von Variablennamen, die mit einem Großbuchstaben beginnen (brr ;) ), hab ich nicht viel auszusetzten.
Hehe, ich mag keine die klein anfangen, abgesehen von Member, Pointer und Referenzen die ich mit m, p und r prefixe.
Hier aber auch wieder abgesehen vom **argv parameter der main().
Was mir so garnicht liegt das ganze in deutscher Namensgebung zu machen, aber da wir hier schon in nem Deutschen
Board sind hab ich mir gedacht mach ich es mal.

Und die Methode selbst könnte ebenfalls als "bool Such( std::string Suchbegriff, std::vector< std::string > &Suchergebnisse ) const" implementiert werden...
Daran hatte ich auch gedacht, allerdings benutze ich rDatenbank() welches nicht
umbedingt als "const" inmplementiert werden sollte. Wobei ich m_Datenbank in der
base Klasse natürlich auch protected hätte setzen können.

Und noch ein Tipp, für die Rückgabe empfielt sich:
Code:
return Suchergebnisse.size() > 0;
Das habe ich wohl vergessen zu ändern. Da war vorher noch vom Versuch, was heißt
Versuch, ich war an einem bestimmten Punkt einfach zu Faul weiter zu machen, die
Ergebnisse zu highlightnen eine Bedingung mehr, weshalb ich dies zur Übersichtlichkeit
lieber so geschrieben hatte.

Best wishes
FBIagent
 
Zuletzt bearbeitet: