אוניברסיטת בן גוריון בנגב מספר נבחן : תאריך המבחן: כ"ג מנ' אב תשע"ז 15.08.17 שמות המורים: ציון סיקסיק א' ב- C תכנות מבחן ב: 202-1-9011 מס' הקורס : הנדסה מיועד לתלמידי : ב' מועד סמ' ב' שנה תשע"ז 3 שעות משך הבחינה : דף פוליו אחד לא מודפס חומר עזר : ולא מצולם. אין להשתמש במחשבון. במבחן זה 5 שאלות רשמו תשובותיכם בדפי התשובות בלבד מחברת הטיוטה לא תימסר לבדיקה בסיום המבחן נאסוף רק את דפי התשובות מותר להגדיר פונקציות עזר בכל השאלות, אלא אם נאמר אחרת. כתבו קוד קריא והקפידו על אינדנטציה והערות )בעברית(. ב ה צ ל ח ה! 1
#include <stdio.h> typedef struct node{ int data; struct node *left, *right, *next; Node; void what1(node** ph, Node* node) { if (node == NULL) return ; if (*ph == NULL) { node->next = NULL; *ph = node; return; what1(&(*ph)->next, node) ; void what2(node* root) { if (root == NULL) return; what1(&root, root->left); what1(&root, root->right); printf("%d ", root->data); what2(root -> next); void what3(node *root) { Node *q; q = NULL; what1(&q, root); what2(root); root---> 15 / \ 10 20 / \ / \ 26 12 18 25 / \ / \ 3 38 14 13 שאלה )18 1 נקודות( נתון הקוד הבא: סעיף א. )11 נקודות( עבור העץ הבא: הסבר: \ right= left= / הבנים שלא סומנו שווים NULL מה הפלט המתקבל אחרי הביצוע של ההוראה what3(root)? סעיף ב. )3 נקודות( הסברו בקצרה מה יעודה של הפונקציה,what1 כולל פירוט תפקיד הארגומנטים. סעיף ג. )4 נקודות( הסברו בקצרה מה יעודה של הפונקציה.what2 2
#include <stdio.h> שאלה )18 2 נקודות( נתונה התכנית הבאה: void what(char *str, int num, int k) { int count, i; if (k>1) { for (i = 0; i < num; i++) { str[0] = str[k - 1] = 'a' + i ; what(str + 1, num, k - 2) ; return; for (count = 1; str[count]; count++); if (k == 0) { puts(str - count); return; if (k == 1) { count--; for (i = 0; i < num; i++) { str[0] = 'a' + i; puts(str - count); void main() { char str[6]; int len; for (len = 2; len < 5; len++) { str[len] = '\0'; what(str, 3, len); k) void what(char *str, int num, int כולל פירוט תפקיד סעיף א. )14 נקודות( מהו הפלט של התכנית הנ"ל? סעיף ב. )4 נקודות( הסברו בקצרה מה יעודה של הפונקציה הארגומנטים num ו- k. 3
שאלה ( 3 22 נקודות( שתי מחרוזות יקראו אנאגרמה אם כל האותיות שבמחרוזת הראשונה קיימות בשניה וכל האותיות שבמחרוזת השניה קיימות בראשונה. כלומר: המחרוזות "CCBADB" "ABC DCB" מהוות אנאגרמה. המחרוזות "CBA" "ABC" מהוות אנאגרמה. המחרוזות "AB" "ABB" אינן מהוות אנאגרמה. המחרוזות "AB" "ABC" אינן מהוות אנאגרמה. כתבו פוקנציה count) char* anagram(char** words1, char** words2, int size1, int size2, int* המקבלת שני מערכים של מחרוזות ואת גודלם, הפונקציה תחזיר את כמות האנאגרמות שיש בין שני המערכים דרך המצביע count וכן תחזיר העתק המחרוזת של המערך words1 שיצרה את האנאגרמה הארוכה ביותר )כולל רווחים(. שימו לב: ניתן להניח כי כל מחרוזת במערכים מכילה אותיות A-Z וכן רווחים בלבד. מניחים שכל פונקציות הספריה פועלות ללא תקלה. אין לשנות את המערכים שהתקבלו. חובה לכתוב לפחות פונקצית עזר אחת. שאלה ( 4 22 נקודות( כדי לממש רשימה משורשרת של מספרים שלמים נתונה ההגדרה הבאה: typedef struct item item; struct item{ int value; item *next; ; "רשימה מקובצת K" היא רשימה של מספרים שלמים שמספר האברים שבה מתחלק ב- K ועבור כל תת-רשימה של K איברים אין ערכים כפולים. כתוב פונקציה (K int iskgroup(item *list, int המקבלת list ראש רשימה משורשרת של מספרים שלמים, ומספר שלם K ומחזירה 1 אם הרשימה היא "רשימה מקובצת K" ו- 0 אחרת. תחילת הרשימה 2,4,7,3,5,4,1,6,8,9,0,3 לדוגמה, עבור הרשימה הבאה: "רשימה מקובצת 4", שכן בכל רביעיית איברים כל האיברים שונים זה מזה. הרשימה היא - הרשימה היא לא "רשימה מקובצת 5" כי מספר האיברים שבה, אינו מתחלק ב- 5. - הרשימה היא לא "רשימה מקובצת 6" כי בשישייה הראשונה המספר 4 חוזר על עצמו. - שימו לב: אין לשנות את הרשימה שהתקבלה. אין להעתיק את הנתונים של הרשימה הנתונה למבנה נתונים אחר. חובה לכתוב לפחות פונקצית עזר אחת. 4
שאלה ( 5 24 נקודות( לקראת הקמת מחודשת של שידורי התאגיד וארגון מחדש של לוח השידורים ברדיו, הוחלט לקיים סקר האזנה של 99 תכניות בקרב אוכלוסייה נבחרת של מאזינים. לכל תכנית קוד המורכב מ- 2 ספרות )01-99(. כל מאזין יכול לדרג 10 תכניות לכל היותר, ואסור לו לדרג תכנית יותר מפעם אחת. התכנית שסומנה ראשונה תקבל 10 נקודות, שנייה 9 וכך הלאה. הערך 00 מציין כי אין ניקוד. להלן דוגמא לדירוג של מספר מאזינים: David Shulman 34 23 67 54 20 08 78 61 65 Hana Zadik 17 55 78 65 61 80 00 14 Liat Mor 78 65 00 34 03 53 14 12 00 00 David Shulman דירג 9 תכניות, לפי הדירוג שלו תכנית 34 קיבלה 10 נקודות, 23 9 נק' וכך הלאה... Hana Zadik דירגה 8 תכניות, לפי הדירוג שלה תכנית 17 קיבלה 10 נקודות, 55 9 נק', אך אין תכנית שקיבלה ניקוד... 4 נתוני הסקר הועלו לקובץ ובו כל שורה במבנה הבא: 20 תווים. שם המאזין עד 10 מספרים דו-ספרתיים המופרדים ברווח. נתוני הדירוג הנהלת התאגיד מעוניינת להפיק דו"ח המרכז את תוצאות הסקר לקובץ ובו כל שורה מכילה: 2 ספרות. קוד התכנית 5 ספרות. הניקוד הכולל שקיבלה 4 ספרות. מספר המדרגים הקובץ יהיה ממוין לפי הניקוד הכולל בסדר יורד. כתבו פונקציה surveyreportfile) int surveyreport (FILE * survey, char* המקבלת מצביע של קובץ נתוני הסקר ואת שם קובץ הדו"ח. על פי נתוני קובץ הסקר הפונקציה בונה את קובץ הדו"ח ובנוסף מחזירה את המספר המקסימלי של המדרגים עבור תכנית. שימו לב! בכל אחד מהקבצים, אין תווי הפרדה בין נתון לנתון )חוץ מרווח בין נתוני הדירוג בקובץ הסקר(. אין לעבור על קובץ יותר מפעם אחת. אי שימוש בלולאה במקום הנחוץ יגרום להורדת ציון. אין להעתיק קובץ למבנה נתונים אחר )מערך, רשימה משורשרת, עץ,קובץ אחר...(. 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