Neuling sucht Rat

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

Beispiele geb ich sowieso immer ein.
Ah danke für die Info werde der Seite mal nen Besuch abstatten :)
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

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 :(
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

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
Zuletzt geändert von Anonymous am Mittwoch 20. März 2013, 08:54, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
Sirius3
User
Beiträge: 18265
Registriert: Sonntag 21. Oktober 2012, 17:20

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
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()
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

Also ist mal wieder 90% Falsch :(
Hurray
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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. :D
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.
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

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
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?
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

Oh Gott - logisch ...das dass in der Schleife stehen muss weil das sonst nur einmalig einen Wert zuweist - ich bin so schlecht XD
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

Dictionarys werden zufällig ausgegeben?
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.
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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.
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

Ah ok danke :)
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

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".
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

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
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

x = 50
x = Referenz
50 = Objekt
oder umgekehrt?
Benutzeravatar
snafu
User
Beiträge: 6862
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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.
bords0
User
Beiträge: 234
Registriert: Mittwoch 4. Juli 2007, 20:40

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.
Antworten