תרגול מס' 14

28
ססססס סס'14 - םםםםם םםםםםםםADT - םםםםם םםםםםםםBASH

Upload: hollis

Post on 12-Jan-2016

76 views

Category:

Documents


0 download

DESCRIPTION

תרגול מס' 14. שאלות ממבחנים - ADT שאלות ממבחנים - BASH. שאלות ממבחנים - ADT. שאלה 1 (מועד ב', אביב 2006). - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: תרגול מס'  14

14תרגול מס' - שאלות ממבחניםADT - שאלות ממבחניםBASH

Page 2: תרגול מס'  14

2מבוא לתכנות מערכות - 234122

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

Page 3: תרגול מס'  14

3מבוא לתכנות מערכות - 234122

(2006 )מועד ב', אביב 1שאלה

- מבני נתונים מופשטיםADT( 40)לצורך בקרת כניסה למתקן סודי של נקודות :המוסד הוחלט להקים מערכת המצלמת את פניהם של הבאים למתקן ומאפשרת את

כניסתם רק במידה והפנים זוהו כפנים של אחד העובדים. לכל עובד יש שם ומספר ת"ז )ייחודי(. בעת התקנת המערכת יצולם כל אחד מהעובדים

ממספר זוויות צילום שונות )יתכן מספר שונה של תמונות לכל עובד( והתמונות יישמרו במערכת.

-במנשק ומימוש המערכת נעזר בADT בשם Image המייצג תמונה דיגיטאלית ותומך בין היתר בפעולות הבאות:

–imageCopyהפונקציה מקבלת תמונה ומחזירה העתק שלה :

–imageDestroyמשחררת את כל משאבי התמונה :

–imagesSimilarity המשקף את מידת 1 ל- 0: מקבלת שתי תמונות ומחזירה מספר ממשי בין הדמיון בין התמונות.

ניתן להתייחס אלImageכאל "קופסא שחורה", אין צורך לתאר את מבנה הנתונים או המימוש שלו

Page 4: תרגול מס'  14

4מבוא לתכנות מערכות - 234122

)מועד ב', אביב 1שאלה 2006)

( '20סעיף א)ממשו את קובץ המנשק של המודול נקודות :SurveillanceSystem או בקיצור SurSys:על המנשק לתמוך בפונקציות הבאות בלבד .

.1CreateSurSys יצירת :SurSys.

.2AddWorker.)הוספת עובד חדש למערכת )הפונקציה מקבלת את שמו ות"ז שלו :

.3AddWorkerImage הוספת תמונה של עובד הקיים במערכת )מחזירה מספר סידורי לתמונה זו. מספר :זה הנו ייחודי לעובד זה בלבד, אולם יתכן כי לעובדים אחרים ישנן תמונות עם מספר סידורי זהה(

.4RemoveWorker)מחיקת עובד מהמערכת )כולל כל התמונות שלו :

.5RemoveWorkerImage מחיקת תמונה של עובד )על-פי ת"ז של העובד והמספר הסידורי של :התמונה(

.6GetWorkerImages.החזרת אוסף כל התמונות של עובד מסוים :

.7CheckSimilarity)...זיהוי עובד על סמך תמונה חדשה )הסבר בהמשך :

.8DestroySurSys-הריסת ה :SurSys.

'7פונקציה מס( מקבלת כפרמטר תמונה Image – ומספר )threshold על פונקציה זו 1 ל- 0 בין .( לכל תמונות העובדים שנשמרו imagesSimilarityלהשוות את התמונה )ע"י שימוש בפונקציה

הפונקציה תחזיר thresholdבמערכת. במידה ונמצאה תמונה שמידת הדמיון שלה גבוהה מה- ערך המשקף זיהוי מוצלח. אחרת, הפונקציה תחזיר ערך המשקף חוסר זיהוי. בנוסף, תחזיר

הפונקציה בכל מקרה את ת"ז ושמו של העובד עבורו נמצא הדמיון הגדול ביותר.

Page 5: תרגול מס'  14

5מבוא לתכנות מערכות - 234122

פתרון - סעיף א'#ifndef SURSYS_H#define SURSYS_H #include "image.h" #include <stdbool.h>

