המשימה לפרק 3

תרגיל מסכם לפרקים 1 - 3

סיפור המסגרת :

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


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

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

דגשים :

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



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

program teach;
var alarm : integer;
mone : integer;
enter,leave : semaphore := init(1);


process teacher1;
begin
  wait(enter);
  writeln('teacher1 starts working');
  if alarm<>0 then alarm:=0;
  mone:=mone+1;
  signal(enter);
  delay(100);
  writeln('teacher1 is still working');
  delay(100);
  wait(leave);
  if mone=1 then alarm:=1;
  writeln('teacher1 stops working');
  mone:=mone-1;
  signal(leave);
end;

process teacher2;
begin
  wait(enter);
  writeln('teacher2 starts working');
  if alarm<>0 then alarm:=0;
  mone:=mone+1;
  signal(enter);
  delay(100);
  writeln('teacher2 is still working');
  delay(100);
  wait(leave);
  writeln('teacher2 stops working');
  if mone=1 then alarm:=1;
  mone:=mone-1;
  signal(leave);
end;

begin {MAIN}
  alarm := 1;
  mone := 0;
  parbegin
   teacher1; teacher2;
  parend;
end.




האם באופן כללי הפתרון נראה לכם נכון?

בהמשך המורה השתמש בפתרון זה לדף שאלות נוסף לתלמידים, ענו על השאלות.

חלק ג
שאלון דיון על התרגיל המסכם לפרקים 1 - 3.

קרא את הפתרון שהוצא על ידי התלמיד וצייר תרשים תלויות מתאים (עמוד 67 בחוברת) היעזר בתרשים לענות על השאלות הבאות:

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


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


לאחר שעניתם על שאלות המורה בתוך דף העבודה בחרו קריטריונים למתן ציון לתלמיד : 1. קריטריון ראשון : _______________________________________
2. קריטריון שני : _______________________________________
3. קריטריון שלישי : _______________________________________
4. קריטריון רביעי : _______________________________________


חלק ד


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



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

program school;
 var teach_num : integer;
 alarm : boolean;
 s : semaphore := init(1);

process teacher1;
begin
  teach_num:=teach_num+1;
  wait(s);
  if alarm then alarm:=false;
  signal(s);
 {#}
  writeln('teacher1 is working');
  writeln('teacher1 is leaving');
  teach_num:=teach_num-1;
  wait(s);
  if teach_num=0 then alarm:=true;
  signal(s);
end;

process teacher2;
begin
  teach_num:=teach_num+1;
  wait(s);
  if alarm then alarm:=false;
  signal(s);
 {#}
  writeln('teacher2 is working');
  writeln('teacher2 is leaving');
  teach_num:=teach_num-1;
  wait(s);
  if teach_num=0 then alarm:=true;
  signal(s);
end;

begin {MAIN}
  alarm := true;
  teach_num:=0;
  parbegin
   teacher1; teacher2;
  parend;
end.

האם תשובתכם לשאלה תשתנה אם התלמיד היה ממקם את ההוראה teach_num:=teach_num+1; בשורה {#} כלומר אחרי הבדיקה? כרגיל הסבירו תשובתכם.

אגב - התשובה כן צריכה להשתנות...