|
Nephilim94
Anmeldungsdatum: April 10, 2012
Beiträge: 35
Wohnort: DE, Hessen, Nst.
|

10. April 2012 11:36
Hallo,
ich bin Azubi & soll bald ein anspruchsvolleres Script schreiben.
Ich hab letztes Jahr schon ein paar Sachen gemacht, aber bin jetzt auch noch kein Pro.
Um mein Wissen aufzufrischen bastel ich gerade an einem Lotto-Script rum.
#!/bin/bash
clear
echo "Bitte geben Sie Ihren Tipp (Leerzeichengetrennt) ab: "
read z1 z2 z3 z4 z5 z6
clear
echo "Ihre Zalhen lauten: "
echo "$z1 $z2 $z3 $z4 $z5 $z6"
echo "_______________________"
echo `touch lotto_temp`
rnd=$((RANDOM % 49 + 1))
echo "Die Ziehung ergab: "
i=0
while [ $i -lt 6 ]
do while [ `grep -c $rnd lotto_temp` -gt 0 ]
do rnd=$((RANDOM % 49 + 1))
done
echo $rnd >> lotto_temp
i=`expr $i + 1`
done
#if [ $i[0-6] -eq $z[0-6] > match ]
#then
#echo " $match "
#fi
echo `sort -n lotto_temp`
echo `rm lotto_temp`
exit 0 Soweit läuft alles, nur ein vorhaben funzt net, im Auskommentierten Teil, wäre so natürlich viel zu einfach aber finde i-wie im Netz oder so auch nichts wie ich es lösen könnte. Es sollen die Zahlen ausgegeben werden die getippt worden und gezogen worden, wenn keine Übereinstimmung statt findet echo "Verloren" oder so. (Das Script wird hier ausgeführt (obere Angaben nicht korrekt, aber Pflichtfeld...)
cat /proc/version
Linux version 2.6.16.54-0.2.3-default (geeko@buildhost) (gcc version 4.1.2 20070115 (prerelease) (SUSE Linux))
) Danke im vorraus für eure Antworten!
MfG Nephilim
|
|
rklm
Moderator & Supporter
Anmeldungsdatum: Okt. 16, 2011
Beiträge: 2214
|

10. April 2012 11:56
Nephilim94 schrieb: Hallo,
ich bin Azubi & soll bald ein anspruchsvolleres Script schreiben.
Herzlich willkommen im Forum!
echo `touch lotto_temp`
echo `sort -n lotto_temp`
...
echo `rm lotto_temp`
Du verdienst Dir hier einen Useless use of echo award. Lediglich der mit dem sort hat eine gewisse Berechtigung, weil er alle Zahlen in eine Reihe bringt. Das geht auch mit sort -n lotto_temp | paste -d ' ' -s
Soweit läuft alles, nur ein vorhaben funzt net, im Auskommentierten Teil, wäre so natürlich viel zu einfach aber finde i-wie im Netz oder so auch nichts wie ich es lösen könnte. Es sollen die Zahlen ausgegeben werden die getippt worden und gezogen worden, wenn keine Übereinstimmung statt findet echo "Verloren" oder so.
Du könntest die Treffer zu Fuß zählen | treffer=0
for z in $z1 $z2 $z3 $z4 $z5 $z6; do
egrep -q "^$z\$" lotto_temp && treffer=$((treffer + 1))
done
|
oder etwas trickreicher | treffer=$(fgrep -cw -f <(echo -e "$z1\n$z2\n$z3\n$z4\n$z5\n$z6") lotto_temp)
|
Ciao robert
|
|
Nephilim94
(Themenstarter)
Anmeldungsdatum: April 10, 2012
Beiträge: 35
Wohnort: DE, Hessen, Nst.
|

