אוניברסיטת בן גוריון בנגב מספר נבחן : תאריך המבחן: כ"ג חשון תשע"ח 12/11/17 שמות המורים: ציון סיקסיק א' ב- C תכנות מבחן ב: 202-1-9011 מס' הקורס : הנדסה מיועד לתלמידי : ב' מועד קיץ סמ' שנה תשע"ז 3 שעות משך הבחינה : דף פוליו אחד לא מודפס חומר עזר : ולא מצולם. אין להשתמש במחשבון. במבחן זה 5 שאלות רשמו תשובותיכם בדפי התשובות בלבד מחברת הטיוטה לא תימסר לבדיקה בסיום המבחן נאסוף רק את דפי התשובות מותר להגדיר פונקציות עזר בכל השאלות, אלא אם נאמר אחרת. כתבו קוד קריא והקפידו על אינדנטציה והערות )בעברית(. ב ה צ ל ח ה! 1
שאלה )20 1 נקודות( נתונה הפונקציה out) void reverse(char* in, char* אשר מקבלת מחרוזת in ומערך out בו כל התאים מאותחלים ל- 0 \. הפונקציה כותבת למערך out את המחרוזת ההפוכה לזו שבמחרוזת.in לדוגמא, עבור המחרוזת programming c הפונקציה צריכה לכתוב למערך c gnimmargorp סעיף א. )3 נקודות( בפונקציה reverse קיימת שגיאה. בהינתן המחרוזת "hello" במשתנה,in סעיף ב. )5 נקודות( void reverse(char* in, char* out){ *(out + strlen(in)) = *in; if (*in!= \0 ) { reverse(in+1, out); מה הפונקציה תכתוב במערך?out תקנו את הפונקציה )אין לשנות את החתימה של,reverse ואין להשתמש בלולאות(. סעיף ג. )12 נקודות( כתבו פונקציה out) int reverse2(char* in, char* )שימו לב לטיפוס החזרה(, אשר מבצעת את אותה הפעולה כמו,reverse מבלי להשתמש באף פונקציה אחרת )כולל פונקציות ספריה, כמו.)strlen ניתן לבצע רק קריאות רקורסיביות. אין להגדיר פונקצית עזר. רמז: ניתן לכתוב את reverse2 בפחות מ- 10 שורות קוד. 2
typedef struct childrenlist{ struct _treenode* node; struct _childrenlist* next; childrenlink; שאלה )18 2 נקודות( נתונות ההגדרות הבאות )כמו בעבודה 4(: typedef struct treenode{ char name[256]; int id; childrenlisnk children; treenode; הפונקציה dir) void tree_sort_node(treenode* node, int מקבלת קודקוד בעץ וממיינת את רשימת הילדים שלו לפי השדה.id אם הערך של dir הוא 1, היא ממיינת אותם בסדר עולה, אם הוא 1-, היא ממיינת את הילדים בסדר יורד..?? void tree_sort_node(treenode* node, int dir) { treenode* temp; childlink* curr_child; childlink* min_child; childlink* child; curr_child = node->children; while (curr_child!= NULL) { n השלימו בדף התשובות את הקטעים המסומנים ב-?? child =?? 1?? ;?? 2?? = curr_child; while (child!=?? 3?? ) { if (dir *?? 4?? < dir *?? 5?? ) { min_child = child; child = child->next; if (curr_child->node!= min_child->node) { temp =?? 6?? ; curr_child->node = min_child->node; min_child->node = temp; tree_sort_node(?? 7??,?? 8?? );?? 9?? ; 3
שאלה 3 ( 25 נקודות ) סעיף א'. )5 נקודות( כתבו פונקציה index) int countcharfromindex(char* str, int המקבלת מחרוזת ואינדקס ומחזירה כמה תווים זהים ברצף יש במחרוזת החל מאותו האינדקס. סעיף ב'. )20 נקודות( כתבו פונקציה str) char* makenicestring(char* המקבלת מחרוזת )ניתן להניח כי אינה ריקה( ומחזירה מחרוזת חדשה בה כל רצף של תווים זהים הופך לרצף ארוך יותר באחד מהרצף המקורי )שימו לב כי גם תו אחד בלבד נחשב רצף של 1(. לדוגמא: עבור המחרוזת "aaabbcdc" תוחזר המחרוזת "aaaabbbccddcc" חובה להשתמש בפונקציה הקודמת גם אם לא כתבתם אותה. רמז: גודל המחרוזת המוחזרת לא יכול להיות יותר מכפולה גודל המחרוזת שהתקבלה. שימו לב: לא ניתן להניח דבר על המחרוזת שהתקבלה בפונקציה. אין לשנות את המחרוזת שהתקבלה בפונקציה. ניתן להניח כי כל פונקציות הספרייה עובדות היטב. יש להחזיר מחרוזת בגודל מדויק ללא איברים מיותרים. שאלה )15 4 נקודות( נתון עץ בינארי שקדקודיו מהטיפוס הבא: typedef struct node node; struct node{ int value; node *left; node *right; ; root כתבו פונקציה level) int countnodesfrom(node *root, int אשר מקבלת שורש של עץ בינארי ורמה בעץ וסופרת כמה קדקודים יש מרמה זו ומטה. )השורש נמצא ברמה - 0 ראה ציור( רמה 1 רמה 2 רמה 0 countnodesfrom(root, 1)= 11 countnodesfrom(root, 2)= 9 countnodesfrom(root, 3)= 6 countnodesfrom(root, 4)= 2 לדוגמא בעץ זה נקבל : אין לשנות את העץ שהתקבלה בפונקציה. אין להגדיר פונקצית עזר. 4
שאלה ( 5 25 נקודות( נתונים שלושה קבצים: הקובץ הראשון מכיל מידע על כל מנויי "בזק", עבור כל מנוי שורה שמכילה את הפרטים הבאים: 20 תווים - שם המנוי 20 תווים - כתובת 9 ספרות - מספר ת.ז. 9 ספרות - מספר טלפון ספרה אחת )1 מחובר, 0 מנותק( - מצב הקו הקובץ השני מכיל רשימת מנויים חדשים הכוללת את הפרטים הנ"ל ללא השדה האחרון )היות וקו חדש במצב "מחובר"( הקובץ השלישי מכיל עדכונים על חיבור או ניתוק קווים, עבור כל עדכון שורה אחת הכוללת את השדות הבאים: 9 ספרות - מספר טלפון ספרה אחת )1 מחובר, 0 מנותק( - מצב הקו מעודכן - - - כל הקבצים מסודרים לפי מספר טלפון בסדר עולה. כתובו פונקציה filename) int update(file* bezeq, FILE *newclients, FILE* changes, char* שמקבלת שלושה מצביעים לקבצים הנ"ל ו- filename מצביע למחרוזת, הפונקציה יוצרת קובץ חדש ששמו במחרוזת. filename הקובץ החדש מכיל את פרטי המנויים של הקובץ הראשון מעודכנים לפי הקובץ השלישי ומכיל גם את פרטי המנויים החדשים )עם מצב הקו 1( של הקובץ השני. לקובץ החדש מבנה זהה למבנה הקובץ הראשון והוא גם מסודר לפי מספר טלפון בסדר עולה. הפונקציה תחזיר 1 ובכל מקרה של תקלה בעבודה עם קובץ הפונקציה תחזיר את הערך 0. שימו לב! בכל אחד מהקבצים, אין תווי הפרדה בין נתון לנתון. אין לעבור על קובץ יותר מפעם אחת. אין להעתיק קובץ למבנה נתונים אחר )מערך, רשימה משורשרת, עץ,קובץ אחר...(. 5
רשימת פונקציות קלט/פלט: 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); ב ה צ ל ח ה! 6