Vokabeltrainer - Wie mehrere Lösungen einlesen?
-
Hallo,
ich bin gerade dabei, einen kleinen Vokabeltrainer zu programmieren. Es soll so funktionieren, dass die Wörter aus 2 Textdateien gelesen werden, die man beim Start auswählt. Datei1: Anzeige; Datei2: Was eingegeben werden muss, damit es als richtig gewertet wird. Es funktioniert ganz gut, doch wie schaffe ich es, dass ich verschiedene Antworten als "Richtig" deklarieren kann?
Vielen Dank im V*****
-
Ich meine, wie muss ich es machen, dass wenn in der textdatei "möglichkeit1,möglichkeit2" steht, möglichkeit1 und möglichkeit2 als richtig akzeptiert wird.
-
Kommt drauf an, wie du deine Daten organisierst. Wenn du dich in der STL auskennst dürfte std::map<std::string, std::vectorstd::string > der Container der Wahl sein. Wenn nicht könnte man das zum Anlass nehmen, sich da einzuarbeiten oder sich selbst ein Konstrukt basteln, das man in eine TList einfügt. Das könnte dann so aussehen:
// von TObject erben, damit man Objekte in eine TList einpacken kann struct DictionaryEntry : public TObject { // zu übersetzendes Wort AnsiString Word; // Stringliste mit Übersetzungen TStringList* Translations; };
Ich empfehle allerdings den ersten Vorschlag, er ist bei weitem komfortabler und robuster als die VCL Lösung, da sie typsicher ist und ihre Ressourcen selbst verwaltet. Bei der VCL Lösung muss man Typumwandlungen durchführen und sich selbst um die Speicherverwaltung kümmern.
-
DocShoe schrieb:
Kommt drauf an, wie du deine Daten organisierst. Wenn du dich in der STL auskennst dürfte std::map<std::string, std::vectorstd::string > der Container der Wahl sein. Wenn nicht könnte man das zum Anlass nehmen, sich da einzuarbeiten oder sich selbst ein Konstrukt basteln, das man in eine TList einfügt. Das könnte dann so aussehen:
// von TObject erben, damit man Objekte in eine TList einpacken kann struct DictionaryEntry : public TObject { // zu übersetzendes Wort AnsiString Word; // Stringliste mit Übersetzungen TStringList* Translations; };
Ich empfehle allerdings den ersten Vorschlag, er ist bei weitem komfortabler und robuster als die VCL Lösung, da sie typsicher ist und ihre Ressourcen selbst verwaltet. Bei der VCL Lösung muss man Typumwandlungen durchführen und sich selbst um die Speicherverwaltung kümmern.
Ich glaube du hast mich falsch verstanden. Was ich brauche, ist eigentlich nur der Teil, wie ich erkenne, ob mehrere Wörter vorhanden sind, wenn ja, wie viele und ob eines übereinstimmt.
Edit1->Text = LowerCase(Edit1->Text); Losung->Strings[Zeile] = LowerCase(Losung->Strings[Zeile]); Edit1->Text = Trim(Edit1->Text); Losung->Strings[Zeile] = Trim(Losung->Strings[Zeile]); if ((Edit1->Text)==Losung->Strings[Zeile])
Und so weiter.
In Zeile ist die Zeilennummer gespeichert, Losung ist eine Stringliste mit den Lösungen, Edit1 das Eingabefeld für die Antwort. Dies ist der Teil der ButtonClick Methode des Überprüfen-Buttons.
Wie muss ich dies ändern, dass das Programm auch mehrere Wörter in der Lösung durch Kommas getrennt erkennt.
-
Vok_Trainer schrieb:
Ich glaube du hast mich falsch verstanden.
Ich glaube nicht. Teil meines Vorschlags war auch eine effiziente Datenorganisation, die dein Problem gleich miterledigt. Aber egal.
Du musst deinen String in die einzelnen Teilstrings zerlegen, das geht mit AnsiStrings wohl am besten mit der ExtractStrings Funktion. Als Ergebnis erhälst du einen TStrings Container, der alle Token enthält. Nun musst du die Eingabe nur noch mit den einzelnen Token vergleichen.
-
DocShoe schrieb:
Vok_Trainer schrieb:
Ich glaube du hast mich falsch verstanden.
Ich glaube nicht. Teil meines Vorschlags war auch eine effiziente Datenorganisation, die dein Problem gleich miterledigt. Aber egal.
Du musst deinen String in die einzelnen Teilstrings zerlegen, das geht mit AnsiStrings wohl am besten mit der ExtractStrings Funktion. Als Ergebnis erhälst du einen TStrings Container, der alle Token enthält. Nun musst du die Eingabe nur noch mit den einzelnen Token vergleichen.Geht das noch mal für anfänger?
Oder der Passende COde?
-
Welche genau?
Die STL Lösung oder ExtractStrings? Ich denke mal, du willst VCL konform gehen, dann nimm das hier:
#include <Classes.hpp> AnsiString strTranslations = "Vokabel1, Vokabel2, Vokabel3"; TStringList* pToken = new TStringList(); ExtractStrings( TSysCharset() << ',', // Komma als Separator TSysCharset() << ' ', // Leerzeichen als Whitespace strTranslations.c_str(), // Sequenz, die zerlegt wird pToken ); // TStrings mit Token AnsiString strVokabel = "Vokabel2"; bool bMatch = false; for( int iIndex = 0; iIndex < pToken->Count; ++i ) { // Token vergleich (case insensitiv) if( 0 == strVokabel.AnsiCompareIC( pToken->Strings[iIndex] ) ) { // einer der Token passt bMatch = true; } } // Stringliste wieder abräumen delete pTokens; if( true == bMatch ) { // Vokabel richtig erkannt } else { // nicht erkannt }
Die STL Lösung braucht dafür nur einen Aufruf:
if( theDictionary["wort"].end() != find( theDictionary["wort"].begin(), theDictionary["wort"].begin(), "Eingabe" ) ) { // Treffer } else { // kein Treffer }
Nur als Anreiz