מדעי המחשב ב`

‫מדעי המחשב‬
‫שאלון‪ - 899205 :‬תשע"ד ‪4112 -‬‬
‫עיצוב תכנה‬
‫‪1‬‬
‫מדעי המחשב ב'‬
‫פתרון בחינת הבגרות‬
‫פרק א ‪ -‬עיצוב תכנה‬
‫שאלה ‪1‬‬
‫א‪.‬‬
‫לא מאוזן‪:‬‬
‫הפרש ‪ 2‬בין‬
‫הבנים‬
‫‪X‬‬
‫לא מאוזן‪:‬‬
‫הפרש ‪ 2‬בין‬
‫הבנים‬
‫‪X‬‬
‫מאוזן‬
‫מאוזן‬
‫מאוזן‬
‫‪:Java‬‬
‫‪www.kadman.net‬‬
‫הילה קדמן‬
‫עיצוב תכנה‬
‫מדעי המחשב‬
4112 - ‫ תשע"ד‬- 899205 :‫שאלון‬
4
‫ נכתב ע"י ראמי ג'באלי‬- C# ‫פתרון‬
‫ נכתב ע"י דיתה אוהב ציון‬- ‫ בתנכית החדשה‬C# ‫פתרון‬
/// ‫פעולת עזר המחזירה את גובה העץ‬
/// <param name="t"> ‫<העץ לבדיקה‬/param>
/// <returns> ‫<מספר שלם‬/returns>
public static int High(BinNode<int> t)
{
if (t == null) return -1;
return 1+ Math.Max(High(t.GetLeft()),High(t.GetRight()));
}
/// ‫ אחרת תחזיר שקר‬,‫פעולה המקבלת עץ ומחזירה אמת אם הוא מאוזן‬
/// <param name="t"> ‫<העץ לבדיקה‬/param>
/// <returns>‫ שקר‬/ ‫<אמת‬/returns>
public static bool IsBalance(BinNode<int> t)
{
if (t == null) return true;
if (Math.Abs(High(t.GetLeft())-High(t.GetRight()))>1)
return false;
return IsBalance(t.GetLeft()) && IsBalance(t.GetRight());
}
‫הילה קדמן‬
www.kadman.net
‫מדעי המחשב‬
‫שאלון‪ - 899205 :‬תשע"ד ‪4112 -‬‬
‫שאלה ‪2‬‬
‫‪3‬‬
‫עיצוב תכנה‬
‫‪:Java‬‬
‫‪www.kadman.net‬‬
‫הילה קדמן‬
‫מדעי המחשב‬
‫שאלון‪ - 899205 :‬תשע"ד ‪4112 -‬‬
‫‪2‬‬
‫עיצוב תכנה‬
‫פתרון ‪ - C#‬נכתב ע"י ראמי ג'באלי‬
‫‪www.kadman.net‬‬
‫הילה קדמן‬
‫עיצוב תכנה‬
5
‫מדעי המחשב‬
4112 - ‫ תשע"ד‬- 899205 :‫שאלון‬
‫ נכתב ע"י דיתה אוהב ציון‬- ‫ בתנכית החדשה‬C# ‫פתרון‬
public class Collec
{
private Node<int> first; // ‫מאפיין המחלקה – הפניה לשרשרת חוליות‬
private int max;
//‫האיבר הגדול ביותר‬
.‫סעיף א‬
.‫סעיף ב‬
/// ‫בנאי היוצר אוסף ריק‬
public Collec()
{
this.first = null;
this.max = 0;
}
/// ‫בנאי המוסיף איבר לאוסף‬
/// 0-‫ המספר גדול מ‬-‫הנחה‬
/// <param name="n">‫ המספר להוספה‬- 0 -‫< מספר שלם גדול מ‬/param>
public Collec(int n)
{
if (this.first==null)
this.max = n;
// ‫האיבר הגדול הוא הראשון‬
this.first = new Node<int>(n);
}
.‫סעיף ג‬
/// ‫פעולה המוסיפה מספר לאוסף בתנאי שאין גדול ממנו באוסף‬
/// 0-‫ המספר גדול מ‬-‫הנחה‬
/// <param name="n">‫ המספר להוספה‬- 0 -‫<מספר שלם גדול מ‬/param>
/// <returns>.‫שקר אם הוסף האיבר‬/‫<אמת‬/returns>
public bool Add(int n)
{
if (n > max )
return false;
else
{
if (this.first == null)
this.first = new Node<int>(n);
else
this.first.SetNext(new Node<int>(n, first.GetNext()));
}
return true;
}
‫הילה קדמן‬
www.kadman.net
‫עיצוב תכנה‬
6
‫מדעי המחשב‬
4112 - ‫ תשע"ד‬- 899205 :‫שאלון‬
.‫סעיף ד‬
/// ‫פעולה המחזירה מהו המספר הקטן ביותר באוסף‬
/// <returns> ‫<מספר שלם‬/returns>
public int Small()
{
Node<int> pos = this.first;
int min = int.MaxValue;
while (pos != null)
{
if (pos.GetValue() < min)
min = pos.GetValue();
pos = pos.GetNext();
}
return min;
}
. ‫סעיף ה‬
/// ‫פעולה המקבלת אוסף ןמחזירה מהו המספר הקטן בין שני האוספים‬
/// <param name="c"></param>
/// <returns>‫ המספר הקטן ביותר באוספים‬-‫<מספר שלם‬/returns>
public int Smallest(Collec c)
{
return Math.Min(Small(), c.Small());
}
}
‫הילה קדמן‬
www.kadman.net
‫מדעי המחשב‬
‫שאלון‪ - 899205 :‬תשע"ד ‪4112 -‬‬
‫שאלה ‪3‬‬
‫‪7‬‬
‫עיצוב תכנה‬
‫‪: Java‬‬
‫בהנחה שבמחלקה ‪ School‬קיימת הפעולה הבאה‪( :‬שהיא פעולה הגיונית יותר מפעולה המחזירה הפניה למערך)‬
‫אתחול מערך החודשים‪:‬‬
‫הכנסת התלמידים למערך החודשים לפי חודש הלידה (בהיסט של ‪:)1‬‬
‫‪www.kadman.net‬‬
‫הילה קדמן‬
‫מדעי המחשב‬
‫שאלון‪ - 899205 :‬תשע"ד ‪4112 -‬‬
‫‪8‬‬
‫עיצוב תכנה‬
‫פתרון ‪ - C#‬נכתב ע"י ראמי ג'באלי‬
‫במחלקה ‪ School‬קיימת הפעולה הבאה‪ ,‬המחזירה הפניה למערך ביה"ס‪:‬‬
‫הכנסת התלמידים למערך החודשים לפי חודש הלידה‪:‬‬
‫‪www.kadman.net‬‬
‫הילה קדמן‬
‫עיצוב תכנה‬
9
‫מדעי המחשב‬
4112 - ‫ תשע"ד‬- 899205 :‫שאלון‬
‫ נכתב ע"י דיתה אוהב ציון‬- ‫ בתנכית החדשה‬C# ‫פתרון‬
public static Node<Student>[] AllBirthDay(School s)
{
int i, m;
Node<Student>[] all = new Node<Student>[12];//‫מערך התוצאות‬
for ( i = 0; i < all.Length; i++)
all[i] = null;
Node<Student>[] st = s.GetArr(); //‫קבלת מערך תלמידי בית הספר‬
for (i = 0; i < st.Length; i++) // ‫סריקת המערך‬
{
if (st[i] != null)
{
Node<Student> pos = st[i];
while (pos != null)
// ‫סריקת שרשרת החוליות‬
{
m = pos.GetValue().GetStMonth(); // ‫חודש הלידה של התלמיד‬
if (all[m-1] == null)
all[m-1] = new Node<Student>(pos.GetValue());// ‫הוספת התלמיד‬
else
all[m-1].SetNext(new Node<Student>(pos.GetValuue(), all[m-1].GetNext()));
pos = pos.GetNext();
}
}
}
return all;
}
‫הילה קדמן‬
www.kadman.net
‫מדעי המחשב‬
‫שאלון‪ - 899205 :‬תשע"ד ‪4112 -‬‬
‫עיצוב תכנה‬
‫‪11‬‬
‫שאלה ‪4‬‬
‫א‪.‬‬
‫] ‪lst: [ -2 , -9087 , 16 , -43 , 5‬‬
‫‪x≥0‬‬
‫‪lst‬‬
‫‪x‬‬
‫רשימה ריקה?‬
‫‪1 + _2_ = 3‬‬
‫לא‬
‫]‪[-2, -9087,16,-43,5‬‬
‫‪-2‬‬
‫לא‬
‫‪1 + _1_ = 2‬‬
‫לא‬
‫]‪[ -9087,16,-43,5‬‬
‫‪-9087‬‬
‫לא‬
‫__‪__1‬‬
‫כן‬
‫]‪[16,-43,5‬‬
‫‪16‬‬
‫לא‬
‫‪1 + _0__ = 1‬‬
‫לא‬
‫]‪[-43,5‬‬
‫‪-43‬‬
‫לא‬
‫_‪_0‬‬
‫כן‬
‫]‪[5‬‬
‫‪5‬‬
‫לא‬
‫ערך מוחזר‬
‫כן‬
‫][‬
‫(‪)1‬‬
‫ערך מוחזר ‪3 :‬‬
‫(‪)4‬‬
‫הפעולה סופרת ומחזירה את מספר האיברים השליליים ברשימה‬
‫(‪)3‬‬
‫)‪(i‬‬
‫הפעולה תספור את רצף האיברים השלילי שבתחילת הרשימה‪ ,‬עד האיבר הלא שלילי הראשון‪.‬‬
‫(אם בתחילת הרשימה יהיה איבר חיובי‪ ,‬תחזיר הרשימה ‪)1‬‬
‫)‪(ii‬‬
‫בסיום הפעולה תכיל הרשימה את כל האיברים שהיו בה ללא הרצף ההתחלתי של האיברים‬
‫השליליים וללא האיבר החיובי הראשון‪.‬‬
‫]‪[-43 , 5‬‬
‫בסיום הפעולה תכיל הרשימה הנתונה את האיברים הבאים‪:‬‬
‫ב‪.‬‬
‫] ‪s : [ 12 , 4 , 33 , 6 , 30 , 0‬‬
‫ערך מוחזר‬
‫‪x % 6 == 0‬‬
‫‪x‬‬
‫המחסנית ריקה?‬
‫‪s‬‬
‫‪12 + _36_ = 48‬‬
‫כן‬
‫‪12‬‬
‫לא‬
‫]‪[12,4,33,6,30,0‬‬
‫_‪_36‬‬
‫לא‬
‫‪2‬‬
‫לא‬
‫]‪[4,33,6,30,0‬‬
‫_‪_36‬‬
‫לא‬
‫‪33‬‬
‫לא‬
‫]‪[33,6,30,0‬‬
‫‪6 + _30_ = 36‬‬
‫כן‬
‫‪6‬‬
‫לא‬
‫]‪[6,30,0‬‬
‫‪30 + _0_ = 30‬‬
‫כן‬
‫‪31‬‬
‫לא‬
‫]‪[30,0‬‬
‫‪0 + _0_ = 0‬‬
‫כן‬
‫‪1‬‬
‫לא‬
‫]‪[0‬‬
‫כן‬
‫][‬
‫(‪)1‬‬
‫ערך מוחזר‪:‬‬
‫(‪)4‬‬
‫מצב המחסניות והתורים לפני זימון ‪ sod‬מתוך ‪:main‬‬
‫‪www.kadman.net‬‬
‫‪28‬‬
‫(סכום המספרים שבמחסנית‪ ,‬המתחלקים ב‪)6 -‬‬
‫הילה קדמן‬
‫מדעי המחשב‬
‫שאלון‪ - 899205 :‬תשע"ד ‪4112 -‬‬
‫‪11‬‬
‫] ‪s2: [ 1 , 36 , 23‬‬
‫בזימון לפעולה מכילים התורים‪:‬‬
‫‪x‬‬
‫עיצוב תכנה‬
‫] ‪s1 : [ 12 , 4 , 33 , 6 , 30 , 0‬‬
‫] [ ‪qr:‬‬
‫‪qm‬‬
‫] ]‪que: [ [s1] , [s2‬‬
‫‪qq‬‬
‫‪48‬‬
‫] ‪[ 48‬‬
‫] ]‪[ [12,4,33,6,30,0] , [1,36,23‬‬
‫‪36‬‬
‫] ‪[ 48 , 36‬‬
‫] ]‪[ [1,36,23‬‬
‫][‬
‫‪www.kadman.net‬‬
‫הילה קדמן‬
‫מדעי המחשב‬
‫שאלון‪ - 899205 :‬תשע"ד ‪4112 -‬‬
‫‪14‬‬
‫עיצוב תכנה‬
‫פתרון לפי התנכית החדשה ‪ -‬נכתב ע"י דיתה אוהב ציון‬
‫‪www.kadman.net‬‬
‫הילה קדמן‬
‫מדעי המחשב‬
‫שאלון‪ - 899205 :‬תשע"ד ‪4112 -‬‬
‫‪www.kadman.net‬‬
‫‪13‬‬
‫עיצוב תכנה‬
‫הילה קדמן‬
‫מדעי המחשב‬
‫שאלון‪ - 899205 :‬תשע"ד ‪4112 -‬‬
‫‪12‬‬
‫עיצוב תכנה‬
‫פרק ב'‬
‫מערכות מחשב ואסמבלר‬
‫הפתרון לפרק זה נכתב ע"י‪:‬‬
‫תרגיל ‪5‬‬
‫תרגיל ‪6‬‬
‫תרגיל ‪7‬‬
‫שאלה ‪8‬‬
‫‪www.kadman.net‬‬
‫הילה קדמן‬
‫מדעי המחשב‬
‫שאלון‪ - 899205 :‬תשע"ד ‪4112 -‬‬
‫‪15‬‬
‫עיצוב תכנה‬
‫פרק ב'‬
‫מבוא לחקר ביצועים‬
‫שאלה ‪9‬‬
‫שאלה ‪11‬‬
‫שאלה ‪11‬‬
‫שאלה ‪12‬‬
‫‪www.kadman.net‬‬
‫הילה קדמן‬
‫מדעי המחשב‬
‫שאלון‪ - 899205 :‬תשע"ד ‪4112 -‬‬
‫‪16‬‬
‫עיצוב תכנה‬
‫פרק ב'‬
‫מודלים חישוביים‬
‫הפתרון לפרק זה נכתב ע"י רחל לודמר‪.‬‬
‫תרגיל ‪13‬‬
‫‪www.kadman.net‬‬
‫הילה קדמן‬
‫מדעי המחשב‬
‫שאלון‪ - 899205 :‬תשע"ד ‪4112 -‬‬
‫‪17‬‬
‫עיצוב תכנה‬
‫שאלה ‪14‬‬
‫‪www.kadman.net‬‬
‫הילה קדמן‬
‫מדעי המחשב‬
‫שאלון‪ - 899205 :‬תשע"ד ‪4112 -‬‬
‫‪18‬‬
‫עיצוב תכנה‬
‫שאלה ‪15‬‬
‫‪www.kadman.net‬‬
‫הילה קדמן‬
‫מדעי המחשב‬
‫שאלון‪ - 899205 :‬תשע"ד ‪4112 -‬‬
‫‪19‬‬
‫עיצוב תכנה‬
‫שאלה ‪16‬‬
‫‪www.kadman.net‬‬
‫הילה קדמן‬
‫מדעי המחשב‬
‫שאלון‪ - 899205 :‬תשע"ד ‪4112 -‬‬
‫עיצוב תכנה‬
‫‪41‬‬
‫פרק ב'‬
‫תכנות מונחה עצמים ‪Java‬‬
‫הפתרון לפרק זה נכתב ע"י אביטל גרינולד ‪.EVI‬‬
‫תרגיל ‪17‬‬
‫א‪.‬‬
‫שאלת מעקב‪ ,‬ירושה ופולימורפיזם‪ ,‬זיהוי שגיאות תחביר וריצה‬
‫קטע ‪: i‬תקין‪ ,‬הפלט‪:‬‬
‫בבניה ‪//‬‬
‫זימון ראשון ‪//‬‬
‫זימון שני ‪//‬‬
‫המרה אינה משנה דבר‪//‬‬
‫‪A‬‬
‫‪One of A‬‬
‫‪One of A‬‬
‫קטע ‪ : ii‬שגוי‪ .‬שגיאת ריצה‪.‬‬
‫‪ a2‬נוצר מהמחלקה ‪. A‬‬
‫בשורה שנייה יש ניסיון להמיר אותו כלפי מטה לטיפוס מהמחלקה ‪. B‬‬
‫שגיאת ריצה‪ .‬המרות מתבצעות בזמן ריצה‪.‬‬
‫קטע ‪ : iii‬תקין‪ ,‬הפלט‪:‬‬
‫הפעלת בנאי ריק של ‪// A‬‬
‫המשך הבנאי של ‪// B‬‬
‫פולימורפיזם ‪//‬‬
‫העצם נוצר כ ‪//B‬‬
‫‪A‬‬
‫‪B‬‬
‫‪two of B‬‬
‫‪one of B‬‬
‫קטע ‪ : iv‬שגיאת תחביר‬
‫בשורה הראשונה יוצרים עצם מטיפוס ‪ A‬ומציבים אותו במשתנה שהוא הפנייה לעצם מטיפוס ‪. B‬‬
‫קטע ‪ : v‬תקין‪ ,‬הפלט‪:‬‬
‫קודם בניה של ‪// A‬‬
‫אח"כ בניה של ‪// B‬‬
‫‪A‬‬
‫‪B‬‬
‫קטע ‪ : iv‬שגיאת תחביר‬
‫בשורה הראשונה יוצרים עצם מטיפוס ‪ A‬ומציבים אותו במשתנה שהוא הפנייה לעצם מטיפוס ‪. B‬‬
‫אין התאמה בטיפוסים‪ A .‬הוא לא סוג של ‪.B‬‬
‫קטע ‪ :vii‬תקין‪ ,‬הפלט‬
‫קודם בניה של ‪// A‬‬
‫אח"כ בניה של ‪// B‬‬
‫פולימורפיזם‪ ,‬העצם נוצר כ ‪// B‬‬
‫‪www.kadman.net‬‬
‫‪A‬‬
‫‪B‬‬
‫‪one of B‬‬
‫הילה קדמן‬
‫מדעי המחשב‬
‫שאלון‪ - 899205 :‬תשע"ד ‪4112 -‬‬
‫ב‪.‬‬
‫‪41‬‬
‫עיצוב תכנה‬
‫השלמת הפעולות הבונות בהתאם לתרשים מעקב‬
‫פעולה בונה ריקה ‪//‬‬
‫)(‪public BBB‬‬
‫{‬
‫;)( ‪super‬‬
‫;‪this.a = null‬‬
‫}‬
‫פעולה בונה ריקה ‪//‬‬
‫)(‪public AAA‬‬
‫{‬
‫;‪this.n = 0‬‬
‫;‪this.x = 0‬‬
‫}‬
‫פעולה בונה על פי פרמטר לתכונה ‪//‬‬
‫)‪public BBB(AAA a‬‬
‫{‬
‫;)( ‪super‬‬
‫;‪this.a = a‬‬
‫}‬
‫פעולה בונה על פי כל התכונות ‪//‬‬
‫)‪public AAA (int n, double x‬‬
‫{‬
‫;‪this.n = n‬‬
‫;‪this.x = x‬‬
‫}‬
‫פעולה בונה על פי המספר השלם והטיפוס ‪//A‬‬
‫)‪public BBB (int n, AAA a‬‬
‫{‬
‫;)‪super (n, n‬‬
‫;‪this.a = a‬‬
‫}‬
‫פעולה בונה על פי כל התכונות ‪//‬‬
‫)‪public BBB(int n, double x, AAA a‬‬
‫{‬
‫;)‪super (n, x‬‬
‫;‪this.a = a‬‬
‫}‬
‫הערות‪:‬‬
‫(‪)1‬‬
‫(‪)4‬‬
‫(‪)3‬‬
‫חובה להוסיף את הפעולה הבונה הריקה מאחר והוספנו פעולות בונות עם פרמטרים ‪ ,‬לכן הפעולה הבונה‬
‫ברירת המחדל לא קיימת יותר ויש לכתוב אותה באופן מפורש‪.‬‬
‫בפעולות הבנות אפשר לכתוב מפורשות את ההשמה ואפשר להסתמך על ברירת המחדל שאי הצבת ערך‬
‫בתכונה שמה ערכי ‪ 1‬למשתנים פשוטים ו ‪ null‬לעצמים‪.‬‬
‫בפעולות הבונות במחלקה הבת ‪ , BBB‬אפשר לכתוב )(‪ super‬כאשר מזמנים את את בנאי מחלקת העל‬
‫הריק או לא‪ .‬בכל מקרה יזמן אותו בראש הפעולה הבונה‪.‬‬
‫‪www.kadman.net‬‬
‫הילה קדמן‬
‫עיצוב תכנה‬
44
‫מדעי המחשב‬
4112 - ‫ תשע"ד‬- 899205 :‫שאלון‬
18 ‫תרגיל‬
‫מעקב כולל תרשים עצמים‬
.‫ב‬
‫ מעקב ורשום פלט‬. ‫ירושה‬
.‫א‬
count = 0
AA
1) <AA> f1  num1 = 10
num2 = 10
:‫הפלט הוא‬
count = 1
1) AA ctor1
2) sum1 = 20
3) count = 1
4) <AA> f2 
AA
num1 = 10
num2 = 20
count = 2
4) AA ctor2
5) count = 2
BB
6) <BB> s1  num1 = 1
num2 = 1
num3 = 1
7) <AA> f3 
BB
num1 = 4
num2 = 2
num3 = 2
9) <AA> f2  BB
num1 = 1
<BB> s1  num2 = 1
num3 = 1
count = 3
6) AA ctor 1
BB ctor 1
count = 4
7) AA ctor1
BB ctor1
8) count = 4
10) sum = 3 // ‫פולי‬
***
C
C
C
CC
--C
CC
C
D
###
C
C
C
C
CC
C
D
C
D
C
D
C
D
new C(n) ‫כל‬
n ‫מדפיס‬
.C ‫פעמים‬
.CC ‫ובסוף‬
new D(n) ‫כל‬
‫מפעיל הבנאים‬
n ‫הריקים‬
‫ בכל פעם‬.‫פעמים‬
‫ ואחריו‬C ‫מודפס‬
D
12) sum = 4
13) sum = 4 // ‫פולי‬
:‫הפלט של סעיף ב‬
‫ יש לו הקצאה אחת‬.‫ הוא משתנה מחלקה‬count ‫ המשתנה‬:‫הערה‬
,1 ‫ גדל ב‬count ‫ ערכו של‬,‫ בכל פעם שנוצר עצם חדש‬.‫בזיכרון‬
. 2 ‫ וכך עד ל‬1 ‫ אח"כ‬, 1 ‫כלומר בהתחלה ערכו‬
.‫ פעמים‬2 ‫למען נוחות הכתיבה הוא מופיע‬
‫הילה קדמן‬
AA ctor1
sum1 = 20
count = 1
AA ctor2
count = 2
AA ctor1
BB ctor1
AA ctor1
BB ctor1
count = 4
sum = 3
sum = 4
sum = 4
www.kadman.net
‫מדעי המחשב‬
‫שאלון‪ - 899205 :‬תשע"ד ‪4112 -‬‬
‫עיצוב תכנה‬
‫‪43‬‬
‫תרגיל ‪19‬‬
‫א‪.‬‬
‫השלמת הטיפוס כך שיתאים להמשך הקוד ויעבור קומפילציה‪.‬‬
‫ב‪.‬‬
‫כתיבת פעולה‬
‫;)(‪Inter1 x = new A‬‬
‫;)(‪B y = new B‬‬
‫;)(‪Inter3 z = new C‬‬
‫ט‪.‬כ‪ :‬מערך מטיפוס הממשק ‪Inter1‬‬
‫ט‪.‬י‪ :‬הפעלת הפעולה ‪ g3‬לעצמים עבורם היא קיימת‪ ,‬אחרת תופעל ‪g1‬‬
‫‪//‬‬
‫‪//‬‬
‫)‪public static void doG (Inter1 [] a‬‬
‫{‬
‫)‪for (int k=0 ; k < a.length ; k++‬‬
‫{‬
‫)‪if (a[k] instanceof A‬‬
‫;)(‪((A)a[k]).g3‬‬
‫‪else‬‬
‫)‪if (a[k] instanceof C‬‬
‫;)(‪( (C)a[k]).g3‬‬
‫‪else‬‬
‫;)(‪( (B)a[k]).g1‬‬
‫}‬
‫}‬
‫‪www.kadman.net‬‬
‫הילה קדמן‬
‫עיצוב תכנה‬
42
‫מדעי המחשב‬
4112 - ‫ תשע"ד‬- 899205 :‫שאלון‬
CellPhone
21 ‫שאלה‬
.‫א‬
Type1
Type3
Type2
InterC (interface)
:‫הערה‬
‫ שלא נכתבה בשאלה מאחר ויש תכונות ופעולות שמשותפות לכל טיפוסי‬CellPhone ‫הוספתי מחלקה מופשטת‬
.‫מכשירי הטלפון הסלולריים‬
.‫המחלקה מופשטת מכיוון שלא יוצרים ממנה עצמים‬
.‫ב‬
public abstract class CellPhone
public static final double PRICE_MINUTE_CONVERSATION = 1; // ‫תעריף דקת שיחה‬
protected int minutes; // ‫מספר דקות שיחה‬
protected String phoneNumber; // ‫מספר טלפון‬
public CellPhone (String phoneNumber)
// ‫פעולה בונה טלפון על פי מספרו‬
public void dial (String phoneNumber, int minutes) // ‫חיוג למספר טלפון עם מספר דקות השיחה‬
public void recCall(String phoneNumber) // ‫קבלת שיחה ממספר טלפון‬
public void reset()
// ‫איפוס דקות השיחה‬
public class Type1 extends CellPhone
protected int numOfMessages; // ‫מספר הודעות‬
public Type1(String phoneNumber) // ‫ על פי מספר טלפון‬1 ‫בניית טלפון מסוג‬
public void senMsg(String phoneNumber) //‫שליחת מסרון למספר טלפון‬
public void recMsg(String phoneNumber) // ‫קבלת מסרון ממספר טלפון‬
public void reset() // ‫איפוס דקות שיחה ומספר ההודעות‬:‫דריסת הפעולה ממחלקת העל‬
public class Type2 extends Type1 implements InterC
public Type2 (String phoneNumber)
// ‫ על פי מספר טלפון‬4 ‫בניית טלפון מסוג‬
public void takePic(String pic)
// ‫צילום תמונה‬
public void showPic(String pic)
// ‫הצגת תמונה‬
‫הילה קדמן‬
www.kadman.net
‫מדעי המחשב‬
‫שאלון‪ - 899205 :‬תשע"ד ‪4112 -‬‬
‫עיצוב תכנה‬
‫‪45‬‬
‫‪public class Type3 extends CellPhone implements InterC‬‬
‫)‪public Type3 (String phoneNumber‬‬
‫בניית טלפון מסוג ‪ 3‬על פי מספר טלפון ‪//‬‬
‫)‪public void takePic (String pic‬‬
‫צילום תמונה ‪//‬‬
‫)‪public void showPic (String pic‬‬
‫הצגת תמונה ‪//‬‬
‫ג‪.‬‬
‫החזרה חשבון טלפון עדכני ‪//‬‬
‫במחלקה ‪CellPhone‬‬
‫)( ‪public double bill‬‬
‫}‬
‫;‪return this.minutes * CellPhone.PRICE_MINUTE_CONVERSATION‬‬
‫}‬
‫החזרה חשבון טלפון עדכני ‪//‬‬
‫במחלקה ‪Type1‬‬
‫)(‪public double bill‬‬
‫{‬
‫;‪return super.bill() + this.numOfMessages * Type1.PRICE_SMS‬‬
‫}‬
‫הסבר למבנה היררכית המחלקות והממשקים‪:‬‬
‫‪-1‬‬
‫מחלקה‬
‫‪CellPhon‬‬
‫‪e‬‬
‫‪-4‬‬
‫‪-3‬‬
‫‪-2‬‬
‫‪-5‬‬
‫‪-6‬‬
‫‪-7‬‬
‫אין אף טלפון שיש לו תכונות ופעולות המשותפות לשלושת‬
‫טיפוסי הטלפון‪ ,‬לכן‪ ,‬חייבים ליצור מחלקת על שתכלול את‬
‫הפעולות והתכונות המשותפות לכולם‪ .‬מכיוון שזו מחלקה‬
‫שלא יוצרים ממנה עצמים‪ ,‬היא צריכה להיות מופשטת‪.‬‬
‫מי שלא למד מחלקות מופשטות‪ ,‬יכול לעשות מחלקה "רגילה"‪.‬‬
‫התכונות המשותפות לכולם‪ :‬מספר דקות שיחה‪.‬‬
‫הפעולות המשותפות לכולם‪ :‬חיוג‪ ,‬קבלת שיחה‪,‬‬
‫איפוס ועריכת חשבון לתשלום‪.‬‬
‫מספר ההודעות והפעולות בטפול ההודעות משותפות למכשירים‬
‫מסוג ‪124‬‬
‫למכשיר ‪ 4‬יש פעולות נוספות על אלו שבמכשיר ‪ 4‬ולכן הוא‬
‫הרחבה של הטיפוס‪.‬‬
‫למכשיר ‪ 4‬ו ‪ 3‬פעולות משותפות המטפלות בתמונה‬
‫אבל אי אפשר ליצור היררכית ירושה ביניהם‬
‫ולכן המשותף בינהם הוא התפקוד‪.‬‬
‫למכשיר ‪ 3‬טיפול נוסף ייחודי עבורו‪ ,‬טיפול ביישומים‪.‬‬
‫ראה הטבלה הבאה‪:‬‬
‫‪www.kadman.net‬‬
‫טלפון ‪1‬‬
‫חיוג‬
‫קבלת שיחה‬
‫שליחת הודעה‬
‫קבלת הודעה‬
‫טלפון ‪2‬‬
‫חיוג‬
‫קבלת שיחה‬
‫שליחת הודעה‬
‫קבלת הודעה‬
‫צילום תמונה‬
‫הצגת תמונה‬
‫טלפון ‪3‬‬
‫חיוג‬
‫קבלת שיחה‬
‫צילום תמונה‬
‫הצגת תמונה‬
‫התקנת‬
‫אפליקציות‬
‫משותפות‬
‫איפוס‬
‫חשבון‬
‫דקות ש'(תכונה)‬
‫‪Group Type1‬‬
‫‪A‬‬
‫‪dial‬‬
‫‪recCall‬‬
‫‪B‬‬
‫‪sendMsg‬‬
‫‪recNsg‬‬
‫‪Type2‬‬
‫‪A‬‬
‫‪dial‬‬
‫‪recCall‬‬
‫‪B‬‬
‫‪sendMsg‬‬
‫‪recMsg‬‬
‫‪C‬‬
‫‪takePic‬‬
‫‪showPic‬‬
‫‪Type3‬‬
‫‪A‬‬
‫‪dial‬‬
‫‪recCall‬‬
‫‪C‬‬
‫‪takePic‬‬
‫‪showPic‬‬
‫‪D‬‬
‫‪installApp‬‬
‫‪Common‬‬
‫‪reset‬‬
‫‪bill‬‬
‫‪minutes‬‬
‫‪Com‬‬
‫הילה קדמן‬
‫מדעי המחשב‬
‫שאלון‪ - 899205 :‬תשע"ד ‪4112 -‬‬
‫עיצוב תכנה‬
‫‪46‬‬
‫פרק ב'‬
‫תכנות מונחה עצמים ‪C#‬‬
‫הפתרון לפרק זה נכתב ע"י אביטל גרינולד ‪ EVI‬ועקיבא לביא‬
‫תרגיל ‪21‬‬
‫א‪.‬‬
‫שאלת מעקב‪ ,‬ירושה ופולימורפיזם‪ ,‬זיהוי שגיאות תחביר וריצה‬
‫קטע ‪: i‬תקין‪ ,‬הפלט‪:‬‬
‫בבניה ‪//‬‬
‫זימון ראשון ‪//‬‬
‫זימון שני ‪//‬‬
‫המרה אינה משנה דבר‪//‬‬
‫‪A‬‬
‫‪One of A‬‬
‫‪One of A‬‬
‫קטע ‪ : ii‬שגוי‪ .‬שגיאת ריצה‪.‬‬
‫‪ a2‬נוצר מהמחלקה ‪. A‬‬
‫בשורה שנייה יש ניסיון להמיר אותו כלפי מטה לטיפוס מהמחלקה ‪. B‬‬
‫שגיאת ריצה‪ .‬המרות מתבצעות בזמן ריצה‪.‬‬
‫קטע ‪ : iii‬תקין‪ ,‬הפלט‪:‬‬
‫הפעלת בנאי ריק של ‪// A‬‬
‫המשך הבנאי של ‪// B‬‬
‫פולימורפיזם ‪//‬‬
‫העצם נוצר כ ‪//B‬‬
‫‪A‬‬
‫‪B‬‬
‫‪two of B‬‬
‫‪one of B‬‬
‫קטע ‪ : iv‬שגיאת תחביר‬
‫בשורה הראשונה יוצרים עצם מטיפוס ‪ A‬ומציבים אותו במשתנה שהוא הפנייה לעצם מטיפוס ‪. B‬‬
‫קטע ‪ : v‬תקין‪ ,‬הפלט‪:‬‬
‫קודם בניה של ‪// A‬‬
‫אח"כ בניה של ‪// B‬‬
‫‪A‬‬
‫‪B‬‬
‫קטע ‪ : iv‬שגיאת תחביר‬
‫בשורה הראשונה יוצרים עצם מטיפוס ‪ A‬ומציבים אותו במשתנה שהוא הפנייה לעצם מטיפוס ‪. B‬‬
‫אין התאמה בטיפוסים‪ A .‬הוא לא סוג של ‪.B‬‬
‫קטע ‪ :vii‬תקין‪ ,‬הפלט‬
‫קודם בניה של ‪// A‬‬
‫אח"כ בניה של ‪// B‬‬
‫פולימורפיזם‪ ,‬העצם נוצר כ ‪// B‬‬
‫‪www.kadman.net‬‬
‫‪A‬‬
‫‪B‬‬
‫‪one of B‬‬
‫הילה קדמן‬
‫מדעי המחשב‬
‫שאלון‪ - 899205 :‬תשע"ד ‪4112 -‬‬
‫ב‪.‬‬
‫‪47‬‬
‫עיצוב תכנה‬
‫השלמת הפעולות הבונות בהתאם לתרשים מעקב‬
‫פעולה בונה ריקה ‪//‬‬
‫)(‪public BBB‬‬
‫{‬
‫;)( ‪super‬‬
‫;‪this.a = null‬‬
‫}‬
‫פעולה בונה ריקה ‪//‬‬
‫)(‪public AAA‬‬
‫{‬
‫;‪this.n = 0‬‬
‫;‪this.x = 0‬‬
‫}‬
‫פעולה בונה על פי פרמטר לתכונה ‪//‬‬
‫)‪public BBB(AAA a‬‬
‫{‬
‫;)( ‪super‬‬
‫;‪this.a = a‬‬
‫}‬
‫פעולה בונה על פי כל התכונות ‪//‬‬
‫)‪public AAA (int n, double x‬‬
‫{‬
‫;‪this.n = n‬‬
‫;‪this.x = x‬‬
‫}‬
‫פעולה בונה על פי המספר השלם והטיפוס ‪//A‬‬
‫)‪public BBB (int n, AAA a‬‬
‫{‬
‫;)‪super (n, n‬‬
‫;‪this.a = a‬‬
‫}‬
‫פעולה בונה על פי כל התכונות ‪//‬‬
‫)‪public BBB(int n, double x, AAA a‬‬
‫{‬
‫;)‪super (n, x‬‬
‫;‪this.a = a‬‬
‫}‬
‫הערות‪:‬‬
‫(‪)1‬‬
‫(‪)4‬‬
‫(‪)3‬‬
‫חובה להוסיף את הפעולה הבונה הריקה מאחר והוספנו פעולות בונות עם פרמטרים ‪ ,‬לכן הפעולה הבונה‬
‫ברירת המחדל לא קיימת יותר ויש לכתוב אותה באופן מפורש‪.‬‬
‫בפעולות הבנות אפשר לכתוב מפורשות את ההשמה ואפשר להסתמך על ברירת המחדל שאי הצבת ערך‬
‫בתכונה שמה ערכי ‪ 1‬למשתנים פשוטים ו ‪ null‬לעצמים‪.‬‬
‫בפעולות הבונות במחלקה הבת ‪ , BBB‬אפשר לכתוב )(‪ super‬כאשר מזמנים את את בנאי מחלקת העל‬
‫הריק או לא‪ .‬בכל מקרה יזמן אותו בראש הפעולה הבונה‪.‬‬
‫‪www.kadman.net‬‬
‫הילה קדמן‬
‫עיצוב תכנה‬
48
‫מדעי המחשב‬
4112 - ‫ תשע"ד‬- 899205 :‫שאלון‬
22 ‫תרגיל‬
‫מעקב כולל תרשים עצמים‬
.‫ב‬
‫ מעקב ורשום פלט‬. ‫ירושה‬
.‫א‬
count = 0
AA
2) <AA> f1  num1 = 10
num2 = 10
:‫הפלט הוא‬
count = 1
4) AA ctor1
5) sum1 = 20
6) count = 1
4) <AA> f2 
AA
num1 = 10
num2 = 20
count = 2
4) AA ctor2
5) count = 2
BB
6) <BB> s1  num1 = 1
num2 = 1
num3 = 1
7) <AA> f3 
BB
num1 = 4
num2 = 2
num3 = 2
9) <AA> f2  BB
num1 = 1
<BB> s1  num2 = 1
num3 = 1
count = 3
6) AA ctor 1
BB ctor 1
count = 4
7) AA ctor1
BB ctor1
8) count = 4
10) sum = 3 // ‫פולי‬
***
C
C
C
CC
--C
CC
C
D
###
C
C
C
C
CC
C
D
C
D
C
D
C
D
new C(n) ‫כל‬
n ‫מדפיס‬
.C ‫פעמים‬
.CC ‫ובסוף‬
new D(n) ‫כל‬
‫מפעיל הבנאים‬
n ‫הריקים‬
‫ בכל פעם‬.‫פעמים‬
‫ ואחריו‬C ‫מודפס‬
D
12) sum = 4
13) sum = 4 // ‫פולי‬
:‫הפלט של סעיף ב‬
‫ יש לו הקצאה אחת‬.‫ הוא משתנה מחלקה‬count ‫ המשתנה‬:‫הערה‬
,1 ‫ גדל ב‬count ‫ ערכו של‬,‫ בכל פעם שנוצר עצם חדש‬.‫בזיכרון‬
. 2 ‫ וכך עד ל‬1 ‫ אח"כ‬, 1 ‫כלומר בהתחלה ערכו‬
.‫ פעמים‬2 ‫למען נוחות הכתיבה הוא מופיע‬
‫הילה קדמן‬
AA ctor1
sum1 = 20
count = 1
AA ctor2
count = 2
AA ctor1
BB ctor1
AA ctor1
BB ctor1
count = 4
sum = 3
sum = 4
sum = 4
www.kadman.net
‫מדעי המחשב‬
‫שאלון‪ - 899205 :‬תשע"ד ‪4112 -‬‬
‫‪49‬‬
‫עיצוב תכנה‬
‫תרגיל ‪23‬‬
‫‪www.kadman.net‬‬
‫הילה קדמן‬
‫עיצוב תכנה‬
‫מדעי המחשב‬
4112 - ‫ תשע"ד‬- 899205 :‫שאלון‬
31
24 ‫שאלה‬
.‫קבוצות לפי הפעולות‬-‫ נחלק את הפעולות לתת‬:‫ניתוח‬
.‫א‬
‫ שאין אף טלפון שיכול להיות מחלקה‬,‫הרכב הקבוצות הוא כזה‬
.‫עליונה מכיוון לכל אחד מהשלושה פעולות שאינן בטלפון אחר‬
‫ חייבים ליצור מחלקת על שתכלול את הפעולות והתכונות‬,‫לכן‬
‫ מכיוון שזו מחלקה שלא יוצרים ממנה‬.‫המשותפות לכולם‬
‫ מי שלא למד מחלקות‬.‫ היא צריכה להיות מופשטת‬,‫עצמים‬
."‫ יכול לעשות מחלקה "רגילה‬,‫מופשטות‬
‫ הן תהיינה‬,‫ משותפת לשלשת המחלקות‬min -‫ ו‬Com ,A ‫קבוצות‬
:‫ בס"ה נקבל‬.‫במחלקה העליונה‬
abstract
AllPhone
Type1
Type2
Type3
InterC (interface)
abstract AllPhone
const PRICE_MIN_CONV
minutes
phoneNumber
AllPhone(String phoneNumber)
dial(String phoneNumber, int minutes)
recCall(String phoneNumber)
virtual void reset( )
virtual double bill()
override ToString( )
Type1
const double PRICE_SMS
numOfMessages
Type1(String phoneNumber)
SendMsg(String phoneNumber)
RecMsg(String phoneNumber)
override void reset( )
override double bill( )
override String ToString( )
Group Type1
Dial
A
RecCall
SendMsg
B
RecMsg
Type2
Dial
A
RecCall
SendMsg
B
RecMsg
TakePic
C
ShowPic
Type3
Dial
A
RecCall
TakePic
C
ShowPic
InstallApp
D
Com
Common
Reset
Bill
min
1 ‫טלפון‬
‫חיוג‬
‫קבלת שיחה‬
‫שליחת הודעה‬
‫קבלת הודעה‬
2 ‫טלפון‬
‫חיוג‬
‫קבלת שיחה‬
‫שליחת הודעה‬
‫קבלת הודעה‬
‫צילום תמונה‬
‫הצגת תמונה‬
3 ‫טלפון‬
‫חיוג‬
‫קבלת שיחה‬
‫צילום תמונה‬
‫הצגת תמונה‬
‫התקנת‬
‫אפליקציות‬
‫משותפות‬
‫איפוס‬
‫חשבון‬
)‫דקות ש'(תכונה‬
.)‫ מפורט (לא חובה‬UML ‫ יהיה יותר קל עם‬:‫סעיף ב‬
.‫כך רואים יותר טוב היכן ואיך לממש‬
.‫ בעמוד הבא‬C# ‫פרוט ב‬
Type3
Type3(String phoneNumber)
takePic(String pic)
showPic(String pic)
installApp(String app)
override String ToString( )
Type2
numOfMessages
Type2(String phoneNumber)
takePic(String pic)
showPic(String pic)
override String ToString( )
‫הילה קדמן‬
InterC (interface)
void takePic(String pic)
void showPic(String pic)
www.kadman.net
‫עיצוב תכנה‬
‫מדעי המחשב‬
4112 - ‫ תשע"ד‬- 899205 :‫שאלון‬
31
C# ‫פרוט בקוד‬
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
using System;
namespace Q20_24
{
public interface InterC
{
void takePic(String pic);
void showPic(String pic);
}
// ‫נניח שהמחרוזת היא שם התמונה‬
public abstract class AllPhone
{
protected const double PRICE_MIN_CONV = 1;
protected int minutes;
// ‫דקות שיחה‬
protected String phoneNumber;
// ‫מספר הטלפון‬
public AllPhone(String phoneNumber) // ‫ מספר הטלפון‬:‫ הפרמטר‬.‫פעולה בונה‬
{
this.minutes = 0;
this.phoneNumber = phoneNumber;
}
/* dial to phoneMuner and talk minutes minutes
* @param phoneNumber: String
* @param minutes : int */
public void dial(String phoneNumber, int minutes)
{ this.minutes += minutes; }
/* get conversation from phoneNumber
* @param phoneNumber : String */
public void recCall(String phoneNumber)
{}
/* zeroing the minutes
*/
public virtual void reset()
{ this.minutes = 0; }
/* calculate bill
* @return bill */
public virtual double bill( )
// ‫ פעולות חישוב החשבון‬:‫סעיף ג‬
{ return this.minutes * PRICE_MIN_CONV; }
public override String ToString()
{ return "CellPhone: phneNumber is: " + this.phoneNumber +
" minutes = " + this.minutes; }
}
‫הילה קדמן‬
www.kadman.net
‫עיצוב תכנה‬
34
‫מדעי המחשב‬
4112 - ‫ תשע"ד‬- 899205 :‫שאלון‬
public class Type1 : AllPhone
{
public const double PRICE_SMS = 0.5;
protected int numOfMessages;
public Type1(String phoneNumber) : base(phoneNumber)
{ this.numOfMessages = 0; }
public void senMsg(String phoneNumber)
{ this.numOfMessages++; }
public void recMsg(String phoneNumber)
{}
public override void reset( )
{
base.reset( );
this.numOfMessages = 0;
}
public override double bill( )
// ‫ פעולות חישוב החשבון‬:‫סעיף ג‬
{ return base.bill( ) + this.numOfMessages * PRICE_SMS; }
public override String ToString( )
{
return "Type1 is kind of " + base.ToString() + "number of sms = " +
this.numOfMessages + " act as InterB";
}
}
public class Type2 : Type1, InterC
{
public Type2(String phoneNumber) : base(phoneNumber)
{ }
public void takePic(String pic)
{}
public void showPic(String pic)
{}
public override String ToString( )
{
return "Type2 is kind of " + base.ToString( ) +
" with pictures act as InterC";
}
}
‫הילה קדמן‬
www.kadman.net
‫עיצוב תכנה‬
33
‫מדעי המחשב‬
4112 - ‫ תשע"ד‬- 899205 :‫שאלון‬
public class Type3 : AllPhone, InterC
{
public Type3(String phoneNumber) : base(phoneNumber)
{}
public void takePic(String pic)
{}
public void showPic(String pic)
{}
public void installApp(String app)
{}
public override String ToString()
{ return "Type3 is kind of " + base.ToString() + " act as InterC"; }
}
class Program
{
static void Main(string[] args) // === ‫התכנית הראשית‬
{
AllPhone[] ar = new AllPhone[3];
ar[0] = new Type1("aa");
ar[0].dial("cc", 20);
((Type1)ar[0]).senMsg("bb");
((Type1)ar[0]).senMsg("cc");
((Type1)ar[0]).senMsg("dd");
ar[1] = new Type2("bb");
ar[1].dial("dd", 25);
((Type2)ar[1]).takePic("pic1");
((Type1)ar[1]).senMsg("aa");
ar[2] = new Type3("cc");
ar[2].dial("ada", 25);
for (int k = 0; k < ar.Length; k++)
{
Console.WriteLine(ar[k]);
Console.WriteLine("bill is: " + ar[k].bill());
}
Console.WriteLine("\nEnd"); Console.ReadLine();
}
}
}
‫הילה קדמן‬
www.kadman.net