Schrift
[thread]10074[/thread]

Simples lern-script



<< >> 10 Einträge, 1 Seite
Gast Gast
 2007-08-14 15:38
#98130 #98130
hallo, ich bastel gerad an nem lern-script rum, soll einfach fragen stellen und dann halt ermitteln ob richtig oder falsch... simpel halt :)

hier mein 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
#!/usr/bin/perl
#
# Simple learning Script
# by F.Luettgens
#
#######################################

use strict;
use warnings;

my $maxtries = '3';

my $dbfile = "learnIT.db";
open(DB, "<$dbfile");
my @db = <DB>;

system("clear");
foreach (@db) {
        my $tries = 0;
        my @package = split(/.:./, $_);
        my $question_nr = $package[1];
        my $question_question = $package[2];
        my $question_answer = $package[3];
        QUESTION:
        print("\#$question_nr $question_question\n");
        print("Answer: ");
        my $answer = <STDIN>;
        if ($answer eq $question_answer) {
                print("Thats correct!\n");
        } else {
                $tries++;
                if ($tries eq $maxtries) {
                        print("Wrong answer!\nThe right one is $question_answer\n");
                } else {
                        print("Thats wrong, try again!\n");
                        goto QUESTION;
                }
        }
}


die db:
[nop].:.1.:.What is 1+1?.:.2
.:.2.:.Whats the airspeed velocity of an unladen swallow?.:.African or European?
.:.3.:.How many fingers are on a single hand?.:.4
.:.4.:.Is this question dumb?.:.Yes[/nop]

Output:
[nop]#1 What is 1+1?
Answer: 1
Thats wrong, try again!
#1 What is 1+1?
Answer: 2
Thats correct!
#2 Whats the airspeed velocity of an unladen swallow?
Answer: 3
Thats wrong, try again!
#2 Whats the airspeed velocity of an unladen swallow?
Answer: African or European?
Thats correct!
#3 How many fingers are on a single hand?
Answer: 4
Thats correct!
#4 Is this question dumb?
Answer: Yes
Thats correct!
[/nop]
Gast Gast
 2007-08-14 15:38
#98131 #98131
<schnipp>

Nun zu meinen Fragen:

1. Ich benutz goto, wie kann ich es sinnvoll ersetzen?
2. Im moment werden die fragen eine nach der anderen abgearbeitet, wie kann ich zufällig eine frage aus der db ziehn?
3. habt ihr sonstige vorschläge wie man das recht simple script weiter verbessern kann?

Bitte keine verweise auf CPAN, hab keine möglichkeit die module auf der box zu installieren

Mfg

FlorianL
(dessen login komischerweise nicht funzt)
renee
 2007-08-14 15:46
#98132 #98132
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
1. mit ner while-Schleife
2. perldoc -f rand
3. muss ich mir erstmal genauer ansehen...
4. ich setz' Dir gleich mal das Passwort zurück und melde mich dann bei Dir...
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-08-14 15:53
#98133 #98133
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
*) Um Zahlen brauchst Du keine ' zu machen
*) Fehler beim "open" sollten abgefangen werden
*) die 3-Arg-Form von open ist sicherer
*) geöffnete Filehandles sollten auch wieder geschlossen werden
*) evtl. lexikalische Filehandles verwenden
*) Die Punkte in der split RegEx sollten escaped werden.

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
#!/usr/bin/perl

use strict;
use warnings;

my $maxtries = 3;

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

