AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte Vokabeltrainer Abfrageprobleme.

Vokabeltrainer Abfrageprobleme.

Ein Thema von blender · begonnen am 22. Mai 2008 · letzter Beitrag vom 27. Jun 2008
Antwort Antwort
blender
Registriert seit: 25. Feb 2008
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
Angehängte Dateien
Dateityp: exe vocabulary1b5a4_947.exe (544,5 KB, 6x aufgerufen)
 
Larsi

 
Delphi 2007 Professional
 
#2
  Alt 22. Mai 2008, 19:07
Könntest du das ganze vielleicht mal ein bisschen kommentieren?
  Mit Zitat antworten Zitat
blender

 
Delphi 7 Personal
 
#3
  Alt 22. Mai 2008, 19:34
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
  Mit Zitat antworten Zitat
blender

 
Delphi 7 Personal
 
#4
  Alt 26. Jun 2008, 16:35
Hallo?
  Mit Zitat antworten Zitat
oldmax
 
#5
  Alt 27. Jun 2008, 06:51
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
  Mit Zitat antworten Zitat
oldmax
 
#6
  Alt 27. Jun 2008, 07:55
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
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:35 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf