תכנות, רקורסיה, מערכים, מחרוזות, עצים בינאריים ורשימות מקושרות
FlatMatrix המממשת את הממשק Matrix (ראו תיאור בנספח) ומייצגת מטריצה אשר ממומשת כמערך חד-מימדי של איברים מטיפוס double. מערך זה שמור כשדה matrix במחלקה. השדות rows ו-columns מייצגים את מספר השורות והעמודות של המטריצה בהתאמה.set (5 נקודות) ואת הבנאי המעתיק (5 נקודות). לנוחיותכם, מעטפת חלקית של המחלקה מופיעה סביב שתי השיטות. אין צורך להשתמש בשיטות מחלקה שאינן נתונות לכם.set מקבלת שני אינדקסים ו-, ומעדכנת את הערך בתא של המטריצה ל-value.IllegalArgumentException.otherMatrix כפרמטר, ויוצר מטריצה חדשה על ידי העתקה עמוקה:otherMatrix, ו- הם גם אינדקסים חוקיים במטריצה החדשה ותוכן התא בשתי המטריצות שווה. יש להניח שהקלט אינו null.IntegerBinaryTree, IntegerBinaryNode, המחלקות את המרחיבות BinaryTree<Integer>, BinaryNode<Integer> בהתאמה.IntegerBinaryTree את השיטה הבוליאנית pathSum(int sum) אשר מקבלת מספר שלם sum ומחזירה ערך true אם קיים מסלול כלשהו בעץ מהשורש לעלה אשר סכום המספרים בקודקודי המסלול הוא בדיוק sum. אם לא קיים מסלול כזה השיטה מחזירה ערך false (5 נקודות).IntegerBinaryNode (10 נקודות). 5
/ \
1 7
/ / \
6 2 9
/
4
5
/ \
1 8
\ / \
2 6 9
/
7
BinarySearchTree את השיטה searchPathString(T element) אשר מקבלת איבר element ומחזירה את מחרוזת החיפוש של element בעץ.BinarySearchNode. השיטה במחלקה זו מקבלת איבר element ופרמטר נוסף אותו עליכם לקבוע.TreeNode ו-BinarySearchTree יכילו את השדות הבאים (השינוי מהכיתה מסומן בקו תחתון):>>> print(tree.root.right.key_range) → (19, 38)update_key_range() למחלקה TreeNode, שתעדכן את השדה key_range של הצומת לערכיו התקינים לפי ההגדרה שצוינה.update_all_key_range(self) אשר מעדכנת את טווחי המפתחות בכל הצמתים בעץ, תוך שימוש במתודה שמומשה בסעיף א'. הקוד הבא מציע מימוש:update_key_range_2.update_all_key_range, אך ורק על ידי החלפת הקריאה ל-update_key_range בקריאה ל-update_key_range_2.update_all_key_range במקרה הגרוע כתלות בכמות הצמתים (). בנוסף, ציינו האם הקוד נכון, ואם אינו נכון הציעו תיקון (בקצרה).GraphMinimalNeighbourPathIterator המממשת את הממשק Iterator ומייצגת איטראטור של מספרים בגרף לא מכוון .next() את הקודקוד הבא ב-"מסלול שכן מינימלי מ-".graph, מספר שלם nextVertex ושדה נוסף אותו עליכם להגדיר.graph וקודקוד vertex. יש להניח כי בגרף יש לפחות קודקוד אחד.hasNext().findNextVertex() המעדכנת את השדה nextVertex. קריאה לשיטה זו מתרחשת בעת קידום האיטרטור – בשיטה next().next().GraphBlackAndWhiteEdgesIterator המממשת את הממשק Iterator<Edge> ומתארת איטרטור שעובר על כל הקשתות בגרף G שהן קשתות לבנות-שחורות (ורק עליהן). לא מוגדר סדר מסויים לפיו האיטרטור מחזיר את הקשתות.graph, מערך בוליאני whiteVertices וקשת nextEdge.MysteryGraph (ראו נספח) ולה בנאי מעתיק המקבל פרמטר מטיפוס Graph (ראו נספח) ויוצר גרף בעל אותו מספר קודקודים וקשתות.graph וקבוצת קודקודים לבנים whiteVertices. יש להניח כי בגרף יש לפחות קודקוד אחד וכי כל קודקוד שאינו לבן הוא שחור.hasNext().findNextEdge המעדכנת את השדה nextEdge.next().treeComparator) וכמו כן הוא "קטן" מכל הערכים בתת-העץ הימני שלו. בעץ אין איברים שווים.BinarySearchNode<T>, כמפורט בסעיפים א' וב'. בנוסף, עומדות לרשותכם שתי שיטות בהן תוכלו להיעזר כרצונכם:T findMin() מחזירה את הערך המינימלי בתת-העץ המושרש בקודקוד הנוכחי.T findMax() מחזירה את הערך המקסימלי בתת-העץ המושרש בקודקוד הנוכחי.private boolean replace(T newData) אשר מקבלת ערך newData ובודקת האם ניתן להחליף בינו לערך השדה data כך שתת העץ המושרש בקודקוד הנוכחי נשאר עץ חיפוש בינארי. אם התשובה חיובית, השיטה מבצעת את ההחלפה ומחזירה true. אחרת השיטה מחזירה false, וערך השדה data אינו משתנה.return מעבר לפקודה הניתנת בתבנית (השורה האחרונה בשיטה). 7
/ \\
2 11
/ \ \\
1 4 13
\\
14
true כי אם מחליפים את ערכו של השורש ב-5 תת-העץ המושרש בו נשאר עץ חיפוש בינארי.false והעץ לא ישתנה, כי תת-העץ המתקבל לאחר החלפת ערכו של השורש ב-3, 12 או 0 איננו עץ חיפוש בינארי.public boolean replace(T replaceMe, T newData) המקבלת שני ערכים replaceMe ו-newData.replaceMe בערך newData אם ניתן לעשות זאת - ניתן לבצע את ההחלפה אם קיים קודקוד בתת העץ שערכו replaceMe ולאחר ההחלפה העץ נשאר עץ חיפוש בינארי.false.node:node:
7
/ \\
2 11
/ \ \\
1 4 13
\\
14
node.replace(2,3):
7
/ \\
3 11
/ \ \\
1 4 13
\\
14
node.replace(2, 3) יוחזר הערך true ויתקבל תת העץ מימין.node.replace(2, 6) יוחזר הערך false ולא יבוצע שינוי בעץ מאחר שאם תתבצע ההחלפה העץ לא יישאר עץ חיפוש בינארי.node.replace(5, 6) יוחזר false ולא יבוצע שינוי בעץ מאחר שלא קיים בתת-העץ שמושרש ב-node קודקוד שערכו 5.return מעבר לפקודה הניתנת בתבנית (השורה האחרונה בשיטה).A, B, C, D, E.f() בשתי מחלקות.f().Driver נכתב קטע הקוד הבא בשיטה main אשר יוצר את העצמים הבאים, והוא תקין.Driver נכתב הקטע הבא, ולידו כתוב מה קרה בעקבות כל פקודה:B יורשת ישירות מהמחלקה A, ציירו זאת כך:A, B, C, D ו- E. (חתימות בלבד!)f().f() בכל המחלקות שציינתם בסעיף ג.a4 = o1;o2 = o1;((A)o1).toString();a4.toString();((A)o2).toString();Node שלהלן מממשת צומת בעץ בינרי.BinaryTree מאגדת בתוכה שיטות סטטיות לטיפול בעץ בינרי.find1, find2 ו- find3 הבאות:root: 8
/ \
11 6
/ \ \
4 2 13
/ / \
10 3 25
|
19
find1 בעקבות הקריאה BinaryTree.find1(root, 10)?find1 באופן כללי כשהיא מקבלת כפרמטרים: שורש של עץ בינרי root, שכל הערכים בצמתיו שונים זה מזה, ומספר שלם num כלשהו? שימו לב, עליכם לתת תיאור ממצה של מה עושה השיטה באופן כללי, ולא תיאור של מה עושה כל שורה בשיטה, או איך היא מבצעת זאת. כלומר, לכתוב בקצרה מה משמעות הערך שהשיטה מחזירה. התייחסו למקרי קצה.find2 בעקבות הקריאה BinaryTree.find2(root, 3, 2)?find2 באופן כללי כשהיא מקבלת כפרמטרים: שורש של עץ בינרי root, שכל הערכים בצמתיו שונים זה מזה, ושני מספרים שלמים ו-? שימו לב, עליכם לתת תיאור ממצה של מה עושה השיטה באופן כללי, ולא תיאור של מה עושה כל שורה בשיטה, או איך היא מבצעת זאת. כלומר, לכתוב בקצרה מה משמעות הערך שהשיטה מחזירה. התייחסו למקרי קצה.find3 בעקבות הקריאה BinaryTree.find3(root, 3, 13)?find3 באופן כללי כשהיא מקבלת כפרמטרים: שורש של עץ בינרי root, שכל הערכים בצמתיו שונים זה מזה, ושני מספרים שלמים ו-? שימו לב, עליכם לתת תיאור ממצה של מה עושה השיטה באופן כללי, ולא תיאור של מה עושה כל שורה בשיטה, או איך היא מבצעת זאת. כלומר, לכתוב בקצרה מה משמעות הערך שהשיטה מחזירה. התייחסו למקרי קצה.E, F, K, L, N, Pf() בשלוש מחלקות והשיטה g() במחלקה אחת בלבד.equals לא מומשה באף אחת מהמחלקות.f() ו g(). (הערך המוחזר של שתי השיטות הוא מטיפוס String)Driver נכתב קטע הקוד הבא בשיטה main אשר יוצר את העצמים הבאים, והוא תקין.Driver בהמשך השיטה main נכתבו פקודות נוספות (כל פקודה לא תלויה בפקודות האחרות), בהערה בסוף כל שורה, כתוב מה קרה בעקבות הוספת פקודה זו:f().f().main במחלקה Driver נכתבו הפקודות הבאות, והן תקינות.arr[3] = lf;lf = arr[3];System.out.println(o2 instanceof Object);System.out.println(o2 instanceof E);System.out.println(e2.equals(o2));System.out.println(((E)o1).equals(e2));שאלות תרגול במבוא למדעי המחשב בנושא מחלקות ממבחנים של האוניברסיטה הפתוחה, אוניברסיטת תל אביב, אוניברסיטת בר-אילן, הטכניון. השאלות ממוינות לפי רמת קושי, עם פתרונות לבדיקה עצמית - כך שניתן ללמוד מטעויות ולהבין את דרך הפתרון לפני הבחינה. ניתן לאתר שאלות חוזרות ולהריץ מבחני סימולציה ממוקדים בנושא מחלקות.