vokabeltest
-
Ahoi, ich wollte für ein Projekt einen Vokabeltest einbauen, der die Vokabeln aus einer Datei einzeln ausliest, diese am Bildschirm zeigt und man dann die übersetzung via cin>> eintippt und dieser dann nachschaut ob die vokabel richtig war und im idealfall die richtige lösung nach falscher eingabe vorzeigt. gegen ende des programms soll die fehleranzahl und die gesammte vokabelanzahl aufgeführt werden. die vokabeln sind in verschiedene kapitel unterteilt und sollen via switch/case abgerufen werden können. ich habe wirklich keinen plan wie ich das programmieren könnte, könntet ihr mir helfen?
-
Bau dir eine (multi)map<string,string>, in die du alle Vokabeln einträgst. Dann suchst du dir (zufällig oder nach einem bestimmten System) einen Eintrag der map aus, gibst dem User den Schlüssel des Eintrags und vergleichst seine Antwort mit dem zugehörigen Wert:
map<string,string> vokabeln; ... map<string,string>::iterator pos = select_question();//Auswahl string answer; cout<<"Wie lautet die Übersetzung von \""<<pos->first<<"\"?"<<endl; cin>>answer; if(answer==pos->second) ++korrekt; else ++falsch;
-
danke, aber wie baue ich einen (multi)map<string,string>, in die ich alle vokabeln einbaue, bzw das dieser das mit der richtigen übersetzung vergleicht. könntest du ein beispiel mit z.B. einigen testvokabeln liefern? danke
-
Zum Anlegen der map:
map<string,string> vokabeln; //Beispiel-Eingaben vokabeln.insert(make_pair("deutsch","german")); vokabeln.insert(make_pair("englisch","english")); ... //Alternative Möglichkeit vokabeln["Auto"] = "car"; ...(anstelle der map<> kannst du auch eine multimap<> verwenden, wenn ein Wort mehrere mögliche Übersetzungen haben könnte - aber dann wird die Fehlerkontrolle schwieriger)
Im allgemeinen Fall würde ich die Wörterliste in einer Datei speichern und dann über einen fstream einlesen.
(zum Vergleichen siehe den obigen Beispielcode)
-
habe die fehlermeldung das insert ne klasse oder struktur sein muss. wie binde ich eine klasse damit ein usw. ist die hauptklasse nicht vokabeln? muss ich ein unterprogramm erstellen? muss die vokabelabfrage dann im hauptprogramm stehen? AHHHHHHHHHH!!!
-
ich glaube auslesen wäre am besten. der stoff ist in einer editor datei geschrieben, ungefährt so
Unit1 A
dog hund
mother Mutter
father Vater
Unit1 B
woman Frau
man Mann
Unit2 A
...
..
.wie lese ich die datei aus, das z.B. das deutsche wort erscheint und ich das englische hinschreiben muss und das programm diese vergleicht, alle einzeln ins programm einzippen wäre viel zu zeitaufwändig. trotzdem vielen vielen vielen dank

