ערכתי לאחרונה בתאריך 05.05.06 בשעה 19:24 בברכה, Phinox
בס"ד1. כשיישמת את הפונקציה, למה הגדרת בתוכה עוד שתי משתנים מסוג נקודה-צפה בשם a ו-b? הרי a ו-b הם הפרמטרים שהפונקציה מקבלת, לא? שתי משתנים זהים באותו בלוק של קוד... אני בספק אם המהדר ייפסח על זה ויריץ לך את התכנית בשקט.
2. תבין, נשמה - רק כשאתה מצהיר על הפוקנציה ומיישם אותה אתה מצרף לפרמטרים את הטיפוס שלהם! כדוגמה, בפונקציה הראשית שלך, במשתנה min, למה נתת לפונקציה check_min את הפרמטרים float a ו-float b? היא הרי אמורה לקבל את הפרמטרים a ו-b ולהשוות ביניהם, ולא בין הפרמטרים float a ו-float b... מבין? ברגע שאתה כותב תכנית כמו שכתבת, המהדר אוטומאטית רץ לך בכל התכנית ומחפש משתנים בשם float a ו-float b, ומנסה להעביר אותם כפרמטרים לפונקציה check_min. לא כך זה צריך להיות! אתה אמור להעביר לפונקציה את המשתנים a ו-b, שהם מטיפוס float, שמכילים בתוכם את הקלט שהמשתמש הכניס.
3. בוא ואני אסביר לך את העיקרון הכללי שעל-פיו עובד האלגוריתם לבעיה שהצגת. נניח ונתונים לנו שלושה מספרים שונים, b ,a ו-c. אם a>b, ו-b>c, אזי גם a>c. ההיפך גם הוא הנכון (ז"א, אם a<b, ו-b<c, אזי גם a<c). אותו הפסוק ניתן ליישום גם בקטע של שוויון. נניח ויש לנו שלושה גדלים. הראשון מבניהם שווה לשני, והשני מבניהם שווה לשלישי. משתי הנתונים הללו ניתן להסיק גם כי הראשון שווה לשלישי (אפשר גם להדגים זאת כך: אם אני בגובה שלך, ואתה בגובה שלו, אז גם אני בגובה שלו.) מה שאנחנו צריכים לעשות בתכנית שלנו זה לבצע, למעשה, שלושה בדיקות עקריות. האחת תבדוק איזה משתנה קטן יותר מבין הנתון הראשון והשני שהכניס המשתמש (ז"א, איזה משתנה קטן יותר, a או b). השנייה תבדוק איזה משתנה קטן יותר מבין הנתון השני והשלישי שהכניס המשתמש (ז"א, איזה משתנה קטן יותר, b או c). השלישית תבדוק, למעשה, איזו תוצאה קטנה יותר מבין תוצאות שתי הבדיקות שכרגע ערכנו. התכנית שלך, במידה והייתה עובדת, הייתה מבצעת אך ורק את השלב הראשון, ולא מייחסת כלל חשיבות לשלב השני ובוודאי שלא לשלישי. אם תרצה, תוכל להגדיר משתנה בשם bdika_rishona, שבו תאוחסן תוצאת הבדיקה הראשונה, ומשתנה בשם bdika_shnia, שבו תאוחסן תוצאת הבדיקה השנייה. לבסוף, תוכל להגדיר משתנה בשם bdkia_sofit, שבו תאוחסן תוצאת בדיקת ההשוואה בין המשתנים bdika_rishona ו-bdika_shnia, ולהשתמש בו להצגת תוצאת הבדיקה הסופית.
4. מבחינת ביצועים, זה לגמרי מיותר ליצור משתנים ולאחסן בהם את תוצאות הבדיקה. תוכל להעביר ישר את התוצאות לפונקציות הרצויות ע"י שימוש בפונקצית הבדיקה כפרמטר בפני עצמו. פונקציה שמחזירה ערך היא למעשה משתנה לכל דבר! לכן, בתכנית שלי, כדוגמה, במקום ליצור את המשתנים bdika_rishona/shnia/sofit הנ"ל, ישר העברתי את תוצאת הבדיקה הראשונה והשנייה כפרמטרים לפונקציה לבדיקה סופית, ואת תוצאת הבדיקה הסופית ישר העברתי לפונקציית הפלט, כדי שזאת בתורה תכתוב אותה על המסך.
מקווה שעזרתי ושהכל נהיה מעט מובן יותר!
אגב, אני שם לב, לפי שלל הטעויות הבסיסות שהתכנית שלך מציגה, שאתה באמת לא ממש שולט בקטע של כתיבת פונקציות, ההבנה של המבנה שלהן והדרך בה הן עובדות. אני ממש ממליץ ומבקש ממך לפתוח את ספר הלימוד שלך ולעבור, מההתחלה ועד הסוף, על הפרק שמסביר את הנושא. תוך כדי שאתה עושה זאת, עקוב אחרי כל משפט ומשפט שכתוב שם, הבן אותו, יישם את ה"תכניות לדוגמה" במחשב שלך, חקור, ראה מה מביא לטעויות ודע לענות גם מדוע. רק כך תצליח ותשיג שליטה מלאה בנושא.
בברכת שב"ש, אריה.
נ.ב: בגלל שאני מרגיש נדיב היום, הרשתי לעצמי לתקן לך את התכנית ולהעיר\להאיר לך בה בכל שורה. צפה בקישור המצ"ב, וקרא היטב את ההערות\הארות!
http://www.rafb.net/paste/results/5MT89O78.html