typedef struct SurSys_t *SurSys;typedef enum {SUR_SYS_SUCCESS, SUR_SYS_FAIL, SUR_SYS_OUT_OF_MEMORY,...} SurSysResult; 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,

bool* match, int* bestID, char** bestName);void DestroySurSys(SurSys system); #endif

Page 6: תרגול מס'  14

6מבוא לתכנות מערכות - 234122

)מועד ב', אביב 1שאלה 2006)

( '20סעיף ב)נקודות :, SurSys.c כפי שיופיע בקובץ SurSysהציגו את מבנה הנתונים של נקודות( 8)1.

עם כל ההגדרות הנלוות הנדרשות. אין צורך לממש אף פונקציה בסעיף זה.

מסעיף א' על פי מבנה הנתונים שבחרתם 7ממשו את פונקציה נקודות( 9)2.. על המימוש להיות נכון ויעיל. המימוש צריך לתאר את 1בסעיף ב'

האלגוריתם העיקרי במלואו )בפונקציה אחת או יותר(, אין צורך לממש בסיסיים וגם לא פונקציות מנשק אחרות של ADTsפונקציות מנשק של

SurSys.

( SurSys קודי שגיאה אפשריים שונים )ספציפיים ל-3ציינו נקודות( 3)3.המוחזרים ע"י פונקציות המנשק )אין לציין "בעיה בהקצאת זיכרון", וגם לא

בסיסיים(.ADT(s)קודי שגיאה של

Page 7: תרגול מס'  14

7מבוא לתכנות מערכות - 234122

1פתרון - סעיף ב' #include "SurSys.h"#include "set.h" /* the struct of the ADT */struct SurSys_t {

Set workers;}; /* internal struct (not ADT) */typedef struct Worker_t {

int id;char* name;Set workerImages;

} Worker; /* internal struct (not ADT) */typedef struct WorkerImage_t {

int id;Image image;

} WorkerImage;

Page 8: תרגול מס'  14

8מבוא לתכנות מערכות - 234122

2פתרון -סעיף ב' SurSysResult CheckSimilarity(SurSys system, Image image, double threshold,

bool* match, int* id, char** name) {

if (system == NULL || match == NULL || id == NULL || name == NULL || image == NULL)

return SUR_SYS_BAD_PARAM;

if (threshold < 0 || threshold > 1)

return SUR_SYS_INVALID_THRESHOLD;

double maxSimilarity = 0.0;

char* tempName = NULL;

SET_FOREACH(Worker, worker, system->workers) {

SET_FOREACH(WorkerImage, image, worker->workerImages) {

double similarity = imagesSimilarity(image->image, image);

if (similarity > maxSimilarity) {

maxSimilarity = similarity;

*id = worker->id;

tempName = worker->name;}}

}

Page 9: תרגול מס'  14

9מבוא לתכנות מערכות - 234122

- המשך2פתרון - סעיף ב' if (tempName != NULL) {

*name = malloc(strlen(tempName) + 1);

if (*name == NULL)

return SUR_SYS_OUT_OF_MEMORY;

strcpy(*name, tempName);

}

*match = maxSimilarity > threshold;

return SUR_SYS_SUCCESS;

}

Page 10: תרגול מס'  14

10מבוא לתכנות מערכות - 234122

3פתרון - סעיף ב'

:קודי שגיאה אפשריים SUR_SYS_INVALID_THRESHOLD SUR_SYS_IMAGE_DOESNT_EXIST SUR_SYS_WORKER_ALREADY_EXISTS

Page 11: תרגול מס'  14

11מבוא לתכנות מערכות - 234122

2שאלה

ברשותנו הקובץstudent.h המגדיר את המחלקה Student.++, C ולא של Cמכיוון שבמחשב עליו אתם עובדים יש רק מהדר של

שיכלול את אותה פונקציונליות כמו Student בשםADTעליכם לכתוב.Studentהמחלקה

עליכם לחלק את הקוד בין שני קבציםstudent_adt.h-ו student_adt.c ולציין איזה חלק של הקוד יכלול כל קובץ.

מתאיםset.h ושקיים course_adt.hהניחו שמישהו אחר כבר כתב את –

const correctnessאין צורך להקפיד על –אין צורך לממש את הפונקציות–

Page 12: תרגול מס'  14

