سؤال

أنا الآن أكتب برنامجًا سيحل نظرية فيثاغور. ومع ذلك ، لدي خطأ في البرنامج. كلما وضعت رقمًا سالبًا للطول A أو B ، فإنه يطبع "A لا يمكن أن يكون أقل من الصفر" ولكنه يمضي قدماً ويحل لـ C على أي حال ويطبع طول C على الرغم من أن المستخدم لم يدخل B بعد. كيف يمكنني تحقيق ذلك ، عندما يقوم المستخدم بإدخال رقم سالب ، فإنه يطبع العبارة "A لا يمكن أن يكون أقل من الصفر" ثم حلق مرة أخرى لإدخال طول للجانب ، بدلاً من كيفية طباعة بعد ذلك بيان أنه يعيد التوجيه إلى النهاية؟

ها هو رمزتي:

 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 + "."
هل كانت مفيدة؟

المحلول 2

حسنًا ، إذا كنت ترغب في التحقق باستمرار من المدخلات الخاصة بك ، فسيتعين عليك استخدام حلقة. كما هو الحال في ، يجب أن يكون psuedocode للخوارزمية:

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

يرجى ملاحظة أن الخوارزمية لديها يهرب على الأقل ذات مرة.

هذا هو في الأساس كيف psuedocode ينبغي يشبه. لذلك ، هذه حالة يمكنك من خلالها استخدام ملف do-while بنية حلقة. في بيثون ، لا يوجد شيء من هذا القبيل ، لذلك نحن محاكاة هو - هي:

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()

نصائح أخرى

لقد فاتتك مستوى Indentatino. جربه مثل هذا:

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 + "."

حاول تجنب استخدام المتداخلة if عند تصميم تدفق البرنامج. إنه يؤدي إلى هذا النوع من الأخطاء (في عداد المفقودين مستوى واحد من المسافة البادئة). قطع كبيرة من الكود في الداخل if الكتل والعديد من المتداخلة if الكتل تجعل البرنامج أكثر صعوبة في متابعته.

بدلاً من ذلك ، يمكنك أن تسأل مرة أخرى حتى يكون الإدخال صالحًا:

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"

نصيحة فريد جيدة ، لفها في وظيفة لإعادة الاستخدام:

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

ثم استخدام:

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,
)

إخلاء المسئولية: أنا أستخدم نسخة مختلفة من Python حتى تختلف الأميال

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)

الآن إذا نظرت إلى الكود A ، B هي 0 في البداية حتى تتمكن من تنفيذ الحلقات (وإلا فإنك تحصل على خطأ ، فإن المترجم المترجم لا يعرف عن A ، B حتى هذه النقطة). ثم يكرر العبارات التي تسأل عن A ، B على التوالي حتى تحصل على إدخال صالح (صالح بالمعنى العام ، لا نفعل أي خطأ في التحقق ، ماذا يحدث إذا كنت تستخدم سلسلة؟ بالتأكيد سألقي نظرة على مستندات Python وأرى ٪ D ٪ S وما إلى ذلك. ثم نمرر إرجاع الطريقة (انظر Def Py_theorem Up Top) إلى السلسلة مع وحدة. لاحظ أن الوظيفة تأخذ وسيطتين أ ، ب على التوالي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top