Frage

Ich schreibe derzeit ein Programm, das den pythagoräischen Theorem lösen wird. Ich habe jedoch einen Fehler im Programm. Immer wenn ich eine negative Zahl für die Länge A oder B einsehe, druckt es "A nicht weniger als Null" aus, löst aber trotzdem für C und löst die Länge von C, obwohl der Benutzer B noch nicht eingeben hat. Wie kann ich es so erstellen, wenn der Benutzer eine negative Zahl eingibt, druckt er die Anweisung "A nicht weniger als Null" aus und schleifen dann erneut, um eine Länge für die Seite einzugeben, anstatt wie es jetzt danach danach ist Aussage, es leitet zum Ende weiter?

Hier ist mein Code:

 import math
    print"This program will solve the pythagorean theorem for you"
    unit=raw_input('Enter the unit you will be using')
    a=float(raw_input('Enter the length of side a'))
    if a<=0:
      print"A cannot be less than zero"
    else:
        b=float(raw_input('Enter the length of side b'))
    if b<=0:
      print"B cannot be less than zero"
    else:
        c2=(a**2)+(b**2)
        c=math.sqrt(c2)
        c=str(c)
        print "The length of side C is: "+ c + " " + unit + "."
War es hilfreich?

Lösung 2

Wenn Sie Ihre Eingaben ständig überprüfen möchten, müssen Sie eine Schleife verwenden. Wie in, sollte der PSUDOCODE für den Algorithmus sein:

Loop Begin
Check the value of a and b
If a or b is less than 0 then ask for input again
Otherwise, continue

Bitte beachten Sie, dass der Algorithmus hat laufen wenigstens einmal.

Im Grunde genommen wie der PSUEDOCODE sollte aussehen. Dies ist also ein Fall, in dem Sie a verwenden können do-while Schleifenkonstrukt. In Python gibt es so etwas, also wir emulieren, nacheifern es:

import math


def take_in():
    a = raw_input("Enter the value of side a -> ")
    b = raw_input("Enter the value of side b -> ")

    # Trying to convert to a float
    try:
        a, b = float(a), float(b)
        # If successfully converted, then we return
        if a > 0 and b > 0:
            return a, b
    except ValueError:
        pass
    # If we cannot return, then we return false, with a nice comment

    print "Invalid input"
    return False


def main():
    # Calling the function at least once
    valid = take_in()

    # While we are not getting valid input, we keep calling the function
    while not valid:
        # Assigning the value to valid
        valid = take_in()

    # Breaking the return tuple into a and b
    a, b = valid
    print math.sqrt(a ** 2 + b ** 2)


if __name__ == '__main__':
    main()

Andere Tipps

Sie haben einen Indentatino -Level verpasst. Versuchen Sie es so:

if a<0:
  print"A cannot be less than zero"
else:
    b=raw_input('Enter the length of side b')
    b=float(b)
    if b<0:
        print"B cannot be less than zero"
    else:
        c2=(a**2)+(b**2)
        c=math.sqrt(c2)
        c=str(c)
        print "The length of side C is: "+ c + " " + unit + "."

Versuchen Sie, verschachtelt zu vermeiden if Beim Entwerfen des Programmflusses. Es führt zu dieser Art von Fehler (fehlt ein Eindringungsstufe). Große Codebrocken im Inneren if Blöcke und viele verschachtelt if Blöcke erschweren das Programm schwieriger zu befolgen und zu vermitteln.

Stattdessen können Sie noch einmal fragen, bis die Eingabe gültig ist:

a = -1
while a < 0:
    try:
        a=float(raw_input('Enter the length of side a'))
    except ValueError:
        pass
    if a<0:
        print "A cannot be less than zero"

Freds Rat ist gut, wickeln Sie ihn in eine Funktion zur Wiederverwendung ein:

def validate(initial, prompt, test, message, typecast=str):
    value = initial
    while not test(value):
        try:
            value = typecast(raw_input(prompt))
        except ValueError:
            print "Invalid value"
            continue

        if not test(value):
            print message
            continue

        return value

Dann benutze:

a = validate(
    initial = -1, 
    prompt = 'Enter the length of side A', 
    test = lambda x: x >= 0,
    message = "A cannot be less than zero",
    typecast = float
)
b = validate(
    initial = -1, 
    prompt = 'Enter the length of side B', 
    test = lambda x: x >= 0,
    message = "B cannot be less than zero",
    typecast = float,
)

Haftungsausschluss: Ich verwende eine andere Version von Python, sodass die Kilometerleistung variieren kann

import math

a = 0
b = 0

def py_theorem(a, b):
    return(a**2 + b**2)


unit = raw_input('Enter the unit you will be using: ')

while a <= 0:
a = float(raw_input('Enter the length of side A: '))
if a <= 0:
    print('A cannot be less than 0.')

while b <= 0:
b = float(raw_input('Enter the length of side B: '))
if b <= 0:
    print('B cannot be less than 0.')

print('The length of the 3rd side C is %d %s') % (py_theorem(a,b), unit)

Wenn Sie sich meinen Code A ansehen, sind B zunächst 0, sodass Sie die while -Loops ausführen können (ansonsten erhalten Sie einen Fehler, der Dolmetscher weiß nicht über a, b bis zu diesem Punkt). Dann wiederholt es die Aussagen, in denen A, B bzw. B gefragt wird, bis Sie gültige Eingaben erhalten (in allgemeinem Sinne gültig, wir machen keine Fehlerprüfung. Was passiert, wenn Sie eine Zeichenfolge verwenden? <>. <) Jetzt ist der Druck ein wenig funky. Ich würde auf jeden Fall die Python -Dokumente untersuchen und sehen, was %d %s usw. ist. Anschließend übergeben wir die Rückgabe der Methode (siehe das Def py_theorem oben) zusammen mit einer Einheit an die Zeichenfolge. Beachten Sie, dass die Funktion zwei Argumente A, B nimmt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top