-
hi, ich würde die vokabeln in der datei mit einem bestimmten zeichen trennen,
da manche vokabeln ein leerzeichen enthalten.
ich benutze mal | . Dann sollte das so gehn :fstream datei; datei.open("datei.txt", ios::in); while(!datei.eof()) { getline(datei, line); i = 0; while(line[i] != '|') { str += line[i]; i++; } i++; while(i<=line.length()) { str2 += line[i]; i++; } vokabeln.insert(make_pair(str,str2)); }
-
Man kann die Strings auch aneinanderreihen und das Array dann 1:1 auf die Platte kopieren.
/* Alle Wörter */ char *g_pcStringPool; int g_iStringPoolSize; /* Hash zum schnellen Finden */ struct thashentry { int istrpooloff; int ivokabelidx; }; struct thash { int iecnt; struct thashentry *pe; }; struct thash g_HashEnglish[1000]; struct thash g_HashDeutsch[1000]; /* das eigentliche Vokabelarray */ struct tVokabel { int ienglishcount; /* engl. Anzahl der Synonyme */ int *pienglish; /* StringPoolOffsets */ int ideutschcount; /* dt. Anzahl der Synonyme */ int *pideutsch; /* StringPoolOffsets */ }; struct tVokabel *g_pVokabel; int g_iVokabelCount; int Load(char *file) { FILE *fp; int i; if ((fp = fopen(file, "rb")) == 0) return 0; g_iStringPoolSize = getw(fp); g_pcStringPool = malloc(g_iStringPoolSize); fread(g_pcStringPool, 1, g_iStringPoolSize, fp); g_iVokabelCount = getw(fp); g_pVokabel = malloc(g_iVokabelCount*sizeof(struct tVokabel)); for (i = 0; i < g_iVokabelCount; i++) { /* engl. "hobby" */ g_pVokabel[i].ienglishcount = getw(fp); g_pVokabel[i].pienglish = malloc(g_pVokabel[i].ienglishcount*sizeof(int)); fread(g_pVokabel[i].pienglish, sizeof(int), g_pVokabel[i].ienglishcount, fp); /* dt. "Hobby", "Steckenpferd" */ g_pVokabel[i].ideutschcount = getw(fp); g_pVokabel[i].pideutsch = malloc(g_pVokabel[i].ideutschcount*sizeof(int)); fread(g_pVokabel[i].pideutsch, sizeof(int), g_pVokabel[i].ideutschcount, fp); } fclose(fp); InitHashEnglishDeutsch(); return 1; }
-
Dieser Thread wurde von Moderator/in SideWinder aus dem Forum DOS und Win32-Konsole in das Forum C++ verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
danke backfisch und keksekekse, aber ich weiß nicht wie ich die strukturen bei dir einbinden soll backfisch, und bei dir kekse kekse bekommen ich folgende fehlermeldungen:
E:\dfdfdfd\dfdfdfd.cpp(37) : error C2065: 'FILE' : nichtdeklarierter Bezeichner
E:\dfdfdfd\dfdfdfd.cpp(37) : error C2065: 'fp' : nichtdeklarierter Bezeichner
E:\dfdfdfd\dfdfdfd.cpp(37) : warning C4552: '*' : Operator hat keine Auswirkungen; Operator mit Seiteneffekt erwartet
E:\dfdfdfd\dfdfdfd.cpp(40) : error C2065: 'fopen' : nichtdeklarierter Bezeichner
E:\dfdfdfd\dfdfdfd.cpp(43) : error C2065: 'getw' : nichtdeklarierter Bezeichner
E:\dfdfdfd\dfdfdfd.cpp(44) : error C2065: 'malloc' : nichtdeklarierter Bezeichner
E:\dfdfdfd\dfdfdfd.cpp(44) : error C2440: '=' : 'int' kann nicht in 'char *' konvertiert werden
Die Konvertierung eines ganzzahligen Typs in einen Zeigertyp erfordert ein reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat
E:\dfdfdfd\dfdfdfd.cpp(45) : error C2065: 'fread' : nichtdeklarierter Bezeichner
E:\dfdfdfd\dfdfdfd.cpp(48) : error C2440: '=' : 'int' kann nicht in 'struct tVokabel *' konvertiert werden
Die Konvertierung eines ganzzahligen Typs in einen Zeigertyp erfordert ein reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat
E:\dfdfdfd\dfdfdfd.cpp(52) : error C2440: '=' : 'int' kann nicht in 'int *' konvertiert werden
Die Konvertierung eines ganzzahligen Typs in einen Zeigertyp erfordert ein reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat
E:\dfdfdfd\dfdfdfd.cpp(57) : error C2440: '=' : 'int' kann nicht in 'int *' konvertiert werden
Die Konvertierung eines ganzzahligen Typs in einen Zeigertyp erfordert ein reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat
E:\dfdfdfd\dfdfdfd.cpp(60) : error C2065: 'fclose' : nichtdeklarierter Bezeichner
E:\dfdfdfd\dfdfdfd.cpp(62) : error C2065: 'InitHashEnglishDeutsch' : nichtdeklarierter Bezeichner
Fehler beim Ausführen von cl.exe.dfdfdfd.exe - 12 Fehler, 1 Warnung(en)
-
muss ich evtl. mehrer bibliotheken einbinden? wenn ja, welche (header wären auch schön.
#include "stdafx.h"
#include "iostream.h"
#include "string.h"die hab ich benutzt
-
oder könntet ihr einen kompletten quellcode, mit headern usw. auflisten????????????
-
#include "stdafx.h" #include <iostream> #include <string>muss es wenn heißen ...
-
Ich arbeite im Moment auch an einem Vokabeltrainer, hier mein Code bisher:
#include <cstdlib> #include <iostream> #include <fstream> #include <string> #include <conio.h> #include <map> #include <ic.hpp> #include <windows.h> using namespace std; using namespace ic::shorties; char buffer; string str, str2, line; int i; map<string,string> vokabeln; void menu(); void initialize(); void vokabeltest(); void add(); void wait(); int main() { initialize(); menu(); } void initialize() { fstream datei; datei.open("datei.txt", ios::in); while(!datei.eof()) { cout<<"Initialisieren......"; getline(datei, line); i = 0; while(line[i] != '|') { str += line[i]; i++; } i++; while(i!=line.length()) { str2 += line[i]; i++; } vokabeln.insert(make_pair(str,str2)); clrscr(); gotoxy(0,0); } } void menu() { clrscr(); gotoxy(0,0); cout<<"Vokabeln hinzufuegen : 1\n"; cout<<"Vokabeltest : 2\n"; int antwort; cin>>antwort; switch(antwort) { case 1: add(); break; case 2: vokabeltest(); break; default: menu(); break; } } void add() { //kommt noch } void vokabeltest() { map<string,string>::iterator pos; pos = vokabeln.begin(); cout<<"Wie lautet die Uebersetzung von \""<<pos->first<<"\"?"<<endl; string answer; cin>>answer; if(answer==pos->second) { cout<<"Richtig!\n"; wait(); } else{ cout<<"Falsch!\n"; cout<<"Richtg waere "<<pos->second<<" gewesen."; wait(); } } void wait () { FlushConsoleInputBuffer(GetStdHandle(STD_INPUT_HANDLE)); getch(); }Meine datei.txt sieht wie folgt aus:
englisch|deutsch englisch2|deutsch2 ...Aber irgendwie sagt es mir immer, dass meine Eingabe falsch waere. kA was da falsch ist.
-
Ich hab mal das versucht:
... string answer; answer == pos->second; if(answer==pos->second) { cout<<"Richtig!\n"; wait(); } else{ cout<<"Falsch!\n"; cout<<"Richtg waere "<<pos->second<<" gewesen."; wait(); } ...Warum zur Hölle spuckt das immer wieder Falsch! aus?
-
e:\gggggg\gggggg.cpp(108) : fatal error C1010: Unerwartetes Dateiende waehrend der Suche nach der Direktive fuer die vorkompilierte Header-Datei
Fehler beim Ausführen von cl.exe.gggggg.exe - 1 Fehler, 0 Warnung(en)
der fehler bezieht sich auf die letzte zeile. woran liegts???
-
wtf?
-
Hm eine Frage:
Wozu die Map wenn der Zugriff über den String als Schlüssel nicht verwendet wird?
-
@Whtthfck: Schau dir das Programm mal im Debugger an - womöglich hast du ja beim Einlesen gepatzt.
(btw, die Anweisunganswer==pos->secondist nutzlos)@Zwielicht: Lies dir mal in der MSDN das Kapitel "vorcompilierte Header" durch

-
omg ich depp hab vergessen str und str2 zurückzusetzen

thx CStoll ^^