Geschwindigkeitsumrechner programmieren

Du hast eine Idee für ein Projekt?
Antworten
jstn99
User
Beiträge: 4
Registriert: Donnerstag 24. Januar 2019, 11:06

Donnerstag 24. Januar 2019, 11:16

Hallo! Ich programmiere gerade einen Geschwindigkeitenumrechner. Aber an einigen stellen komme ich nicht weiter. Kann mir jmd ein paar Tipps geben und sagen wo genau es hängt?



Hier mein Skript:

Code: Alles auswählen

import sys
def main():
    inp = input('Gib deinen Umrechnungswunsch ein (Format: Zahl <leerzeichen> Input-Einheit <leerzeichen> Output-Einheit):   ')
    Menge = float(inp.split()[0])
    input_einheit = inp.split()[1]
    output_einheit = inp.split()[2]
 
    input_einheit = find_out_what_unit(input_einheit)
    output_einheit = find_out_what_unit(out_einh)
 
    print(converter(Menge,input_einheit,output_einheit),output_einheit)
 
def find_out_what_unit(EINHEIT):
    Kn = ['knoten','Knoten','kn','Kn','KNOTEN','kt','KT','Kt']
    mps = ['Meter/Sekunde','meter/sekunde','m/s']
    kmph = ['Km/h','km/h','KM/H']
    mph = ['mph','MPH']
    
 
    if EINHEIT in Kn:
        return 'Knoten'
    elif EINHEIT in mps:
        return 'm/s'
    elif EINHEIT in kmph:
        return 'km/h'
    elif EINHEIT in mph:
        return 'mph'
    else:
        print(' {} ist keine gültige Einheit!'.format(EINHEIT))
        sys.exit()
   
 
def converter(Menge,input_einheit,output_einheit):
    
    def convert_to_m/s(Menge,input_einheit):
        if input_einheit == 'mph':
            return Menge/2.2369362920544
        elif input_einheit == 'Kn':
            return Menge/1.9438444924574
        else:
            print('FEHLER! Nicht metrische Einheiten nur in metrische!')
            sys.exit()
           
    def convert_to_km/h(Menge,input_einheit):
        if input_einheit == 'mph':
            return Menge*1.609344
        elif input_einheit == 'Kn':
            return Menge*1.851999999984
        else:
            print('FEHLER! Nicht metrische Einheiten nur in metrische!')
            sys.exit()
            
    def convert_to_Kn(Menge,input_einheit):
        if input_einheit == 'm/s':
            return Menge*2.2369362920544
        elif input_einheit == 'km/h':
            return Menge*0.62137119223733
        else:
            print('FEHLER! Metrische Einheiten nur in nicht metrische!')
            sys.exit()
            
    def convert_to_mph(Menge,input_einheit):
        if input_einheit == 'm/s':
            return Menge* 1.9438444924574
        elif input_einheit == 'km/h':
            return Menge*0.53995680346039
        else:
            print('FEHLER! Metrische Einheiten nur in nicht metrische!')
            sys.exit()
 
    def convert_m/s_to(Menge,output_einheit):
       
    def convert_m/s_to_Kn(Menge):
        return convert_to_m/s
 
    def convert_m/s_to_mph(Menge):
        return convert_to_m/s
 
    if input_einheit == 'm/s':
        if output_einheit == 'Kn':
            return convert_m/s_to(convert_m/s_to_Kn(Menge),'Kn')
        elif output_einheit == # u.s.w.
 
    elif input_einheit == 'cm':
        if output_einheit == 'mile':
            return convert_Yard_to(convert_Meter_to_Yard(convert_to_Meter(Menge,'cm')),'mile')
        elif # u.s.w.
 
    elif input_einheit == 'km':
        # u.s.w.
    elif input_einheit == 'yard':
        # u.s.w.
    elif input_einheit == 'fuß':
        # u.s.w.
    elif input_einheit == 'mile':
        # u.s.w.
    else:
        print('FEHLER!')
        sys.exit()
           
           
 
main()

Benutzeravatar
__blackjack__
User
Beiträge: 2270
Registriert: Samstag 2. Juni 2018, 10:21

Donnerstag 24. Januar 2019, 12:49

@jstn99: Das musst Du doch selbst wissen wo es hängt/wo Du nicht weiter kommst‽
»I'm not going to ride on a magic carpet!« he hissed.
»I'm afraid of grounds!«
»You mean heights,« said Conina. »And stop being silly.«
»I know what I mean! It's the grounds that kill you!« — Terry Pratchett, Sourcery
Benutzeravatar
__blackjack__
User
Beiträge: 2270
Registriert: Samstag 2. Juni 2018, 10:21