10. April 2012 12:53
Danke für die Begrüßung! Ok, der Award ist jetzt hoffentlich wider weg
Alles klar, funzt alles, falls noch jmd. vor hat ein solches Script zu basteln wäre hier ein Lösungsvorschlag: #!/bin/bash
clear
echo "Bitte geben Sie Ihren Tipp (Leerzeichengetrennt) ab: "
read z1 z2 z3 z4 z5 z6
clear
echo "Ihre Zalhen lauten: "
echo "$z1 $z2 $z3 $z4 $z5 $z6"
echo "_______________________"
echo ""
touch lotto_temp
rnd=$((RANDOM % 49 + 1))
echo "Die Ziehung ergab: "
i=0
while [ $i -lt 6 ]
do while [ `grep -c $rnd lotto_temp` -gt 0 ]
do rnd=$((RANDOM % 49 + 1))
done
echo $rnd >> lotto_temp
i=`expr $i + 1`
done
treffer=0
for z in $z1 $z2 $z3 $z4 $z5 $z6;
do
egrep -q "^$z\$" lotto_temp && treffer=$((treffer + 1))
done
sort -n lotto_temp | paste -d ' ' -s
rm lotto_temp
echo ""
echo "Sie haben $treffer Zahlen richtig! "
echo ""
exit 0 Nochmals Danke für die schnelle Hilfe, ich werde euch bestimmt nochmal brauchen.
Bis die Tage!
|
|
rklm
Moderator & Supporter
Anmeldungsdatum: Okt. 16, 2011
Beiträge: 2214
|

10. April 2012 14:13
Nephilim94 schrieb: Nochmals Danke für die schnelle Hilfe, ich werde euch bestimmt nochmal brauchen. 
Dafür sind wir ja da. Ich setze dann das Thema mal auf "gelöst". Bitte beim nächsten Mal dran denken. Viele Grüße robert
|
|
user unknown
Anmeldungsdatum: Aug. 10, 2005
Beiträge: 13823
Wohnort: Berlin
|

11. April 2012 03:18
Nephilim94 schrieb:
Ich habe noch Kritik!  #!/bin/bash
clear
'clear' macht man nicht. http://www.catb.org/~esr/writings/taoup/html/
echo "Ihre Zalhen lauten: "
Die Rtschbeipfüüng mmeri!
do while [ `grep -c $rnd lotto_temp` -gt 0 ]
Backticks sind veraltet. Benutze stattdessen $(...) - das kann man einfacher schachteln, schreiben und lesen.
i=expr $i + 1
Shellarithmetik geht mit doppelten, runden Klammern:
exit 0
Wozu soll das gut sein? Insgesamt ist es eine unstrukturierte Nudelsuppe ohne Funktionen.
|
|
user unknown
Anmeldungsdatum: Aug. 10, 2005
Beiträge: 13823
Wohnort: Berlin
|

11. April 2012 03:31
Hier ist übrigens das Ergebnis einer Sitzung mit dem Programm:
| Ihre Zalhen lauten:
4 7 7 a -2
_______________________
Die Ziehung ergab:
11 15 27 34 37 39
Sie haben 0 Zahlen richtig!
|
Es hilft einem weder, in dem es sagt, wieviele Zahlen aus welchem Bereich erwartet werden, noch prüft es die Eingabe. Außerdem vermisse ich Einrückungen im Code.
|
|
Nephilim94
(Themenstarter)
Anmeldungsdatum: April 10, 2012
Beiträge: 35
Wohnort: DE, Hessen, Nst.
|

