Ein einfaches Programm aber es wird angemekert

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.
Antworten
Bombastino
User
Beiträge: 3
Registriert: Montag 21. Januar 2019, 01:09
Wohnort: Leipzig
Kontaktdaten:

Hallo,
ich bin bei der Programmierung von Python recht unerfahren und wollte ein einfaches Programm schreiben zum Thema Pendelgesetz. Leider gibt es einen Fehler den ich nicht verstehe.
Bitte seid so gut und helft mir.
Vielen Dank dafür
Christoph

import math
g=9.81
PI=3.1415
Weg = int(input("Was wollen Sie berechnen? Periodendauer=1 oder Pendellänge=2 : "))
if Weg == 2:
Wert=int(input("Periodendauer: "))
Ergebnis=(Wert^2*g/(4*(PI^2))

else: (Hier erscheint ein Error beim letzten e von else )
Wert=int(input("Pendellänge: "))
Ergebnis=((2 * PI) * math.sqr(Wert/g))


if Weg==2:
print ("Die Pendellänge beträgt: " + (Ergebnis * 100) + " Centimeter ")

else:
print("Die Periodendauer beträgt: "+ Ergebnis+ " Sekunden")
Benutzeravatar
sparrow
User
Beiträge: 4164
Registriert: Freitag 17. April 2009, 10:28

Bitte setze deine Code in Code-Tags. Die werden automatisch eingefügt, wenn du den </>-Button über dem Eingabefeld drückst.
Bitte zeigt auch die Fehlermeldung - und zwar komplett.
Danke.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@Bombastino: es wäre gut, wenn Du nicht nur sagen würdest, dass es einen Fehler gibt, sondern auch welcher und wo.
^ ist nicht Potenzieren, ** wäre korrekt. Zahlen und Strings kann man nicht addieren, Du willst an der Stelle Stringformatierung benutzen.
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Bombastino: Bei Syntaxfehlern meckert der Compiler oft nicht an der Stelle wo der eigentliche Fehler ist, sondern an der Stelle wo er das erste mal merkt, dass da etwas nicht stimmen kann. Der Fehler ist dann in der Regel irgend wo kurz *vor* der angemeckerten Stelle. In Deinem Fall solltest Du mal die öffnenden und die schliessenden Klammern in der Zeile davor zählen. Die Anzahl muss innerhalb eines Ausdrucks ja gleich sein, weil die immer paarweise auftreten.

Wobei man im konkreten Fall auch darüber nachdenken sollte welche Klammern tatsächlich *benötigt* werden. Komplette Ausdrücke noch mal extra zu Klammern macht keinen Sinn. Manchmal können eigentlich unnötige Klammern die Lesbarkeit erhöhen, oder sie sind nützlich wenn man einen langen Ausdruck auf mehrere Zeilen verteilen will oder muss, aber beides trifft hier nicht zu.

``^`` gibt übrigens keinen Syntaxfehler weil es diese Operator in Python tatsächlich gibt, allerdings ist das die Bitoperation “exklusive oder“-Verknüpfung.

Anstelle von Zeichenkettenformatierung bei der Ausgabe des Ergebnisses, kann man auch alle drei Teile als einzelne Argumente an `print()` übergeben.

Es gibt Konventionen für die Namensschreibweise an die man sich halten sollte. Alles ausser Konstanten (KOMPLETT_GROSS), und Klassen (MixedCase), wird klein_mit_unterstrichen benannt. `g` ist beispielsweise eine Konstante und sollte dementspechend gross geschrieben werden. Damit man da nicht mit der physikalischen Konstante „gross G“ durcheinander kommt, bietet es sich an nicht einfach einen einzelnen Buchstaben zu verwenden, sondern gleich einen Namen der diesen Wert beschreibt ohne das man in einer Formelsammlung nachschlagen muss.

Die Definition der Fallbeschleunigung könnte man dann noch mit einem Kommentar ergänzen welche physikalische Einheit der Wert hat, und dass es sich um den Wert für Deutschland handelt (1906 in Potsdam ermittelt, sagt Wikipedia).

Die Zahl π gibt es im `math`-Modul bereits, die braucht man sich nicht selbst definieren.

Um Gleichheitszeichen bei Zuweisungen (ausserhalb von Argumentlisten) und binäre Operatoren werden per Konvention Leerzeichen gesetzt, damit das leichter lesbar ist.

Wenn der Benutzer etwas anderes als 1 oder 2 eingibt bei der Frage was er denn berechnen möchte, geht der Code einfach davon aus das 1 gemeint war. Das ist nicht besonders robust. Solche Fälle sollte man auch immer prüfen und auch passend auf eine Fehleingabe reagieren. Und den Weg würde man auch eher nicht zweimal auswerten wollen. Du kannst die Ausgabe doch auch einfach als letzte Zeile mit in die erste Fallunterscheidung schreiben. Hier hat mich übrigens sehr verwirrt das erst 2 behandelt wird. Damit rechnet man nicht unbedingt.

Die Namen könnten dann auch besser gewählt werden. Statt `wert` und `ergebnis` möchte der Leser eher wissen was der `wert` und das `ergebnis` jeweils *bedeuten*. Beide werden ja jeweils zweimal im Code definiert, haben aber in beiden Fällen eine ganz andere Bedeutung. Und `weg` würde ich dann in `auswahl` umbenennen, den im Kontext von diesem Programm könnte sonst noch jemand auf die Idee kommen das `weg` als Strecke/Länge gemeint ist.

Dem Benutzer möchte man bei der Zahleneingabe auch mitteilen in welcher physikalischen Einheit seine Angabe sein muss.

Und warum ist die Eingabe von Pendellänge oder Periodendauer auf ganze Zahlen beschränkt?

Das ganze noch in eine Funktion verschoben sähe dann so aus (ungetestet):

Code: Alles auswählen

#!/usr/bin/env python3
import math
from math import pi as PI

FALLBESCHLEUNIGUNG = 9.81  # für Deutschland, in m/s.


def main():
    auswahl = int(
        input('Was wollen Sie berechnen?  Periodendauer=1 oder Pendellänge=2: ')
    )
    if auswahl == 1:
        pendellaenge = float(input('Pendellänge (in cm): '))
        periodendauer = 2 * PI * math.sqrt(pendellaenge / FALLBESCHLEUNIGUNG)
        print('Die Periodendauer beträgt:', periodendauer, 'Sekunden.')
    elif auswahl == 2:
        periodendauer = float(input('Periodendauer (in s): '))
        pendellaenge = (
            (periodendauer**2 * FALLBESCHLEUNIGUNG) / (4 * PI**2) * 100
        )
        print('Die Pendellänge beträgt:', pendellaenge, 'Zentimeter.')
    else:
        print('Ungültige Eingabe.')


if __name__ == '__main__':
    main()
Die Berechnung ist von Dir übernommen und wenn ich das richtig sehe enthält die noch einen kleinen Fehler. ;-)
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@__blackjack__: Einheitenumrechnung sind so eine Sache. Würde ich auf jeden Fall mit einem Kommentar versehen, warum hier plötzlich irgendwelche Zehnerpotenzen auftauchen. Liegt vielleicht an Deiner Interpretation des Inputs ;-)
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Sirius3: Ich bin verwirrt. Aber das ist ja auch Mathe, das hat mich schon immer etwas verwirrt. Du meinst sicher das die Pendellänge bei `auswahl` 1 in Metern und nicht Zentimetern angegeben werden muss, das muss man im Text bei `input()` natürlich ändern. :oops:
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Bombastino
User
Beiträge: 3
Registriert: Montag 21. Januar 2019, 01:09
Wohnort: Leipzig
Kontaktdaten:

Hallo Ihr netten Helfer,
da habe ich das Programm auch gleich mal ausprobiert. Läuft super. Da kriege ich ja direkt wieder Lust zu programmieren. Aber die Aufgaben die ich vorhabe sind so groß dass ich in 100 Jahren noch nicht so weit bin alles zu können. Also nehme ich die vorhandenen Programme und steuere meinen Roboter oder die anderen CNC Maschinen. Aber es wird nichts schaden mich in den Anfängen mit Python vertraut zu machen. Bei solchen netten Helfern, die mit gleich das komplett Programm schreiben. Das bin ich nicht gewöhnt. Im RoboterForum haben sie mir gleich abgeraten mich mit dem Gerät zu beschäftigen. Also danke nochmal gerne komme ich hier hin zurück.Viele Grüße Christoph
Antworten