Seite 3 von 14
Re: Neuling sucht Rat
Verfasst: Mittwoch 20. März 2013, 00:07
von Tengel
Beispiele geb ich sowieso immer ein.
Ah danke für die Info werde der Seite mal nen Besuch abstatten

Re: Neuling sucht Rat
Verfasst: Mittwoch 20. März 2013, 05:08
von Tengel
Oh man - langsam bin ich wirklich frustriert(noch mehr wie bei meiner äußerung gesternt^^) ......
Mir ist gerade die Idee gekommen etwas für mich "nützliches" zu programmieren.
Und zwar:
Ich muss für die Arbeit ein Fahrtenbuch schreiben was ich aber ehrlich gesagt nicht immer sofort im Auto eintrage - die Zeit hat gezeigt das die gesamte Strecke immer etwas zwischen 80 und 83 KM beträgt.
Hinzu kommt das natürlich manchmal zwischen denn Schichten private Fahrten sind - die ja den Startkmstand verändern.
Nachdem ich das die letzten Monate immer mit Taschenrechner gemacht habe, kam mir die Idee ein Programm dafür zu schreiben.
Code: Alles auswählen
# KM Berechnung für Arbeit
import random
random.seed()
z=1
while z == 1: #Schleife zum Eingabefehlerabfangen(Km)
#Eingabe des KM Startwertes
print("KM Anzeige am Anfang des Monats:")
try:
km_stand_start= int(input())
z=2
except:
print("Falsche Eingabe")
continue
x=1
while x ==1: #Schleife zum Fehlerwertabfangen(Atage)
#Eingabe der Arbeitstage
print("Wieviele Tage wurden gearbeitet?")
try:
A_tage=int(input())
x=2
except:
print("Falsche Eingabe")
continue
#Gesamt Strecke
g_strecke = random.randint(80,83)
#Private fahrten
p_fahrten = random.randint(1,20)
#Schleife zur Berechnung der einzelnen Werte
for i in range(0,A_tage,1):
i=i+1
km_stand = km_stand_start + g_strecke + p_fahrten
einfache_strecke = g_strecke / 2
print("Tag",i,"Gesamt gefahren:",g_strecke,"einfache Strecke:",einfache_strecke,"KM Stand:",km_stand)
So - ich habe nur folgende Probleme an denen ich verzweifel
1. ich kenne nur die Möglichkeit uhrzeitbasiert eine zufällige Zahl zu erzeugen, nachdem die Schleife anscheinend so schnell ausgeführt wird ist es immer die
selbe Zufallszahl
2. ich bin zu unfähig das die km_stand variable bei dem nächsten Durchlauf mit dem neuen Startwert anfängt
3. p_fahrten sollte auch ab und an 0 sein da es ja doch immer wieder einmal vorkommt das zwischen den Diensten nichts privat erledigt wird mein versuch
random.randint(0,5-20) hat natürlich nicht funktioniert