11. April 2012 10:20
rklm schrieb:
Ich setze dann das Thema mal auf "gelöst". Bitte beim nächsten Mal dran denken.
Sorry, hab ich nicht gewusst. Merk ich mir! @user unknow Hallo,
ist jetzt nicht böse gemeint oder sonstwas, ich aktzeptiere deine Kritik, grade das mit dem $(...), ok, wenn das so ist, merk ich mir. Aber du musst auch mal bedenken das ich blutiger Anfänger bin und froh das das überhaupt läuft. Ich wende hier teilweise schon gelernte, teilweise Strings 1:1 aus tutorials und alles an, klar is das noch net perfekt, aber das ich schon soweit bin das ich Nudelsuppe ohne Funktionen programmieren kann ist natürlich sehr aufbauend, danke!  Entschuldigung auch dass ich so ne Prüfung noch nie gemacht hab, aber ich weiß ja nicht wie du Lotto spielst aber ich hab noch kein a oder ne -2 am Zettel gesehen, bei mir sieht das so aus:
Ihre Zalhen lauten:
8 12 16 23 32 36
_______________________
Die Ziehung ergab:
15 16 23 28 35 47
Sie haben 2 Zahlen richtig!
|
|
Lysander
Anmeldungsdatum: Juli 30, 2008
Beiträge: 2314
Wohnort: Hamburg
|

11. April 2012 11:24
Nephilim94 schrieb: Entschuldigung auch dass ich so ne Prüfung noch nie gemacht hab, aber ich weiß ja nicht wie du Lotto spielst aber ich hab noch kein a oder ne -2 am Zettel gesehen, bei mir sieht das so aus: 
Es geht darum, dass Du bei Programmen die Eingaben grundsätzlich validieren solltest. Ein Benutzer muss ja nicht aus böser Absicht heraus falsche Eingaben machen, sonder das kann auch unabsichtlich passieren. Und für solche Fälle wäre eine Warnung ganz nett  Hier mal das Beispiel in Python (2.x):
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 | #!/usr/bin/env python2
# coding: utf-8
import argparse
from random import sample
def generate_draw(numbers=5):
return sample(range(1, 50), numbers)
def compare_draws(*draws):
a, b = map(set, draws)
return len(a & b)
def main():
parser = argparse.ArgumentParser(description=u"A simple Lotto simulator.")
parser.add_argument("values", type=int, nargs=5, choices=xrange(1, 50),
help=u"Five Lotto numbers between 1 and 49.")
args = parser.parse_args()
draw_ai = generate_draw()
print u"Ihre Zahlen lauten:"
print u" ".join(map(str, args.values))
print u"-"*25
print u"Die Ziehung ergab:"
print u" ".join(map(str, draw_ai))
print
print u"Sie haben {} Zahlen richtig.".format(compare_draws(args.values,
draw_ai))
if __name__ == "__main__":
main()
|
Die Ausgabe im Fehlerfalle ist zwar eher unhübsch, aber der Benutzer kann keine solchen krummen Eingaben tätigen. In der Bash ist das sicherlich trickreicher zu bewältigen; außer es gibt ein Tool für das Parsen von Argumenten, wovon ich fast ausgehe. Ansonsten musst Du die Argumente eben Stück für Stück durchgehen und prüfen, ob sie gültig sind.
|
|
Nephilim94
(Themenstarter)
Anmeldungsdatum: April 10, 2012
Beiträge: 35
Wohnort: DE, Hessen, Nst.
|

