You are on page 1of 8

‫תאריך המבחן‪ :‬כ"ז תמוז תשע"ט ‪30/7/19‬‬ ‫אוניברסיטת בן גוריון בנגב‬

‫שמות המורה‪ :‬ציון סיקסיק‬


‫תכנות מתקדם‬ ‫מבחן ב‪:‬‬
‫‪371-1-1662‬‬ ‫מס' הקורס ‪:‬‬ ‫מספר נבחן ‪:‬‬
‫מיועד לתלמידי‪ :‬הנדסת מערכות תקשורת‬
‫מועד ב'‬ ‫סמ' ב'‬ ‫שנה תשע"ט‬
‫משך הבחינה ‪ 3 :‬שעות‬
‫דף פוליו אחד לא מודפס‬ ‫חומר עזר ‪:‬‬
‫ולא מצולם‪ .‬אין להשתמש במחשבון‪.‬‬

‫במבחן זה ‪ 5‬שאלות‬ ‫‪‬‬

‫‪ ‬רשמו תשובותיכם בדפי התשובות בלבד‬

‫מחברת הטיוטה לא תימסר לבדיקה‬ ‫‪‬‬

‫‪ ‬בסיום המבחן נאסוף רק את דפי התשובות‬

‫מותר להגדיר פונקציות עזר בכל השאלות‪ ,‬אלא אם נאמר אחרת‪.‬‬ ‫‪‬‬

‫כתבו קוד קריא והקפידו על אינדנטציה והערות (בעברית)‪.‬‬ ‫‪‬‬

‫בהצלחה!‬ ‫‪‬‬

‫‪1‬‬
‫שאלה ‪ 20( 1‬נקודות)‬
‫סעיף א'‪ 3( .‬נקודות)‬
‫עליכם לממש את המחלקה "מחסנית מינימום" ‪ MinStack‬כולל השדות שלה והכרזות על השיטות‬
‫הנצרכות‪.‬‬
‫המחלקה ‪ MinStack‬מכילה אובייקטים כלשהם מאותו סוג (רמז‪ :‬השתמשו בתבניות)‪.‬‬
‫ניתן להשתמש במחלקה ‪ Stack‬המצורפת (אין צורך לממש מחלקה זו)‪ ,‬אולם אין להגדיר או‬
‫להשתמש במחלקות נוספות מלבד שתי המחלקות האלה‪.‬‬

‫רמז חשוב‪ MinStack :‬יכולה להכיל מחסנית פנימית שתשמור את הערכים המינימליים הנוכחיים‬

‫סעיף ב'‪ 2( .‬נקודות)‬


‫ממשו את הבנאי הדיפולטיבי וההורס של המחלקה ‪.MinStack‬‬

‫בנוסף יש לממש את השיטות (המתודות) הבסיסיות של המחלקה‪:‬‬ ‫‪‬‬


‫סעיף ג'‪( .‬נקודה אחת)‬
‫‪ - isEmpty‬שיטה המחזירה ‪ true‬אם "מחסנית המינימום" ריקה‪.‬‬

‫סעיף ד'‪ 6( .‬נקודות)‬


‫‪ - push‬שיטה המכניסה איבר למחסנית‬

‫סעיף ה'‪ 3( .‬נקודות)‬


‫‪ – pop‬שיטה המוציאה איבר מהמחסנית לפי ‪( LIFO‬כלומר האיבר שיוצא הוא האחרון שהוכנס‬
‫למחסנית)‪ .‬שימו לב‪ :‬שיטה זו זורקת חריגה במידה והמחסנית ריקה‪.‬‬

‫סעיף ו'‪( .‬נקודה אחת)‬


‫‪ -Min‬שיטה המחזירה את האיבר המינימלי הקיים במחסנית כעת (ללא הוצאתו) כמובן ב‪O(1)-‬‬

‫סעיף ז'‪ 4( .‬נקודות)‬


‫הדגמת שימוש ב‪ MinStack-‬בפונקצית ‪ ,main‬כולל שימוש בבנאי והורס‪ ,‬ובכל השיטות הנ"ל‪.‬‬
‫שימו לב שהשיטה ‪ pop‬עלולה "לזרוק" חריגה‪.‬‬

‫‪2‬‬
‫שאלה ‪ 20( 2‬נקודות)‬
‫מה פלט של קטעי קוד הבאים‪ .‬במידה וישנה שגיאה עליכם לפרט בקצרה מה סוג השגיאה‪.‬‬