Donnerstag 24. Januar 2019, 13:07

@jstn99: Der Compiler sagt Dir doch recht deutlich wo das Problem liegt:

Code: Alles auswählen

  File "forum16.py", line 35
    def convert_to_m/s(Menge,input_einheit):
                    ^
SyntaxError: invalid syntax
Schau mal in der Python-Dokumentation nach a) welche Zeichen in Namen erlaubt sind und b) was ``/`` für eine Bedeutung hat. Für letzteres kann man den Index der Dokumentation verwenden, der auf fast jeder Seite der HTML-Variante oben rechts verlinkt ist.

Anonsten enthält diese Code *so* viele Syntaxfehler das man da sehr viel dran ändern müsste um den wenigstens am Compiler vorbei zu bekommen. Sinnvoll laufen wird der dann ziemlich sicher immer noch nicht.

Ich würde sagen Du gehst falsch ans Programmieren heran. Statt das ganze Programm runter zu schreiben und etliche halbfertige Codeteile zu haben, entwickelt man Software Schritt für Schritt und zwar so, das jeder Zwischenschritt tatsächlich lauffähig ist. Man macht erst mit dem nächsten Schritt weiter wenn der aktuelle Zustand soweit funktioniert.

Man würde das auch nicht mit diesen Unmengen an Vergleichen lösen, sondern mit einer Umrechnungstabelle wo Faktoren drin stehen, zum Beispiel von `m/s` nach `km/h` und so weiter. Um nicht jede Mögliche Kombination abdecken zu müssen, würde es sich auch anbieten erst in eine Grundgrösse umzurechnen und von da dann zum Ziel.

Bezüglich der Namensschreibweisen solltest Du auch mal einen Blick in den Style Guide for Python Code werfen.

Vergiss mal bitte das es `sys.exit()` gibt. Solange man an den Aufrufer des Programms nicht verschiedene Rückgabecodes übermitteln möchte, braucht man diese Funktion nicht. Die sollte auch schon gar nicht von irgendwelchen normalen Funktionen zum Umrechnen von Einheiten verwendet werden.

Bei der Namenswahl sollte man sich für *eine* Sprache entscheiden und nicht für Denglisch.
»I'm not going to ride on a magic carpet!« he hissed.
»I'm afraid of grounds!«
»You mean heights,« said Conina. »And stop being silly.«
»I know what I mean! It's the grounds that kill you!« — Terry Pratchett, Sourcery
jstn99
User
Beiträge: 4
Registriert: Donnerstag 24. Januar 2019, 11:06

Samstag 26. Januar 2019, 11:52

Hab es jetzt überarbeitet, sodass es ein Ergebnis ausgibt. Mein Problem ist nur...
1. die Form der Ausgabe... Mein Ergebnis wird z.B. so ausgegeben: (22.369362920544, 'mph') mph, allerdings möchte ich diese Form: 22.369362920544 mph. Wenn ich den print-Befehl oben umschreiben funktioniert das Programm nicht mehr... Wie kann ich das Problem lösen?
2. Ich würde gerne schon Fehler bei der Eingabe abfangen, und den Benutzer diese nochmal eingeben lassen. Z.B. sollte man bei der Fließzahl "," abfangen oder Zahl und Einheit ohne Leerzeichen eingeben können...
Benutzeravatar
__blackjack__
User
Beiträge: 2270
Registriert: Samstag 2. Juni 2018, 10:21

Samstag 26. Januar 2019, 13:28

@jstn99: Ad 1.: Lass Dir mal den Typ Deines Ergebnisses ausgeben (`type()` und `print()` sind da hilfreich). Ich wette das ist ein `tuple`. Zwei Lösungsvarianten: Erstelle kein Tupel, oder schreib den Code so das nicht das Tupel als ein Wert ausgegeben wird, sondern beide Komponenten einzeln/nacheinander.

Ad 2.: Ja dann mach doch. Schreib eine Funktion die solange in einer ”Endlosschleife” den Benutzer nach einer Eingabe fragt bis Du mit der zufrieden bist, also das die in eine Gleitkommazahl umgewandelte Eingabe zurückgegeben wird. Hilfreich hier: ``try``/``except``/``else``.
»I'm not going to ride on a magic carpet!« he hissed.
»I'm afraid of grounds!«
»You mean heights,« said Conina. »And stop being silly.«
»I know what I mean! It's the grounds that kill you!« — Terry Pratchett, Sourcery
jstn99
User
Beiträge: 4
Registriert: Donnerstag 24. Januar 2019, 11:06

