Vokabeltrainer

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Vokabeltrainer

    Wie würdet ihr meinen Vokabeltrainer bewerten? 9
    1.  
      1 (0) 0%
    2.  
      2 (1) 11%
    3.  
      3 (1) 11%
    4.  
      4 (1) 11%
    5.  
      5 (2) 22%
    6.  
      6 (4) 44%
    Hallo,
    ich habe einen Vokabeltrainer programmiert. (Siehe Anhang.)
    Bei der Abfrage treten allerdings Fehler auf.
    Die Vokabel wird nicht richtig ausgewertet, sodass die anzahl der Falschen Buchstaben verfälscht wird:

    Quellcode

    1. procedure TForm1.Button6Click(Sender: TObject);
    2. var auswahl, gessum: integer;
    3. sprach1, sprach2, eingabe: string;
    4. richtanz: Boolean;
    5. label 1;
    6. begin
    7. ZaeleNochAbzuFr(nochabzufr, gessum);
    8. RandomVokabel(nochabzufr, auswahl);
    9. if gessum > 0 then
    10. begin
    11. ChangeVokabel(auswahl, radiogroup1.ItemIndex, sprache1, sprache2, sprach1,sprach2);
    12. 1:
    13. begin
    14. FrageAb(Vokabel1, Sprach1, Sprach2, Eingabe);
    15. VergleicheVokabel(eingabe, vokabel2, checkbox1.checked, fehler, richtanz);
    16. if (not richtanz) and (eingabe <> '') then goto 1;
    17. if eingabe <> '' then
    18. begin
    19. 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.');
    20. end;
    21. end;
    22. end;
    23. end;
    Alles anzeigen


    Quellcode

    1. procedure TForm1.VergleicheVokabel (Vokabel1, Vokabel2: String; FilterLeerZeichen: Boolean; var Fehler: Integer; var KonnteVergleichen: Boolean);
    2. var i, j, gesamtfehler: Integer;
    3. Moeglichkeiten, Moeglichkeiten1, fehlerpromoegl: TStringList;
    4. begin
    5. gesamtfehler:=0;
    6. Moeglichkeiten := TStringlist.Create;
    7. Moeglichkeiten1 := TStringlist.Create;
    8. fehlerpromoegl := TStringlist.Create;
    9. GetMoeglichkeiten(Eingabe, filterleerzeichen, Moeglichkeiten);
    10. GetMoeglichkeiten(Vokabel2, filterleerzeichen, Moeglichkeiten1);
    11. KonnteVergleichen := Moeglichkeiten.Count=Moeglichkeiten1.Count;
    12. if KonnteVergleichen then
    13. begin
    14. //Vergleiche
    15. for i := 0 to Moeglichkeiten.Count-1 do
    16. begin
    17. for j := 0 to moeglichkeiten1.count-1 do
    18. begin
    19. fehler:=0;
    20. VergleicheMoeglichkeit(Moeglichkeiten1[i], moeglichkeiten[j], Fehler);
    21. FehlerProMoegl.Add(inttostr(fehler));
    22. end;
    23. end;
    24. end;
    25. for i := 0 to moeglichkeiten.count-1 do
    26. begin
    27. fehler := StrToInt(FehlerProMoegl[i*moeglichkeiten.count]);
    28. for j := 0 to moeglichkeiten1.count-1 do
    29. begin
    30. if StrToInt(FehlerProMoegl[i*moeglichkeiten.count+j]) < fehler then fehler := StrToInt(FehlerProMoegl[i*moeglichkeiten.count+j]);
    31. end;
    32. inc(GesamtFehler, Fehler);
    33. end;
    34. fehler := gesamtfehler;
    35. end;
    Alles anzeigen

    Quellcode

    1. procedure TForm1.GetMoeglichkeiten (Vokabel: String; LeerzFiltern: Boolean; Var Moeglichkeiten: TStringlist);
    2. var i: Integer;
    3. Moeglichkeit, Filter: String;
    4. begin
    5. Filter:='';
    6. if leerzfiltern then
    7. begin
    8. for i := 1 to Length(Vokabel) do
    9. begin
    10. if vokabel[i] <> '' then Filter:=filter+vokabel[i];
    11. end;
    12. Vokabel := filter;
    13. end;
    14. for i := 1 to Length(Vokabel) do
    15. begin
    16. if (Vokabel[i]<>',') and (vokabel[i] <> ';') then Moeglichkeit := Moeglichkeit + Vokabel[i]
    17. else
    18. begin
    19. Moeglichkeiten.Add(Moeglichkeit);
    20. Moeglichkeit:='';
    21. end;
    22. end;
    23. Moeglichkeiten.Add(Moeglichkeit);
    24. Moeglichkeit:='';
    25. end;
    Alles anzeigen

    Quellcode

    1. procedure TForm1.VergleicheMoeglichkeit (Moegl1, Moegl2: String; var Fehler: integer);
    2. var i, ausgleich: Integer;
    3. begin
    4. ausgleich := 0;
    5. Fehler := 0;
    6. for i := 1 to length(moegl1) do
    7. begin
    8. if i+ausgleich > length(moegl2) then inc(fehler) else
    9. begin
    10. if UpperCase(moegl1[i]) <> UpperCase(moegl2[i + ausgleich]) then
    11. begin
    12. inc(Fehler);
    13. if uppercase(moegl1[i]) = uppercase(moegl2[i + ausgleich - 1]) then
    14. begin
    15. dec(ausgleich);
    16. dec(fehler);
    17. end
    18. else
    19. if uppercase(moegl1[i]) = uppercase(moegl2[i + ausgleich + 1]) then
    20. begin
    21. inc(ausgleich)
    22. end;
    23. end;
    24. end;
    25. end;
    26. end;
    Alles anzeigen


    Quellcode

    1. procedure TForm1.ChangeVokabel(auswahl, WasZuWas: integer; sprache1, sprache2: string; var sprach1, sprach2: string);
    2. begin
    3. case WasZuWas of
    4. 0: begin
    5. vokabel1 := vokabelnf1[auswahl]; sprach1 := sprache1;
    6. vokabel2 := vokabelnf2[auswahl]; sprach2 := sprache2;
    7. end;
    8. 1: begin
    9. vokabel2 := vokabelnf1[auswahl]; sprach2 := sprache1;
    10. vokabel1 := vokabelnf2[auswahl]; sprach1 := sprache2;
    11. end;
    12. 2: begin
    13. case random(2) of
    14. 0: begin
    15. vokabel1 := vokabelnf1[auswahl]; sprach1 := sprache1;
    16. vokabel2 := vokabelnf2[auswahl]; sprach2 := sprache2;
    17. end;
    18. 1: begin
    19. vokabel2 := vokabelnf1[auswahl]; sprach2 := sprache1;
    20. vokabel1 := vokabelnf2[auswahl]; sprach1 := sprache2;
    21. end;
    22. end;
    23. end;
    24. end;
    25. end;
    Alles anzeigen


    Quellcode

    1. procedure TForm1.ZaeleNochAbzuFr (Werte: TStringlist; var Insgesamt: Integer);
    2. var gessum, i: integer;
    3. begin
    4. gessum:=0;
    5. for i := 0 to werte.count-1 do gessum := gessum + strtoint(nochabzufr[i]);
    6. insgesamt:=gessum;
    7. end;


    Quellcode

    1. procedure TForm1.FrageAb (Vokabel1, Sprache1, Sprache2: String; var eingabe: string);
    2. begin
    3. eingabe := InputBox('Abfrage... '+sprache1+' - '+sprache2,'Bitte übersetze folgende Vokabel aus dem '+sprache1+'en ins '+sprache2+'e: '+vokabel1,'');
    4. end;


    Quellcode

    1. procedure TForm1.RandomVokabel (nochabzufr: TStringList; var auswahl: integer);
    2. var gessum: integer;
    3. begin
    4. randomize;
    5. zaelenochabzufr(nochabzufr, gessum);
    6. auswahl := random(vokabelnf1.count-1);
    7. while (gessum > 0) and (strtoint(nochabzufr[auswahl]) <=0) do auswahl := random(vokabelnf1.count-1);
    8. end;



    Ich glaube, dass die Eingabe nicht richtig übergeben wird.
    Hier die Beschreibung, was die Prozedur VergleicheVokabel macht:

    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.

    Beim Kompilieren werden keine Fehler, Warnungen oder Hinweise angezeigt.
    Ich suche schon seit über einer Woche nach dem Fehler und hoffe auf Hilfe.
    Dateien

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von blender ()

  • Also erstienmal muss ich dir leider sagen dass ich deinen Programmierstil unschön finde. der Code ist unlesbar und deswegen so gut wie gar nicht zu debuggen.
    Meine HauptkKritikpunkte daran sind:
    • Deine Buttons haben keine brauchbaren Namen
    • Gotos sind ein absolutes No-Go, das ist unstrukturiert.
    • Du frikelst viel in Arrays rum, wo nicht nachvillziehbar ist wieso.
    • Der Code wirkt irgendwie generell irgendwie umständlich


    Aber solange nur du daran bastelst ist es egal, aber versuch nicht in 3 Monaten daran was zu ändern oder andere daran zu arbeiten zu lassen.
    Zu deinem Problem:

    der Fehler wird von dieser Zeile erzeugt:

    Quellcode

    1. fehler := StrToInt(FehlerProMoegl[i*moeglichkeiten.count]);
    in der Prozedur VergleicheVokabel.

    Wieso kommt da dein Fehler?

    Quellcode

    1. if KonnteVergleichen then
    2. begin
    3. //Vergleiche
    4. for i := 0 to Moeglichkeiten.Count-1 do
    5. begin
    6. for j := 0 to moeglichkeiten1.count-1 do
    7. begin
    8. fehler:=0;
    9. VergleicheMoeglichkeit(Moeglichkeiten1[i], moeglichkeiten[j], Fehler);
    10. FehlerProMoegl.Add(inttostr(fehler));
    11. end;
    12. end;
    13. end;
    Alles anzeigen


    wird nicht ausgeführt, da KonnteVerglichen immer false ist, darauf folgt FehlerProMoegl ist leer und der erst zugriff in der folgenden Schleife mit dem Index 0 schlägt schon fehl (Index out of bounds(0))

    Mehr kann ich dir erstmal leider nicht helfen, weil ich wie gesagt nicht durchsteig ?(
    ~ mfg SeBa

    Ich beantworte keine PMs zu Computer-/Programmierproblemen. Bitte wendet euch an das entsprechende Forum.

    [Blockierte Grafik: http://i.creativecommons.org/l/by-sa/3.0/80x15.png]