בגרות מדעי המחשב 899271, קיץ 2025 מועד א'
תאריך הבחינה: 27.5.2025
טופס המבחן המלא להורדה — ומפתח התשובות עם פתרון מפורט לכל שאלה, אונליין. פתחו שאלה למטה: בשאלה סגורה בוחרים תשובה, בשאלה פתוחה נפתח הפתרון המלא (כניסה מהירה וחינם).
לתלמידי ותלמידות היחידות המתקדמות במדעי המחשב — כולל שלושת מסלולי הבחירה: אלגוריתמים, מודלים חישוביים ותכנות מונחה עצמים.
✓ פתרון מלא לכל שאלה · ✓ הסברים מלאים וחומרי לימוד · ✓ ליווי מורה AI · ✓ התחלה חינם
פתרון מפורט לכל שאלה — לא רק התשובה: הסבר שלב-אחר-שלב וניתוח הטעויות הנפוצות.
שאלות לדוגמה מהמבחן — פתרו עכשיו
בשאלה סגורה בוחרים תשובה; בשאלה פתוחה פותחים את הפתרון המלא (כניסה מהירה וחינם). אלו 3 מתוך 12 שאלות המבחן — את כולן תוכלו לפתור אונליין.
נתונה המחלקה Game – משחק מחשב, ולה שתי תכונות: • name – שם המשחק, מטיפוס מחרוזת. • price – מחיר המשחק – מספר הגדול מ־0 , מטיפוס שלם. הניחו שיש פעולות get/Get ו־set/Set לתכונות המחלקה. נתונה המחלקה Store – חנות משחקי מחשב, ולה תכונה אחת: • lst – הפניה לשרשרת חוליות שאינה ריקה, מטיפוס Game . כל חוליה בשרשרת מכילה משחק הנמכר בחנות. הערה: המשחקים אינם מסודרים בשרשרת בסדר מסוים, וכל משחק מופיע פעם אחת בלבד.
תרשים 1 (עמוד 2): השרשרת lst הנתונה בדוגמה של סעיף א – שבע חוליות
Store.lst --> [.|*]->[.|*]->[.|*]->[.|*]->[.|*]->[.|*]->[.|null]
each cell's data pointer goes down to a Game box:
1: name: "a", price: 30
2: name: "g", price: 30
3: name: "b", price: 27
4: name: "v", price: 99
5: name: "k", price: 30
6: name: "c", price: 25
7: name: "p", price: 30
(the four price values 30 are printed in bold on the paper)
תרשים 2 (עמוד 2): השרשרת בתום הפעולה remove(3, 30)
Store.lst --> [.|*]->[.|*]->[.|*]->[.|null]
1: name: "b", price: 27
2: name: "v", price: 99
3: name: "c", price: 25
4: name: "p", price: 30 (30 in bold)
תרשים 3 (עמוד 3): השרשרת בתום הפעולה remove(5, 30)
Store.lst --> [.|*]->[.|*]->[.|null]
1: name: "b", price: 27
2: name: "v", price: 99
3: name: "c", price: 25
תרשים 4 (עמוד 3): השרשרת בתום הפעולה removeCheap(5)
Store.lst --> [.|*]->[.|null]
1: name: "v", price: 99
2: name: "p", price: 30
ממשו את הפעולה של ממשק המחלקה Store שלפניכם: Java – public int remove (int n, int pr) C# – public int Remove (int n, int pr) הפעולה תמחק מן השרשרת n משחקים שמחיר כל אחד מהם pr . אם יש יותר מ־n משחקים שמחירם pr , יימחקו רק n המשחקים הראשונים מביניהם. אם יש פחות מ־n משחקים שמחירם pr , רק הם יימחקו. הפעולה תחזיר את כמות המשחקים שנמחקו (כלומר מקסימום n , אך ייתכן שפחות). הניחו ש־n ו־pr גדולים מ־0 . הערה: שאר המשחקים בשרשרת יישארו באותו הסדר. אם אין בשרשרת שום משחק במחיר pr , השרשרת תישאר ללא שום שינוי והפעולה תחזיר 0 . דוגמה: בעבור n = 3 , pr = 30 והשרשרת lst שלפניכם: [תרשים 1 ב-figures] הפעולה תחזיר 3 והשרשרת תיראה כך בתום הפעולה: [תרשים 2 ב-figures] הסבר: יש בשרשרת ארבעה משחקים שמחירם 30 . מכיוון ש־n = 3 , נמחקו שלושת המשחקים הראשונים בשרשרת שמחירם 30 , והפעולה החזירה 3 . דוגמה נוספת: בעבור אותה השרשרת מן הדוגמה המקורית שלעיל ו־n = 5 , pr = 30 , הפעולה תחזיר 4 והשרשרת תיראה כך בתום הפעולה: [תרשים 3 ב-figures] הסבר: יש רק ארבעה משחקים שמחירם 30 . לכן נמחקו מן השרשרת ארבעת המשחקים שמחירם 30 , והפעולה החזירה 4 .
ממשו את הפעולה של ממשק המחלקה Store שלפניכם: Java – public int removeCheap (int num) C# – public int RemoveCheap (int num) הפעולה תמחק מן השרשרת את num המשחקים הזולים ביותר. הפעולה תחזיר את סכום המחירים הכולל של כל המשחקים שנמחקו. הניחו ש־num גדול מ־0 וקטן מכמות המשחקים בשרשרת. הערות: – המשחקים בשרשרת שלא נמחקו יישארו באותו הסדר. – אם כמות המשחקים שמחירם זהה גדולה מכמות המשחקים שצריך למחוק מהם, אין חשיבות איזה מהם יימחק. – אפשר להשתמש בפעולה שבסעיף א. דוגמה: בעבור אותה השרשרת מן הדוגמה המקורית בסעיף א ו־num = 5 , הפעולה תחזיר 142 , והשרשרת תיראה כך: [תרשים 4 ב-figures] הסבר: חמשת המשחקים הזולים יותר (25+27+30+30+30) נמחקו מן השרשרת וסכום מחירם הכולל הוא 142 . בשרשרת נשאר משחק אחד שמחירו 99 ואחד שמחירו 30 (אפשר להשאיר בשרשרת משחק אחר שעולה 30 , אין חשיבות איזה מהם יישאר).
public static boolean mmm (Queue<Integer> q, int z)
{
q.insert (0);
int num = q.head();
int y = 0;
while (q.head() > 0)
{
if (y < z)
{
if (q.head() == num)
{
y++;
}
else
{
num = q.head();
y = 1;
}
}
q.insert (q.remove());
}
q.remove();
return y == z;
}
public static int what (Queue<Integer> q, int n)
{
if (mmm (q, n))
return n;
return what (q, n - 1);
}
עמוד 4 (Java) ועמוד 6 (C#): התור q הנתון לסעיף א
queue q (head on the LEFT, tail on the RIGHT, as the labels ראש התור / סוף התור are printed):
| 1 | 3 | 1 | 1 | 1 | 2 |
head -> 1, 3, 1, 1, 1, 2 <- tail
עמוד 4 (Java) ועמוד 6 (C#): טבלת המעקב הריקה של סעיף א(1)
טבלת המעקב הריקה של סעיף א (עמודות כפי שהן מודפסות, משמאל לימין על הדף):
| התור q | num | y | y < z | q.head() == num |
|---|---|---|---|---|
| | | | | |
עמוד 5 (Java) ועמוד 7 (C#): התור q הנתון לסעיף ב (זהה לתור של סעיף א)
queue q (head on the LEFT, tail on the RIGHT, as the labels ראש התור / סוף התור are printed):
| 1 | 3 | 1 | 1 | 1 | 2 |
head -> 1, 3, 1, 1, 1, 2 <- tail
עמוד 5 (Java) ועמוד 7 (C#): טבלת המעקב המוצעת של סעיף ב(1)
טבלת המעקב המוצעת של סעיף ב (עמודות כפי שהן מודפסות, משמאל לימין על הדף):
| התור q שמתקבל בפעולה | הערך n שמתקבל בפעולה | mmm (q, n) == true | ערך מוחזר |
|---|---|---|---|
| | | | |
לפניכם הפעולה mmm , המקבלת תור – q ובו מספרים הגדולים מ־0 , ומספר שלם z – הגדול מ־0 . [קוד mmm/Mmm ב-code_context] נתון תור q מטיפוס שלם: [התור ב-figures] עקבו בעזרת טבלת המעקב שלפניכם אחר הפעולה mmm (q , 4) , וכתבו מה הפעולה מחזירה.
mmm (q, 4)
הסבירו מה הפעולה mmm עושה.
מהי סיבוכיות זמן הריצה של הפעולה mmm ? נמקו את תשובתכם.
לפניכם הפעולה what , המקבלת תור – q ובו מספרים הגדולים מ־0 , ואת גודל התור – n . [קוד what/What ב-code_context] נתון תור – q מטיפוס שלם: [התור ב-figures] עקבו אחר הפעולה what (q, 6) , וכתבו מה הפעולה מחזירה (אין צורך לעקוב אחר הפעולה mmm). המעקב יכלול בכל קריאה את הערכים של q , n ואת הערך המוחזר. לפניכם הצעה לטבלת מעקב (אין חובה להשתמש בטבלה זו).
הסבירו מה הפעולה what עושה.
מהי סיבוכיות זמן הריצה של הפעולה what ? נמקו את תשובתכם.
"עץ K־שמאלי" הוא עץ בינרי ובו כל מסלול משורש העץ לעלה כלשהו מכיל לכל היותר K קשתות הפונות שמאלה (כלומר מקסימום K בנים שמאליים). שימו לב: ב"עץ K־שמאלי" ייתכן שאין שום מסלול המכיל K קשתות הפונות שמאלה (כלומר ייתכן שבכל אחד מן המסלולים יש פחות קשתות שמאליות מ־K). דוגמה: [העץ מתואר בתרשים: שורש; בן שמאלי L ובן ימני P; ל-L בן ימני יחיד L2; ל-P בן שמאלי Q ובן ימני עלה Q2; ל-Q בן שמאלי עלה Q3 ובן ימני עלה Q4 — סך הכול 8 צמתים] עץ זה אינו "עץ 1־שמאלי" כי בעץ יש מסלול שבו יש יותר מקשת אחת שמאלית (במסלול המקווקו יש שתי קשתות שמאליות). לעומת זאת, עץ זה הוא "עץ 2־שמאלי" כי אין בו מסלול שבו יותר משתי קשתות שמאליות (ובאותה מידה הוא גם "עץ 3־שמאלי", וגם "עץ 4־שמאלי" וכן הלאה).
עמוד 8: עץ הדוגמה של «עץ K־שמאלי», עם מסלול מקווקו
binary tree, 8 unlabelled nodes (drawn as empty circles), arrows point from parent to child:
R (root, top centre)
R.left = L (drawn up-left of the root)
R.right = P (drawn right of the root)
L.right = L2 (a single child of L, drawn down-RIGHT of L)
P.left = Q ; P.right = Q2 (leaf)
Q.left = Q3 (leaf) ; Q.right = Q4 (leaf)
total: root, L, P, L2, Q, Q2, Q3, Q4 = 8 nodes.
A DASHED contour marks the path root -> P -> Q -> Q3 (one right edge then two LEFT edges);
this is the «מסלול המקווקו» the caption refers to.
סרטטו "עץ 1־שמאלי" (כלומר שבכל מסלול של העץ יש קשת שמאלית אחת לכל היותר), ובו 8 צמתים ומקסימום 4 רמות.
כתבו פעולה חיצונית ששמה isLeftK בשפת Java או IsLeftK בשפת C#, המקבלת עץ בינרי – root מטיפוס שלם שאינו ריק, וערך K שאינו שלילי, ומחזירה true אם העץ הוא "עץ K־שמאלי", ואם לא – היא מחזירה false .
public static boolean isLeftK (BinNode<Integer> root, int K)
פתרו את המבחן המלא — עם משוב על כל תשובה
כל שאלות המבחן, פתרון מפורט, משוב אישי ומעקב התקדמות. בדיוק מה שצריך כדי לעבור.
התחילו לתרגל — חינם ←