11. April 2012 11:44
Dafür steht ja im echo "Leerzeichengetrennt".
Ja ist ja richtig, aber ich kann so eine Prüfung doch noch garnet, was bringt es denn wenn ich die Scripts mit Sachen vollhau die ich net versteh und mir i-wo ausm Netz zieh. Ich bin von der Genertion die mit Windows XP aufgewachsen ist. Es is net lange her, dass ich netmal wusste, dass es nen Konsolenfenster gibt. Sorry wenn ich falsch liege, aber ihr seid bestimmt damit aufgewachsen und habt den PC so kennengelernt, ich net. In dem Lottoscript gibt es schon noch Strings wo ich eigl. garnet weiß was genau der macht, wiegesagt ich bin froh das es erstmal funzt, jetzt gehts ans verstehen und da juckt mich ehrlich gesagt kein Rechtschreibfehler, geschweigedenn das ich da mir i-welchen Reg-Ex und Var und keine Ahnung da ne Prüfung reinhau, das dient doch jetzt erstmal zum reinen lernen, noch sind das Spielereiscripts, die feinheiten kommen schon noch. Ich mein das echt net böse oder so und ich weiß auch das es beim Scripten drauf ankommt, genau zu sein, so simpel wie möglich zu sein, es soll Anschaulich sein, Kommentiert werden sollte es, Ordentliche Variablenbenennung, .... Aber ich muss erstmal mit den ganzen Befehlen, etc. klarkommen und das hinbekommen, dann kann ich richtig Programmieren. Was nutzt es mir 3 Zeilen durch eine zu ersetzen, wenn ich dann die eine net raff, es geht ja aktuell ums Befehle lernen und verstehen, mehr nicht, RICHTIG scripten wäre dann der nächste Schritt.
|
|
jug
Moderator & Supporter
Anmeldungsdatum: März 19, 2007
Beiträge: 8944
Wohnort: Berlin
|

11. April 2012 11:53
Nephilim94 schrieb: Entschuldigung auch dass ich so ne Prüfung noch nie gemacht hab, aber ich weiß ja nicht wie du Lotto spielst aber ich hab noch kein a oder ne -2 am Zettel gesehen, bei mir sieht das so aus: 
user unknown wollte dich damit auf ein großes Problem deines Scriptes hinweisen: Du prüfst nicht, ob die Eingaben sinnvoll sind. Außerdem sagst du dem Benutzer nirgendwo, was für Eingaben das Script erwartet. Wenn du etwas programmierst, dann ist eine der ersten Regeln, niemals den Benutzereingaben zu trauen. Wenn du Lottozahlen als Eingabe erwartest, dann solltest du sicherstellen, dass
Zahlen eingegeben werden (keine Buchstaben), die Zahlen aus dem zulässigen Zahlenbereich stammen (1-49) und keine Zahl doppelt eingegeben wird.
Ein Verstoß gegen diese Regeln sollte ein Programm immer mit einer entsprechenden Fehlermeldung quittieren. Dazu würde ich die Eingabe und Prüfung der Zahlen in eine Funktion kapseln. Du wirst nämlich schnell merken, dass dein Code unübersichtlicher wird, je mehr Codezeilen du hinzufügst. Deshalb finde kleinere Einheiten, bestimmte Teilaufgaben in deinem Script, die unabhängig voneinander sind und tue diese in eine Funktion. Eine Funktion ist in sich geschlossen, relativ kurz (Codezeilen) und kann wenn sie einmal funktioniert immer wieder aufgerufen oder in anderen Projekten wiederverwendet werden. Wenn man keine Funktionen verwendet, dann erhält man ein Script wie deines, eine lange Aneinanderreihung von Codezeilen, die von oben nach unten der Reihe nach abgearbeitet werden – man nennt es Spaghetticode (deshalb wohl der Hinweis auf Nudelsuppe) – das ist kein guter Stil. Klar es funktioniert irgendwie, aber sobald deine Skripte etwas mehr können sollen, wird es schnell extrem unübersichtlich, also lerne lieber gleich mit Funktionen umzugehen. Oh und noch ein Hinweis: Lerne mit Arrays umzugehen, die temporäre Datei die du da anlegst brauchst du nämlich für dein Script nicht. Mit diesen Hinweisen lasse ich dich mal allein, du sollst ja was lernen.  ~jug
|
|
jug
Moderator & Supporter
Anmeldungsdatum: März 19, 2007
Beiträge: 8944
Wohnort: Berlin
|

