Presentation is loading. Please wait.

Presentation is loading. Please wait.

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

Similar presentations


Presentation on theme: "שאלות ממבחנים לי-טל משיח"— Presentation transcript:

1 שאלות ממבחנים לי-טל משיח litalma@cs.technion.ac.il

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

3 מבחן מועד ב' סמסטר אביב 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 הפונקציה תחזיר ערך המשקף זיהוי מוצלח. אחרת, הפונקציה תחזיר ערך המשקף חוסר זיהוי. בנוסף, תחזיר הפונקציה בכל מקרה את ת"ז ושמו של העובד עבורו נמצא הדמיון הגדול ביותר.

4 פתרון סעיף א' #ifndef SURSYS_H #define SURSYS_H #include "image.h" typedef enum {FALSE, TRUE} Boolean; typedef enum {SUR_SYS_SUCCESS, SUR_SYS_FAIL, SUR_SYS_OUT_OF_MEMORY,... } 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

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

6 פתרון סעיף ב' 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

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

8 פתרון סעיף ב' 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 SUR_SYS_BAD_PARAM; if (threshold 1) return SUR_SYS_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 SUR_SYS_OUT_OF_MEMORY; strcpy(*name, tmpName); } if (maxSimilarity > threshold) *match = TRUE; else *match = FALSE; return SUR_SYS_SUCCESS; }

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

10 פתרון סעיף ב' 3 SUR_SYS_INVALID_THRESHOLD SUR_SYS_IMAGE_DOESNT_EXIST SUR_SYS_WORKER_ALREADY_EXISTS

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

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

13 פתרון סעיף א' #ifndef CLUSTER_H #define CLUSTER_H typedef enum {FALSE, TRUE} Boolean; typedef enum {CLUSTER_SUCCESS, CLUSTER_FAIL, CLUSTER_OUT_OF_MEMORY, CLUSTER_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;

14 פתרון סעיף א' המשך 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 in case the job is not runnable ClusterResult CreateMatching(Cluster c, Job* jobs, int num_jobs, Cluster** matches); #endif

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

16 פתרון סעיף ב' 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:

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

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

19 שאלות ממבחנים לי-טל משיח litalma@cs.technion.ac.il

20 מבחן 21.7.95 כתוב תוכנית ב - cshell ששמהarrange אשר מעבירה קבצים מהמדריך הנוכחי (שאינם מדריכים) לתוך תת-מדריכים לפי הכללים הבאים: לכל קובץ שאינו מדריך, 1.אם קיים תת-מדריך למדריך הנוכחי ששמו זהה ל-4 האותיות הראשונות בשם הקובץ, הקובץ יועבר לתוך המדריך. (שים לב שהכוונה להעברת הקובץ ולא להעתקתו). 2.אם תנאי 1 לא מתקיים, וקיימים לפחות שני קבצים נוספים במדריך הנוכחי שאינם מדריכים, כך ש-4 האותיות הראשונות בשמם זהות ל-4 האותיות הראשונות בשם הקובץ, התוכנית תיצור תת-מדריך חדש ששמו זהה ל-4 האותיות הראשונות בשם הקובץ, והקובץ יועבר לתוך תת-מדריך זה.

21 מבחן 21.7.95 דוגמה: אם במדריך הנוכחי קיימים הקבצים הבאים: file1 file2 file3 prog1 prog2 prog script1 script2 כאשר רק הקובץ prog הינו מדריך, file1prog1prog2progscript1script2file2file3

22 מבחן 21.7.95 אזי לאחר הפעלת התוכנית arrange במדריך הנוכחי, יהיו הקבצים הבאים במדריך זה: file script1 script2 prog כאשר רק file ו – prog הינם מדריכים. במדריך file יהיו הקבצים file1 file2 file3, ובמדריך prog יהיו הקבצים prog1 ו - prog2 (בנוסף לקבצים שהיו בתוכו לפני הפעלת התוכנית arrange). file1 file prog1 prog2 progscript1 script2 file2file3

23 מבחן 21.7.95 הנחות: 1.ניתן להניח שבמדריך הנוכחי לא קיימים קבצים ששמם מתחיל ב - temp. 2.ניתן להניח שמותר לבצעoverwrite לקבצים קיימים במידה ויש צורך בכך. 3.בפתרון מותר להיעזר בקובץ ביניים אחד ולא יותר.אין הגבלה על מספר קבצי ה- script.

24 פתרון ראשון #!/usr/local/bin/tcsh -f foreach f (*) if (-f $f) then set a = `echo $f | cut -c1-4` echo $a >>! temp_file endif end foreach f (*) if (-f $f) then set a = `echo $f | cut -c1-4` if (-d $a) then mv $f $a else set b = `grep $a temp_file| wc -l` if ($b > 2) then mkdir $a mv $f $a endif end נשמור בקובץ בשם temp_file את 4 האותיות הראשונות בשמו של כל קובץ. לאחר מכן נעבור על כל הקבצים מחדש ונעבירם למדריך ששמו כארבעת האותיות הראשונות בשמם, אם קיים כזה מדריך או שישנם יותר משני קבצים אשר שמם מתחיל באותן ארבע אותיות.