Samstag 26. Januar 2019, 13:40

@__blackjack__
1. Danke das Problem hab ich gelöst!
2. Ja soweit bin ich auch, aber kann das auch so schreiben, dasss man integer oder floats eingeben kann? Also, sodass ich Kommas abfangen kann oder fehlende Leerzeichen?
__deets__
User
Beiträge: 4539
Registriert: Mittwoch 14. Oktober 2015, 14:29

Samstag 26. Januar 2019, 14:00

Warum willst du integer und floats? Floats sind (Im weißesten sinne) eine Obermenge der ganzen Zahlen. Benutzt einfach immer floats. Die muss man ja nicht mit Punkt und nachkommastellen eingeben. Und wenn die Eingabe ungültig ist, bekommst du einen ValueError. Den kannst du anfangen und um erneute eingabe bitten.
Benutzeravatar
__blackjack__
User
Beiträge: 2270
Registriert: Samstag 2. Juni 2018, 10:21

Samstag 26. Januar 2019, 14:20

@jstn99: Ad 2.: Ja das kann man so schreiben. Muss man halt tun und es sind ein paar Zeilen. Du musst Dir wie immer beim Programmieren, überlegen was Du hast an Werten und an Operationen und Funktionen/Methoden und wie man dann Schritt für Schritt dem näher kommt was man haben will. Dabei das Problem immer wieder in Teilprobleme zerlegen, und die dann auch wieder, solange bis die so klein sind, das man sie mit ein paar Zeilen Code lösen kann. Das tun, und testen, und dann mit dem nächsten Teilproblem weitermachen. Bis irgendwann das gesamte Problem gelöst ist.

Teilprobleme kann man auch mit einer selbst geschriebenen Funktion lösen. Am Anfang auch gerne mal ”zu viele” kleine Funktionen. Die lassen sich dann einfacher isoliert testen. ”Inlinen” kann man die später, wenn alles funktioniert dann immer noch, wenn es einem zu kleinteilig aussieht. Die Richtung ist einfacher als an einem immer grösser werdenden Codestück zu verzweifeln was Fehler enthält die man einfach nicht findet/loswird oder wo die Beseitigung von einem Problem zu einem anderen an anderer Stelle führt.
»I'm not going to ride on a magic carpet!« he hissed.
»I'm afraid of grounds!«
»You mean heights,« said Conina. »And stop being silly.«
»I know what I mean! It's the grounds that kill you!« — Terry Pratchett, Sourcery
jstn99
User
Beiträge: 4
Registriert: Donnerstag 24. Januar 2019, 11:06

Samstag 26. Januar 2019, 18:09

@__blackjack__ so ganz will es einfach nicht klappen... Da ja in meiner Eingabe auch Einheiten in Form von strings mit eingegeben werden müssen. Hast du eine Idee wie ich das Problem lösen kann? Es müssen nämlich Zahlen und Einheiten eingegeben werden können.
__deets__
User
Beiträge: 4539
Registriert: Mittwoch 14. Oktober 2015, 14:29

Samstag 26. Januar 2019, 18:18

Dazu kannst du reguläre Ausdrücke benutzen, welche dir den String in einen zahl-Anteil und die Einheit zerlegen.
Benutzeravatar
__blackjack__
User
Beiträge: 2270
Registriert: Samstag 2. Juni 2018, 10:21

Samstag 26. Januar 2019, 18:25

@jstn99: Habe ich doch schon geschrieben: Das Problem in Teilprobleme zerlegen. Also erst die Eingabe in drei Teile zerlegen. Wenn das nicht geht weil es mehr oder weniger sind hat der Schritt nicht geklappt und der Benutzer wird da drüber informiert. Falls das klappt musst Du einen Teil in eine Zahl umwandeln, und die beiden anderen auf gültige Einheiten prüfen, klappt davon was nicht, Benutzer informieren.

Mit regulären Ausdrücken geht das zwar auch, aber ich denke das macht hier unnötigerweise eine weitere komplexe Baustelle mit einer zusätzlichen Sprache auf.
»I'm not going to ride on a magic carpet!« he hissed.
»I'm afraid of grounds!«
»You mean heights,« said Conina. »And stop being silly.«
»I know what I mean! It's the grounds that kill you!« — Terry Pratchett, Sourcery
Antworten