KarstenW.
Anmeldungsdatum: 27. Juni 2011
Beiträge: 208
|
Hallo, ich stehe mal wieder vor einem Rätsel und Google konnte mir auch nicht weiterhelfen. Mit RANDOM möchte ich eine Zufallszahl erzeugen diese muss aber gerade sein, ungerade Zahlen kann ich nicht gebrauchen. Hintegrund ist das ich für meine Tochter gerade ein Script schreibe mit dem sie die Grundrechenarten üben kann. Plus, Minus und Mal ist kein Problem aber für das dividieren (teilen) brauche ich gerade Zahlen also Zahlen die teilbar sind. Vielleicht hat ja jemand ne Idee wie man das in der Konsole hinbekommt? Gruß
Karsten
|
microft
Anmeldungsdatum: 6. August 2009
Beiträge: 454
Wohnort: Norddeutschland
|
Hol dir doch einfach solange Zufallszahlen bis eine gerade Zahl kommt. Ok. Brecheisen aber simpel. cu
|
u1000
Anmeldungsdatum: 2. Oktober 2011
Beiträge: 1850
|
|
Ruudsy
Anmeldungsdatum: 1. Mai 2012
Beiträge: 328
|
Ich würde mich beim Dividieren nicht auf gerade Zahlen beschränken. Mir fallen spontan zwei vorgehensweisen ein:
Erzeuge Dir zuerst einen Dividend. Anschließend suche nach einem geeigneten Divisor, der nicht nur bei Teilung keinen Rest lässt, sonder auch sinnvolle Aufgaben zu Tage fördert. Das kann man ja gut mit Bedingungen anfragen. Sinnvoll erachte ich Aufgaben, die als Ergebnis nicht nur kleine Zahlen hat. 1234 : 617 wäre in meinen Augen ein Gegenbeispiel. Wenn der Zahlenraum bekannt ist und nicht zu groß, könnte man zufällig aus der Menge der Primzahlen in diesem Zahlenraum zwei Mengen auswählen, die eine nicht triviale Schnittmenge haben. Dann jeweils die Produkte über diese Mengen bilden und ein sinnvolles Ergebnis ist sichergestellt.
Mit welcher Skriptsprache schreibst Du das ganze denn? Ich frage deswegen, da ich dann nicht nur eine Idee bereitstellen kann, sondern auch vielleicht konkrete Lösungen. Mit Python könnte man da viele schöne Sachen machen, vielleicht sogar mit einer GUI.
|
KarstenW.
(Themenstarter)
Anmeldungsdatum: 27. Juni 2011
Beiträge: 208
|
@U1000: Diese Lösung funktioniert in etwa werde ich nochmal ein bisschen mit experimentieren. @microft: Mit dem Brecheisen kann ich schlecht umgehen 😀 @Ruudsy: Schreibe das Programm aktuell in bash weil ich damit am besten umgehen kann. Hintergrund ist wie schon erwähnt für meine Tochter ein kleines Übungsprogramm zu erstellen, mit dem Sie das kleine 1x1 und die Grundrechenarten üben kann. Das Programm als solches läuft bereits und man kann multiplizieren üben. Der Ablauf des Scriptes ist folgender: Es müssen 10 Aufgaben aus dem Kleinen 1x1 gelöst werden. Für jede richtige Antwort gibt es einen Punkt für jede falsche wird ein Punkt abgezogen. Hat man die 10 Aufgaben gelöst wird am Ende aus der Zeit die man benötigt hat ein Punktewert errechnet. Je schneller man rechnet umso höher der Punktewert. Ich pack das Script mal hier mit rein dann könnt ihr euch das mal anschauen. Mir ging es jetzt darum das Programm zu erweitern aber am dividieren beiss ich mir noch ein bisschen die Zähne aus. Hier das aktuelle Script: 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 | #!/bin/bash
COUNT1=0
COUNT2=0
AW1=10
ZEIT1=$(date +'%M%S')
function W1
{
clear
ZAHL1=$(echo $(($RANDOM % 10+1)))
ZAHL2=$(echo $(($RANDOM % 10+1)))
ERGEBNIS=$(echo "$ZAHL1*$ZAHL2"|bc)
read -p "Wieviel ist $ZAHL1*$ZAHL2: " USER
if [ $USER = $ERGEBNIS ] ; then
PUNKTE=$(echo "$COUNT1+1"|bc)
COUNT1=$PUNKTE
#echo "Prima das ist richtig, Du erhälst einen Punkt."
#echo "Du brauchst $AW1 Punkt(e)"
#echo "Dein aktueller Punktestand: $PUNKTE"
#sleep 2
else
PUNKTE=$(echo "$COUNT1-1"|bc)
COUNT1=$PUNKTE
FEHLER=$(echo "$COUNT2+1"|bc)
COUNT2=$FEHLER
#echo "Leider falsch, Du bekommst einen Punkt abgezogen."
#echo "Dein aktueller Punktestand: $PUNKTE"
#sleep 2
fi
CHW1
}
function CHW1
{
if (( $PUNKTE < 1 )) ; then
clear
echo "Leider verloren !!!" &exit 0
fi
if [ $PUNKTE = $AW1 ] ; then
clear
ZEIT2=$(date +'%M%S')
ZAUSWERT=$(echo "$ZEIT2-$ZEIT1"|bc)
#ZAUSWERT2=$(echo "$ZAUSWERT-20"|bc)
ENDPUNKTE=$(echo "1000-$ZAUSWERT"|bc)
echo "Gratuliere Du hast $AW1 Aufgaben richtig gelöst !!!"
#echo "Dein aktueller Punktestand: $PUNKTE"
echo "Du hattest $COUNT2 Fehler"
echo "Deine Zeit: $ZAUSWERT Sekunden."
echo
echo "Deine Gesamtpunktzahl ist $ENDPUNKTE"
exit 0
else
W1
fi
}
W1
|
|
Matthias_H.
Anmeldungsdatum: 22. Juni 2011
Beiträge: 2671
|
Nu ja. Ich bin selber Vater einer Tochter (9.Klasse Gymn.). Das kleine 1x1 lernt man auch (und besser) zusammen ohne Rechenknecht. Einfach mal ein bisschen Zeit nehmen für die Zwerge....
|
Prof._Frink
Anmeldungsdatum: 29. Mai 2010
Beiträge: 1096
|
u1000 schrieb: RANDOM*2
Jo, für gerade Zahlen. ☺ KarstenW. schrieb: Plus, Minus und Mal ist kein Problem aber für das dividieren (teilen) brauche ich gerade Zahlen also Zahlen die teilbar sind. Vielleicht hat ja jemand ne Idee wie man das in der Konsole hinbekommt?
Nimm zwei zufällige natürliche Zahlen x,y multipliziere sie w=x*y. Und frage, was ist w/x (Lösung: y). P.S: 985 war mein bestes Ergebnis bisher.
|
KarstenW.
(Themenstarter)
Anmeldungsdatum: 27. Juni 2011
Beiträge: 208
|
@Matthias H. : Es geht mir nicht darum die Mathehilfe auf den Computer abzuwälzen sondern das ganze spielerisch zu gestalten. Wir haben uns heute Abend abwechselnd mit 3 Leuten an dem Script versucht und jeder wollte mehr Punkte erreichen als der andere. Also habe ich mein Ziel schon fast erreicht ☺ @Prof. Frink:
Mein bestes Ergebnis: Zeit 18 Sekunden
Punkte 982 Hab das Spiel erweitert jetzt werden noch Punkte für falsch gelöste Aufgaben abgezogen. Ein ASCII Bildchen sowie eine kurze Erklärung habe ich auch hinzugefügt. Wenn man im Script die Zufallszahlen verändert und $RANDOM % 100+1 setzt dann wirds interessanter 😉 für meine Tochter aber leider auch unlösbar. Hier das neue Script: 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 | #!/bin/bash
COUNT1=0
COUNT2=0
AW1=10
ZEIT1=$(date +'%M%S')
function W1
{
clear
ZAHL1=$(echo $(($RANDOM % 10+1)))
ZAHL2=$(echo $(($RANDOM % 10+1)))
ERGEBNIS=$(echo "$ZAHL1*$ZAHL2"|bc)
read -p "Wieviel ist $ZAHL1*$ZAHL2: " USER
if [ $USER = $ERGEBNIS ] ; then
PUNKTE=$(echo "$COUNT1+1"|bc)
COUNT1=$PUNKTE
#echo "Prima das ist richtig, Du erhälst einen Punkt."
#echo "Du brauchst $AW1 Punkt(e)"
#echo "Dein aktueller Punktestand: $PUNKTE"
#sleep 2
else
PUNKTE=$(echo "$COUNT1-1"|bc)
COUNT1=$PUNKTE
FEHLER=$(echo "$COUNT2+1"|bc)
COUNT2=$FEHLER
#echo "Leider falsch, Du bekommst einen Punkt abgezogen."
#echo "Dein aktueller Punktestand: $PUNKTE"
#sleep 2
fi
CHW1
}
function CHW1
{
if (( $PUNKTE < 1 )) ; then
clear
echo "Leider verloren !!!" &exit 0
fi
if [ $PUNKTE = $AW1 ] ; then
clear
ZEIT2=$(date +'%M%S')
ZAUSWERT=$(echo "$ZEIT2-$ZEIT1"|bc)
#ZAUSWERT2=$(echo "$ZAUSWERT-20"|bc)
STRAFE=$(echo "$COUNT2*5"|bc)
ENDPUNKTE=$(echo "1000-$ZAUSWERT-$STRAFE"|bc)
echo "Gratuliere Du hast $AW1 Aufgaben richtig gelöst !!!"
#echo "Dein aktueller Punktestand: $PUNKTE"
echo "Du hattest $COUNT2 Fehler"
echo "Deine Zeit: $ZAUSWERT Sekunden."
echo
echo "Deine Gesamtpunktzahl ist $ENDPUNKTE"
exit 0
else
W1
fi
}
function START
{
clear
cat <<EOF
\|||/
(o o)
,~~~ooO~~(_)~~~~~~~~~,
| Das kleine 1x1 |
| GENIE |
| |
'~~~~~~~~~~~~~~ooO~~~'
|__|__|
|| ||
ooO Ooo
Du musst 10 Aufgaben aus dem kleinen 1x1 lösen.
Für jede richtig gelöste Aufgabe erhälst Du einen
Punkt und für jede falsche ziehe ich Dir einen
ab. Solltest Du 0 Punkte erreichen hast Du verloren
und das Spiel ist beendet.
Wenn Du 10 Aufgaben richtig gelöst hast sag ich Dir
wie lange Du dafür benötigt hast. Deine Punktzahl ist
am Ende von der Zeit abhängig, also je schneller Du
die Aufgaben löst je besser die Punktezahl. Für falsch
gelöste Aufgaben ziehe ich Dir am Ende noch ein paar
Punkte ab.
Soooooo bist Du bereit ???
Na dann zeig was Du kannst:
Drücke die ENTER Taste um das Spiel zu starten!
EOF
read -p " "
W1
}
START
|
Ps: Arbeite noch an einer Highscore Liste.
|
Prof._Frink
Anmeldungsdatum: 29. Mai 2010
Beiträge: 1096
|
Und was meinst du zu: Prof. Frink schrieb: Nimm zwei zufällige natürliche Zahlen x,y multipliziere sie w=x*y. Und frage, was ist w/x (Lösung: y).
Ist doch okay, oder?
|
Matthias_H.
Anmeldungsdatum: 22. Juni 2011
Beiträge: 2671
|
Hi Karsten, natürlich musst Du selber wissen, was für deine Tochter das Beste ist. Allerdings ist der Rechner für Grundschüler nicht das non plus ultra. Gerade in Mathe ist in der 3.oder4.Klasse dreidimensionales Denken gefragt - Geometrie. Da sind Bauklötzer und ähnliches wesentlich hilfreicher als der beste Rechner... 😉
|
KarstenW.
(Themenstarter)
Anmeldungsdatum: 27. Juni 2011
Beiträge: 208
|
@Prof. Frink Jaaaaa funktioniert super danke für den Tip da hätte ich auch selber drauf kommen können 🙄 @Matthias H. Ich achte schon darauf das alles kindgerecht abläuft. Am Computer hat sie schon mit 5J. gesessen und im Internet bei Kika gesurft. Einen eigenen PC mit Ubuntu und Internetzugang hat sie auch und ich finde es nicht tragisch. In der heutigen Zeit setzen die Schulen sowas schon voraus, da müssen die Kinder als Hausaufgabe etwas bei Wikipedia nachlesen und ausdrucken. Trotzdem behalte ich eine gewisse Kontrolle darüber. Meine Tochter ist mitlerweile in der 6. Klasse und tut sich mit dem 1x1 schwer. Das Script macht ihr Spaß und ich finde es witzig das sie an so einfachen Dingen Spaß hat.
|
KarstenW.
(Themenstarter)
Anmeldungsdatum: 27. Juni 2011
Beiträge: 208
|
So abschließend noch eine Korrektur im Script, leider wurde die Zeit falsch berechnet. Lag wohl daran das der Wert einer Variable aus einem vorherigen Spiel erhalten blieb und die Berechnung deswegn fehlerhaft war. Habe das jetzt mit unset gelöst und lasse die Variablen vor dem Programmende löschen, scheint jetzt zu funktionieren. Ein Dankeschön an alle die geantwortet haben. Hier das überarbeitete Script nochmal: 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
111
112 | #!/bin/bash
COUNT1=0
COUNT2=0
AW1=10
ZEIT1=$(date +'%I%M%S')
function W1
{
clear
ZAHL1=$(echo $(($RANDOM % 10+1)))
ZAHL2=$(echo $(($RANDOM % 10+1)))
ERGEBNIS=$(echo "$ZAHL1*$ZAHL2"|bc)
read -p "Wieviel ist $ZAHL1*$ZAHL2: " USER
if [ $USER = $ERGEBNIS ] ; then
PUNKTE=$(echo "$COUNT1+1"|bc)
COUNT1=$PUNKTE
#echo "Prima das ist richtig, Du erhälst einen Punkt."
#echo "Du brauchst $AW1 Punkt(e)"
#echo "Dein aktueller Punktestand: $PUNKTE"
#sleep 2
else
PUNKTE=$(echo "$COUNT1-1"|bc)
COUNT1=$PUNKTE
FEHLER=$(echo "$COUNT2+1"|bc)
COUNT2=$FEHLER
#echo "Leider falsch, Du bekommst einen Punkt abgezogen."
#echo "Dein aktueller Punktestand: $PUNKTE"
#sleep 2
fi
CHW1
}
function CHW1
{
if (( $PUNKTE < 1 )) ; then
clear
echo "Leider verloren !!!" &exit 0
fi
if [ $PUNKTE = $AW1 ] ; then
clear
ZEIT2=$(date +'%I%M%S')
ZAUSWERT=$(echo "$ZEIT2-$ZEIT1"|bc)
STRAFE=$(echo "$COUNT2*5"|bc)
ENDPUNKTE=$(echo "1000-$ZAUSWERT-$STRAFE"|bc)
cat <<EOF
\|||/
(o o)
,~~~ooO~~(_)~~~~~~~~~,
| Punkte: $ENDPUNKTE |
| Zeit: $ZAUSWERT |
| Fehler: $COUNT2 |
'~~~~~~~~~~~~~~ooO~~~'
|__|__|
|| ||
ooO Ooo
EOF
#echo "Gratuliere Du hast $AW1 Aufgaben richtig gelöst !!!"
#echo "Du hattest $COUNT2 Fehler"
#echo "Deine Zeit: $ZAUSWERT Sekunden."
#echo
#echo "Deine Gesamtpunktzahl ist $ENDPUNKTE"
unset ZEIT1
unset ZEIT2
exit 0
else
W1
fi
}
function START
{
clear
cat <<EOF
\|||/
(o o)
,~~~ooO~~(_)~~~~~~~~~,
| Das kleine 1x1 |
| GENIE |
| |
'~~~~~~~~~~~~~~ooO~~~'
|__|__|
|| ||
ooO Ooo
Du musst 10 Aufgaben aus dem kleinen 1x1 lösen.
Für jede richtig gelöste Aufgabe erhälst Du einen
Punkt und für jede falsche ziehe ich Dir einen
ab. Solltest Du 0 Punkte erreichen hast Du verloren
und das Spiel ist beendet.
Wenn Du 10 Aufgaben richtig gelöst hast sag ich Dir
wie lange Du dafür benötigt hast. Deine Punktzahl ist
am Ende von der Zeit abhängig, also je schneller Du
die Aufgaben löst je besser die Punktezahl. Für falsch
gelöste Aufgaben ziehe ich Dir am Ende noch ein paar
Punkte ab.
Soooooo bist Du bereit ???
Na dann zeig was Du kannst:
Drücke die ENTER Taste um das Spiel zu starten!
EOF
read -p " "
W1
}
START
|
|
Ruudsy
Anmeldungsdatum: 1. Mai 2012
Beiträge: 328
|
nicht schlecht ... das macht ja sogar einem Erwachsenen Spaß 😀 Die Zeit wird aber immer noch falsch berechnet, hab das grad meiner Freundin gezeigt und dann nach einer halben Ewigkeit erst auf ENTER gedrückt, da hatte ich dann mal gute 5min=300s gebraucht, von den Punkten ganz zu schweigen.
|
KarstenW.
(Themenstarter)
Anmeldungsdatum: 27. Juni 2011
Beiträge: 208
|
So ich glaube jetzt zu wissen woran es liegt, die Variable $ZEIT1 beim Aufruf des Scripts ist falsch gesetzt. Habe das Programm jetzt um eine Funktion erweitert so das die Startzeit erst gesetzt wird wenn man das Spiel mit der Entertaste startet. Einfach mal ausprobieren und bescheid geben obs klappt. Freut mich das es euch Spaß macht. Als nächstes werde ich die anderen Grundrechenarten einbauen. Hier das überarbeitete Script: 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
111
112
113
114
115
116
117
118 | #!/bin/bash
COUNT1=0
COUNT2=0
AW1=10
function W1
{
clear
ZAHL1=$(echo $(($RANDOM % 10+1)))
ZAHL2=$(echo $(($RANDOM % 10+1)))
ERGEBNIS=$(echo "$ZAHL1*$ZAHL2"|bc)
read -p "Wieviel ist $ZAHL1*$ZAHL2: " USER
if [ $USER = $ERGEBNIS ] ; then
PUNKTE=$(echo "$COUNT1+1"|bc)
COUNT1=$PUNKTE
#echo "Prima das ist richtig, Du erhälst einen Punkt."
#echo "Du brauchst $AW1 Punkt(e)"
#echo "Dein aktueller Punktestand: $PUNKTE"
#sleep 2
else
PUNKTE=$(echo "$COUNT1-1"|bc)
COUNT1=$PUNKTE
FEHLER=$(echo "$COUNT2+1"|bc)
COUNT2=$FEHLER
#echo "Leider falsch, Du bekommst einen Punkt abgezogen."
#echo "Dein aktueller Punktestand: $PUNKTE"
#sleep 2
fi
CHW1
}
function CHW1
{
if (( $PUNKTE < 1 )) ; then
clear
echo "Leider verloren !!!" &exit 0
fi
if [ $PUNKTE = $AW1 ] ; then
clear
ZEIT2=$(date +'%I%M%S')
ZAUSWERT=$(echo "$ZEIT2-$ZEIT1"|bc)
STRAFE=$(echo "$COUNT2*5"|bc)
ENDPUNKTE=$(echo "1000-$ZAUSWERT-$STRAFE"|bc)
cat <<EOF
\|||/
(o o)
,~~~ooO~~(_)~~~~~~~~~,
| Punkte: $ENDPUNKTE |
| Zeit: $ZAUSWERT |
| Fehler: $COUNT2 |
'~~~~~~~~~~~~~~ooO~~~'
|__|__|
|| ||
ooO Ooo
EOF
#echo "Gratuliere Du hast $AW1 Aufgaben richtig gelöst !!!"
#echo "Du hattest $COUNT2 Fehler"
#echo "Deine Zeit: $ZAUSWERT Sekunden."
#echo
#echo "Deine Gesamtpunktzahl ist $ENDPUNKTE"
unset ZEIT1
unset ZEIT2
exit 0
else
W1
fi
}
function START
{
clear
cat <<EOF
\|||/
(o o)
,~~~ooO~~(_)~~~~~~~~~,
| Das kleine 1x1 |
| GENIE |
| |
'~~~~~~~~~~~~~~ooO~~~'
|__|__|
|| ||
ooO Ooo
Du musst 10 Aufgaben aus dem kleinen 1x1 lösen.
Für jede richtig gelöste Aufgabe erhälst Du einen
Punkt und für jede falsche ziehe ich Dir einen
ab. Solltest Du 0 Punkte erreichen hast Du verloren
und das Spiel ist beendet.
Wenn Du 10 Aufgaben richtig gelöst hast sag ich Dir
wie lange Du dafür benötigt hast. Deine Punktzahl ist
am Ende von der Zeit abhängig, also je schneller Du
die Aufgaben löst je besser die Punktezahl. Für falsch
gelöste Aufgaben ziehe ich Dir am Ende noch ein paar
Punkte ab.
Soooooo bist Du bereit ???
Na dann zeig was Du kannst:
Drücke die ENTER Taste um das Spiel zu starten!
EOF
read -p " "
ZEIT
}
function ZEIT
{
ZEIT1=$(date +'%I%M%S')
exit 0 &W1
}
START
|
|
Prof._Frink
Anmeldungsdatum: 29. Mai 2010
Beiträge: 1096
|
Hey, die Berechnung der Zeit ist immer noch falsch. Angenommen du beginnst um 12:00:10 und bist um 12:01:00 fertig, dann ergibt deine Rechung 120100-120010=90 (Sekunden), obwohl es nur 50 waren. Für solche Zwecke gibt es die Unixzeit: | ZEIT1=$(date '+%s')
ZEIT2=$(date '+%s')
echo "$ZEIT2-$ZEIT1" | bc
|
Grüße Frink
|