שאלות ממבחנים לי-טל משיח

Slides:



Advertisements
Similar presentations
ממיבחניםC שאלות ++.
Advertisements

תוכנה 1 סמסטר א ' תשע " ב תרגול מס ' 7 * מנשקים, דיאגרמות וביטים * לא בהכרח בסדר הזה.
Files 1 יום חמישי 16 אפריל 2015 יום חמישי 16 אפריל 2015 יום חמישי 16 אפריל 2015 יום חמישי 16 אפריל 2015 יום חמישי 16 אפריל 2015 יום חמישי 16 אפריל 2015.
מבוא למדעי המחשב לתעשייה וניהול
1 Formal Specifications for Complex Systems (236368) Tutorial #4 Refinement in Z: data refinement; operations refinement; their combinations.
טבלאות סמלים נכתב ע"י אלכס קוגן סמסטר חורף, תשס"ח.
עיבוד תמונות ואותות בעזרת מחשב
תכנות מונחה עצמים Object Oriented Programming (OOP) אתגר מחזור ב'
1 מבחן מועד ג' סמסטר אביב אשכול מחשבים (Cluster) הוא קבוצה של מחשבים המחוברים ביניהם ופועלים יחד בצורה מתואמת, כך שבמובנים רבים הם יכולים להיחשב.
דוד שוורץ, עידן זק, נטע צור וחיה כהן. הפונקציונאליות : המשתמש יבחר קובץ שעליו הוא רוצה לבצע את האנליזה, וילחץ עליו עם כפתור ימני בעכבר. יפתח תפריט ובו.
רקורסיות נושאי השיעור פתרון משוואות רקורסיביות שיטת ההצבה
תרגול 5 רקורסיות. רקורסיה קריאה של פונקציה לעצמה –באופן ישיר או באופן עקיף היתרון : תכנות של דברים מסובכים נעשה ברור ונוח יותר, מכיוון שזו למעשה צורת.
שאלות חזרה לבחינה. שאלה דיסקים אופטיים מסוג WORM (write-once-read-many) משמשים חברות לצורך איחסון כמויות גדולות של מידע באופן קבוע ומבלי שניתן לשנותו.
מבוא לשפת C חידות ונקודות חשובות נכתב על-ידי יורי פקלני. © כל הזכויות שמורות לטכניון – מכון טכנולוגי לישראל.
שאלות ממבחנים לי-טל משיח
חורף - תשס " ג DBMS, צורות נורמליות 1 צורה נורמלית שלישית - 3NF הגדרה : תהי R סכמה רלציונית ותהי F קבוצת תלויות פונקציונליות מעל R. R היא ב -3NF.
Map-Reduce Input: a collection of scientific articles on different topics, each marked with a field of science –Mathematics, Computer Science, Biology,
1 Formal Specifications for Complex Systems (236368) Tutorial #5 Refinement in Z: data refinement; operations refinement; their combinations.
11 Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel 1 Introduction to Programming in C תרגול
תרגול חזרה. מבנה האובייקט תאר את מבנה האובייקט כולל מבנה טבלאות הפונקציות הוירטואליות עבור התכנית הבאה struct A { int x; virtual void a() {}; }; struct.
Formal Specifications for Complex Systems (236368) Tutorial #6 appendix Statecharts vs. Raphsody 7 (theory vs. practice)
חלון הפקודות מיועד לבצע פעולה אחת בכל פעם. כיצד אפשר לבצע רשימת פקודות או אפליקציות מורכבות ?
תכנות תרגול 6 שבוע : תרגיל שורש של מספר מחושב לפי הסדרה הבאה : root 0 = 1 root n = root n-1 + a / root n-1 2 כאשר האיבר ה n של הסדרה הוא קירוב.
1 Formal Specifications for Complex Systems (236368) Tutorial #1 Course site : T.A. :Emilia Katz.
Backpatching 1. תזכורת מתרגול קודם קוד ביניים - שפת הרביעיות שיטות לייצור קוד ביניים –שימוש בתכונת code –כתיבה ישירה ל-buffer של פקודות שיטות לתרגום מבני.
מערכות הפעלה ( אביב 2009) חגית עטיה ©1 מערכת קבצים log-structured  ה log הוא העותק היחיד של הנתונים  כאשר משנים בלוק (data, header) פשוט כותבים את הבלוק.
תרגול 10: הכרות עם ++C ++C כ- C משופר
שאלות ממבחנים לי-טל משיח
1 מבוא למדעי המחשב ארגומנטים לתוכנית בזמן ריצה קבצים הקדם מעבד Preprocessor טיפוסים סדורים Enumerated Types Typedef.
תכנות תרגול 5 שבוע : הגדרת פונקציות return-value-type function-name(parameter1, parameter2, …) הגדרת סוג הערכים שהפונקציה מחזירה שם הפונקציהרשימת.
Remember Remember The 5 th of November. תרגול 2 קובץ סדרתי.
עקרון ההכלה וההדחה.
תכנות מונחה עצמים Object Oriented Programming (OOP) אתגר מחזור ב' Templates תבניות.
מבוא למדעי המחשב תרגול 3 שעת קבלה : יום שני 11:00-12:00 דוא " ל :
Last time on Clang משתנה: "פתק" המשמש את המחשב לשמירת מידע. לכל משתנה יש שם וטיפוס כללים לשמות משתנים –חייבים להכיל רק אותיות, מספרים ו '_' –חייבים להתחיל.
מבוא למדעי המחשב, סמסטר א ', תשע " א תרגול מס ' 1 נושאים  הכרת הקורס  פסאודו - קוד / אלגוריתם 1.
שאלות ממבחנים לי-טל משיח
1 מבוא למדעי המחשב סיבוכיות. 2 סיבוכיות - מוטיבציה סידרת פיבונאצ'י: long fibonacci (int n) { if (n == 1 || n == 2) return 1; else return (fibonacci(n-1)
Points on a perimeter (Convex Hull) קורס – מבוא לעבוד מקבילי מבצעים – אריאל פנדלר יאיר ברעם.
1 Formal Specifications for Complex Systems (236368) Tutorial #3 Z introduction and notation (contd.); Birthday book example (Chapter 1 in the book)
11 Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel 1 Introduction to Programming in C תרגול
Structure. מה לומדים היום ? דרך לבנות מבנה נתונים בסיסי – Structure מייצר " טיפוס " חדש מתאים כאשר רוצים לאגד כמה משתנים יחד דוגמאות : עובד : שם, טלפון,
מטא-מודלים Metamodels. מטא-מודל - דגשים לפתרון לקרוא את הכל – זה ארוך אבל הכל נמצא בפנים ! להסתכל על התרשימים הויזואליים ולראות מה מזהים. לקשר בין התמונה.
פיתוח מערכות מידע Class diagrams Aggregation, Composition and Generalization.
מבוא למדעי המחשב לתעשייה וניהול הרצאה 7. סברוטינות subroutines.
Practice session 3.  תחביר ממשי ( קונקרטי ) ותחביר מופשט ( אבסטרקטי )  שיטות חישוב : Applicative & Normal Evaluation.
Operating Systems Practical Session 10 File Systems 1.
תכנות מכוון עצמים ושפת ++C וויסאם חלילי. TODAY TOPICS: 1. Function Overloading & Default Parameters 2. Arguments By Reference 3. Multiple #include’s 4.
מבנים קרן כליף. ביחידה זו נלמד :  מהו מבנה (struct)  איתחול מבנה  השמת מבנים  השוואת מבנים  העברת מבנה לפונקציה  מבנה בתוך מבנה  מערך של מבנים.
מבוא למדעי המחשב לתעשייה וניהול הרצאה 6. מפעל השעווה – לולאות  עד עכשיו  טיפלנו בייצור נרות מסוג אחד, במחיר אחיד  למדנו להתמודד עם טיפול במקרים שונים.
1 Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel 1 Introduction to Programming in C תרגול
מספרים אקראיים ניתן לייצר מספרים אקראיים ע"י הפונקציה int rand(void);
Programming Arrays.
מבוא למדעי המחשב לתעשייה וניהול
Tirgul 12 Trees 1.
Computer Architecture and Assembly Language
מחלקות classes.
SQL בסיסי – הגדרה אינדוקטיבית
תירגול 14: מבני נתונים דינאמיים
שאלות ממבחנים - ADT שאלות ממבחנים - C-Shell
עבודה עם נתונים באמצעות ADO.NET
פרוקטוז, C6H12O6 , חד-סוכר מיוחד
סוגי משתנים קרן כליף.
Shell Scripts בסביבת UNIX
תוכנה 1 תרגול 13 – סיכום.
תכנות מכוון עצמים ו- C++ יחידה 02 העמסת פונקציות, ערכי ברירת מחדל, enum, קימפול מותנה קרן כליף.
מחסנית ותור Stacks and Queues.
Computer Programming תרגול 3 Summer 2016
Engineering Programming A
Computer Architecture and Assembly Language
Presentation transcript:

שאלות ממבחנים לי-טל משיח

מבחן מועד ב' סמסטר אביב 2006 מבני נתונים מופשטים - ADT (40 נקודות) לצורך בקרת כניסה למתקן סודי של המוסד הוחלט להקים מערכת המצלמת את פניהם של הבאים למתקן ומאפשרת את כניסתם רק במידה והפנים זוהו כפנים של אחד העובדים. לכל עובד יש שם ומספר ת"ז (ייחודי). בעת התקנת המערכת יצולם כל אחד מהעובדים ממספר זוויות צילום שונות (יתכן מספר שונה של תמונות לכל עובד) והתמונות ישמרו במערכת. במנשק ומימוש המערכת נעזר ב-ADT בשם Image המייצג תמונה דיגיטאלית ותומך בין היתר בפעולות הבאות: imageCopy – הפונקציה מקבלת תמונה ומחזירה העתק שלה imageDestroy – משחררת את כל משאבי התמונה imagesSimilarity – מקבלת שתי תמונות ומחזירה מספר ממשי בין 0 ל- 1 המשקף את מידת הדמיון בין התמונות. ניתן להתייחס אל Image כאל "קופסא שחורה", אין צורך לתאר את מבנה הנתונים או המימוש שלו.

מבחן מועד ב' סמסטר אביב 2006 סעיף א' (20 נקודות) ממשו את קובץ המנשק של המודול SurveillanceSystem או בקיצור SurSys על המנשק לתמוך בפונקציות הבאות בלבד: CreateSurSys 1 יצירת SurSys AddWorker 2 הוספת עובד חדש למערכת (הפונקציה מקבלת את שמו ות"ז שלו) AddWorkerImage 3 הוספת תמונה של עובד הקיים במערכת (מחזירה מספר סידורי לתמונה זו. מספר זה הנו ייחודי לעובד זה בלבד, אולם יתכן כי לעובדים אחרים ישנן תמונות עם מספר סידורי זהה) RemoveWorker 4 מחיקת עובד מהמערכת (כולל כל התמונות שלו) RemoveWorkerImage 5 מחיקת תמונה של עובד (על-פי ת"ז של העובד והמספר הסידורי של התמונה) GetWorkerImages 6 החזרת אוסף כל התמונות של עובד מסוים CheckSimilarity 7 זיהוי עובד על סמך תמונה חדשה (הסבר בהמשך...) DestroySurSys 8 הריסת ה- SurSys פונקציה מס' 7 מקבלת כפרמטר תמונה (Image) ומספר – threshold בין 0 ל- 1. על פונקציה זו להשוות את התמונה (ע"י שימוש בפונקציה imagesSimilarity) לכל תמונות העובדים שנשמרו במערכת. במידה ונמצאה תמונה שמידת הדמיון שלה גבוהה מה- threshold הפונקציה תחזיר ערך המשקף זיהוי מוצלח. אחרת, הפונקציה תחזיר ערך המשקף חוסר זיהוי. בנוסף, תחזיר הפונקציה בכל מקרה את ת"ז ושמו של העובד עבורו נמצא הדמיון הגדול ביותר.