11. April 2012 12:13
Nephilim94 schrieb: Aber ich muss erstmal mit den ganzen Befehlen, etc. klarkommen und das hinbekommen, dann kann ich richtig Programmieren. Was nutzt es mir 3 Zeilen durch eine zu ersetzen, wenn ich dann die eine net raff, es geht ja aktuell ums Befehle lernen und verstehen, mehr nicht, RICHTIG scripten wäre dann der nächste Schritt.
Nenene, meiner Meinung nach der falsche Ansatz. Lerne programmieren. Lerne in Variablen, IF-Bedingungen, Schleifen und Funktionen zu denken und überlege was mit einer Variablen passieren muss, damit ein Ergebnis entsteht. Das nennt man Algorithmus und kann man häufig mit Stift und Papier machen (Programmablaufplan, Nassi-Shneiderman-Diagramm), funktioniert nämlich unabhängig von der Programmiersprache. Danach erst kommt die Umsetzung in tatsächlichen Programmcode. Dazu muss man dann die Syntax und Eigenheiten einer Sprache lernen, das ist klar; aber wenn man mit den grundlegenden Konzepten vertraut ist – was ist eine Schleife, wie sind IF-Bedingungen aufgebaut – dann geht das schnell sich sowas anzueignen. ~jug
|
|
Lysander
Anmeldungsdatum: Juli 30, 2008
Beiträge: 2314
Wohnort: Hamburg
|

11. April 2012 12:21
jug schrieb: ... funktioniert nämlich unabhängig von der Programmiersprache.
[begin klugscheißermode]
Das ist so nur bei prozeduralen Sprachen richtig
[end klugscheißermode] Ich würde auch nicht zwangsweise auf Ablaufdiagramme setzen (kann man sicherlich dennoch tun!), aber auf jeden Fall ebenso dafür plädieren, dass man von Anfang an Sprachelemente und Idiome richtig lernt! Wenn man sich erst einmal etwas falsches angeeignet hat, dann wird es viel schwerer, davon wieder los zu kommen. Kleine simple Spielchen zur Motivation und Übung sind auch vollkommen ok, aber stößt man dabei auf Sachen, die man noch nicht kann, dann muss man sich diese eben aneignen und nicht einfach per copy&paste lösen. Und wenn man dann an seine Grenzen stößt, muss man die Idee evtl. auch mal zurückstellen und etwas anderes, bereits machbares in Angriff nehmen.
|
|
user unknown
Anmeldungsdatum: Aug. 10, 2005
Beiträge: 13823
Wohnort: Berlin
|

11. April 2012 12:28
@Nephilim94: Nimm es auch nicht persönlich. Wenn es Dir zuviel Kritik auf einmal ist, pick Dir raus, was Du meinst angehen zu wollen und zu können. Rom wurde auch nicht an einem Tag erbaut.
|
|
Nephilim94
(Themenstarter)
Anmeldungsdatum: April 10, 2012
Beiträge: 35
Wohnort: DE, Hessen, Nst.
|

11. April 2012 15:04
Okok,
genau, Rom hat auch gedauert!  Nein, ich bin eure Post's gerade mal alle durchgegengen, mit dem Theoretischen Plan und so ist ja schonmal gut, werde ich auch mal testen. Aaaaber auch @Lysander, ja klar sollte man es von Anfang an richtig lernen, ich gebe auch mein bestes, aber es klappt in der Umsetzung einfach noch nicht 100% weil mir für richtig noch nen paar Fähigkeiten fehlen.
|
|
Nephilim94
(Themenstarter)
Anmeldungsdatum: April 10, 2012
Beiträge: 35
Wohnort: DE, Hessen, Nst.
|

13. April 2012 11:04
Hallo, ich nochmal,
also ich bin am versuchen und awk'n und grep'n und test'n, aber ich bekomme keine Eingabeüberprüfung programmiert. Nur das man nix Alphabetisches eingeben darf^^ Aber es sollen ja nur Zahlen von 0-49 rein dürfen.
Das Python bsp. bringt mich leider nicht weiter. Villt. hat ja jmd. nen paar Tipps oder nen Lösungsansatz. Grüüße!
|