בכיתה
1. ברור לגבי שאלות על ש.ב עד לתרגיל פלינדרום (לא כולל).
2. פתרון משותף של תר' 13: "סדרה חשבונית? **" בעמ' 71.
3. מהי "שגיאה תחבירית" - "Syntax error".
4. מהי "שגיאת זמן ריצה" - "Runtime error".
5. דוגמה לתיקון טעות מסוג "שגיאת זמן ריצה"
לדוגמה: ידוע שחלוקה ב- 0 אינה מוגדרת.
במקרה בו מתבצעת חלוקה, וערך המכנה נקבע על-ידי המשתמש, אזי לפני ביצוע חישוב תוצאת החלוקה,
יש לבצע בדיקת תקינות הקלט - שהוא לא שווה ל- 0.
לדוגמה: ידוע שחלוקה ב- 0 אינה מוגדרת.
במקרה בו מתבצעת חלוקה, וערך המכנה נקבע על-ידי המשתמש, אזי לפני ביצוע חישוב תוצאת החלוקה,
יש לבצע בדיקת תקינות הקלט - שהוא לא שווה ל- 0.
הערה1 - שגיאה תחבירית / Syntax Error
אם המתכנת היה כותב ...console במקום ...Console, זאת שגיאה תחבירית, ויופיע קו אדום.
אם המתכנת היה כותב ;(C.W(100/0 לא ניתן היה לבצע הרצה של התוכנית.
היה מופיע קו אדום מתחת לביטוי החלוקה ב- 0, כיוון שהקומפיילר של #C מזהה שגיאה תחבירית
("Syntax Error"). הקומפיילר יודע שאסור לחלק ב- 0.
היה מופיע קו אדום מתחת לביטוי החלוקה ב- 0, כיוון שהקומפיילר של #C מזהה שגיאה תחבירית
("Syntax Error"). הקומפיילר יודע שאסור לחלק ב- 0.
כאשר המתכנת יציב את העכבר מעל לקו האדום, תופיע ההודעה: "Devision by constant zero".
על המתכנת לתקן השגיאה על-ידי כך שיחליף את ה- 0 במשהו אחר או יוותר על החישוב שמכיל חלוקה ב- 0.
הערה2 - שגיאת זמן ריצה
לעיתים מתבצעת בתוכנית חלוקה ב- 0, אך לא תקבלו על כך התראה של שגיאה תחבירית.
לעיתים מתבצעת בתוכנית חלוקה ב- 0, אך לא תקבלו על כך התראה של שגיאה תחבירית.
מדוע?
כיוון שלא בוצעה בתוכנית חלוקה מפורשת ב- 0, אלא חלוקה במשתנה מספרי (כמו 100 לחלק ל- n)
מבחינת #C, אם בזמן ריצת התוכנית (לאחר לחיצה על Ctrl+F5) הוא מזהה חלוקה ב- 0,
כלומר הוא גילה שערכו של המשתנה n הוא 0, התוכנית תקרוס בפתאומיות ("תעופת התכנית").
כלומר הוא גילה שערכו של המשתנה n הוא 0, התוכנית תקרוס בפתאומיות ("תעופת התכנית").
שגיאה מסוג זה נקראת "שגיאת זמן ריצה", כיוון שהיא מתרחשת רק לאחר שמריצים את התוכנית.
לפני הרצת התוכנית, לא הופיעה כל שגיאה. לא ראינו קו אדום, ולכן הרצנו את התכנית, והיא אכן רצה.
עד ש... היא הגיעה לשורה בה מתבצעת חלוקה ב- 0, ואז התבצעה "תעופה".
ראינו שגיאה (Exception) בשם "DivideByZeroException".
הערה3 - איך מוודאים שהמשתמש לא הקליד למכנה n את הערך 0?
במקרה זה, מיד לאחר קליטת הערך מהמשתמש, נבצע if הבודק אם הערך שונה מ- 0.
אם הוא שונה, נבצע את החישוב של 100 לחלק ל- n.
אם הוא שווה ל- 0, נדפיס הודעת שגיאה כמו "!Divided by zero is not permitted".
בדיקה זו שביצע המתכנת, נקראת "בדיקת תקינות הקלט".
הערה4 - מתי צריך ומתי לא צריך לבצע בדיקת תקינות לקלט?
בתרגילים בהם מבקשים שהתכנית תקלוט מספר דו-ספרתי או תלת-ספרתי וכו', אין צורך
שתבצעו בדיקת תקינות לקלט, ההנחה שלכם בעת ביצעו תרגילים תהיה שהמשתמש יקליד ערך לפי ההוראות,
אנו מתרגלים בסביבת ה- Console ("המסך השחור"), וזו סביבת תרגול ללימוד מקצועי, והמשתמשים
בתוכנית שלכם הם אתם או תלמידים אחרים או המורה, וכל אלה יקלידו ערך חוקי בהתאם להוראות שנתתם,
מה שיחסוך בכל פעם ביצוע של בדיקות תקינות, שאינן מהוות את "לב" התרגיל, או את מטרתו הלימודית.
מה שיחסוך בכל פעם ביצוע של בדיקות תקינות, שאינן מהוות את "לב" התרגיל, או את מטרתו הלימודית.
רק אם התבקשתם בשאלה כלשהי, באופן מפורש, לבצע בדיקת תקינות, אז אתם מחוייבים בה.
במקרה של סכנת חלוקה ב- 0, פשוט בקשו מהמשתמש " :Enter number, but not zero",
וזה יתקבל כפתרון תקין.
וזה יתקבל כפתרון תקין.
אם תרצו בכל זאת לשלב בדיקת תקינות היכן שלא התבקשתם, גם זה בסדר.
הערה5 - האם בכל זאת ניתן לחלק ב- 0?
בהקשרים מתמטיים מסוימים נוח להגדיר את תוצאת החילוק ב- 0,
ומותר למתכנת לבצע הגדרה כזאת בתכנית.
ומותר למתכנת לבצע הגדרה כזאת בתכנית.
לדוגמה, יתכן ובניסוח השאלה כתוב במפורש שאם יש חלוקה ב- 0,
אז התוצאה אמורה להיות 0.
במקרה כזה, המתכנת יכתוב תנאי שבו אם ערך המכנה הוא 0, אז התוצאה תהיה 0.
לסיכום: אצלנו במגמה, ההתייחסות לחלוקה ב- 0 תהיה כאלה משהו אסור ולא חוקי,
כמו התייחסות ברירת-המחדל של #C לנושא זה.
לבית
1. אין שיעורים ליום ה' הקרוב. מי שלא הכין את כל השיעורים להיום, ישלים הכל עד יום ה'.
2. קראו היטב הפוסט של היום והכינו שאלות עליו, אם לא תבינו משהו.
בשיעור הבא
1. בדיקת תרגילי סוכות בנושא תנאי מורכב.
2. ככל שנספיק, נלמד גם תנאי מקונן.