Schrift
[thread]10737[/thread]

Array random abarbeiten

Leser: 1


<< >> 9 Einträge, 1 Seite
FlorianL
 2007-11-07 16:30
#101972 #101972
User since
2007-05-18
142 Artikel
BenutzerIn
[default_avatar]
Hallo zusammen, ich hab für unsre Azubis ein simples multiple-choice script geschrieben, nun möchte ich das array gerne zufällig durchlaufen damit die einzelnen fragen nicht in der anordnung wiedergegeben werden in der sie im db-file gespeichert sind.

Eine Randomzeile habe ich mir schonmal mit

Code: (dl )
1
2
my $length = $#db + 1;
print $db[int rand($#db)];


aus den fingern gelutscht ;)

hat mal jemand nen denkanstoss für mich wie ich das auf den rest übertragen kann? Hier ist der Code:

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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#!/usr/bin/perl
use strict;
use warnings;

my $dbfile = "learnIT.db";
open(my $dbh, "<",$dbfile) or die $!;
my @db = <$dbh>;
close $dbh;

my $good = 0;
my $bad = 0;
my $count = 0;

my $length = $#db + 1;
print $db[int rand($#db)];


sub clear {
        my $sleeptime = shift;
        sleep("$sleeptime");
        system("clear");
        print("##############################\n##  LearnIT by Florian L    ##\n##                          ##\n##  type 'exit' to quit...  ##\n##                          ##\n###
###########################\n");
}
#clear(0);

sub getrand {
        my $random = int(rand(3));
        return $random;
}

foreach (@db) {
        my (undef,$question_nr,$question, $answer_a, $answer_b, $answer_c, $answer_d) = split(/\.:\./, $_);
        my $randnum = getrand();
        $count++;
        if ($randnum == 0) {
                print("\n$question_nr $question\n------------------------------\n");
                print("a) $answer_a\nb) $answer_b\nc) $answer_c\nd) $answer_d\n");
                TYPEA:
                print("\nAntwort: ");
                chomp(my $answer = <STDIN>);
                if ($answer eq 'd') {
                        print("\n-Korrekt-\n");
                        $good++;
                        clear(2);
                } elsif ($answer eq 'exit') {
                        print("Von $count Fragen wurden $good richtig beantwortet, es wurden dabei $bad falsche Antworten gegeben.\n");
                        exit;
                } else {
                        print("Leider falsch, try again...\n");
                        $bad++;
                        goto TYPEA;
                }
        } elsif ($randnum == 1) {
                print("\n$question_nr $question\n------------------------------\n");
                print("a) $answer_b\nb) $answer_c\nc) $answer_d\nd) $answer_a\n");
                TYPEB:
                print("\nAntwort: ");
                chomp(my $answer = <STDIN>);
                if ($answer eq 'c') {
                        print("\n-Korrekt-\n");
                        $good++;
                        clear(2);
                } elsif ($answer eq 'exit') {
                        print("Von $count Fragen wurden $good richtig beantwortet, es wurden dabei $bad falsche Antworten gegeben.\n");
                        exit;
                } else {
                        print("Leider falsch, try again...\n");
                        $bad++;
                        goto TYPEB;
                }
         } elsif ($randnum == 2) {
                print("\n$question_nr $question\n------------------------------\n");
                print("a) $answer_c\nb) $answer_d\nc) $answer_a\nd) $answer_b\n");
                TYPEC:
                print("\nAntwort: ");
                chomp(my $answer = <STDIN>);
                if ($answer eq 'b') {
                        print("\n-Korrekt-\n");
                        $good++;
                        clear(2);
                } elsif ($answer eq 'exit') {
                        print("Von $count Fragen wurden $good richtig beantwortet, es wurden dabei $bad falsche Antworten gegeben.\n");
                        exit;
                } else {
                        print("Leider falsch, try again...\n");
                        $bad++;
                        goto TYPEC;
                }
         } elsif ($randnum == 3) {
                print("\n$question_nr $question\n------------------------------\n");
                print("a) $answer_d\nb) $answer_a\nc) $answer_b\nd) $answer_c\n");
                TYPED:
                print("\nAntwort: ");
                chomp(my $answer = <STDIN>);
                if ($answer eq 'a') {
                        print("\n-Korrekt-\n");
                        $good++;
                        clear(2);
                } elsif ($answer eq 'exit') {
                        print("Von $count Fragen wurden $good richtig beantwortet, es wurden dabei $bad falsche Antworten gegeben.\n");
                        exit;
                } else {
                        print("Leider falsch, try again...\n");
                        $bad++;
                        goto TYPED;
                }
        }
}
print("\nVon $count Fragen wurden $good richtig beantwortet,\nes wurden dabei $bad falsche Antworten gegeben.\n");


db-file:

Code: (dl )
1
2
3
.:.1.:.Frage.:.Antwort1.:.Antwort2.:.Antwort3.:.Antwort4.:.
.:.2.:.Frage2.:.Antwort21.:.Antwort22.:.Antwort23.:.Antwort24.:.
.:.3.:.Frage3.:.Antwort31.:.Antwort32.:.Antwort33.:.Antwort34.:.



Vielen dank im Vorraus :)
pq
 2007-11-07 16:40
#101973 #101973
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
FlorianL+2007-11-07 15:30:16--
Code: (dl )
1
2
my $length = $#db + 1;
print $db[int rand($#db)];

das macht man ueblicherweise so:
Code (perl): (dl )
print $db[rand @db];

das int() ist ueberfluessig. perl weiss schon, dass man als arrayindex
keine kommazahl moechte. das $#db ist falsch. $#db ist nicht die laenge des
arrays! wie du lustigerweise eine zeile drueber selbst schreibst, aber
$length nie benutzt.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
renee
 2007-11-07 16:44
#101975 #101975
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Ich würde da mit "shuffle" arbeiten (aus einem Modul List::MoreUtils oder so). Dann kannst Du Dir das ganze if-else-Konstrukt sparen...

und: goto ist böse ;-)
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
FlorianL
 2007-11-07 16:49
#101977 #101977
User since
2007-05-18
142 Artikel
BenutzerIn
[default_avatar]
Hi ;)

Das goto böse ist weiss ich doch, aber ich seh das bei ~50 zeilen code nich so eng *g*

Das mit dem shuffle ist interessant, problematisch ist wieder mal das keine module auf dem server nachinstalliert werden können. (Bzw. können schon, dürfen -nicht )

danke :)

und schönen feierabend noch
renee
 2007-11-07 16:55
#101978 #101978
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
ungetestet:
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
#!/usr/bin/perl
use strict;
use warnings;
use List::Util;

my $dbfile = "learnIT.db";
open(my $dbh, "<",$dbfile) or die $!;
my @db = <$dbh>;
close $dbh;

my $good  = 0;
my $bad   = 0;
my $count = 0;


sub clear {
        my $sleeptime = shift;
        sleep("$sleeptime");
        system("clear");
        print("##############################\n##  LearnIT by Florian L    ##\n##                          ##\n##  type 'exit' to quit...  ##\n##                          ##\n###
###########################\n");
}
#clear(0);

sub getrand {
        my $random = int(rand(3));
        return $random;
}

foreach (@db) {
        my (undef,$question_nr,$question, @answers) = split(/\.:\./, $_);
        my $randnum = getrand();
        $count++;
        
        my @tmp = shuffle @answers;
        
        WHILELOOP: while( 1 ){
            print qq~
$question_nr $question
------------------------------
1) $tmp[0]
2) $tmp[1]
3) $tmp[2]
4) $tmp[3]

Antwort:~;
            chomp(my $answer = <STDIN>);
            if( $answer =~ /^\d$/ and $tmp[$answer] eq $answers[3] ){
                print "\n-Korrekt-\n";
                $good++;
                clear(2);
                last WHILELOOP;
            }
            elsif( $answer eq 'exit' ){
                print "Von $count Fragen wurden $good richtig beantwortet, es wurden dabei $bad falsche Antworten gegeben.\n";
                exit;
            }
            else{
                print "Leider falsch, try again...\n";
                $bad++;
            }
        }
}

