Hallo Leute!
Ich habe in VB.Net einen Vokabeltrainer programmiert, mit der Funktion,
dass beim Klick auf einen Button "bereits gelernt" die Frage nicht mehr
angezeigt wird.
Das Ganze funktioniert über einen Zufallsgenerator. Heißt, dass die
Fragen zufällig hereinfliegen, solange die Frage nicht als "bereits
gelernt" markiert wurde.
Hier der VB-Code, wo ich noch Probleme habe:
Der Code bezieht sich auf den Klick auf den Button "nächste Frage".
Wie wäre es, wenn du dein Programm mal sinfällig kommentieren würdest?
Prinzipiell braucht man doch nur 3 Arrays:
1. Fragen
2. Antworten
3. schon gelernt.
Dann nimmt man die Zufallszahl und guckt nach, ob das "Schon
gelernt"-Flag gesetzt ist, und nimmt dann die nächste Zufallszahl.
Wenn sie noch nicht gelernt wurde, dann zeigt man die Frage an und
wartet auf die Antwort.
Bei Bedarf kann dann das Flag gesetzt werden.
Und wo findet man das in deinem Programm?
Vitali B. schrieb:> Hoffe, jetzt ist es einleuchtender :)
ist es denn für dich einleuchtender?
Deine Abfrage, ob die Frage schon "gelernt" wurde ist falsch.
Du stellst keine Beziehung zwischen der Frage und ob sie bereits gelernt
wurde her, sondern ob die akuelle schon gelernt wurde.
Da das Array aber mit 0 initialisiert sein müsste, wirst du keine
Antwort auf diese Abfrage finden.
> Wo liegt mein Fehler, dass die Fragen nicht mehr erscheinen, die bereits> als "gelernt" markiert wurden?
Und was ist damit gemeint?
Für mich ist die Frage unlogisch.
Du solltest Dich fragen ob Du oder sonst jemand aus Deinen Kommentaren
mehr erfährst als aus dem Quellcode.
Das ist offensichtlich nicht der Fall.
Sowas wie
>ZaehlGelernt = ZaehlGelernt + 1 'inkrementiere Indexzähler
ist absolut überflüssig. Das gilt für alle anderen Zeilen auch.
Die Kommentare sollten klarlegen warum etwas geschieht oder auch in
einem eine Stufe abstrakteren Sinne, was geschieht. Wer nicht versteht,
was in einer einzelnen Zeile geschieht, muss erst noch die Sprache oder
das programmieren lernen.
>Du stellst keine Beziehung zwischen der Frage und ob sie bereits gelernt>wurde her, sondern ob die akuelle schon gelernt wurde.
Leider weiß ich nicht, was du damit meinst. Kann mir nichts darunter
vorstellen, wo die Beziehung dazwischen fehlt.
>> Wo liegt mein Fehler, dass die Fragen nicht mehr erscheinen, die bereits>> als "gelernt" markiert wurden?>Und was ist damit gemeint?>Für mich ist die Frage unlogisch.
Sorry, ich habe meine Frage falsch formuliert. Sollte wie folgt lauten:
Wo liegt mein Fehler? Die Fragen erscheinen trotz des Klickens auf
"bereits gelernt" weiterhin.
Ich weiß echt nicht weiter. Könnt ihr mir einen kleinen Denkanstoß
geben?
Vielen Dank!
Vitali B. schrieb:>>Du stellst keine Beziehung zwischen der Frage und ob sie bereits gelernt>>wurde her, sondern ob die akuelle schon gelernt wurde.>> Leider weiß ich nicht, was du damit meinst. Kann mir nichts darunter> vorstellen, wo die Beziehung dazwischen fehlt.
Deine Vokabeln bestehen doch jeweils aus der Gruppe:
"Frage", "Antwort" und "schon gelernt".
Leider gibt es keinen Zusammenhang zwischen den ersten beiden und dem
letzten Teil der Gruppe.
Also kurz umrissen:
Mein Programm bietet einmal ein Label, in dem die deutsche Vokabel
angezeigt wird.
Darunter ein Textfeld, in dem dann die vermutete Antwort eingegeben
werden kann (ohne weitere "Intelligenz": Textfeld wird nicht abgefragt).
Darunter wiederum befindet sich wieder ein Label, in dem dann die
korrekte Antwort angezeigt werden kann.
3 Buttons stehen zur Verfügung:
"Nächste Frage" , "Korrekte Antwort aufdecken" und "Vokabel als
'Gelernt' markieren".
Klickt man auf "nächste Frage", kommt nach dem Zufallsprinzip eine
deutsche Vokabel auf das (wie oben beschrieben) erste Label. Nun kann
der Benutzer seine vermutete Antwort eingeben. Klickt der Benutzer auf
"Korrekte Antwort aufdecken", so wird ihm die richtige Antwort gezeigt.
Klickt er auf "Vokabel als 'Gelernt' markieren", wird die Vokabel nicht
mehr bis zum Neustart des Programms angezeigt und erscheint somit nicht
mehr im "Vokabel-Pool".
Das Programm holt die Daten aus einer Access-Datenbank.
Mein Vorhaben war, dass anhand dess Arrays "gelernteZufallszahlen" das
Programm überprüft, welche Zufallszahl (und somit welcher zugeordnete
Wert der "ID" der Access-DB) bereits angezeigt wurde, sodass die bereits
als "gelernt" markierten Fragen nicht mehr erscheinen.
Ich möchte also die Zufallszahlen in eine Array schreiben und überprüfe
jedes Mal beim Klick auf "nächste Frage", ob die anzuzeigende Frage
bereits als gelernt markiert wurde. Ist dies der Fall, soll eine neue
Frage erscheinen, die noch nicht als "bereits gelernt" markiert wurde.
Ich hoffe, das hilft! :)
Vielen Dank
Vitali B. schrieb:> Ich möchte also die Zufallszahlen in eine Array schreiben und überprüfe> jedes Mal beim Klick auf "nächste Frage", ob die anzuzeigende Frage> bereits als gelernt markiert wurde. Ist dies der Fall, soll eine neue> Frage erscheinen, die noch nicht als "bereits gelernt" markiert wurde.
Zwischen deinem Wunsch und der Wirklichkeit fehlt eine Schleife, die das
Array nach schon gestellten Fragen durchsucht.
Formulier doch erst einmal in normalem Deutsch den Vorgang den du machen
willst. Wenn du das schon nicht hinkriegst kannst du das auch nicht
programmieren
Du hast einen 2-stufigen Prozess
der erste SChritt ist das Bestimmten der Nummer der Frage
Der zweite Schritt ist das Fragen und auswerten der Antwort
Wie funktioniert der erste Schritt?
Gesucht ist also eine Zahl die
a) zufällig ist
b) deren Frage als "noch nicht gestellt" markiert ist
Du brauchst also eine Schleife. Wann endet diese Schleife?
Ganz einfach: wenn du eine derartige Zahl hast
gefunden = false
solange nicht gefunden
bestimme eine Zufallszahl
if Frage( Zufallszahl ) ist noch nicht gestellt then
gefunden = true
end solange
-- an dieser Stelle haben wir eine Zufallszahl, deren zugehörige
-- Frage noch nie gestellt wurde
Achtung: Das ist noch nicht alles. Du musst dir auch überlegen, wie du
den Fall handhaben willst, dass es überhaupt keine nicht gestellte Frage
mehr gibt.
Hallo,
>Du brauchst also eine Schleife. Wann endet diese Schleife?>Ganz einfach: wenn du eine derartige Zahl hast>> gefunden = false> solange nicht gefunden> bestimme eine Zufallszahl> if Frage( Zufallszahl ) ist noch nicht gestellt then> gefunden = true> end solange
Ist das nicht identisch mit dem hier?
> While y < 500 'Solange y kleiner 500...> If gelernteFragen(y) <> zufallszahl Then 'steht >Zufallswert
bereits in der Array "gelernteFragen"? Wenn nein, dann >Frage/Antwort anzeigen
> lblQuestion.Text = AngezeigteFrage(zufallszahl)> lblRightAnswer.Text = AngezeigteAntwort(zufallszahl)> Else> zufallszahl = r.Next(0, i) ' Ansonsten neue >Zufallszahl> End If>> y = y + 1 'inkrementiere Zählvariable> End While
Wenn ich es wüsste, würde ich nicht fragen.
Vitali B. schrieb:
Wie kann
>> gefunden = false>> solange nicht gefunden
identisch sein mit
>> While y < 500 'Solange y kleiner 500...
?
Ist doch eine völlig andere Abbruchbedingung!
> Wenn ich es wüsste, würde ich nicht fragen.
Ich habe einen Zwiespalt in mir. Auf der einen Seite würde ich gerne
sagen: Na, dann musst du das eben mal ausprobieren!
Auf der anderen Seite ist Programmieren nach der Methode "Versuch und
Irrtum" selten eine gute Wahl, wenn es nur bei "Versuch und Irrtum" und
unkontrolliertem Probieren bleibt.
Ein wenig probieren ist nicht schlecht und seine Ideen testen und im
Debugger mal in Einzelschritten durchgehen und sich die Variablen
ansehen ist so schlecht dann auch wieder nicht. Man lernt zumindest
recht anschaulich, warum etwas nicht geht. Und oft genug entsteht dann
daraus eine neue Idee, wie es dann richtig geht.
Hinweis: reduziere deine 500 während es Programmierens auf 5, sonst
debuggst du dir einen Wolf. Während der Programmentwicklung nimmt man
kleine Zahlen, damit alles überschaubar bleibt. Erst wenn alles
funktioniert, schraubt man die Zahlen größer.
nein das funktioniert nicht
If gelernteZufallszahlen(y) = zufallszahl Then
das ist beim 1. mal (y = 0) also gelernteZufallszahlen(0) extrem
unwahrscheinlich
also wird AngezeigteFrage aufgeführt
(also dein beschriebenes Problem)
obwohl z.b in gelernteZufallszahlen(1) die zufallszahl stehen würde..
(ich glaub das ist jetzt aber fast schon zu viel geholfen)
Also so wird das doch nix überleg' dir doch erst mal fern von aller
Sprache wie es funktionieren könnte (wenn man dann Probleme mit der
Umsetzung hat kann man auch mal den lehrer fragen der ist nicht nur
zum Tafelabwischen da!).
So... nun bestimmst du eine Zufallszahl und schaust ob diese schon
gelernt wurde wenn ja würde ich einfach im Array nach vorne gehen und
die nächste ungelernte Frage wählen sonst läuft dein Algorithmus im
Zweifel unendlich lange...
Wenn nun eine Frage als gelernt markiert werden soll setzt du einfach
gelernt[fragenummer] auf true und fertig.
> y = 0>> While y <= 5> If gelernt(y) = True Then> zufallszahl = r.Next(0, i)> End If> y = y + 1> End While>>> lblQuestion.Text = AngezeigteFrage(zufallszahl)> lblRightAnswer.Text = AngezeigteAntwort(zufallszahl)> picP1.Text = AngezeigtesBild(zufallszahl)
gehs doch einfach mal auf einem Zettel Papier durch
Index Frage Antwort gelernt
1 2 + 2 4 nein
2 8 * 3 24 nein
3 12 + 8 20 nein
4 3 + 4 12 nein
5 8 - 6 2 nein
Wie gehst du vor.
Als erstes würfelst du eine Zahl zwichen 1 und 5. Sagen wir 3.
Jetzt schaust du bei gelernt, Index 3, nach, ob diese Frage schon
gelernt wurde. Nein, wurde sie nicht. Also kannst du die Frage stellen.
Wieviel ist 12 + 8 ?
Bei der richtigen Antwort 20 trägst du das ein: gelernt, Index 3, wird
auf Ja gestellt
Index Frage Antwort gelernt
1 2 + 2 4 nein
2 8 * 3 24 nein
3 12 + 8 20 ja
4 3 + 4 12 nein
5 8 - 6 2 nein
Du würfelst wieder für die nächste Frage und deine Zufallszahl sagt dir,
dass du Frage 5 nehmen sollst.
Also schaust du bei gelernt(5) nach, ob diese Frage eine ist, die du
stellen sollst. Sie ist nicht als gelernt markiert (gelernt(5) steht auf
Nein).
Also stellst du die Frage
Wieviel ist 8 - 6 ?
Bei richtiger Antwort, 2, trägst du im gelernt Array, an der Stelle 5
ein, dass diese Frage gelernt wurde:
Index Frage Antwort gelernt
1 2 + 2 4 nein
2 8 * 3 24 nein
3 12 + 8 20 ja
4 3 + 4 12 nein
5 8 - 6 2 ja
Nächste Frage. Du würfelst wieder (Zufallszahl bestimmen) und die
Zufallszahl sagt, dir dass die nächste Frage, die Frage Nummero 3 wäre.
Wie gewohnt siehst du nach, ob diese Frage eine zu lernende ist und
stellst fest, dass gelernt(3) auf 'Ja' steht, du diese Frage also nicht
mehr stellen brauchst. Daher würfelst du erneut und diesmal sei die
Zufallszahl 2. Du schaust wieder nach und gelernt(2) sagt dir, dass
diese Frage eine zu lernende ist.
ALso fragst du
Wieviel ist 8 * 3 ?
und wenn der Benutzer die richtige Antwort gibt, nämlich 24, dann
markierst du Frage 2 als nicht mehr zu lernende
Index Frage Antwort gelernt
1 2 + 2 4 nein
2 8 * 3 24 ja
3 12 + 8 20 ja
4 3 + 4 12 nein
5 8 - 6 2 ja
Und so gehst weiter und weiter, bis alle Fragen gelernt wurden.
Nimm jetzt mal deinen Code her, spiel ihn mal selber durch (also nicht
einfach nur den COmputer arbeiten lassen und danach lametieren, dass
nichts funktioniert, sondern DU bist der Computer und arbeitest das
Programm ab) und sieh nach, was dein Code macht. Erfinde ein paar Daten,
erfinde die Zufallszahlen und ansonsten machst du einfach nur genau das,
was in deinem Programm steht. Du machst nicht das was du dir denkst das
hier passieren müsste, sondern genau und 100% nur das, was in deinem
Programm niedergeschrieben steht. Und das spielst du für ein paar
Fragen/Antwort SPielchen durch, wobei du natürlich deine erfundenen
Zufallszahlen auch mal so legst, dass du auf einer bereits gelernten
Frage landest.
> gelernt(y) = zufallszahl
wie soll denn das funktionieren?
gelernt(irgendwas) kann nur ja/nein, false/true sein. Du hast es doch
selbst als Boolean definiert. Wie willst du denn da eine Zahl zuweisen.
Die letzte Zufallszahl, mit der du deine Frage dann gestellt hast, sagt
dir doch, welches gelernt, welcher Index davon, auf true zu setzen ist.
Hallo Karl-Heinz,
das ist mir soweit auch geläufig, danke für deinen Beitrag! Habe es auch
durchgespielt, habe aber noch ein Verständnisproblem mit der Schleife.
> und wo ist das Catch?
Das Catch gibt dann den Fehler in einer Msgbox aus. Habe es aus
Platzgründen jetzt hier weggelassen, da es nichts mit der Funktionalität
zutun hat.
> gelernt(y) = zufallszahl
sollte heißen:
> gelernt(zufallszahl) = True
Ich probiere es jetzt das letzte Mal, ansonsten bekenne ich mich zu
einer schlechten Note.
Hier der Codeausschnitt meines nun nochmals modifizierten Programms:
nee, immer noch falsch geraten.
Beispiel:
Deine Zufallszahl ist 6
gelernt(3) ist false, gelernt(6) ist aber true, weil die Frage schon man
richtig beantwortet wurde.
Wo ist der Fehler?
>> Dann wohl so. Wenn das stimmen sollte, geht es trotzdem nicht ;-)
Wo in deiner Schleife bestimmst du denn eine neue Zufallszahl.
Ich kann mich nur wiederholen: Spiel das selber als Computer durch! Dann
muss dir doch auffallen, dass du immer dieselbe Frage daraufhin
untersuchst, ob sie schon gestellt wurde oder nicht, weil du in der
Schleife keine neue Zufallszahl erzeugst.
Ich will dich doch nicht damit häkeln, dass ich dir immer wieder
nahelege, dass DU selber mal dein Programm mit von dir erfundenen
Zufallsdaten durchspielst. Aber schön langsam hab ich das Gefühl mit den
Mund fusselig zu reden (im übertragenen Sinne).
Jetzt muss ich immer häufiger auf "Nächste Frage" klicken, je mehr
Antworten bereits als "gelernt" markiert wurden.
Hängt dies mit der Abbruchbedingung die Karl-Heinz geschrieben hat
zusammen?
Ich habe zwar schon was von einer Abbruchbedingung gelesen, weiß aber
nicht, wie ich die in der Schleife realisieren soll.
Wofür steht eigentlich das i in
zufallszahl = r.Next(0, i)
?
Das frag ich mich schon die ganze Zeit und mir will einfach kein
wirklich stichhaltiger logischer Grund einfallen, warum da i steht.
i ist eine Zählvariable weiter oben, die die Anzahl der Elemente in
einem Array angibt.
Das Ganze bedeutet nur, dass eine Zufallszahl zwischen 0 und des
höchsten Indexes (i) generiert werden soll.
Vitali B. schrieb:> Das Ganze bedeutet nur, dass eine Zufallszahl zwischen 0 und des> höchsten Indexes (i) generiert werden soll.
Siehst du, und das ist Blödsinn.
Wenn du 500 Fragen hast, dann brauchst du eine Zufallszahl zwischen 0
und 499 (inklusive, oder eben 1 und 500. keine Ahnung ob in VB bei 0
oder bei 1 angefangen wird zu zählen). Und zwar jedes mal!
Welchen Sinn soll es haben, wenn du dir zunächst eine Zahl zwischen 0
und 1 generieren lässt? Auf die Art hat doch Frage 328 niemals eine
Chance als allererste drann zu kommmen.
Wie hab ich das denn weiter oben gemacht? Ich hatte 5 Fragen und die
erste Zufallszahl mit der ich hochgekommen bin war 3 (also eine Zahl
zwischen 1 und 5). Ich habe NICHT nach einer Zahl zwischen 1 und 1
gesucht, weil ich das 1te mal versucht habe eine Frage zu finden. Und
beim 2-ten mal dann eine Zufallszahl zwischen 1 und 2. Ich habe immer
gleich gewürfelt! Immer eine Zufallszahl zwischen 1 und 5
>> gelernt(y) = zufallszahl>Immer noch nicht gemerkt, dass das falsch ist, obwohl dir das schon>jemand anders oben erzählt hat?
das ist übrigens NICHT falsch, sondern einfach ein anderes "system" (das
aber genauso funktionieren würde, wenn richtig ausprogrammiert)