פתרון סעיף א' #ifndef SURSYS_H #define SURSYS_H #include "image.h" typedef enum {FALSE, TRUE} Boolean; typedef enum {SUCCESS, FAIL, OUT_OF_MEMORY, BAD_PARAM, …. } SurSysResult; typedef struct SurSys_t *SurSys; SurSys CreateSurSys(); // or SurSysResult CreateSurSys(SurSys *system); SurSysResult AddWorker(SurSys system,int id, const char * name); SurSysResult AddWorkerImage(SurSys system,int id, Image image, int*imageId); SurSysResult RemoveWorker(SurSys system, int id); SurSysResult RemoveWorkerImage(SurSys system,int id,int imageId); SurSysResult GetWorkerImages(SurSys system,int id,Image** images, int * imagesSize); SurSysResult CheckSimilarity(SurSys system, Image image, double threshold, Boolean * match, int * bestID, char** bestName); void DestroySurSys(SurSys system); #endif

מבחן מועד ב' סמסטר אביב 2006 סעיף ב' (20 נקודות) 1.(8 נקודות) הציגו את מבנה הנתונים של SurSys כפי שיופיע בקובץ SurSys.c, עם כל ההגדרות הנלוות הנדרשות. אין צורך לממש אף פונקציה בסעיף זה. 2.(9 נקודות) ממשו את פונקציה 7 מסעיף א' על פי מבנה הנתונים שבחרתם בסעיף ב' 1. על המימוש להיות נכון ויעיל. המימוש צריך לתאר את האלגוריתם העיקרי במלואו (בפונקציה אחת או יותר), אי צורך לממש פונקציות מנשק של ADTs בסיסיים וגם לא פונקציות מנשק אחרות של SurSys. 3.(3 נקודות) ציינו 3 קודי שגיאה אפשריים שונים (ספציפיים ל- SurSys) המוחזרים ע"י פונקציות המנשק (אין לציין "בעיה בהקצאת זיכרון", וגם לא קודי שגיאה של ADT(s) בסיסיים).

פתרון סעיף ב' 1 #include “SurSys.h” #include "set.h" /* the struct of the ADT */ struct SurSys_t { Set workSet; }; /* internal struct (not ADT) */ typedef struct Worker_t { int id; char* name; Set workerImagesSet; } Worker; /* internal struct (not ADT) */ typedef struct WorkerImage_t { int id; Image image; } WorkerImage; SurSys