‫סעיף ב'‪ 4( .‬נקודות)‬ ‫סעיף א'‪ 4( .‬נקודות)‬

‫סעיף ד'‪ 4( .‬נקודות)‬ ‫סעיף ג'‪ 4( .‬נקודות)‬

‫‪3‬‬
‫סעיף ה'‪ 4( .‬נקודות)‬

‫‪4‬‬
‫שאלה ‪ 18( 3‬נקודות)‬
‫נתון קטע הקוד הבא‪ .‬בכל סעיף עליך לרשום בדפי התשובות את מס' הסעיף ואת הפלט של הקוד תוך‬
‫החלפת שורת\שורות הקוד בשורה\שורות הנתונות בסעיף לפי מספרי השורות (כלומר ללא‬
‫התחשבות בסעיפים הקודמים(‪.‬‬
‫שימו לב‪ :‬ייתכן שהתשובה היא שגיאת קומפילציה \ שגיאת ריצה‪ ,‬במקרה כזה עליכם לפרט את סיבת‬
‫השגיאה‪.‬‬

‫‪ .1‬פלט (ללא שינוי בקוד)‬


‫‪.2‬‬

‫‪.3‬‬

‫‪.4‬‬

‫‪.5‬‬

‫‪.6‬‬

‫‪.7‬‬

‫‪.8‬‬

‫‪.9‬‬

‫‪5‬‬
)‫ נקודות‬20( C ‫ שפת‬4 ‫שאלה‬
:‫נתונה ההגדרה הבאה של מבנה ברשימה משורשרת‬
typedef struct item item;
struct item{
int value;
item *next;
};
‫ מקבלת כארגומנטים את‬void rebuild(item* list1, item* list2, int num) ‫הפונקציה‬
.‫ מספר שלם‬num -‫ ו‬,‫ראשים של שתי רשימות משורשרות‬r‫ה‬
num ‫ את הערך‬value ‫ הפונקציה מחליפה כל מבנה שמכיל בשדה‬list1 ‫עבור הרשימה של‬
.list2-‫ברשימה הלא ריקה המתחילה ב‬

:‫ עבור‬,‫לדוגמה‬
list1  1  4  5  4  2  NULL
list2  7  8  6  NULL
num = 4
:‫נקבל את הרשימה‬
list1  1  7  8  6  5  7  8  6  2  NULL
:‫ ?? ) בפונקציה הבאה‬N ??- ‫השלמו את הקטעים החסרים (המסומנים ב‬

void rebuild(item* list1, item* list2, int num){


item *temp ,*temp2;

while( list1 ){
if( ?? 1 ?? ){
list1->value = ?? 2 ?? ;
temp2 = ?? 3 ?? ;
for( ?? 4 ?? ; ?? 5 ?? ; temp = temp ->next){
list1 ->next = ?? 6 ?? ;
list1 = ?? 7 ?? ;
?? 8 ?? ;
}
list1 -> next = ?? 9 ?? ;
}
?? 10 ?? ;
}
}

6
‫שאלה ‪ 5‬שפת ‪ 25 ( C‬נקודות)‬

‫האוניברסיטה ביקשה ממכם לפתח מערכת שתעזור לסטודנט בכל סמסטר לבחור בקלות קורסי‬
‫בחירה‪.‬‬

‫מוגדר קובץ כל הקורסים הניתנים באוניברסיטה‪ ,‬כל שורה בקובץ מכילה את הפרטים הבאים‪:‬‬
‫– ‪ 20‬תווים‬ ‫‪ ‬שם הקורס‬
‫– ‪ 8‬ספרות‬ ‫‪ ‬מס‪ .‬הקורס‬
‫– ספרה אחת (‪ 1‬יום א'‪ 2 ,‬יום ב'‪)....‬‬ ‫‪ ‬יום בשבוע‬
‫– ‪ 2‬ספרות‬ ‫‪ ‬שעת התחלה‬
‫– ‪ 2‬ספרות‬ ‫‪ ‬שעת סיום‬
‫‪ ‬תאריך עדכון הפרטים – ‪ 8‬ספרות‬
‫הקובץ ממוין לפי מס' קורס בסדר עולה‪( .‬מניחים שכל קורס ניתן פעם בשבוע בלבד)‬

‫עבור כל מסלול בכל מחלקה מוגדר קובץ המכיל פרטי קורסי בחירה שסטודנט במסלול‬
‫רשאי לקחת‪ ,‬כל שורה בקובץ מכילה את הפרטים הבאים‪:‬‬
‫– ‪ 8‬ספרות‬ ‫‪ ‬מס‪ .‬הקורס‬
‫– ‪ 2‬ספרות‬ ‫‪ ‬נקודות זיכוי‬
‫‪ ‬תאריך עדכון הפרטים – ‪ 8‬ספרות‬
‫הקובץ ממוין לפי מס' קורס בסדר עולה‪.‬‬

‫עבור כל סטודנט מוגדר מערך דו מימדי ‪ arr‬של מערכת השעות שלו באותו סמסטר‪,‬‬
‫מס' השורה (‪ )0-6‬מגדיר את היום (‪ 0‬שבת‪ 1 ,‬יום א'‪ 2 ,‬יום ב'‪ )...‬ומספר העמודה שעה אחת‬
‫במערכת‪ .‬לדוגמה האיבר ]‪ arr[3][9‬מיצג את השעה ‪( 9:00‬עד ‪ )10:00‬שביום ג'‪.‬‬
‫שעה תפוסה במערכת מסומנת ע"י ‪ 1‬ושעה פנויה ע"י ‪.0‬‬

‫עליכם לכתוב פונקציה‬


‫)‪int schedule(FILE* all, FILE* options, int arr[7][24], char* filename‬‬
‫שמקבלת ‪ all‬ו‪ options-‬שני מצבעים של הקבצים הנ"ל ‪ arr ,‬מערך של מערכת הסטודנט‪,‬‬
‫הפונקציה בונה קובץ חדש בשם ‪ filename‬ובו רשימת קורסי בחירה שהסטודנט יכול לקחת ללא‬
‫התנגשות עם המערכת הקיימת שלו‪ ,‬כל שורה בקובץ מכילה את הפרטים הבאים‪:‬‬
‫– ‪ 20‬תווים‬ ‫‪ ‬שם הקורס‬
‫– ‪ 8‬ספרות‬ ‫‪ ‬מס‪ .‬הקורס‬
‫– ‪ 2‬ספרות‬ ‫‪ ‬נקודות זיכוי‬
‫– ספרה אחת (‪ 1‬יום א'‪ 2 ,‬יום ב'‪)....‬‬ ‫‪ ‬יום בשבוע‬
‫– ‪ 2‬ספרות‬ ‫‪ ‬שעת התחלה‬
‫– ‪ 2‬ספרות‬ ‫‪ ‬שעת סיום‬
‫הקובץ ממוין לפי מס' קורס בסדר עולה‪.‬‬

‫הפונקציה תחזיר את מספר קורסי הבחירה שהסטודנט יכול לקחת ללא התנגשות עם המערכת‬
‫הקיימת שלו ובכל מקרה של תקלה בעבודה עם קובץ כלשהו הפונקציה תחזיר את הערך ‪.-1‬‬

‫שימו לב!‬
‫‪ ‬כל הקבצים ממוינים לפי מס' קורס בסדר עולה‪.‬‬
‫‪ ‬בכל הקבצים אין תווי הפרדה בין השדות‪.‬‬
‫‪ ‬אין לעבור על קובץ יותר מפעם אחת‪.‬‬
‫‪ ‬אין להעתיק קובץ למבנה נתונים אחר (מערך‪ ,‬רשימה משורשרת‪ ,‬עץ‪ ,‬קובץ אחר‪)...‬‬

‫‪7‬‬
INPUT/OUTPUT FUNCTIONS PROTOTYPES :‫פלט‬/‫רשימת פונקציות קלט‬

Open/Close a file

FILE *fopen( char *filename, char *mode );


int fclose(FILE *stream);

Repositions the file pointer to the beginning of a file

void rewind( FILE *stream );

Get/put a character

int fgetc( FILE *stream );


int fputc( int c, FILE *stream );

Get/put a string

char *fgets( char *string, int n, FILE *stream );


int fputs( const char *string, FILE *stream );

Formatted Input/Output

int fscanf( FILE *stream, const char *format [, argument ]... );


int sscanf( const char *string, const char *format [, argument ]... );
int fprintf( FILE *stream, const char *format [, argument ]...);
int sprintf( char *string, const char *format [, argument ]...);

Remove a file

int remove(const char* filename);

Rename a file

int rename(const char* oldname, const char*newname);

! ‫בהצלחה‬

You might also like