PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Vokabeltrainer [Array-Problem]


NaTzoR
17.10.2007, 23:12
Hallo alle miteinander,

bin leider noch völliger Perl-Neuling und hoffe ihr könnt mir mit meinem Problem helfen! Mal kurz um meinen Wissensstand euch offenzulegen:

Ich habe momentan Perl in der Schule und wir sind noch relativ am Anfang als Themen hatten wir bisher: Sklare,Hashes,Arrays,Schleifen,Abfragen,Modularisierung und Datei(Gebrauch).

Habe nun ein kleines Programm geschrieben im Zuge der Einübung für die Modularisierung. Das klappt soweit auch ganz gut. Also es geht um einen Vokabeltrainer, das mal vorab!

Dieser Vokabeltrainer ließt Vokabeln aus einer Datei, fragt sie ab, und fragt Falsche nochmals ab! Das klappt soweit auch, aber nachdem er die falschen nochmals abgefragt hat, kann es ja sein, dass es wieder Falsche gibt, die er eigentlich auch nochmal abfragen sollte, doch da haperts. Er müsste die zweite Falscheingabe ebenfalls in dem Array speichern bzw. das richtige Löschen und das Falsche drin lassen und abfragen!

Meine bitte wäre es nun einen Codeschnipsel zuschreiben, in welchem drinsteht, wie ich nach einer Abfrage (handelt sich um die 1te Falsch-Abfrage) nochmals die wie oben abfragen kann!

Thx in Advance
NaTzoR


Alamar
18.10.2007, 00:15
Ich verstehe nun nicht genau wo das Problem liegt, bzw. was du für einen Codeschnippsel willst.

Falsch eingaben kannst du per push/unshift auf ein entsprechendes Array(Oder in einen Hash) klatschen und entfernen per delete (Für nähere Beschreibungen siehe perldoc -f delete bzw. push und unshift)

NaTzoR
18.10.2007, 19:44
Habe mal hier den Code, vlt wirds dann klarer!

## Voktrainer mit modularer Aufteilung

#---------- Hauptprogramm -----------#

oeffnen();
splitten();
abfrage();
falschpruefen();


#---------- Unterprogramme ----------#

sub oeffnen
{ $vokfile = qw(vokabeln);
open(VOK, $vokfile) or die "Fehler: $!";
@vokabeln = <VOK>;
chomp (@vokabeln);
close (VOK);
}

sub splitten
{ foreach $zeile(@vokabeln)
{ ($en, $de) = split (/:/, $zeile);
$abfrage{$en} = $de;
};
}

sub abfrage
{ foreach $en(keys(%abfrage))
{ print "Was bedeutet $en? ";
chomp($antwort = <STDIN>);
if ($antwort eq $abfrage{$en})
{ print "Richtig! \n"}
else { print "Falsch! \n" and push(@falsch,en);};
}
}

sub falschpruefen
{ do{
foreach $word(@falsch)
{ print "Was heisst $word? ";
chomp($antwortneu = <STDIN>;
if ($antwortneu eq $abfrage{$word})
{ print "Richtig! \n"}
else { print "Das war immer noch falsch! \n" and push(@falsch)}; ## Eigentlich sollte er danach nochmals abfragen, aber hier müsste schon was nicht stimmen!
}
}until (@falsch[0] eq undef);
}

Alamar
19.10.2007, 13:56
Erstmal vorab - ich finde deine Einrückung ziemlich(!) unleserlich


sub abfrage
{ foreach $en(keys(%abfrage))
{ print "Was bedeutet $en? ";
chomp($antwort = <STDIN>);
if ($antwort eq $abfrage{$en})
{ print "Richtig! \n"}
else { print "Falsch! \n" and push(@falsch,en);};
}
}

Und hier ist das "and" unnötig, du kannst da auch ein ";" setzen, oder
verfolgst du irgendeine Absicht damit die ich nicht nachvollziehen kann.
Und am Ende eins Blocks ist ein ";" zwar nicht zwingend notwendig, aber
entweder immer weglassen oder nie (IMHO).


sub falschpruefen
{ do{
foreach $word(@falsch)
{ print "Was heisst $word? ";
chomp($antwortneu = <STDIN>;
if ($antwortneu eq $abfrage{$word})
{ print "Richtig! \n"}
else { print "Das war immer noch falsch! \n" and push(@falsch)}; ## Eigentlich sollte er danach nochmals abfragen, aber hier müsste schon was nicht stimmen!
}
}until (@falsch[0] eq undef);
}
Hier fehlt beim chomp() die schließende Klammer.
@falsch[0] muss $falsch[0] sein.
Und ich denke mal dass du da ein while(!defined($falsch[0])) willst.
Du musst dann jedoch auch irgendwo anfangen Elemente zu "undef"en
Und warum ausgerechnet $falsch[0]?

NaTzoR
19.10.2007, 15:43
Erstmal danke für deine Hilfe!

Nein ich bezwecke mit dem and keineswegs irgendwas. Weiß auch nicht warum ich das so mache, Macht der Gewohnheit.

Der Code sieht so unsauber aus, weil ich ihn schnell vom Laptop abgetippt habe, und diese Formatierung sieht auf meinem Breitbild ganz praktisch aus. Ich werde beim nächsten Mal darauf achten, dass er auch als Code-Zitat hier sauber wird!

Die Codefehler wo ich ein ";" vergessen habe, sind darauf zurückzuführen, dass ich das Programm nur schnell abgetippt habe und nicht mehr getestet unter Windows!

"falsch[0]" war gedacht, weil die Wörter aus dem @falsch, die dann richtig beantwortet wurden, immer an die "Nullte" Stelle des Arrays geschoben werden sollten, damit man sie dann mit "shift" rauswerfen kann, sodass man danach wieder den Array abfragen kann, solange bis er leer ist!

Gruß
NaTzoR