Thread Vokabeltrainer (17 answers)
Opened by Futureflo at 2011-03-06 23:06

payx
 2011-03-07 13:00
#146280 #146280
User since
2006-05-04
564 Artikel
BenutzerIn

user image
Hallo Futureflo,

da Du nach Verbesserungsvorschlägen gefragt hattest:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#!/usr/bin/perl

use strict;
use warnings;

# Solche Werte am Anfang des Scripts festlegen, damit man später
# nicht lang im Script suchen muss, wenn sich etwas ändert.
my ($vokabeln_file, $loesung_file, $nichtgekonnte_file) = ("Vokabeln.txt", "Loesung.txt", "nichtgekonnte.txt");

# Wie von Linuxer schon empfohlen: 3-Argument-Form des open() mit lexikalischem Filehandle
open (my $vokabeln_FH, '<', $vokabeln_file) || die "Die Datei $vokabeln_file konnte nicht gefunden werden";
# So klappt das Einlesen mehrerer Zeilen in ein Array
chomp(my @vokabeln_array = <$vokabeln_FH>);
close ($vokabeln_FH);

#my @vokabeln_array = split (/:+/, $vokabeln);

open (my $loesung_FH, '<', $loesung_file) || die "Die Datei $loesung_file konnte nicht gefunden werden";
chomp(my @loesung_array = <$loesung_FH>);
close ($loesung_FH);

#my @loesung_array = split (/:+/, $loesung);

#$#loesung_array;

# Diese beiden Arrays sind verzichtbar, wenn die Datei nichtgekonnte.txt (wie schon von
# Linuxer vorgeschlagen) mit '>>' for appending (also zum Anhängen) geöffnet wird.
# Siehe perldoc -f open
#my @alle_versuche;
#my @alle_vokabeln;

# Bei Deiner Methode wird nämlich jedes Mal, wenn der Benutzer nach einem
# Fehler 1 wählt, die Datei nichtgekonnte.txt gelöscht und komplett
# neu gefüllt.
open(my $schreib_FH, ">>", $nichtgekonnte_file);

#my $durchgaenge=0;

# Statt ($durchgaenge<($#loesung_array+1)) würde ich schreiben
# ($durchgaenge <= $#loesung_array) oder gleich
for my $durchgaenge (0..$#loesung_array) {
# In Schleifen sinnvoll einrücken
    
    # Warum 0+? Als Index werden ganze Zahlen verwendet, daher Umwandlung mit int()
    my $zahl=int(rand(3));

    print "Translate the word $vokabeln_array[$zahl]\n";
    
    # Wenn schon in einer Zeile, dann besser so:
    chomp(my $eingabe = <STDIN>);
    #push @alle_versuche, $eingabe;
    #push @alle_vokabeln, $vokabeln_array[$zahl];

    if ($eingabe eq $loesung_array[$zahl])     {
        print "The translation is correct!\n";
        # Das Hochzählen übernimmt for
        #$durchgaenge++;
    } else {
        print "The translation is incorrect\n";

        print "Do you want to save the incorrect word and answer?\n";
        print "(1)Yes              (2)No\n";
        chomp(my $antwort=<STDIN>);
        
        # Der Vergleichsoperator für Zahlen ist '=='; für Strings eq,
        # - dann würde ich aber einen gequoteten String erwarten.
        # Perl drückt bei Deinem Konstrukt aber ein Auge zu.
        if ($antwort eq 1) {
            #open(my $schreib_FH, ">", $nichtgekonnte_file);
            #print $schreib_FH ">>Wrong:\n";
            #print $schreib_FH join "\n", @alle_vokabeln;
            #print $schreib_FH "\n\n";
            #print $schreib_FH ">>Answer:\n";
            #print $schreib_FH join "\n", @alle_versuche;
            #close($schreib_FH);
            print $schreib_FH "Wrong: \"$eingabe\" for \"$vokabeln_array[$zahl]\" (correct is: \"$loesung_array[$zahl]\")\n";
            #$durchgaenge++;
        } #else {
            #$durchgaenge++;
        #}
    }
}
close($schreib_FH);

Das (verkürzte und vereinfachte) Script macht jetzt etwa dasselbe wie vorher, allerdings werden hier die Wörter aus den Quelldateien zeilenweise ausgelesen und die Ausgabe in die Datei nichtgekonnte.txt sieht etwas anders aus.

Das sind meine Verbesserungsvorschläge hinsichtlich der Programmierform. Auf dem Weg zu einem wirklich brauchbaren Vokabeltrainer gäbe es natürlich noch sehr, sehr viele Verbesserungen ...

HTH
Grüße
payx

View full thread Vokabeltrainer