Hallo, ich habe ein Problem bei einem Programm, was dir die Seitenlängen und Winkel im Dreieck ausrechnen soll. Wenn ich am Anfang a=3, b=4 und c=5 und bei dem Rest 0 eingebe, passiert nichts mehr.
import math
sin = math.sin
print("Gib die gegebenen Werte deines Dreiecks an. Die gesuchten werden als 0 eigetippt.")
a = float(input("a: "))
b = float(input("b: "))
c = float(input("c: "))
wa = float(input("Winkel bei A: "))
wb = float(input("Winkel bei B: "))
wc = float(input("Winkel bei C: "))
while a*b*c*wa*wb*wc == 0:
if wa != 0:
swa = math.sin(math.radians(wa))
if wb != 0:
swb = math.sin(math.radians(wb))
if wc != 0:
swc = math.sin(math.radians(wc))
if wa != 0:
if wb !=0:
if wc == 0:
wc = 180 - wa - wb
elif wb == 0:
if wc != 0:
wb = 180 - wc - wa
if wa == 0:
if wb * wc != 0:
wa = 180 - wb - wc
#a mit b
if a == 0:
if wa * b * wb != 0:
a = (swa * b)/swb
#a mit c
if wa * c * wc != 0:
a = (swa * c)/swc
#b mit a
if b == 0:
if wb * a * wa != 0:
b = (swb * a)/swa
#b mit c
if wb * c * wc != 0:
b = (swb * c)/swc
#c mit a
if c == 0:
if wa * a * wb != 0:
b = (swb * a)/swa
#b mit c
if wb * c * wc != 0:
b = (swc * b)/swb
#wa mit b
if wa == 0:
if wb * a * b != 0:
swa = 1 / (b * (swb * a))
#wa mit c
if wc * a * c != 0:
swa = 1 / (c * (swc * a))
#wb mit c
if wb == 0:
if wc * b * c != 0:
swb = 1 / (c * (swc * b))
#wb mit a
if wa * a * b != 0:
swb = 1 / (a * (swa * b))
#wc mit b
if wc == 0:
if wb * c * b != 0:
swa = 1 / (b * (swb * c))
#wc mit a
if wa * a * c != 0:
swc = 1 / (a * (swa * c))
if wa != 0:
wa = math.degrees(math.asin(swa))
if wb != 0:
wb = math.degrees(math.asin(swb))
if wc != 0:
wc = math.degrees(math.asin(swc))
if a * b * c != 0:
cwa = (b*b + c*c - a*a)/(2 * b * c)
wa = math.degrees(math.acos(cwa))
else:
print("a =",a)
print("b =",b)
print("c =",c)
print("Alpha =",wa,"Grad")
print("Beta =",wb,"Grad")
print("Gamma =",wc,"Grad")
Programm hängt fest in while-Schleife
Und wenn man jetzt noch Code-Tags benutzt, kriegt man: Spaghetti. Hatte ich gestern übrigens zum Mittag.
Domingo hat geschrieben: ↑Mittwoch 17. Januar 2024, 18:40Code: Alles auswählen
import math sin = math.sin print("Gib die gegebenen Werte deines Dreiecks an. Die gesuchten werden als 0 eigetippt.") a = float(input("a: ")) b = float(input("b: ")) c = float(input("c: ")) wa = float(input("Winkel bei A: ")) wb = float(input("Winkel bei B: ")) wc = float(input("Winkel bei C: ")) while a*b*c*wa*wb*wc == 0: if wa != 0: swa = math.sin(math.radians(wa)) if wb != 0: swb = math.sin(math.radians(wb)) if wc != 0: swc = math.sin(math.radians(wc)) if wa != 0: if wb !=0: if wc == 0: wc = 180 - wa - wb elif wb == 0: if wc != 0: wb = 180 - wc - wa if wa == 0: if wb * wc != 0: wa = 180 - wb - wc #a mit b if a == 0: if wa * b * wb != 0: a = (swa * b)/swb #a mit c if wa * c * wc != 0: a = (swa * c)/swc #b mit a if b == 0: if wb * a * wa != 0: b = (swb * a)/swa #b mit c if wb * c * wc != 0: b = (swb * c)/swc #c mit a if c == 0: if wa * a * wb != 0: b = (swb * a)/swa #b mit c if wb * c * wc != 0: b = (swc * b)/swb #wa mit b if wa == 0: if wb * a * b != 0: swa = 1 / (b * (swb * a)) #wa mit c if wc * a * c != 0: swa = 1 / (c * (swc * a)) #wb mit c if wb == 0: if wc * b * c != 0: swb = 1 / (c * (swc * b)) #wb mit a if wa * a * b != 0: swb = 1 / (a * (swa * b)) #wc mit b if wc == 0: if wb * c * b != 0: swa = 1 / (b * (swb * c)) #wc mit a if wa * a * c != 0: swc = 1 / (a * (swa * c)) if wa != 0: wa = math.degrees(math.asin(swa)) if wb != 0: wb = math.degrees(math.asin(swb)) if wc != 0: wc = math.degrees(math.asin(swc)) if a * b * c != 0: cwa = (b*b + c*c - a*a)/(2 * b * c) wa = math.degrees(math.acos(cwa)) else: print("a =",a) print("b =",b) print("c =",c) print("Alpha =",wa,"Grad") print("Beta =",wb,"Grad") print("Gamma =",wc,"Grad")
Deine Schleife hat als Bedingung:
while a*b*c*wa*wb*wc == 0:
Dann lass dir doch mal in jedem Durchlauf den aktuellen Wert der 6 Variablen ausgeben, dann kannst du sehen, welche davon 0 bleibt. Anschließend musst du rausfinden, wieso das so ist.
while a*b*c*wa*wb*wc == 0:
Dann lass dir doch mal in jedem Durchlauf den aktuellen Wert der 6 Variablen ausgeben, dann kannst du sehen, welche davon 0 bleibt. Anschließend musst du rausfinden, wieso das so ist.
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
- __blackjack__
- User
- Beiträge: 13117
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@Domingo: Die Zuweisung ``sin = math.sin`` würde man als ``from math import sin`` ausdrücken, aber `sin` wird im Code gar nicht benutzt.
Das ``else`` zur ``while``-Schleife macht keinen Sinn wenn da nicht irgendwo auch ein ``break`` drin steht.
Wenn man in einem ``if`` oder ``elif`` genau das Gegenteil von dem ``if`` davor prüft, sollte man schauen ob das nicht einfach ein ``else`` sein sollte.
Das ``else`` zur ``while``-Schleife macht keinen Sinn wenn da nicht irgendwo auch ein ``break`` drin steht.
Wenn man in einem ``if`` oder ``elif`` genau das Gegenteil von dem ``if`` davor prüft, sollte man schauen ob das nicht einfach ein ``else`` sein sollte.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
@Kebap: mach ich mal, vllt. Krieg ichs dadurch gefixt.
@Blackjack: davor hat es auch nicht funktioniert und kannst du für else ein Beispiel geben? Und
@Snafu: Danke fürs überführen, ich kenne mich auf der Website nicht so aus
@Blackjack: davor hat es auch nicht funktioniert und kannst du für else ein Beispiel geben? Und
@Snafu: Danke fürs überführen, ich kenne mich auf der Website nicht so aus
- __blackjack__
- User
- Beiträge: 13117
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@Domingo: Ich weiss nicht was Du da jetzt für ein Beispiel haben willst. Das ``else`` zum ``while`` macht keinen Sinn. Das Beispiel wäre Code ohne den ``else``-Zweig. Die Ausgabe vom Ergebnis soll ja in jedem Fall passieren und nicht abhängig von irgendeiner Bedingung.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
`sin` wird definiert, aber nie benutzt.
Wenn die elif-Bedingung genau dem Gegenteil der if-Bedingung entspricht, benutzt man else, dann sieht man das auch sofort, andern falls überlegt sich der Leser, was denn passiert, wenn keine der beiden Bedingungen erfüllt sind.
Bei deinen Verschachtelten if-Anweisungen versuchst Du ja Werte die 0 sind, durch den richtigen Wert im Dreieck zu ersetzen. Aber da das so viele sind, ist es schwierig, herauszufinden, ob alle Bedingungen komplett sind. Bei c == 0 hast Du z.B. eine Copy-Paste-Fehler. Und bei wc == 0 auch.
Und dann fehlt noch die Prüfung, ob es überhaupt möglich ist, alles zu berechnen, wenn wa == 0 und a == 0, dann geht das nicht, und Du landest in einer Endlosschleife. Und auch wenn keine Seiten gegeben sind, oder die falsche Kombination an Seiten und Winkeln.
Der erste Schritt wäre also, erst prüfen, ob es möglich ist, und dann anfangen zu rechnen.
Mit ein paar Funktionen sparst Du Dir das hinschreiben der immer wieder gleichen Formeln:
Wenn die elif-Bedingung genau dem Gegenteil der if-Bedingung entspricht, benutzt man else, dann sieht man das auch sofort, andern falls überlegt sich der Leser, was denn passiert, wenn keine der beiden Bedingungen erfüllt sind.
Bei deinen Verschachtelten if-Anweisungen versuchst Du ja Werte die 0 sind, durch den richtigen Wert im Dreieck zu ersetzen. Aber da das so viele sind, ist es schwierig, herauszufinden, ob alle Bedingungen komplett sind. Bei c == 0 hast Du z.B. eine Copy-Paste-Fehler. Und bei wc == 0 auch.
Und dann fehlt noch die Prüfung, ob es überhaupt möglich ist, alles zu berechnen, wenn wa == 0 und a == 0, dann geht das nicht, und Du landest in einer Endlosschleife. Und auch wenn keine Seiten gegeben sind, oder die falsche Kombination an Seiten und Winkeln.
Der erste Schritt wäre also, erst prüfen, ob es möglich ist, und dann anfangen zu rechnen.
Mit ein paar Funktionen sparst Du Dir das hinschreiben der immer wieder gleichen Formeln:
Code: Alles auswählen
def calculate_angle(side1, side2, angle2, side3, angle3):
if angle2 != 0 and angle3 != 0:
return 180 - angle2 - angle3
elif side1 == 0:
raise RuntimeError("cannot determine angle if side is 0")
elif side2 != 0 and angle2 != 0:
side, angle = side2, angle2
elif side3 != 0 and angle3 != 0:
side, angle = side3, angle3
else:
# cannot determine angle yet
return 0
sin_angle = math.sin(math.radians(angle))
result = 1 / (side * sin_angle * side1)
return math.degrees(math.asin(result))
def calculate_side(angle1, side2, angle2, side3, angle3):
if angle1 == 0:
raise RuntimeError("cannot determine side if angle is 0")
elif side2 != 0 and angle2 != 0:
side, angle = side2, angle2
elif side3 != 0 and angle3 != 0:
side, angle = side3, angle3
sin_angle1 = math.sin(math.radians(angle1))
sin_angle = math.sin(math.radians(angle))
return side * sin_angle1 / sin_angle
if wa == 0:
wa = calculate_angle(a, b, wb, c, wc)
if wb == 0:
wb = calculate_angle(b, a, wa, c, wc)
if wc == 0:
wc = calculate_angle(c, a, wa, b, wb)
if a == 0:
a = calculate_side(wa, b, wb, c, wc)
if b == 0:
b = calculate_side(wb, a, wa, c, wc)
if c == 0:
c = calculate_side(wc, a, wa, b, wb)