מבחן מועד ב' סמסטר אביב 2006 סעיף ב' (20 נקודות) 1.(8 נקודות) הציגו את מבנה הנתונים של SurSys כפי שיופיע בקובץ SurSys.c, עם כל ההגדרות הנלוות הנדרשות. אין צורך לממש אף פונקציה בסעיף זה. 2.(9 נקודות) ממשו את פונקציה 7 מסעיף א' על פי מבנה הנתונים שבחרתם בסעיף ב' 1. על המימוש להיות נכון ויעיל. המימוש צריך לתאר את האלגוריתם העיקרי במלואו (בפונקציה אחת או יותר), אין צורך לממש פונקציות מנשק של ADTs בסיסיים וגם לא פונקציות מנשק אחרות של SurSys. 3.(3 נקודות) ציינו 3 קודי שגיאה אפשריים שונים (ספציפיים ל- SurSys) המוחזרים ע"י פונקציות המנשק (אין לציין "בעיה בהקצאת זיכרון", וגם לא קודי שגיאה של ADT(s) בסיסיים).

פתרון סעיף ב' 2 SurSysResult CheckSimilarity(SurSys system, Image image, double threshold, Boolean * match, int * id, char** name){ double similarity, maxSimilarity = 0.0; Worker *currentWorker; WorkerImage *currrentImage; char* tmpName= NULL; if (system==NULL || match==NULL || id == NULL || name ==NULL) return BAD_PARAM; if (threshold 1) return INVALID_THRESHOLD; SET_FOREACH(currentWorker,system->workerSet){ SET_FOREACH(currentImage, currentWorker->workerImagesSet){ similarity = imagesSimilarity(currentImage->image,image); if (similarity > maxSimilarity){ maxSimilarity = similarity; *id =currentWorker->id; tmp_name = currentWorker->name; } if (tmpName!=NULL){ *name = (char*)malloc(strlen(tmpName)+1); if (*name == NULL) return OUT_OF_MEMORY; strcpy(*name, tmpName); } if (maxSimilarity > threshold) *match = TRUE; else *match = FALSE; return SUCCESS; } #define SET_FOREACH(e,s) \ for (e=setFirst(s); e!=NULL; e=setNext(s)) !!

מבחן מועד ב' סמסטר אביב 2006 סעיף ב' (20 נקודות) 1.(8 נקודות) הציגו את מבנה הנתונים של SurSys כפי שיופיע בקובץ SurSys.c, עם כל ההגדרות הנלוות הנדרשות. אין צורך לממש אף פונקציה בסעיף זה. 2.(9 נקודות) ממשו את פונקציה 7 מסעיף א' על פי מבנה הנתונים שבחרתם בסעיף ב' 1. על המימוש להיות נכון ויעיל. המימוש צריך לתאר את האלגוריתם העיקרי במלואו (בפונקציה אחת או יותר), אי צורך לממש פונקציות מנשק של ADTs בסיסיים וגם לא פונקציות מנשק אחרות של SurSys. 3.(3 נקודות) ציינו 3 קודי שגיאה אפשריים שונים (ספציפיים ל- SurSys) המוחזרים ע"י פונקציות המנשק (אין לציין "בעיה בהקצאת זיכרון", וגם לא קודי שגיאה של ADT(s) בסיסיים).

פתרון סעיף ב' 3 INVALID_THRESHOLD IMAGE_DOENT_EXIST WORKER_ALREADY_EXIST

מבחן מועד ג' סמסטר אביב אשכול מחשבים (Cluster) הוא קבוצה של מחשבים המחוברים ביניהם ופועלים יחד בצורה מתואמת, כך שבמובנים רבים הם יכולים להיחשב כמחשב אחד. עיקרון הפעולה הוא חלוקת המשימות החישוביות (Jobs) למספר רב של נקודות קצה (Nodes) המחוברות לאשכול. לצורך פתרון השאלה ניתן להניח כי Node מאופיין על ידי שם יחודי (מחרוזת) והוא בעל התכונות הבאות: מהירות CPU (שבר עשרוני), גודל הזיכרון (מספר שלם) וגודל דיסק (מספר שלם). משימה חישובית מתוארת באמצעות שורת הפעלה (מחרוזת), מספר המחשבים שהמשימה תרוץ עליהם (לא יותר ולא פחות, מס' מדוייק) ודרישות מדוייקות לגבי מאפייני המחשבים האלו (מהירות, גודל זיכרון וגודל דיסק). לצורך פתרון השאלה יש להניח כי לא ניתן להריץ בו-זמנית 2 משימות על אותו מחשב.