Re: Neuling sucht Rat
Verfasst: Mittwoch 20. März 2013, 05:32
von Tengel
Ok - das mit dem Kilometerstand konnte ich beheben - hab wieder zu kompliziert gedacht
Code: Alles auswählen
# KM Berechnung für Arbeit
import random
random.seed()
z=1
while z == 1: #Schleife zum Eingabefehlerabfangen(Km)
#Eingabe des KM Startwertes
print("KM Anzeige am Anfang des Monats:")
try:
km_stand = int(input())
z=2
except:
print("Falsche Eingabe")
continue
x=1
while x ==1: #Schleife zum Fehlerwertabfangen(Atage)
#Eingabe der Arbeitstage
print("Wieviele Tage wurden gearbeitet?")
try:
A_tage=int(input())
x=2
except:
print("Falsche Eingabe")
continue
#Gesamt Strecke
g_strecke = random.randint(80,83)
#Private fahrten
p_fahrten = random.randint(1,20)
#Schleife zur Berechnung der einzelnen Werte
for i in range(0,A_tage,1):
i=i+1
km_stand = km_stand + g_strecke
einfache_strecke = g_strecke / 2
print("Tag",i,"Gesamt gefahren:",g_strecke,"einfache Strecke:",einfache_strecke,"KM Stand:",km_stand)
km_stand_neu = km_stand+p_fahrten
km_stand = km_stand_neu
Re: Neuling sucht Rat
Verfasst: Mittwoch 20. März 2013, 07:11
von Sirius3
Da Du bereits continue kennst, was an dieser Stelle total überflüssig ist, weil eine while-Schleife automatisch wieder von vorne begonnen wird, kennst Du sicher auch break um die Schleife abzubrechen.
Ein nacktes except ist in Python sehr schlecht, da auch falsch geschriebene Variablennamen, etc. abgefangen werden. Was Du willst ist ein except ValueError.
Jetzt machst Du das selbe 2 mal für km_stand und A_tage die gerne auch arbeitstage heißen dürfen, dafür gibt es Funktionen:
Code: Alles auswählen
def input_int(prompt):
while True:
try:
return int(input(prompt))
except ValueError:
print("Falsche Eingabe")
km_stand = input_int("KM Anzeige am Anfang des Monats:")
arbeitstage = input_int("Wieviele Tage wurden gearbeitet?")
Dieses random.randint willst Du wahrscheinlich innerhalb der Schleife, um nicht jeden Tag exakt die selben km zu fahren.
Was soll das i=i+1, anscheinend kennst Du ja bereits range mit Startwert?
km_stand_neu ist überflüssig
Re: Neuling sucht Rat
Verfasst: Mittwoch 20. März 2013, 09:28
von BlackJack
@Tengel: Die `random.seed()`-Funktion brauchst Du nicht aufrufen, das ist unnötig. Ich würde sogar sagen man sollte sie nicht aufrufen, denn in bestimmten Situationen kann das dazu führen das die Pseudozufallszahlen *weniger* zufällig sind.
Das mit ``break`` hat Sirius3 ja schon erwähnt. Damit werden die Namen `x` und `z` überflüssig.
Namen sollte man so wählen, dass daraus ersichtlich wird was der Wert dahinter im Programmkontext bedeutet. Abkürzungen die nicht allgemein bekannt sind, sollte man vermeiden und stattdessen den Namen ausschreiben. Dann braucht man auch keinen Kommentar der den Namen erklärt und so einen Kommentar muss man dann nicht suchen wenn man einen Namen irgendwo im Programm findet und nichts damit anfangen kann.
Überarbeitet könnte das so aussehen (ungetestet):
Code: Alles auswählen
#!/usr/bin/env python3
"""KM Berechnung für Arbeit"""
import random
def input_int(prompt):
print(prompt)
while True:
try:
return int(input())
except ValueError:
print('Falsche Eingabe')
def main():
km_stand = input_int('KM Anzeige am Anfang des Monats:')
arbeitstage = input_int('Wieviele Tage wurden gearbeitet?')
for i in range(1, arbeitstage + 1):
gesamt_strecke = random.randint(80, 83)
km_stand += gesamt_strecke
print(
'Tag', i, 'Gesamt gefahren:', gesamt_strecke,
'einfache Strecke:', gesamt_strecke / 2, 'KM Stand:', km_stand
)
#
# Private Fahrten berücksichtigen.
#
km_stand += random.randint(1, 20)
if __name__ == '__main__':
main()
Re: Neuling sucht Rat
Verfasst: Mittwoch 20. März 2013, 15:15
von Tengel
Also ist mal wieder 90% Falsch

Hurray
Re: Neuling sucht Rat
Verfasst: Mittwoch 20. März 2013, 15:26
von /me
Tengel hat geschrieben:Also ist mal wieder 90% Falsch

Die Fähigkeit des Programmierens umfasst nur zu einem Teil die Kenntnis der Syntax der Programmiersprache. Genauso wichtig ist es, Konzepte, Ideen und Algorithmen zu verstehen.
Du befindest dich noch am Anfang und musst da jetzt durch.