12מבוא לתכנות מערכות - 234122

2שאלה #ifndef STUDENT_H_#define STUDENT_H_#include "course.h"#include <set>

class Student {enum { MAX_COURSES = 30 };char* name;Course *courses[MAX_COURSES];int numCourses;double calculateAverageGrade();

public:Student(const char*);~Student();void addCourse(const Course&);void removeCourse(const Course&);double getAverage() const ;const char* getName() const ;set<Course> getFailedCourses();bool isHonorsStudent() const ;friend bool operator<(const Student&, const Student&); // order by nameclass NoCoursesException {}; // the student has no courses yetclass HasAllCoursesException {}; // the student has MAX_COURSES coursesclass CourseExistsException {}; // the student already took the courseclass CourseMissingException {}; // the student is not registered to the course

};

#endif /* STUDENT_H_ */

Page 13: תרגול מס'  14

13מבוא לתכנות מערכות - 234122

student_adt.h – 2שאלה #ifndef STUDENT_H_#define STUDENT_H_#include "course_adt.h"#include "set.h" typedef struct student_t* Student;typedef enum { STUDENT_SUCCESS, STUDENT_NULL_ARG, STUDENT_OUT_OF_MEMORY,

STUDENT_NO_COURSES, STUDENT_HAS_ALL_COURSES, STUDENT_COURSE_EXISTS,STUDENT_COURSE_MISSING

} StudentResult; Student studentCreate(const char*);void studentDestroy(Student);StudentResult studentAddCourse(Student, Course);StudentResult studentRemoveCourse(Student, Course);StudentResult studentGetAverage(Student, double* result);const char* studentGetName(Student);StudentResult studentGetFailedCourses(Student, Set* result);bool studentIsHonored(Student);int studentCompare(Student, Student); #endif /* STUDENT_H_ */

Page 14: תרגול מס'  14

14מבוא לתכנות מערכות - 234122

student_adt.c – 2שאלה

#include "student_adt.h"

#define MAX_COURSES 30

 

struct student_t {

char* name;

Course *courses[MAX_COURSES];

int numCourses;

};

Page 15: תרגול מס'  14

15מבוא לתכנות מערכות - 234122

3שאלה ( של מספרים שלמים )דו-כיוונית( נתון מימוש פשוט של רשימה מקושרתint)

תזכורת: ברשימה דו-כיוונית לכל צומת יש שני מצביעים - אחד לצומת שאחריו ואחר לצומת אשר –.NULLלפניו. אם לא קיים כזה צומת אזי המצביע מכיל

typedef struct node_t *Node;struct node_t {

int n;Node next;Node previous;

};

כיתבו פונקציה המקבלת רשימה מקושרת שכזו ומסירה ממנה צמתים כך שכל מספר שהופיעברשימה לפני הרצת הפונקציה מופיע בדיוק פעם אחת ברשימה לאחר הרצת הפונקציה

( לאחר הרצת הפונקציה3 2 1( תהפוך ל-)2 3 2 2 1למשל הרשימה )–

:הערותאין צורך לשמור על סדר כלשהו ברשימה–

ניתן להניח כי כל הצמתים של הרשימה הוקצו דינאמית ואינם בשימוש במקום אחר–

Page 16: תרגול מס'  14

16מבוא לתכנות מערכות - 234122

- פתרון3שאלה void removeByValue(Node head, int n) {

for(Node ptr = head; ptr ; ptr = ptr->next) {

if (ptr->n != n) {

continue;

}

if (ptr->previous) {

ptr->previous->next = ptr->next;

}

if (ptr->next) {

ptr->next->previous = ptr->previous;

}

Node tmp = ptr;

ptr = ptr->previous;

free(tmp);

}

}

 

Node removeDuplicates(Node head) {

for(Node ptr = head; ptr; ptr = ptr->next) {

removeByValue(ptr->next, ptr->n);

}

return head;

}

Page 17: תרגול מס'  14

17מבוא לתכנות מערכות - 234122

