Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   Vokabeltrainer Abfrageprobleme. (https://www.delphipraxis.net/114275-vokabeltrainer-abfrageprobleme.html)

blender 22. Mai 2008 16:55


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:
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;
Ich glaube, dass die Eingabe nicht richtig übergeben wird.
Beim Kompilieren werden keine Fehler, Warnungen oder Hinweise angezeigt.
Lasse

Larsi 22. Mai 2008 18:07

Re: Vokabeltrainer Abfrageprobleme.
 
Könntest du das ganze vielleicht mal ein bisschen kommentieren?

blender 22. Mai 2008 18:34

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

blender 26. Jun 2008 15:35

Re: Vokabeltrainer Abfrageprobleme.
 
Hallo?

oldmax 27. Jun 2008 05:51

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:
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;
Die Zeile ShowMessage ist auch ziemlich lang, daher nehme ich in solchen Fälle eine Stringvariable zuhilfe und weise sie in mehreren Zeilen zu:
Delphi-Quellcode:
Infotext:=Sprach1+'-'+Sprach2+#13;
Infotext:=Infotext+Vokabel1+'-'+Vokabel2+#13;
Infotext:=Infotext+'Es werden moch..... usw
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.

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

oldmax 27. Jun 2008 06:55

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 02:05 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz