קשיים של תלמידים בעיצוב תכנה

אסתי אפלבוים

 

בין שמש למשתמש

 

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

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

 

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

להלן מספר דוגמאות:

א.      תלמידים נחשפים לטיפוס הנתונים "מחסנית" גם ברמה של הכרת אופן מימוש הפעולות השונות. כאשר הם נדרשים לכתוב תוכניות שבהן נעשה שימוש במחסנית הם משתמשים בשדה TOP.S כדי לקבל את מספר האיברים במחסנית. יש מקרים שבהם לאחר ביצוע הפעולה דחוף_למחסנית, הם מוסיפים את הפקודה  1+ TOP.S = TOP.S משום שהם לא משוכנעים שאכן זה מתבצע ע"י השגרה ביחידת הספריה.

ב.       התלמידים נחשפים לטיפוס הנתונים רשימה בד בבד עם ההכרות שהם עושים עם נושא ההקצאה הדינמית. גם כאן קורה בשלב כתיבת התוכנית המשתמשת ביחידת הספריה הם משתמשים גם בפעולות שקשורות למימוש, במקום להשתמש בפעולה המוגדרת ע"י השגרה. למשל, כותבים INFO.^P במקום להשתמש בפעולה אחזר_מרשימה,

או מבצעים התקדמות לאיבר הבא ע"י הפקודה NEXT.^P =: P במקום להשתמש בפעולה עוקב_ברשימה.

 

ערבוב התחומים בין שלב כתיבת היחידה המשמשת לבין שלב כתיבת התוכנית המשתמשת ביחידה מוזכר ברשימת הקשיים הבאה: 12 , 20 , 25 , 27 , 33 .

הקושי המייצג הוא מספר 27.

 

לדעתי, אחת הדרכים היעילות ביותר לפתרון הבעיה היא ע"י תרגול מעשי שבו התלמיד אכן נדרש לשנות את תפקידיו.

לדוגמא, בבחינת הבגרות בשנת תשנ"ו ניתנו שני שאלונים. שאלון לתלמידים שלמדו מבני נתונים ושאלון לתלמידים שלמדו עיצוב תוכנה.

 

בשאלה שניתנה בשאלון של עיצוב תוכנה מתואר טיפוס נתונים :

טיפוס הנתונים "תור_דו_ שלבי" (TWO-LEVEL-QUEUE) הוא טיפוס המורכב משני תורים. לפניך רשימת הפעולות שניתן לבצע על תור_דו_שלבי:

  1. אתחל_תור_דו_שלבי – פעולה המאתחלת תור_דו_שלבי.
  2. תור_דו_שלבי_ריק?(T) – פעולה המחזירה "אמת" אם התור_דו_שלבי T הוא ריק ו"שקר" אחרת.
  3. הכנס_לתור_דו_שלבי(T,x,y) – פעולה המקבלת תור_דו_שלבי T ומכניסה את האיבר x לתור הראשון או לתור השני על פי ערכו של y (ערכו של y הוא 1 או 2).
  4. הוצא_מתור_דו_שלבי(T) – פעולה המקבלת תור_דו_שלבי T ומחזירה את האיבר שהוציאה מ- T.

פעולת ההוצאה מתור_דו_שלבי מתבצעת באופן הבא: בודקים את התור הראשון. אם יש בו איברים, מוציאים איבר ממנו, אחרת- מוציאים איבר מהתור השני.

  1. ספור_איברים_בתור_דו_שלבי(T,y) – פעולה המקבלת תור_דו_שלבי T ומחזירה את מספר האיברים שיש בתור הראשון או את מספר האיברים שיש בתור השני על פי ערכו של y.

 

בשאלון שניתן לתלמידים שנבחנו בתוכנית מבני נתונים נתנה השאלה הבאה:

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

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

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

הערה: ניתן להשתמש בכל הפעולות המוגדרות על תור.

 

יש קשר ברור בין שתי השאלות וניתן לנצלן כעבודה במסגרת שעורי התרגול במעבדה.

 

שלב א' – בניית יחידת ספריה לטיפוס הנתונים "תור-דו-שלבי". התלמידים ישתמשו ביחידת ספריה מוכנה המטפלת בטיפוס הנתונים "תור", מבלי שהם יקבלו הסבר על אופן ייצוגו ומימוש הפעולות המוגדרות עליו. התלמידים ייחשפו לממשק בלבד.

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

שמו של טיפוס הנתונים וכותרות השגרות יהיו אחידים לכולם.

 

שלב ב' – כתיבת תוכנית המנהלת את "קופת הבריאים". תוכנית זו היא למעשה תוכנית הבדיקה של יחידת הספריה שנכתבה לתור_דו_שלבי ע"י התלמידים.

 

שלב ג' – התלמידים יריצו את  התוכנית תוך שימוש ביחידת ספריה שנכתבה ע"י תלמיד אחר.

 

תרגיל זה הוא תרגיל פשוט יחסית המאפשר לתלמידים לכתוב תחת "כובעים" שונים.

בשלב כתיבת יחידת הספריה התלמיד הוא "שמש" אך גם "משתמש" משום שעליו להיעזר ביחידת ספריה של תור שאינה מוכרת לו.

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

בשלב הרצת התוכנית עם יחידת ספריה של תלמיד אחר, התלמיד מתנסה בתפקיד ה"משתמש" שמכיר את "השמש" הכרות רופפת. (הוא מכיר אפשרות ייצוג שונה משלו, אך הוא לא כתב את יחידת הספריה בפועל).

 

הערה טכנית: מנסיוני, יש להעביר את הפרמטר מטיפוס תור ותור_דו_שלבי כפרמטר VAR.

 

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

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

 

לאתר המרכז הארצי

לאתר עיצוב תכנה

למאגר קשיים

חזרה