2 תשובות

בעיקרון, הקוד שכתבת מראה שיש לך הבנה בסיסית בחומר.

(אגב, עירבבת שם טאבים ורווחים ולכן פייתון יחטוף עליך את הג'ננה, שוב. אבל את זה הבטחתי לבדוק עבורך במסר פרטי)

עכשיו,

בואי נסתכל בשורה הזו:

aaa abs (num2) - abs (num1) = ans1 aaa

(תתעלמי מ-"aaa", זה רק כדי שהקוד כאן לא יתחרבש)

אנחנו רוצים שהמשתנה ans1 יכיל את תוצאת החישוב. אז הוא חייב לבוא *משמאל* לסימן ה"שווה", ככה:

aaa ans1 = abs (num2) - abs (num1) aaa

תמיד מה שמשמאל לסימן ה"שווה" יהיה שם של משתנה. זה נקרא "משפט הצבה": אנחנו מציבים למשתנה שמשמאל ל"שווה" את ערך הביטוי שמימין.

אבל החישוב שרשמת הוא לא נכון. את יודעת איך רושמים ערך מוחלט במתמטיקה: עם קווים אנכיים. בשפת המתמטיקה אנחנו רוצים להשיג את הדבר הבא:


aaa ans1 = | num2 - num1 | aaa

אז איך "מתרגמים" זאת לפייתון? ככה:

aaa ans1 = abs (num2 - num1) aaa

זהו.

בעקרון, עכשיו את כבר יודעת מספיק כדי לתקן את התוכנית שלך.

לטעמי, את מי שהמציא את המשימה הזו צריך לתלות כי זו משימה מעצבנת: אשר בקלות להתבלבל בין שמות המשתנים.

הבעיה היא שאחרי שתכתבי את הקוד, יהיה קצת קשה לברר אם הוא נכון כי יש שם הרבה משתנים עם שמות דומים. זה מבלבל. אז אני מציע שתפשטי את הקוד בצורה הבאה: תצרי שתי פונקציות, near ו-far, שבודקות אם שני מספרים הם קרובים או רחוקים. ואז לא תצטרכי ליצור משתנים כדי לאחסן ערכי ביניים ולא יהיה סיכון שתטעי באיות המשתנים.

הנה התוכנית המוכנה:

https://pastebin.com/e3jhpjbj

אני בטוח שתודי שקל יותר לקרוא את התוכנית כשהיא כתובה ככה ולראות שהיא מקיימת אחד לאחד את תנאי המשימה. שימי לב שהשתמשתי שם בסוגריים כדי לעטוף את הביטוי הענק. את מה שבתוך הסוגריים אנחנו יכולים לארגן על המסך כרצוננו כדי להפוך אותו לקריא.

אגב, במקום לעשות:

aaa if (condition): return true; else: return false aaa
אפשר פשוט לכתוב:

aaa return condition aaa


יש באג בקוד שלי (שהעליתי ל-pastebin). השורה הזו:

aaa far (n2,n1) and far (n2,n1) aaa

צריכה להיות:

aaa far (n2,n1) and far (n2,n3) aaa