מבחן מועד ג' סמסטר אביב סעיף א' (20 נקודות) ממש/י את קובץ המנשק של המודול Cluster. בנוסף ל-type-ים וכד', על המנשק לתמוך בפונקציות הבאות בלבד: CreateCluster – יצירת אשכול מחשבים DestroyCluster – הריסת אשכול מחשבים AddNode – הוספת מחשב מסוים לאשכול מחשבים RemoveNode – הורדת מחשב מסוים מאשכול מחשבים MergeClusters - בהינתן 2 אשכולות יצירת אשכול חדש – איחוד של השניים RemoveSubcluster – בהינתן 2 אשכולות יצירת אשכול חדש – הפרש בין הראשון והשני IsNodeInCluster – בהינתן אשכול ומחשב מסוים, בדיקה האם המחשב שייך לאשכול IsJobRunnable – בהינתן אשכול ומשימה מסוימים, הפונקציה מחזירה אינדיקציה האם ניתן להריץ את המשימה על האשכול ואם כן אז גם מחזירה תת-אשכול (מתוך האשכול שניתן כפרמטר) שניתן להריץ עליו משימה זו. CreateMatchings – בהינתן אשכול ורשימת משימות חישוביות הפונקציה תחזיר את אוסף "ההתאמות" של משימות אל תתי אשכולות מתוך האשכול שניתן כפרמטר. הסברים נוספים בהמשך...

פתרון סעיף א' #ifndef CLUSTER_H #define CLUSTER_H typedef enum {FALSE, TRUE} Boolean; typedef enum {SUCCESS, FAIL, OUT_OF_MEMORY, BAD_PARAM, …. } ClusterResult; typedef struct Cluster_t *Cluster; /* this struct is not ADT. It is used only for passing parameters to the functions of Cluster ADT */ struct Job_t { char* command; int nodes_num; double cpu_size; int mem_size; int diskspace_size; } ; typedef struct Job_t * Job;

פתרון סעיף א' המשך Cluster CreateCluster(); // or ClusterResult CreateCluster(Cluster *); void DestroyCluster(Cluster c); ClusterResult AddNode(Cluster c,char* name,double cpu, int memsize, int disksize); ClusterResult RemoveNode(Cluster c,char* name); ClusterResult MergeCluster(Cluster c1, Cluster c2, Cluster * c3); ClusterResult RemoveSubCluster(Cluster c1, Cluster c2, Cluster * c3); ClusterResult IsNodeInCluster(Cluster c, char* name, Boolean * res); ClusterResult IsJobRunnable(Cluster c, Job job, Cluster * res); // res will be null incase the job is not runnable ClusterResult CreateMatching(Cluster c, Job* jobs, int num_jobs, Cluster** matches); #endif

מבחן מועד ג' סמסטר אביב סעיף ב' (20 נקודות) 1. (8 נקודות) הציגו את מבנה הנתונים של Cluster כפי שיופיע ב- Cluster.c. תאר/י איזה ADT(s) תבחרו לביסוס המימוש. ניתן להיעזר בכלADT שנלמד בכיתה עם שינויים סבירים. תאר/י את השינויים. אם השתמשתם במבנים נוספים לצורך פתרון סעיף א', יש לתאר גם אותם. 2. (12 נקודות) יש לממש את פונקציה 9 מתוך הממשק מסעיף א'. לצורך הפתרון יש להניח את ההנחות הבאות: רשימת משימות הניתנת כפרמטר נתונה בתור אוסף סדור של משימות ויותר חשוב להתאים מחשבים למשימות "ראשונות" מאשר למשימות "אחרונות", כלומר אם ניתן להתאים את משימות 1 ו-2 או משימות 1 ו-3 אז האפשרות הראשונה היא עדיפה. אוסף ההתאמות צריך להיות מקסימלי, כלומר אם הצלחתם "להתאים" משימות 1, 2, ו-5, אבל ניתן בנוסף "להתאים" את משימה 6, אז אוסף ההתאמות שלכם הוא אינו מקסימלי. ניתן להשתמש בפונקציות אחרות מסעיף א'

פתרון סעיף ב' 1 #include “Set.h” #include “Cluster.h” /* the struct of the ADT */ struct Cluster_t { Set nodes; } ; /* internal struct (not ADT) */ typedef struct Node_t { char* name; double cpu; int mem_size; int disk_size; } Node; קובץ Cluster.c:

מבחן מועד ג' סמסטר אביב סעיף ב' (20 נקודות) 1. (8 נקודות) הציגו את מבנה הנתונים של Cluster כפי שיופיע ב- Cluster.c. תאר/י איזה ADT(s) תבחרו לביסוס המימוש. ניתן להיעזר בכלADT שנלמד בכיתה עם שינויים סבירים. תאר/י את השינויים. אם השתמשתם במבנים נוספים לצורך פתרון סעיף א', יש לתאר גם אותם. 2. (12 נקודות) יש לממש את פונקציה 9 מתוך הממשק מסעיף א'. לצורך הפתרון יש להניח את ההנחות הבאות: רשימת משימות הניתנת כפרמטר נתונה בתור אוסף סדור של משימות ויותר חשוב להתאים מחשבים למשימות "ראשונות" מאשר למשימות "אחרונות", כלומר אם ניתן להתאים את משימות 1 ו-2 או משימות 1 ו-3 אז האפשרות הראשונה היא עדיפה. אוסף ההתאמות צריך להיות מקסימלי, כלומר אם הצלחתם "להתאים" משימות 1, 2, ו-5, אבל ניתן בנוסף "להתאים" את משימה 6, אז אוסף ההתאמות שלכם הוא אינו מקסימלי. ניתן להשתמש בפונקציות אחרות מסעיף א'.