25 פתרון שני arrange #!/usr/local/bin/tcsh -f FirstFourLetters | sort | uniq –c | MakeDirs InsertToDirs FirstFourLetters #!/usr/local/bin/tcsh -f foreach F (*) if (-f $F) then echo $F | cut –c1-4 endif end ראשית ניצור "רשימה" שתכיל את ארבעת האותיות הראשונות בכל קובץ (FirstFourLetters). לאחר מכן נספור את התחיליות. עבור כל תחילית אשר מופיעה יותר מפעמיים נייצר מדריך כשם התחילית, במידה שלא קיים עדיין, (MakeDirs). בסופו של דבר נעביר כל קובץ אשר קיים מדריך ששמו כארבע האותיות הראשונות בשם הקובץ ל directory זה.

26 פתרון שני MakeDirs #!/usr/local/bin/tcsh -f set line = ($<) while ($#line >0) if ($line[1] > 2) then if !( -d $line[2] ) then mkdir $line[2] endif set line = ($<) end InsertToDirs #!/usr/local/bin/tcsh -f foreach F (*) if (-f $F) then set init = `echo $F | cut –c1-4` if (-d $init) then mv $F $init endif end ראשית ניצור "רשימה" שתכיל את ארבעת האותיות הראשונות בכל קובץ (FirstFourLetters). לאחר מכן נספור את התחיליות. עבור כל תחילית אשר מופיעה יותר מפעמיים נייצר מדריך כשם התחילית, במידה שלא קיים עדיין, (MakeDirs). בסופו של דבר נעביר כל קובץ אשר קיים מדריך ששמו כארבע האותיות הראשונות בשם הקובץ ל directory זה.

27 מבחן מועד ג' סמסטר אביב 06 חברת Moogle, שהחליטה זה מכבר לפתוח סניף בחיפה, הכריזה על יום ראיונות בפקולטה למדעי המחשב בטכניון (אשר בהם יכולים להשתתף רק בוגרי קורס מת"ם כמובן). במהלך הראיונות נוכחים מספר מראיינים ובינהם גם מנהל Moogle. כל מראיין נותן ציון למרואיין בין 0 ל-100. הציון הסופי יקבע ע"י שיקלול כל הציונים. למנהל יש זכות וטו ולא יתכן כי יתקבל לעבודה מרואיין שהמנהל החליט לא לקבל. בסיום הראיונות כל מראיין מכין קובץ בפורמט הבא על האנשים אותם הוא ראיין: כאשר השדות מופרדים זה מיזה בטאבים. שם הקובץ הינו.grades. FULL NAME<>GRADE<

28 מבחן מועד ג' סמסטר אביב 06 031243129Moshe Levi60 444422267Shimon Cohen90 555782311David David100 031243129Moshe Levi57 555782311 David David-NO- 444422267 Shimon Cohen80 דוגמה לקובץ בשם :eyal.grades הקובץ של מנהל Moogle יקרא Moogle.grades ויכול להראות כך:

29 מבחן מועד ג' סמסטר אביב 06 עליכם לכתוב סקריפט בשם BestToWork אשר ינתח את הקבצים הללו ויחזיר את קבוצת המרואיינים הטובים ביותר. הסקריפט יקבל כפרמטר את מס' מקומות העבודה הפנויים ויחזיר מס' שכזה של מרואיינים מצטיינים ממויינים לפי מידת ההצלחה. במיקרה שאין מספיק מרואיינים שהתראיינו / עברו את הראיון, תוחזר הודעה: “not enough interviewees” לדוגמה, עבור שורת ההרצה:BestToWork 2 על שני הקבצים שבדוגמה, נקבל: 1) 444422267 Shimon Cohen 2) 031243129 Moshe Levi

30 מבחן מועד ג' סמסטר אביב 06 הערות : הניחו כי קבצי הקלט קיימים ותקינים ניתן להניח שאותם מראיינים ראיינו את כל האנשים אין להשתמש בקבצים זמניים ניתן להשתמש במספר לא מוגבל של תסריטים

31 פתרון #! /bin/tcsh -f if (`cat Moogle.grades | grep -v "\-NO\-" | wc -l` < $1) then echo "not enough interviewees" else cat Moogle.grades | grep -v "\-NO\-" | CalcGrades | \ sort -n -r -k 4 | PrintBest | head -$1 endif BestToWork:

32 המשך פתרון #! /bin/tcsh -f set line = ($<) while (${#line} != 0) set grade = `cat *.grades | grep $line[1] | CalcOneGrade` # $line[1] is ID, $line[2] is the first name, $line[3] is the last name echo $line[1] $line[2] $line[3] $grade set line = ($<) end CalcGrades:

33 המשך פתרון #! /bin/tcsh -f set line = ($<) set total_grade = 0 while (${#line} != 0) @ total_grade+= `echo $line | cut -d” “ -f4` set line = ($<) end echo $total_grade CalcOneGrade:

34 המשך פתרון #! /bin/tcsh -f set line = ($<) set num = 1 while (${#line} != 0) echo "${num}) $line[1] $line[2] $line[3]" @ num++ set line = ($<) end PrintBest:

35 בהצלחה במבחנים !


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

Similar presentations


Ads by Google