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

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

user image
Hallo pktm,
hallo Futureflo,

da bei bei einem Programmdurchlauf immer alle Vokabeln abgefragt werden sollen (while ($durchgaenge<($#loesung_array+1))) und dabei keine Wiederholungen erwünscht sind, ist es nicht zweckmäßig, mit der rand()-Funktion zu arbeiten (und dann über ein Hash auf Wiederholungen zu prüfen). Bei größeren Datenmengen wird sonst die Suche nach einem noch nicht "verbrauchten" Arrayelement zunehmend aufwendig, wenn Perl z.B. aus 100_000 Arrayelementen durch wiederholte Zufallsauswahl das eine letzte erwischen muss, das noch nicht verbraucht ist. Stattdessen ist List::Util ('shuffle') die Methode der Wahl. (Das habe ich übrigens in diesem Forum gelernt.)

Hier mein Vorschlag - abgeleitet aus meinem überarbeiteten Script von vorhin (s.u.). Die Tupel aus Aufgabe und Lösung sammle ich jetzt nicht mehr in parallelen Arrays sondern in einem Hash.
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
#!/usr/bin/perl

use strict;
use warnings;

use List::Util ('shuffle');

my ($vokabeln_file, $loesung_file, $nichtgekonnte_file) = ("Vokabeln.txt", "Loesung.txt", "nichtgekonnte.txt");

open (my $vokabeln_FH, '<', $vokabeln_file) || die "Die Datei $vokabeln_file konnte nicht gefunden werden";
chomp(my @vokabeln_array = <$vokabeln_FH>);
close ($vokabeln_FH);

my %vokabeln;

open (my $loesung_FH, '<', $loesung_file) || die "Die Datei $loesung_file konnte nicht gefunden werden";
chomp($vokabeln{$vokabeln_array[$.-1]} = $_) while (<$loesung_FH>);
close ($loesung_FH);

open(my $schreib_FH, ">>", $nichtgekonnte_file);

for my $aufgabe (shuffle @vokabeln_array) {
    print "Translate the word $aufgabe\n";
    chomp(my $eingabe = <STDIN>);

    if ($eingabe eq $vokabeln{$aufgabe}) {
        print "The translation is correct!\n";
    } 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>);
        if ($antwort eq '1') {
            print $schreib_FH "Wrong: \"$eingabe\" for \"$aufgabe\" (correct is: \"$vokabeln{$aufgabe}\")\n";
        }
    }
}
close($schreib_FH);
HTH
Grüße
payx

View full thread Vokabeltrainer