Programm hängt fest in while-Schleife

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
Domingo
User
Beiträge: 3
Registriert: Mittwoch 17. Januar 2024, 18:33

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")
Benutzeravatar
snafu
User
Beiträge: 6744
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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:40

Code: 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")
Benutzeravatar
Kebap
User
Beiträge: 687
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

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.
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.
Benutzeravatar
__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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Domingo
User
Beiträge: 3
Registriert: Mittwoch 17. Januar 2024, 18:33

@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
Benutzeravatar
__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
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

`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:

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)
Domingo
User
Beiträge: 3
Registriert: Mittwoch 17. Januar 2024, 18:33

Ich habe nun den Fehler gefunden: das Programm rechnet den Sinus nicht zurück. Lieben Dank an alle, die mi geholfen haben.
Antworten