4שאלה :נתון פונקציה גנרית )טמפלייט( למיון מערך

template <class T>void bubble_sort(T* array, int size) {

for(int i = 0; i < size; i++) {

for(int j = 0; j < size - 1; j++) {

if (array[j+1] < array[j]) {

T temp = array[j];

array[j] = array[j+1];

array[j+1] = temp;}

}}

}

מסתבר שבמחשב שברשותנו יש רק מהדר שלC ולא של C ועלינו להחליף את כל הקוד הגנרי ,++.C++- בקוד גנרי שיעבור הידור ב-Cב

-כיצד תראה הפונקציה הגנרית הממיינת מערך בC?שימו לב שהפונקציה אמורה להתאים לכל טיפוס שניתן למיון ולא רק לטיפוסים בסיסיים.–

הסבירו כל פרמטר שהפונקציה מקבלת.–

Page 18: תרגול מס'  14

18מבוא לתכנות מערכות - 234122

- פתרון4שאלה void bubble_sort(void** array, int size, int (*compare)(void*, void*)) {

for(int i = 0; i < size; i++) {

for(int j = 0; j < size - 1; j++) {

if (compare(array[j+1],array[j]) > 0) {

void* temp = array[j];

array[j] = array[j+1];

array[j+1] = temp;

}

}

}

}

:פירוש הפרמטרים לפונקציה–arrayהוא מערך העצמים כאשר כל איבר הוא מצביע לעצם כלשהו

–sizeהוא גודל המערך

–compare הוא מצביע לפונקציה המשווה בין שני עצמים ומחזירה מספר המייצג את הסדר עבור מחרוזות למשל(strcmpביניהם )כמו

Page 19: תרגול מס'  14

19מבוא לתכנות מערכות - 234122

- המשך4שאלה

:נניח שמוגדר הטיפוס הבא המכיל נתוני סטודנטstruct student_t {

int id;

char *name;

};

typedef student_t* Student;

אנו רוצים למיין סטודנטים לפי מספר ת"ז שלהם. מה צריך להגדיר עבורהטיפוס הזה כדי שניתן יהיה להשתמש בפונקציה שכתבנו למיון מערך של

סטודנטים?כתבו את הקריאה לפונקצית המיון ואת הקוד הנדרש כך שקריאה זו –

תתקמפל.

Page 20: תרגול מס'  14

20מבוא לתכנות מערכות - 234122

- פתרון4שאלה

עלינו לממש פונקצית השוואה מתאימה אשר משווה סטודנטים לפימספר ת"ז שלהם:

int studentCompare(void* a, void* b) {

Student student1 = a;

Student student2 = b;

return student1->id - student2->id;

}

:הקריאה לפונקציה )בהינתן מערך וגודלו( תיראה כך

bubble_sort(array, n, studentCompare);

Page 21: תרגול מס'  14

21מבוא לתכנות מערכות - 234122

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

Page 22: תרגול מס'  14

22מבוא לתכנות מערכות - 234122

1שאלה

למשה יש מאגר גדול של מסמכים תחת התיקיהdocs ובמשך עבודתו הוא המכילים מילה docsצריך פעמים רבות למצוא את כל המסמכים תחת

מסוימת..docsבכל השאלה יש להניח שאנו ממוקמים בתיקית האב של התיקיה –

:'ניתן להשתמש ב-פקודת טרמינל יחידהכתבו סעיף א( pipeline אשר ) המכילים את המילה docsמציגה את שמות הקבצים השונים בתיקיה

"banana כמילה עצמאית )לא תת מילה(. אם אין כאלו קבצים הפקודה "אינה מדפיסה כלום.

.grep של הפקודה lבסעיף זה אין להשתמש בדגל -–

קיימים מספר קבצים.docsניתן להניח שתחת התיקיה –

grep "banana" -w docs/* | cut -d":" -f1 | uniq

Page 23: תרגול מס'  14

23מבוא לתכנות מערכות - 234122

- המשך1שאלה מסתבר שבגלל ריבוי המסמכים ביצוע הפקודה שהצעתם בסעיף א' לוקח יותר מדי זמן )משה

לא ידוע בסבלנותו( ולכן משה חשב על הפתרון הבא:במקום לחפש את המילה בכל המסמכים בכל פעם מחדש, משה יכתוב תסריט אשר יוצר אינדקס –

שיאפשר חיפוש מהיר. לאחר קצת חשיבה משה החליט לממש את האינדקס כך:

indexליצור את התיקיה • index יווצר קובץ בשמה תחת התיקיה docsלכל מילה אשר מופיעה בלפחות מסמך אחד ב-•

אשר יכיל את רשימת הקבצים בהם היא מופיעה

אז juices.txt ו-docs: fruits.txt, monkies.txt מסמכים ב-3" מופיעה ב-appleלמשל, אם המילה "• אשר תוכנו יהיה:apple יווצר קובץ בשם indexתחת התיקיה

monkies.txt

fruits.txt

juices.txt

:'בהינתן אינדקס שכזה תחת התיקיה סעיף ב index כתבו את הפקודה החדשה להצגת ," כמו בסעיף א'bananaשמות הקבצים השונים המכילים את המילה "

if [[ -f index/banana ]] ; then cat index/banana; fi

Page 24: תרגול מס'  14

24מבוא לתכנות מערכות - 234122

- המשך1שאלה

כתבו את התסריטmake-index אשר בונה את התיקיה index כך שתכיל .docsקובץ לכל מילה המופיעה במסמך כלשהו בתיקיה

)והיאdocsניתן להניח שכל המסמכים נמצאים ישירות תחת התיקיה –אינה מכילה תיקיות נוספות(

#!/bin/bashfunction addToIndex {

while read -a line; do for word in ${line[*]}; do if [[ ! (-f index/$word ) || ( `grep $1 index/$word` == "" ) ]] ; then echo $1 >> index/$word fi donedone

}mkdir indexfor f in `ls docs`; do cat docs/$f | addToIndex $fdone

make-index

Page 25: תרגול מס'  14

25מבוא לתכנות מערכות - 234122

2שאלה

הינכם נדרשים לכתוב תסריט בשםcreate_makefile אשר מייצר קובץ Makefileבצורה אוטומטית

C (*.h, *.c)יש להניח כי בספריית העבודה קיימים רק קבצי קוד מקור בשפת – בצורה תקינה ושאין שגיאות תחביר includeיש להניח כי הקבצים מבצעים–

בקבצים

שם המטרה הראשית )קובץ ההרצה( ינתן כפרמטר לתסריט–

אין להשתמש בקבצים זמניים–

הקובץ שיווצר צריך לעמוד במספר כללים אשר מפורטים בדוגמה ובהמשך–

Page 26: תרגול מס'  14

26מבוא לתכנות מערכות - 234122

2שאלה קבצים – 4דוגמה: בספריית העבודה קיימים a.c, a.h, b.c, b.hאשר תוכנם נתון להלן

עבור הפרויקט הנתון הרצת הפקודהcreate_makefile prog תיצור קובץ בשם Makefile בעל התוכן הבא.

שימו לב כי הינכם נדרשים להגדיר מאקרו עבור–הקומפיילר ועבור רשימת קבצי האובייקט.

בקובץ הפלט תהיה מטרה עבור כל קובץ ובנוסף מטרה– עבור קובץ ההרצה אשר שמה זהה לפרמטר שמועבר

לתסריט.

gcc –MM *.cהנחייה: השתמשו בפלט של הפקודה –.Makefileכדי ליצור שלד ממנו תיצרו את קובץ ה –

a.c:#include "a.h"int main() { return 0;}

a.h:#include

<stdio.h>

b.c:#include "b.h"void f() {}

b.h:#include "a.h"void f;)(

CC=gccOBJS=a.o b.o prog: $(OBJS) $(CC) a.o b.o -o prog a.o: a.c a.h $(CC) -c a.c b.o: b.c b.h a.h $(CC) -c b.c

Page 27: תרגול מס'  14

27מבוא לתכנות מערכות - 234122

- פתרון2שאלה #!/bin/bashfunction print_makefile {

echo CC=gccobjs=`gcc -MM *.c | grep ":" | cut -f1 -d":"`echo OBJS=$objsecho $1: '$OBJS'echo ' $(CC)' $objs -o $1echowhile read –a line; do echo ${line[*]} echo -n ' $(CC) –c ' for f in ${line[*]}:2; do if [[ "$f" = *.c ]] ; then echo -n "$f "

fi done echodone

}gcc -MM *.c | print_makefile $1 > makefile

create_makefile

Page 28: תרגול מס'  14

28מבוא לתכנות מערכות - 234122

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