פתרון סעיף ב' 2 ClusterResult CreateMatching(Cluster c, Job* jobs, int num_jobs, Cluster** matches){ Boolean free_flag = FALSE; Cluster sub_cluster = NULL, match = NULL; ClusterResult result; if(c == NULL || jobs == NULL || num_jobs < 0 || matches == NULL) return BAD_PARAM; *matches = (Cluster*) malloc(sizeof(Cluster)*num_jobs); if (*matches == NULL) return OUT_OF_MEMORY; for (int i=0; i<num_jobs; i++){ result = IsJobRunnable(c, jobs[i], &match); assert(result == SUCCESS); (*matches)[i] = match; if (match !=NULL){ result = RemoveSubCluster(c, match, &sub_cluster); assert(result == SUCCESS); if (free_flag) DestroyCluster(c); c = sub_cluster; free_flag = TRUE; } } return SUCCESS; }

SmartFile - מבחן מבני נתונים מופשטים - ADT (35 נקודות) השאלה עוסקת ב ADT בשם SmartFile המשמש לכתיבה וקריאה מקבצים. ה SmartFile כותב וקורא מהקובץ בעזרת "ראש" המהווה מעין מצביע לתו מסוים בקובץ (אין קשר למצביע של C ). ניתן להעביר את ה"ראש" כך שיצביע על כל אחד מתווי הקובץ,וכל פעולות הקריאה, כתיבה ומחיקה מתבצעות ע"י ה"ראש" הנ"ל. על ה ADT לתמוך בפעולות הבאות: יצירת SmartFile חדש: ה SmartFile יאותחל לעבוד עם קובץ ששמו ינתן כפרמטר. הריסת ה SmartFile: שחרור המשאבים שהוקצו עבור ה SmartFile (כולל סגירת הקובץ). העברת הראש: הראש "יקפוץ" לתו הנמצא במרחק נתון מראש הקובץ או מסופו. קריאת תו מהקובץ: התו שיקרא יהיה התו עליו מצביע הראש. הראש יעבור לתו הבא. מחיקת תו מהקובץ: התו שימחק יהיה התו שנמצא לפני (מכיוון תחילת הקובץ) התו עליו מצביע הראש. קביעת סוג כתיבה: OVERRIDE (התו הנכתב יכתב במקום התו עליו מצביע הראש) או INSERT (התו הנכתב יכתב לפני התו עליו מצביע הראש). כתיבת תו בודד לקובץ: כתיבת תו בהתאם לסוג הכתיבה.

SmartFile הערות: שימו לב כי הראש אינו נע בכתיבה או מחיקה (מרחקו מסוף הקובץ אינו משתנה). הוספת תווים לקובץ מבוצעת ע"י קפיצה למרחק 0 מסוף הקובץ וכתיבה במצב INSERT. במיקום זה נמצא "אחרי התו האחרון", ומשמש רק לצורך הוספת תווים לסוף הקובץ. ביצירתSmartFile אם הקובץ ששמו ניתן קיים, אזי הקובץ יפתח וה"ראש" יצביע לתו הראשון בקובץ. אחרת, יווצר קובץ ריק בשם זה, והראש יעבור למרחק 0 מסוף הקובץ (מוכן להוספת תווים.) מצב הכתיבה בשני המקרים יהיה INSERT.

דוגמא: בהנחה כי לפני ריצת התוכנית לא קיים קובץ בשם "hello" אזי בסיומה יהיה קובץ בשם זה המכיל את הטקסט "Hey\nyou!" #include "SmartFile.h“ int main() { SF myfile; SFResult status; char c; status = SFCreate(&myfile, “hello”); if (status != SUCCESS) error (“can't create SmartFile\n”); status = SFPut (myfile, ‘H’); SFPut (myfile, ‘e’); SFPut(myfile, ‘k’); SFPut (myfile, ‘\n’); SFDestroy (myfile); SFCreate (&myfile, "hello"); status = SFJump (myfile, END, 0); SFPut (myfile, ‘y’); SFPut (myfile, ‘o’); SFPut (myfile, ‘u’);SFPut (myfile, ‘?’); SFDelete (myfile); SFPut (myfile, ‘!’); status = SFJump (myfile, START, 3); status = SFGet (myfile, &c); /* c is set to 'k' */ status = SFSetMode (myfile, OVERRIDE); SFPut (myfile, 'y'); SFDestroy (myfile); return 0; } Hek\n Hek\nyou? Hek\nyou! Hey\nyou!

