![]() |
Vokabeltrainer Abfrageprobleme.
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
ich habe einen Vokabeltrainer programmiert. Bei der Abfrage treten allerdings Fehler auf. Die Vokabel wird nicht richtig ausgewertet, sodass die anzahl der Falschen Buchstaben verfälscht wird:
Delphi-Quellcode:
procedure TForm1.Button6Click(Sender: TObject);
var auswahl, gessum: integer; sprach1, sprach2, eingabe: string; richtanz: Boolean; label 1; begin ZaeleNochAbzuFr(nochabzufr, gessum); RandomVokabel(nochabzufr, auswahl); if gessum > 0 then begin ChangeVokabel(auswahl, radiogroup1.ItemIndex, sprache1, sprache2, sprach1,sprach2); 1: begin FrageAb(Vokabel1, Sprach1, Sprach2, Eingabe); VergleicheVokabel(eingabe, vokabel2, checkbox1.checked, fehler, richtanz); if (not richtanz) and (eingabe <> '') then goto 1; if eingabe <> '' then begin ShowMessage(sprach1 + ' - '+ sprach2 +#10#13+ vokabel1 + ' - '+vokabel2+#10#13+'Es werden noch '+inttostr(gessum)+' Vokabeln abgefragt.'+#10#13+'Du hast '+inttostr(fehler) {Hier zeigt sich der Fehler.} +' falsche Buchstaben eingegeben.'); end; end; end; end;
Delphi-Quellcode:
procedure TForm1.VergleicheVokabel (Vokabel1, Vokabel2: String; FilterLeerZeichen: Boolean; var Fehler: Integer; var KonnteVergleichen: Boolean);
var i, j, gesamtfehler: Integer; Moeglichkeiten, Moeglichkeiten1, fehlerpromoegl: TStringList; begin gesamtfehler:=0; Moeglichkeiten := TStringlist.Create; Moeglichkeiten1 := TStringlist.Create; fehlerpromoegl := TStringlist.Create; GetMoeglichkeiten(Eingabe, filterleerzeichen, Moeglichkeiten); GetMoeglichkeiten(Vokabel2, filterleerzeichen, Moeglichkeiten1); KonnteVergleichen := Moeglichkeiten.Count=Moeglichkeiten1.Count; if KonnteVergleichen then begin //Vergleiche for i := 0 to Moeglichkeiten.Count-1 do begin for j := 0 to moeglichkeiten1.count-1 do begin fehler:=0; VergleicheMoeglichkeit(Moeglichkeiten1[i], moeglichkeiten[j], Fehler); FehlerProMoegl.Add(inttostr(fehler)); end; end; end; for i := 0 to moeglichkeiten.count-1 do begin fehler := StrToInt(FehlerProMoegl[i*moeglichkeiten.count]); for j := 0 to moeglichkeiten1.count-1 do begin if StrToInt(FehlerProMoegl[i*moeglichkeiten.count+j]) < fehler then fehler := StrToInt(FehlerProMoegl[i*moeglichkeiten.count+j]); end; inc(GesamtFehler, Fehler); end; fehler := gesamtfehler; end;
Delphi-Quellcode:
procedure TForm1.GetMoeglichkeiten (Vokabel: String; LeerzFiltern: Boolean; Var Moeglichkeiten: TStringlist);
var i: Integer; Moeglichkeit, Filter: String; begin Filter:=''; if leerzfiltern then begin for i := 1 to Length(Vokabel) do begin if vokabel[i] <> ' ' then Filter:=filter+vokabel[i]; end; Vokabel := filter; end; for i := 1 to Length(Vokabel) do begin if (Vokabel[i]<>',') and (vokabel[i] <> ';') then Moeglichkeit := Moeglichkeit + Vokabel[i] else begin Moeglichkeiten.Add(Moeglichkeit); Moeglichkeit:=''; end; end; Moeglichkeiten.Add(Moeglichkeit); Moeglichkeit:=''; end;
Delphi-Quellcode:
procedure TForm1.VergleicheMoeglichkeit (Moegl1, Moegl2: String; var Fehler: integer);
var i, ausgleich: Integer; begin ausgleich := 0; Fehler := 0; for i := 1 to length(moegl1) do begin if i+ausgleich > length(moegl2) then inc(fehler) else begin if UpperCase(moegl1[i]) <> UpperCase(moegl2[i + ausgleich]) then begin inc(Fehler); if uppercase(moegl1[i]) = uppercase(moegl2[i + ausgleich - 1]) then begin dec(ausgleich); dec(fehler); end else if uppercase(moegl1[i]) = uppercase(moegl2[i + ausgleich + 1]) then begin inc(ausgleich) end; end; end; end; end;
Delphi-Quellcode:
procedure TForm1.ChangeVokabel(auswahl, WasZuWas: integer; sprache1, sprache2: string; var sprach1, sprach2: string);
begin case WasZuWas of 0: begin vokabel1 := vokabelnf1[auswahl]; sprach1 := sprache1; vokabel2 := vokabelnf2[auswahl]; sprach2 := sprache2; end; 1: begin vokabel2 := vokabelnf1[auswahl]; sprach2 := sprache1; vokabel1 := vokabelnf2[auswahl]; sprach1 := sprache2; end; 2: begin case random(2) of 0: begin vokabel1 := vokabelnf1[auswahl]; sprach1 := sprache1; vokabel2 := vokabelnf2[auswahl]; sprach2 := sprache2; end; 1: begin vokabel2 := vokabelnf1[auswahl]; sprach2 := sprache1; vokabel1 := vokabelnf2[auswahl]; sprach1 := sprache2; end; end; end; end; end;
Delphi-Quellcode:
procedure TForm1.ZaeleNochAbzuFr (Werte: TStringlist; var Insgesamt: Integer);
var gessum, i: integer; begin gessum:=0; for i := 0 to werte.count-1 do gessum := gessum + strtoint(nochabzufr[i]); insgesamt:=gessum; end;
Delphi-Quellcode:
procedure TForm1.FrageAb (Vokabel1, Sprache1, Sprache2: String; var eingabe: string);
begin eingabe := InputBox('Abfrage... '+sprache1+' - '+sprache2,'Bitte übersetze folgende Vokabel aus dem '+sprache1+'en ins '+sprache2+'e: '+vokabel1,''); end;
Delphi-Quellcode:
Ich glaube, dass die Eingabe nicht richtig übergeben wird.
procedure TForm1.RandomVokabel (nochabzufr: TStringList; var auswahl: integer);
var gessum: integer; begin randomize; zaelenochabzufr(nochabzufr, gessum); auswahl := random(vokabelnf1.count-1); while (gessum > 0) and (strtoint(nochabzufr[auswahl]) <=0) do auswahl := random(vokabelnf1.count-1); end; Beim Kompilieren werden keine Fehler, Warnungen oder Hinweise angezeigt. Lasse |
Re: Vokabeltrainer Abfrageprobleme.
Könntest du das ganze vielleicht mal ein bisschen kommentieren?
|
Re: Vokabeltrainer Abfrageprobleme.
Ja.
VergleicheVokabel (da liegt ja der Fehler) Die Vokabel wird auf Kommas und Simikola überprüft. Dann werden die einzelnen Möglichkeiten in eine Stringliste übergeben. Dies passiert mit der richtigen Vokabel, sowie mit der Eingabe. Nun wird jede Möglichkeit der Lösung mit jeder Möglichkeit der Eingabe auf diese Art verglichen: 1. es wird geprüft, ob der jeweilige Buchstabe der Lösungs- mit dem jeweiligen der Eingabemöglichkeit verglichen. Bei Negativem Ausfall wird Fehler inkrementiert. 2. Wenn der Vergleich sich als falsch erweist, wird der Lösungsbuchstabe mit dem jeweilig nächsten der Eingabemöglichkeit verglichen, um eventuell zuviel eingegebene Buchstaben zu berücksichtigen. Daher wird beim einem Positiven Ausfall die Variable Ausgleich Incrementiert (Fehler ist ja schon Inkrementiert worden). Bei einem Negativen Ausfall wird der Lösungsbuchstabe mit dem jeweilig davorstehenden der Eingabemöglichkeit verglichen, um eventuell vergessene Buchstaben zu berücksichtigen. In diesem Fall wird Ausgleich Decrementiert, Fehler aber wieder Dekrementiert, weil Fehler vorher schon Inkrementiert wurde, aber der vorherige Buchstabe schon für einen Fehler gesorgt hat. Nun sucht sich das Programm zu jeder richtigen Möglichkeit die Eingabemöglichkeit mit den wenigsten Tippfehlern. Die Fehler werden zusammengerechnet und man hat, theoretisch, die Gesamtanzahl der Tippfehler. Lasse |
Re: Vokabeltrainer Abfrageprobleme.
Hallo?
|
Re: Vokabeltrainer Abfrageprobleme.
Hi Lasse
Mag ja sein, das du von uns Hilfe erwartest, nur verstehe, du erwartest, das wir uns in einem Code durchfummeln der nix von Formatierung und übersichtlicher Gestaltung hat. Du selbst blickst auch besser durch, wenn du einmal das viel zitierte und doch sowenig beachtete Einrücken der Begin und End Bereiche anwendest. BSP.
Delphi-Quellcode:
Die Zeile ShowMessage ist auch ziemlich lang, daher nehme ich in solchen Fälle eine Stringvariable zuhilfe und weise sie in mehreren Zeilen zu:
procedure TForm1.Button6Click(Sender: TObject);
var auswahl, gessum : integer; sprach1, sprach2, eingabe : string; richtanz : Boolean; [b]label 1; [/b] // ????? Was ist das ? begin ZaeleNochAbzuFr(nochabzufr, gessum); RandomVokabel(nochabzufr, auswahl); if gessum > 0 then begin ChangeVokabel(auswahl, radiogroup1.ItemIndex, sprache1, sprache2, sprach1,sprach2); [b]1: [/b] // ????? Sprungmarke ? Warum nicht Repeat ? begin // FrageAb(Vokabel1, Sprach1, Sprach2, Eingabe); VergleicheVokabel(eingabe, vokabel2, checkbox1.checked, fehler, richtanz); if (not richtanz) and (eingabe <> '') then goto 1; // und hier Until und zurückrücken // Until (richtanz) or(eingabe =''); geänderte Logik ! if eingabe <> '' then begin ShowMessage(sprach1 + ' - '+ sprach2 +#10#13+ vokabel1 + ' - '+vokabel2+#10#13+'Es werden noch '+inttostr(gessum)+' Vokabeln abgefragt.'+#10#13+'Du hast '+inttostr(fehler) {Hier zeigt sich der Fehler.} +' falsche Buchstaben eingegeben.'); end; // Eingabe erfolgt end; // Falsch ! da 1: Begin keinen Sinn macht end; // Gessum gültig ( oder was auch immer ) end;
Delphi-Quellcode:
Ist nicht zwingend notendig, aber es erhöht die Lesbarkeit und je nach Umfang des Programmes ist der Mehraufwand bei Hilfstexten auch gar nicht sooo schlimm.
Infotext:=Sprach1+'-'+Sprach2+#13;
Infotext:=Infotext+Vokabel1+'-'+Vokabel2+#13; Infotext:=Infotext+'Es werden moch..... usw Auch wenn ich nicht auf dein Problem eingegangen bin, hoffe ich, dir genug Info gegeben zu haben, die dir hilft, den Fehler zu finden. Denk auch dran, das du dein Programm auch im Einzelschritt ausführen und Schritt für Schritt das Ergebnis der einzelnen Anweisungen prüfen kannst. Stichwort Haltepunkt! Gruß oldmax |
Re: Vokabeltrainer Abfrageprobleme.
Hi
Noch ein kleiner Nachtrag: Löse dich von Goto - Anweisungen. Sie sind alle durchweg ersetzbar durch Repeat oder While-Schleifen sowie bei Vorwärtssprüngen mit If .. Then Begin ... End Bereichen. Goto ist noch ein Überbleibsel aus längst vergangenen Zeiten und war auch damals eigentlich schon über. Ich bin nicht allein mit der Meinung, das Goto die Struktur und die Lesbarkeit von Quelltext zerstört und ich habe bisher nie ! ein Goto benötigt ! Gruß oldmax |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:33 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz