bluedxca93
Anmeldungsdatum: 29. Dezember 2011
Beiträge: 365
|
Hallo,
fast alle notwendigen Funktionen sind in bash auch enthalten.
gosub und goto fehlt allerdings.kann man aber durch Umstrukturierung und while if ausgleichen
1260 z=(INT(RND(1)*(z2-z1))+z1):RETURN
hab ich heute relativ gut übertragen
nur wie konvertiere ich gleitkommazahl nach integr mit runden
mfg bluedxca93
function create_random {
awk -v "seed=$[(RANDOM & 32767) + 32768 * (RANDOM & 32767)]" 'BEGIN { srand(seed); printf("%.5f\n", rand() ) }'
} function output_z_int {
r=$(create_random)
zdif=$( awk 'BEGIN{print '"$z2"-"$z1"'}')
zdifr=$( awk 'BEGIN{print '"$r"*"$zdif"'}')
zdiff=$( awk 'BEGIN{print '"$zdifr"+"$z1"'}')
int=${zdiff/.*}
echo $int
} function z_r {
output_z_int
unset r
unset zdif
unset zdifr
unset zdiff
unset seed
unset int
unset z1
unset z2
} z1=10
z2=40
te=$(z_r)
echo $te
|
elostio
Anmeldungsdatum: 2. Februar 2006
Beiträge: 424
Wohnort: Guayaquil
|
Formatiere bitte deine Frage besser. Sehe dir Forum/Syntax (Abschnitt „Syntaxelemente“) an.
|
ExcitedSpoon
Anmeldungsdatum: 17. Juli 2010
Beiträge: 226
Wohnort: /home/berlin
|
Bei gleitkomma-berechnungen greife ich meist auf bc zurück. Das rundet auch korrekt.
| $ echo "2.33+3.76" | bc
6.09
$ echo "13.7+124.1" | bc
137.8
|
um das jetzt zu nem "integer" zu machen gibts mehrere möglichkeiten. Einfachste:
| $ echo $result | awk '{print int($1+0.5)}'
|
Grüße PS.: wenn's hier weitergehen soll, dann formatiere bitte deinen Post. So kann kaum einer verstehen, was du sagen willst und was dein problem ist.
|
bluedxca93
(Themenstarter)
Anmeldungsdatum: 29. Dezember 2011
Beiträge: 365
|
hallo,
| z=(INT(RND(1)*(z2-z1))+z1):RETURN
|
Ich wollte den Text formatieren, aber leider hatte ich gestern nur die mobile Version von ubuntuusers und i hatte mir leider die Formatierungsoption hier im forum nicht gemerkt sry.
Hier das sh hoffentlich besser formatiert:
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 | function create_random {
awk -v "seed=$[(RANDOM & 32767) + 32768 * (RANDOM & 32767)]" 'BEGIN { srand(seed); printf("%.5f\n", rand() ) }'
}
function output_z_int {
r=$(create_random)
zdif=$( awk 'BEGIN{print '"$z2"-"$z1"'}')
zdifr=$( awk 'BEGIN{print '"$r"*"$zdif"'}')
zdiff=$( awk 'BEGIN{print '"$zdifr"+"$z1"'}')
int=${zdiff/.*}
echo $int
}
function z_r {
output_z_int
unset r
unset zdif
unset zdifr
unset zdiff
unset seed
unset int
unset z1
unset z2
}
z1=10
z2=40
te=$(z_r)
echo $te
|
Danke für den Tipp. Bc ist leider keine geeignete Lösung für mich ,awk ist öfter installiert und auch auf anderen Systemen lauffähig( sogar auf meinem Handy). Kann man nicht einfach die erste Nachkommastelle mit bash internen Befehlen abfangen und anschließend wenn diese größer 4 ist aufrunden und ansonsten nur die Kommas ignorieren. Ist zwar keine besonders gute Rundung , aber sicher portabler und schneller als bc.Hatte anfangs auch an bc gedacht )=. mfg bluedxca93
|
bluedxca93
(Themenstarter)
Anmeldungsdatum: 29. Dezember 2011
Beiträge: 365
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 | var=3.2415
varw=${var/.*}
float=${var/*.}
zerofloat=$(echo 0.$float)
floati=$(printf "%2.1f\n" $zerofloat)
floatinto=${floati/*.}
floatint=$(printf $floatinto)
varc=$([[ "$floatint" > "4" ]] && echo 1 || echo 0)
echo $var
echo auf 1 nachkommastelle gerundet minus ganzahl $floati
echo korrekterzahl $varc
echo int $(($varc + $varw))
echo ende
|
wie vermeide ich die vielen Variablen? immerhin funktioniert die sh fehlerfrei!
|
TNTMaster
Anmeldungsdatum: 30. Juli 2009
Beiträge: 851
|
Hi Wenn du einfach nur eine Zufallszahl zw. $z1 und $z2 willst, geht das wohl am einfachsten so:
z1=10
z2=40
te=$((RANDOM%(z2-z1+1)+z1))
echo $te TNT
|
bluedxca93
(Themenstarter)
Anmeldungsdatum: 29. Dezember 2011
Beiträge: 365
|
hi, TNT danke für den Tipp.
jetzt hab ich zwei funktionierende Möglichkeiten!Einmal mit random als integr(schneller und weniger Variablen) oder mit random als float/ gleitkommazahl(langsamer aber näher am c64 original).
werde beide miteinander vergleichen mussen.
Bildschirm loeschen geht mit clear oder als ganz gut. ascii graphik laesst sich mit echo oder printf auf den Bildschirm zaubern, genauso wie einfache Tabellen.
bald kann ich schon die erste Hälfte des Prg als sh Posten.
mfg bluedca93
|
TNTMaster
Anmeldungsdatum: 30. Juli 2009
Beiträge: 851
|
Einmal mit random als integr(schneller und weniger Variablen) oder mit random als float/ gleitkommazahl(langsamer aber näher am c64 original).
werde beide miteinander vergleichen mussen.
Das habe ich mal gemacht, dein Script auf das wesentliche gekürzt und 1000 Zufallszahlen erzeugen lassen
$ time (z1=10; z2=40; for ((i=0; i<=1000; i++)); do r=$(awk -v "seed=$[(RANDOM & 32767) + 32768 * (RANDOM & 32767)]" 'BEGIN { srand(seed); printf("%.5f\n", rand() ) }'); zdif=$( awk 'BEGIN{print '"$z2"-"$z1"'}'); zdifr=$( awk 'BEGIN{print '"$r"*"$zdif"'}'); zdiff=$( awk 'BEGIN{print '"$zdifr"+"$z1"'}'); int=${zdiff/.*}; echo $int >/dev/null; done)
real 0m13.133s
user 0m1.140s
sys 0m2.036
# Zum Vergleich:
$ time (z1=10; z2=40; for ((i=0; i<=1000; i++)); do echo $((RANDOM%(z2-z1+1)+z1)) >/dev/null; done)
real 0m0.029s
user 0m0.020s
sys 0m0.008s
Der Unterschied in der Verbeitungsgeschwindigkeit ist doch enorm. wenn du viele Zufallszahlen erzeugen mußt, läuft das Spiel auf einem echten "C 64" gar schneller ☺ bald kann ich schon die erste Hälfte des Prg als sh Posten.
würde mich auch interessieren TNT
|
bluedxca93
(Themenstarter)
Anmeldungsdatum: 29. Dezember 2011
Beiträge: 365
|
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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205 | function show_instruction { echo -e "Spielanleitung"
echo -e "in diesem Spiel sind sie Besitzer eines"
echo -e "Wuerstchenstandes. das Ziel des Spieles"
echo -e "ist es, in moeglichst kurzer Zeit,"
echo -e "moeglichst viel Geld zu machen."
}
read -p "Spielanleitung anzeigen (y/n)?" choice
case "$choice" in
y|Y ) show_instruction;;
esac
daynumber=1
function get_daynumber {
daynumber=""
while [[ ! $daynumber =~ ^[1-7]+$ ]]; do
echo Tagnummer eingeben
read daynumber
done
}
get_daynumber
function dayname {
if [ "$daynumber" = "1" ]; then
echo Montag
elif [ "$daynumber" = "2" ]; then
echo Dienstag
elif [ "$daynumber" = "3" ]; then
echo Mittwoch
elif [ "$daynumber" = "4" ]; then
echo Donnerstag
elif [ "$daynumber" = "5" ]; then
echo Freitag
elif [ "$daynumber" = "6" ]; then
echo Samstag
elif [ "$daynumber" = "7" ]; then
echo Sonntag
else
echo " "
fi
}
day=$(dayname)
echo -e "\033[43m \033[0m"
clear
echo -e "i iiiii iiiii i iiiii iiiii"
echo -e "i i i i i i i i i"
echo -e "i i i iiiii i iiiii iiiii"
echo -e "i i i i i i i i"
echo -e "i i i iiiii i iiiii iiiii"
echo -e " "
echo -e "___________________________"
echo -e "___________________________"
echo -e "___________________________"
echo -e "___________________________"
echo -e "___________________________"
echo -e "___________________________"
echo -e "___________________________"
echo -e "i_________________________i"
echo -e " "
echo -e " "
function pause(){
read -p "$*"
}
pause 'Press [Enter] key to continue...'
clear
z1=10
z2=40
function z_r {
echo $((RANDOM%(z2-z1+1)+z1))
}
te=$(z_r)
function p_categories {
if [[ $te > 5 ]] ; then
pl=5
fi
if [[ $te > 10 ]] ; then
unset pl
pl=10
fi
if [[ $te > 15 ]] ; then
unset pl
pl=15
fi
if [[ $te > 20 ]] ; then
unset pl
pl=20
fi
if [[ $te > 25 ]] ; then
unset pl
pl=25
fi
if [[ $te > 30 ]] ; then
unset pl
pl=30
fi
if [[ $te > 35 ]] ; then
unset pl
pl=35
fi
echo $pl
unset pl
}
p=$(p_categories)
function c_gp {
if [[ $p -eq 5 ]] ; then
z1=20
z2=45
z_r
elif [[ $p -eq 10 ]] ; then
z1=30
z2=50
z_r
elif [[ $p -eq 15 ]] ; then
z1=40
z2=60
z_r
elif [[ $p -eq 20 ]] ; then
z1=40
z2=70
z_r
elif [[ $p -eq 25 ]] ; then
z1=40
z2=70
z_r
elif [[ $p -eq 30 ]] ; then
z1=50
z2=90
z_r
elif [[ $p -eq 35 ]] ; then
z1=80
z2=100
z_r
else
echo unknown
fi
}
gp=$(c_gp)
ep=$(c_gp)
sp=$(c_gp)
unset z1
unset z2
unset pl
unset p
k=1000
kfl=$( awk 'BEGIN{print '"$k"*"0.01"'}')
kpr=$( echo $(printf ":%9.2f Euro\n" "$kfl"))
h1=$sp
h2=$ep
h3=$gp
h4=$(($gp + 10))
h5=$(( $((RANDOM%(9-4+1)+4)) * 50))
h6=$((150 - $gp))
h7=$((170 - $gp))
m1=$(($k/$h1))
m2=$(($k/$h2))
m3=$(($k/$h3))
m4=$(($k/$h4))
m5=$(($k/$h5))
m6=$(($k/$h6))
m7=$(($k/$h7))
echo -e "Einkaufsmoeglichkeiten "
echo -e "Tag: $day Temperatur: $te C"
echo -e "Kasseninhalt $kpr "
echo -e "Max.Einkaufmoeglichkeit Einkaufspreis"
echo -e "Schokoladeneis : $m1 Stueck $h1 Cent"
echo -e "Erdbereis : $m2 Stueck $h2 Cent"
echo -e "Vanilleeis : $m3 Stueck $h3 Cent"
echo -e "Cola : $m4 Flaschen $h4 Cent"
echo -e "Zigaretten : $m5 Stueck $h5 Cent"
echo -e "Bratwuerste : $m6 Stueck $h6 Cent"
echo -e "Pommes Frites : $m7 Stueck $h7 Cent"
|
hi,
hier die sh.dielangsamere random Funktion hatte in dem Skript lustig bugs ausgelöst.
die Geschwindigkeit hätte aber trotzdem noch ausgereicht. der verkaufsalgorithmus schreibe ich morgen in sh um. Vllt kann man einige Funktionen kürzen.
mfg bluedxca93
|
TNTMaster
Anmeldungsdatum: 30. Juli 2009
Beiträge: 851
|
die Geschwindigkeit hätte aber trotzdem noch ausgereicht.
aber gerade so. Hab in vice 1000 Zufallszahlen erzeugen lassen, hier das Ergebnis:
LIST
10 S=TI
20 Z1=10
30 Z2=40
40 FOR I = 1 TO 1000
50 Z=INT(RND(1)*(Z2-Z1))+Z1
60 NEXT I
70 E=TI
80 PRINT (E-S)/60
READY.
RUN
13.7333333
READY.
|
TNTMaster
Anmeldungsdatum: 30. Juli 2009
Beiträge: 851
|
Du solltest dir angewöhnen, alle Funktionen an den Anfang und darunter den eigtl. Programstart zu setzen, bei dir ist das wild durcheinander. Auch entsprechend einrücken bei Funktionen, Schleifen, etc., ist etwas übersichtlicher. Vllt kann man einige Funktionen kürzen
Da wäre jetzt der BASIC Code interessant. Du hast aber ein paar unnötige unset und echo -e, wo ein echo auch reicht, in Z. 31 würde ich mit case..esac arbeiten, Das echo in Z. 176 ist unnötig. Ohne Worte 😊:
| h5=$(( $((RANDOM%(9-4+1)+4)) * 50))
|
|
bluedxca93
(Themenstarter)
Anmeldungsdatum: 29. Dezember 2011
Beiträge: 365
|
hi,
ja diese Zeile hab ich nur mal so stehen lassen, damit ich später leichter dor Prozeduren im Basic Code finde. Echo -e ist manchmal wirklich unnötig, ist aber im Moment einfacher.Außerdem was ist schneller eq oder = wenn ich zahlen vergleiche. Die Funktionen sollten normalerweise am Anfang der sh stehen,nur wenn ich das immer mache, stürzt das ganze einfach ab.
die if schleifen sind übrigens nahezu ,1:1 übernommen.
mfg bluedxca93
|
bluedxca93
(Themenstarter)
Anmeldungsdatum: 29. Dezember 2011
Beiträge: 365
|
unset ist komischerweise notwendig, zumindest bei den random Prozeduren.
wie implementiere ich var=var-1 ohne
hab Teile des verkaufsalgorithmus schon umgeschrieben, werde den baldmoeglichst Posten.
|
TNTMaster
Anmeldungsdatum: 30. Juli 2009
Beiträge: 851
|
wie implementiere ich var=var-1
etwa so?
unset ist komischerweise notwendig
Hier jedensfalls nicht:
Außerdem was ist schneller eq oder = wenn ich zahlen vergleiche
Das könntest du selbst auch messen, der Befehl mit time steht oben ja schon
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 | # mit -eq
$ time (for ((i=0; i<=1000000; i++)); do if [ $i -eq 500000 ]; then echo $i; fi; done)
500000
real 0m13.058s
user 0m12.581s
sys 0m0.444s
# mit =
$ time (for ((i=0; i<=1000000; i++)); do if [ $i = 500000 ]; then echo $i; fi; done)
500000
real 0m12.339s
user 0m11.957s
sys 0m0.348s
# ohne if mit [[ ... ]]
$ time (for ((i=0; i<=1000000; i++)); do [[ $i = 500000 ]] && echo $i; done)
500000
real 0m7.166s
user 0m7.008s
sys 0m0.136s
|
TNT
|
bluedxca93
(Themenstarter)
Anmeldungsdatum: 29. Dezember 2011
Beiträge: 365
|
hi , hab rein zufällig eine Anleitung gefunden wie man mit case/esac arbeitet. Der let Befehl ist auch ein guter Tipp.
hoffe dass ich jetzt auch den Time Befehl richtig einsetzen kann. Die nachfolgende sh war nicht leicht zu erstellen, da der Basic Code recht verwirrend war:
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 | v1=190
v2=90
v3=90
v4=230
v5=400
v6=340
v7=260
daynumber=1
te=39
function set_bkl_ekl_zkl {
if [[ $daynumber -lt 6 ]] ; then
bkl=30; ekl=10; zkl=10
elif [[ $daynumber -eq 6 ]] ; then
bkl=40; ekl=15; zkl=13
else
bkl=40; ekl=20; zkl=18
fi
}
set_bkl_ekl_zkl
function set_ve {
if [[ $v2 -gt $v1 ]] && [[ $v2 -gt $v3 ]] ; then
ve=$v2
elif [[ $v3 -gt $v1 ]] && [[ $v3 -gt $v2 ]] ; then
ve=$v3
else
ve=$v1
fi
}
set_ve
eko=$(($ekl-($ve/10) ))
function set_vb {
if [[ $v6 -gt $v7 ]] ; then
vb=$v7
else
vb=$v6
fi
}
set_vb
zkn=$(($zkl-($v5/100) ))
ekn=$(($eko+ ($te/2) ))
bkn=$(($bkl- ($vb/20) - ($te/2) ))
if ! test "$ekn" -gt 0 2> /dev/null ; then
ek=0
else
ek=$ekn
fi
if ! test "$zkn" -gt 0 2> /dev/null ; then
zk=0
else
zk=$zkn
fi
if ! test "$bkn" -gt 0 2> /dev/null ; then
bk=0
else
bk=$bkn
fi
a=-1
ak=$(($zk+$bk+$ek))
echo $bk
echo $ek
echo $zk
echo $ak
|
Der Code muesste allerdings stimmen nur die Bedeutung der Variablen war mir erst klar als ich alles bereits umgeschrieben hatte ak=anzahl Kunden
bk=anzahl Kunden die bratwurst oder frites möchten
ek=die eis Essen
zk= Zigarettekäufer
Anzahl je Tag mfg
bluedxca93
|