SmartFile סעיף א ( 12 נקודות). בהסתמך על ההסבר וקטע הקוד הנתון, כתבו את הקובץ SmartFile.h המכיל את המנשק interface)) של ה ADT SmartFile.

סעיף א. # ifndef SMART_H #define SMART_H typedef struct SmartFile_t* SF ; typedef enum {INSERT, OVERRIDE} Mode; typedef enum {START, END} Base; typedef enum {SUCCESS, FAILURE, BAD_PARAM, … } SFResult ; SFResult SFCreate (SF* file, const char* filename); SFResult SFPut (SF file, char c); void SFDestroy (SF file); SFResult SFJump (SF file, Base base, int pos); SFResult SFDelete (SF file); SFResult SFGet (SF file, char* c); SFResult SFSetMode (SF file, Mode mode); #endif

סעיף ב' (20 נקודות) הוחלט להוסיף ל ADT פונקציה בשם SFUndo קריאה לפונקציה זו מבטלת את השנוי האחרון שבוצע בקובץ (כתיבת תווים לקובץ או מחיקתם ממנו, אין צורך לזכור את השינויים עקב פעולות Undo) מרגע ביצוע הקפיצה האחרונה או מפתיחת הקובץ אם לא בוצעה עדיין קפיצה. לדוגמא: #include "SmartFile.h" int main() { SFResult status ; SFCreate (&myfile, “hello"); SFJump (myfile, END,0); SFPut (myfile, ‘\n’);// Hey\nYou!\n SFPut (myfile, ‘W’); // Hey\nYou!\nW SFPut (myfile, ‘o’); // Hey\nYou!\nWo SFPut (myfile, ‘h’);// Hey\nYou!\nWoh status = SFUndo (myfile); // Hey\nYou!\nWo SFUndo (myfile); // Hey\nYou!\nW SFPut (myfile,'h'); // Hey\nYou!\nWh SFPut (myfile, ‘y’); // Hey\nYou!\nWhy SFPut (myfile, ‘$’); // Hey\nYou!\nWhy$ SFJump(myfile,END,1); SFSetMode(myfile,OVERRIDE); SFPut(myfile,'p'); // Hey\nYou!\nWhyp SFUndo(myfile); // Hey\nYou!\nWhy$ SFUndo(myfile); // nothing is done, only one change since jump SFPut(myfile,'?'); // Hey\nYou!\nWhy? SFDestroy (myfile); return 0; }

חלק 1 (2 נקודות) הוסיפו למנשק שכתבתם בסעיף א' את חתימת הפונקציה SFUndo. (אין צורך לכתוב את כל המנשק מחדש, אלא רק את חתימת הפונקציה). חלק 2 (10 נקודות) תארו באיזה מבנה נתונים תשתמשו בכדי לאפשר את פעולת ה Undo. (ניתן להיעזר בכל מבנה נתונים שנלמד בכיתה או בתירגול). אין צורך לכתוב את מבנה הנתונים, רק לתאר כיצד הוא פועל ואיזה נתונים ישמרו בו. הקפידו לתאר אילו שינויים ידרשו להתבצע בפונקציות SFPut, SFJump, SFSetMode ו SFDelete ובהגדרת המבנה SF בכדי לאפשר את פעולת ה SFUndo. זכרו כי אין צורך לשמור את השינויים הקורים עקב פעולת Undo. חלק 3 (8 נקודות) ממשו את הפונקציה: SFUndo בעזרת מבנה הנתונים שבחרתם בחלק הקודם. הנכם רשאים להיעזר בכל פונקציות הנמצאות במנשק של SF אשר כתבתם בסעיף א'. זכרו כי אין צורך לשמור את השינויים הקורים עקב פעולת Undo. סעיף ג (3 נקודות). תנו דוגמא לשלושה ( 3 ) קודי שגיאה אשר הפונקציות של המנשק SF עלולות להחזיר (ערכים אפשריים של SFResult), והסבירו את משמעותם. SmartFile