print "\nVon $count Fragen wurden $good richtig beantwortet,\nes wurden dabei $bad falsche Antworten gegeben.\n";
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
renee
 2007-11-07 16:56
#101979 #101979
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Wenn kein Modul installiert werden darf, dann einfach shuffle aus CPAN:List::Util kopieren:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
sub shuffle (@) {
  my @a=\(@_);
  my $n;
  my $i=@_;
  map {
    $n = rand($i--);
    (${$a[$n]}, $a[$n] = $a[$i])[0];
  } @_;
}
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
FlorianL
 2007-11-07 17:00
#101982 #101982
User since
2007-05-18
142 Artikel
BenutzerIn
[default_avatar]
dank dir :)

eine sache die ich schonmal irgendwann in die poard wishlist gesetzt hatte:

baut ma bidde ne möglichkeit ein die zeilen nummern auszublenden ;)
renee
 2007-11-07 17:07
#101984 #101984
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Das steht in der ToDo-List drin, aber wir müssen ja auch alle unsere Brötchen irgendwie verdienen...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
FlorianL
 2007-11-07 17:12
#101986 #101986
User since
2007-05-18
142 Artikel
BenutzerIn
[default_avatar]
pfft, ich dachte ihr seid importiere zwangs-coder aus china? *g*

ich mach schicht für heute, solltet ihr auch, bei dem knaller wetter da draussen *lol
<< >> 9 Einträge, 1 Seite



View all threads created 2007-11-07 16:30.