Re: Neuling sucht Rat
Verfasst: Mittwoch 20. März 2013, 15:44
von BlackJack
@Tengel: Niemand wird Programmieren einfach so aus dem Stehgreif perfekt können, nach dem er ein Buch zu einer einer Programmiersprache gelesen hat. Fehler darf man machen, daraus kann man lernen. Solange man die gleichen Fehler nicht immer wieder macht, ist das doch überhaupt kein Grund zur Sorge.
Re: Neuling sucht Rat
Verfasst: Mittwoch 20. März 2013, 21:57
von Tengel
Hm die Gefahr besteht wohl immer wenn man versucht sich selbst was bei zu bringen.
Man gewöhnt sich etwas falsch an.
Continue hab ich verpennt - hab am anfang nur eine while Schleife benutzt und da gings nicht ohne.
ich hab die random.seed() rausgenommen - aber irgendwie bekomme ich da immer denselben Wert für alle fahrten
Re: Neuling sucht Rat
Verfasst: Mittwoch 20. März 2013, 22:31
von BlackJack
@Tengel: Das kann aber kein Unterschied sein, den das Herausnehmen vom `seed()`-Aufruf gemacht hat. Hast Du das ermitteln der Zufallszahlen denn schon *in* die Schleife hinein gezogen?
Re: Neuling sucht Rat
Verfasst: Mittwoch 20. März 2013, 22:56
von Tengel
Oh Gott - logisch ...das dass in der Schleife stehen muss weil das sonst nur einmalig einen Wert zuweist - ich bin so schlecht XD
Re: Neuling sucht Rat
Verfasst: Donnerstag 21. März 2013, 15:00
von Tengel
Dictionarys werden zufällig ausgegeben?
Re: Neuling sucht Rat
Verfasst: Donnerstag 21. März 2013, 15:12
von BlackJack
@Tengel: Sozusagen. Es ist nicht wirklich zufällig, aber man sollte auch keine Annahmen darüber machen in welcher Reihenfolge die Elemente sind, denn das ist ein Implementierungsdetail.
Re: Neuling sucht Rat
Verfasst: Donnerstag 21. März 2013, 15:14
von /me
Tengel hat geschrieben:Dictionarys werden zufällig ausgegeben?
Nicht ganz. Sie werden in einer durch die Implementierung definierten Reihenfolge ausgegeben die aber weder sortiert ist, noch der Reihenfolge entspricht in der die Elemente hinzugefügt wurden. Ich zitiere das
Tutorial zu Dictionaries: "It is best to think of a dictionary as an unordered set of
key: value pairs [...]".
Kurz gesagt: wenn du eine Sortierung bei der Verarbeitung haben möchtest, dann sortiere die Daten selber.
Code: Alles auswählen
data = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
for value in data.values():
print(value)
for key in sorted(data):
print(data[key])
Es gibt in der Standardbibliothek noch
OrderedDict. Das liefert die Einträge in der Reihenfolge in der sie hinzugefügt wurden.
Re: Neuling sucht Rat
Verfasst: Donnerstag 21. März 2013, 15:48
von Tengel
Ah ok danke

Re: Neuling sucht Rat
Verfasst: Donnerstag 21. März 2013, 16:08
von Tengel
Nochmal zu meinem Programm für die KM Berechnung.
Momentan ist es ja so das die Chance privat nichts gemacht zu haben bei unter 5% - normalerweise ist die Chance privat keine Fahrten gemacht zu haben deutlich größer.
Mein Versuch das abzufangen sieht wie folgt aus:
Code: Alles auswählen
import random()
#Private Fahrten
#75% Chance das nicht privat gefahren wurde
chance = random.randint(0,3)
if chance == 0:
p_fahrten = 0
else:
p_fahrten = random.randint(5,20)
Ich bin mir durchaus bewusst das es wohl elegantere Lösungen gibt - ich bitte nur zu bedenken das ich das verwende was ich "kann".
Re: Neuling sucht Rat
Verfasst: Donnerstag 21. März 2013, 17:27
von Tengel
Code: Alles auswählen
#Private fahrten
chance = random.randint(0,3)
if chance <=2:
p_fahrten = 0
else:
p_fahrten = random.randint(5,20)
meinte ich natürlich
Re: Neuling sucht Rat
Verfasst: Samstag 23. März 2013, 15:09
von Tengel
x = 50
x = Referenz
50 = Objekt
oder umgekehrt?
Re: Neuling sucht Rat
Verfasst: Samstag 23. März 2013, 15:17
von snafu
Tengel hat geschrieben:x = 50
x = Referenz
50 = Objekt
oder umgekehrt?
Ist so herum, wie du es sagst, schon richtig:
50 ist das Objekt (vom Typ `int`) und `x` ist der Verweis / die Referenz auf das Objekt.
Re: Neuling sucht Rat
Verfasst: Samstag 23. März 2013, 17:41
von bords0
snafu hat geschrieben:`x` ist der Verweis / die Referenz auf das Objekt.
Am Besten ist es, man nennt es
Name. Das ist es ja auch. Von Verweis / Referenz haben viele schon eine Vorstellung, die nicht ganz passt.