סעיף ב. חלק 1 SFResult SFUndo (SF file); חלק 2 נעזר במבנה הנתונים מחסנית אשר הוצג בכיתה ואשר יתווסף ל SF. במחסנית ישמר מבנה מטיפוס Oper שיוגדר כ: typedef enum {R,P,D} op; /* internal struct (not ADT) */ typedef struct Oper_t { op code; char old_char ; } Oper; op הנו קוד הפעולה שבוצעה: D - תו נמחק. ואזי old_char מכיל את התו שנמחק. P - תו נכתב. old_char אינו מוגדר. R - תו הוחלף, ואזי old_char מכיל את התו שהוחלף. פעולת ה SetMode לא תשתנה. בפעולת ה Delete נכניס למחסנית מבנה חדש שיכיל כ op את D ואת התו הנמחק. בפעולת ה Put נכניס למחסנית מבנה שיכיל רק P כ op אם אנו במצב insert, או את R כ op אם אנו במצב override. במצב זה גם נקבע את התו שעליו הצביע הראש כ old_char. בפעולת Jump, ו read (במהלך המבחן נאמר שיש להתייחס ל read כ jump) נרוקן את המחסנית. כמו כן, נשמור דגל אשר יאמר אם אנו מבצעים פעולת Undo (ואז כל הפעולות מתנהגות כמו בסעיף א' ואין צורך לשמור את השינויים במחסנית) או שאנו בפעולה רגילה.

חלק 1 (2 נקודות) הוסיפו למנשק שכתבתם בסעיף א' את חתימת הפונקציה SFUndo. (אין צורך לכתוב את כל המנשק מחדש, אלא רק את חתימת הפונקציה). חלק 2 (10 נקודות) תארו באיזה מבנה נתונים תשתמשו בכדי לאפשר את פעולת ה Undo. (ניתן להיעזר בכל מבנה נתונים שנלמד בכיתה או בתירגול). אין צורך לכתוב את מבנה הנתונים, רק לתאר כיצד הוא פועל ואיזה נתונים ישמרו בו. הקפידו לתאר אילו שינויים ידרשו להתבצע בפונקציות SFPut, SFJump, SFSetMode ו SFDelete ובהגדרת המבנה SF בכדי לאפשר את פעולת ה SFUndo. זכרו כי אין צורך לשמור את השינויים הקורים עקב פעולת Undo. חלק 3 (8 נקודות) ממשו את הפונקציה: SFUndo בעזרת מבנה הנתונים שבחרתם בחלק הקודם. הנכם רשאים להיעזר בכל פונקציות הנמצאות במנשק של SF אשר כתבתם בסעיף א'. זכרו כי אין צורך לשמור את השינויים הקורים עקב פעולת Undo. סעיף ג (3 נקודות). תנו דוגמא לשלושה ( 3 ) קודי שגיאה אשר הפונקציות של המנשק SF עלולות להחזיר (ערכים אפשריים של SFResult), והסבירו את משמעותם. SmartFile

חלק 3 SFResult SFUndo (SF file) { SFResult result; Oper rec; assert(file != NULL); Mode_t mode = file->mode ; result = pop (file->s,&rec); if (result == FAIL) return NoMoreOperation; file->flag = UNDO ; switch (rec.oper) { case P: // Put result = SFDelete(file); assert(result == SUCCESS); break; case R: // Replace result = SFSetMode(file, OVERRIDE); assert(result == SUCCESS); result = SFPut(file,rec.old_char); assert(result == SUCCESS); result = SFSetMode(file, mode); assert(result == SUCCESS); break; סעיף ב. ניתן לבצע הנחה סבירה כי ניתן לגשת לשדה זה והוא קיים, או שנדרוש כי במסגרת השינויים יתווספו פונקציות גישה לשדה זה.

case D: // Delete result = SFSetMode(file, INSERT); assert(result == SUCCESS); result = SFPut(file,rec.old_char); assert(result == SUCCESS); result = SFSetMode(file, mode); assert(result == SUCCESS); break; } file->flag=NOT_UNDO; return SUCCESS; } סעיף ב.

חלק 1 (2 נקודות) הוסיפו למנשק שכתבתם בסעיף א' את חתימת הפונקציה SFUndo. (אין צורך לכתוב את כל המנשק מחדש, אלא רק את חתימת הפונקציה). חלק 2 (10 נקודות) תארו באיזה מבנה נתונים תשתמשו בכדי לאפשר את פעולת ה Undo. (ניתן להיעזר בכל מבנה נתונים שנלמד בכיתה או בתירגול). אין צורך לכתוב את מבנה הנתונים, רק לתאר כיצד הוא פועל ואיזה נתונים ישמרו בו. הקפידו לתאר אילו שינויים ידרשו להתבצע בפונקציות SFPut, SFJump, SFSetMode ו SFDelete ובהגדרת המבנה SF בכדי לאפשר את פעולת ה SFUndo. זכרו כי אין צורך לשמור את השינויים הקורים עקב פעולת Undo. חלק 3 (8 נקודות) ממשו את הפונקציה: SFUndo בעזרת מבנה הנתונים שבחרתם בחלק הקודם. הנכם רשאים להיעזר בכל פונקציות הנמצאות במנשק של SF אשר כתבתם בסעיף א'. זכרו כי אין צורך לשמור את השינויים הקורים עקב פעולת Undo. סעיף ג (3 נקודות). תנו דוגמא לשלושה ( 3 ) קודי שגיאה אשר הפונקציות של המנשק SF עלולות להחזיר (ערכים אפשריים של SFResult), והסבירו את משמעותם. SmartFile

סעיף ג. BadJump – קפיצה מעבר לתחילת / סוף הקובץ. NoMoreOperation - אין יותר פעולות לבטל. CannotOpenFile – אין אפשרות לפתוח את הקובץ שניתן כפרמטר.