system("clear");
foreach (@db) {
        my $tries = 0;
        my (undef,$question_nr,$question_question,$question_answer) = split(/\.:\./, $_);
        while( 1 ){
                print("\#$question_nr $question_question\n");
                print("Answer: ");
                my $answer = <STDIN>;
                if ($answer eq $question_answer) {
                         print("Thats correct!\n");
                         last;
                } else {
                         $tries++;
                         if ($tries eq $maxtries) {
                                print("Wrong answer!\nThe right one is $question_answer\n");
                                last;
                        } else {
                                print("Thats wrong, try again!\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/
Gast Gast
 2007-08-14 15:54
#98135 #98135
renee+2007-08-14 13:46:16--
1. mit ner while-Schleife
2. perldoc -f rand
3. muss ich mir erstmal genauer ansehen...
4. ich setz' Dir gleich mal das Passwort zurück und melde mich dann bei Dir...


1. bin gerad schon dabei weil ich mit der antwort gerechnet hab und trotzdem blöd frage ;)
2. soweit ist mir das klar, aber ich hol mir ja mit der foreach schon die zeilen von oben nach unten und "arbeite" sie dann auch gleich ab, soll ich dann erstmal wieder in ein anderes array "parken" und dann abrufen? ich weiss gerad nich wie ich das machn kann :(
3. kein stress, is nix wichtiges...
4. dankescheen :)
nepos
 2007-08-14 16:09
#98137 #98137
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Lass doch die foreach-Schleife weg. Da du eh alle Fragen direkt in einen Array ziehst, kannst du mit Hilfe von rand() dann zufällige Fragen rausholen. Damit nicht die gleiche Frage doppel gestellt wird, merkst du dir einfach den Array-Index der schon gestellten Fragen und prüfst bei jeder Indexberechnung mit rand(), ob die Frage schon dran war.
Das einzige, was die dann noch fehlt ist eine Endlosschleife um das ganze und eine Abfrage, mit der der Benutzer abbrechen kann.
Gast Gast
 2007-08-14 16:09
#98138 #98138
[quote="renee+2007-08-14 13:53:17--"]
*) Um Zahlen brauchst Du keine ' zu machen
*) Fehler beim "open" sollten abgefangen werden
*) die 3-Arg-Form von open ist sicherer
*) geöffnete Filehandles sollten auch wieder geschlossen werden
*) evtl. lexikalische Filehandles verwenden
*) Die Punkte in der split RegEx sollten escaped werden.

1. mach ich immer wieder ;)
2. auch das, vergess ich immer wieder...
3. magst du erklären warum?
4. vergessen :P
5. ich dachte das hätt ich?! :)
6. siehe Pt. 3 :)

eine frage noch zum pBoard: könnt ihr es so einstellen das die zeilen-zahlen ausgeblendet werden können? macht copy&paste einfacher :)
Ronnie
 2007-08-14 16:40
#98140 #98140
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Gast+2007-08-14 14:09:51--
könnt ihr es so einstellen das die zeilen-zahlen ausgeblendet werden können? macht copy&paste einfacher :)

Zur Not im vi(m): :% s/\d\+: //, oder im Textmate o.ä.: ^\d+:\s beim suchen und ersetzen mit einer leeren Zeichenfolge.
renee
 2007-08-14 16:56
#98142 #98142
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Gast+2007-08-14 14:09:51--

eine frage noch zum pBoard: könnt ihr es so einstellen das die zeilen-zahlen ausgeblendet werden können? macht copy&paste einfacher :)


Steht schon auf der ToDo-Liste...
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-08-14 17:10
#98143 #98143
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Gast+2007-08-14 14:09:51--
renee+2007-08-14 13:53:17--
3) die 3-Arg-Form von open ist sicherer
...
6) Die Punkte in der split RegEx sollten escaped werden.


3. magst du erklären warum?
6. siehe Pt. 3 :)


Zu 3.) Mit der 3-Arg-Form gewöhnt man sich gleich an, den Modus mit anzugeben. So kann einem nicht passieren, dass man irgendwelche "Sonderzeichen" im Dateinamen hat und dadurch unangenehme Seiteneffekte hervorruft. Oder wenn Du führende oder nachgestellte Leerzeichen im Dateinamen hast, werden die bei der 2-Arg-Form einfach weggelöscht...

Noch mehr siehe perldoc -f open

Zu 6.) Sonst würde auch so etwas gesplittet werden:

t:t und tausend Sachen mehr. Man übergibt dem split einen Regulären Ausdruck. In einer RegEx steht der Punkt ('.') für ein "beliebiges" Zeichen. D.h. wenn man den echten Punkt (also das Zeichen '.' an sich) haben will, muss man \. schreiben.

Vergleiche:

Code: (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
C:\Dokumente und Einstellungen\Renee>perl
my @array = qw( t:t test.:.hallo test.:hallo t:. );
use Data::Dumper;

print Dumper([split /.:./],[split /\.:\./]) for @array;

^D
$VAR1 = [];
$VAR2 = [
't:t'
];
$VAR1 = [
'test',
'hallo'
];
$VAR2 = [
'test',
'hallo'
];
$VAR1 = [
'test',
'allo'
];
$VAR2 = [
'test.:hallo'
];
$VAR1 = [];
$VAR2 = [
't:.'
];
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/
<< >> 10 Einträge, 1 Seite



View all threads created 2007-08-14 15:38.