טבלת גיבוב (hash table) עם שרשור נפרד (separate chaining): 100 אוספים, פונקציית הגיבוב היא שתי הספרות האמצעיות של מספר הסטודנט. getCode ממש את פונקציית הגיבוב; moveStudent פעולה פנימית להעברת סטודנט בין אוספים; ופעולה חיצונית המתקנת קובץ שהתקלקל, תוך שימוש רק בממשק הציבורי הנתון.
טבלת גיבוב (hash table) עם שרשור נפרד (separate chaining): 100 אוספים, פונקציית הגיבוב היא שתי הספרות האמצעיות של מספר הסטודנט. getCode ממש את פונקציית הגיבוב; moveStudent פעולה פנימית להעברת סטודנט בין אוספים; ופעולה חיצונית המתקנת קובץ שהתקלקל, תוך שימוש רק בממשק הציבורי הנתון.
GradesFile מאופיינת במערך בגודל 100 של אוספי סטודנטים: המקום ה-K במערך (K בין 0 ל-99) מחזיק את כל הסטודנטים שהספרות האמצעיות של מספרם שוות ל-K.
arr[0] -> st1 -> st2 -> ...
arr[1] -> st3 -> ...
...
arr[45] -> (הסטודנט עם studentId=12345678 שייך לכאן)
...
arr[99] -> ...
כתבו את כותרת המחלקות Student ו-GradesFile ואת התכונות שלהן. הערה: יש לבחור מבנה נתונים מתאים לשמירת אוסף נתונים לא מוגבל (תור, מחסנית, שרשרת חוליות).
ממשו במחלקה Student את הפעולה int getCode(). הפעולה מחזירה מספר המורכב משתי הספרות האמצעיות של מספר הסטודנט (studentID). לדוגמה: עבור המספר 12345678 הפעולה תחזיר 45.
public int GetCode()
לפניכם חלק מהפעולות במחלקה GradesFile (אין צורך לממש אותן): Student getStudent(int k) — מחזירה את הסטודנט הראשון באוסף במקום ה-k במערך; אם האוסף במקום k ריק או k לא בגבולות המערך, מחזירה null. boolean isEmpty(int k) — מחזירה אמת אם האוסף במקום ה-k ריק, שקר אחרת; אם k לא בגבולות המערך מחזירה אמת. boolean listIsGood(int k) — מחזירה אמת אם כל הסטודנטים באוסף במקום ה-k מתאימים למקום זה לפי ה-studentId, ושקר אם לא; אם k לא בגבולות המערך או האוסף במקום ה-k ריק, מחזירה אמת. ממשו את הפעולה void moveStudent(int k, int j): הפעולה מעבירה את הסטודנט הראשון באוסף שמיקומו k במערך להיות סטודנט אחרון באוסף שמיקומו j במערך. אם האוסף במקום ה-k ריק או k או j לא נמצאים בגבולות המערך, הפעולה לא מבצעת דבר.
void MoveStudent(int k, int j)
במהלך הכנסת הנתונים למערכת קרתה תקלה, ובעקבות כך חל בלבול ולא כל הסטודנטים הוכנסו למקומות המתאימים לפי מספר הסטודנט שלהם. כתבו פעולה חיצונית המקבלת את מאגר המידע (הפניה לעצם מסוג GradesFile) ומעדכנת אותו כך שבכל תא במערך יהיה אוסף סטודנטים בעלי מספרי סטודנט המתאימים למספר התא במערך (על פי שיטת האחסון שתוארה בתחילה). הערה: בפתרון של סעיף ד' יש להשתמש רק בפעולות הנתונות של המחלקות Student ו-GradesFile! אין להשתמש בפעולות של מבנים אחרים, ואין להניח על קיומן של פעולות אחרות במחלקות Student ו-GradesFile.
public static void FixGradesFile(GradesFile file)
שאלות ותגובות על השאלה
🎓 לא הבנתם משהו? קבלו הסבר נוסף ממרצה לתכנות
שאלו כאן — ותקבלו מענה מוסמך.