אוניברסיטת בן גוריון בנגב מספר נבחן : מס' הקורס : 202-1-9011 מיועד לתלמידי : הנדסה במבחן זה 5 שאלות שנה תשע"ה סמ' א' מועד ב' רשמו תשובותיכם בדפי התשובות בלבד משך הבחינה : 3 שעות מחברת הטיוטה לא תימסר לבדיקה חומר עזר : דף פוליו אחד לא מודפס בסיום המבחן נאסוף רק את דפי התשובות מותר להגדיר פונקציות עזר בכל השאלות, אלא אם ולא מצולם. אין להשתמש במחשבון. נאמר אחרת. כתבו קוד קריא והקפידו על אינדנטציה והערות )בעברית(. ב ה צ ל ח ה! תאריך המבחן: י' אדר תשע"ה 01.03.15 שם המורה: ציון סיקסיק מבחן ב: תכנות ב- C א' שאלה ( 1 20 נקודות( כדי לממש רשימות משורשות של שברים נתונות ההגדרות הבאות: typedef struct ratio* pr; typedef struct ratio{ מונה // numerator; int מכנה // denominator; int pr next; ratio; typedef struct bigratio* pbr; typedef struct bigratio{ int numerator; int denominator; מספר שלם wholenumber;// int pbr next; bigratio; עבור רשימה משורשרת )לא בהכרח ממוינת ) של שברים מטיפוס,ratio הפונקציה הבאה יוצרת שתי רשימות חדשות ממוינות לפי גדלי המספרים בסדר עולה. ברשימה הראשונה יישארו המספרים הקטנים מאחד מטיפוס ratio )אותו טיפוס שהיה ברשימה המקורית ) ממוינים לפי הגודל. ברשימה השנייה יופיעו המספרים הגדולים מאחד מטיפוס bigratio ממוינים ע"פ הגודל. הפונקציה מקבלת phead מצביע לראש הרשימה המקורית - שיהיה גם ראש הרשימה של השברים הקטנים מאחד ו- pbhead מצביע לראש רשימה משורשרת חדשה של המספרים הגדולים מאחד. השלימו את הקטעים החסרים המסומנים ב-?? N?? כך שהפונקציה תבצע את המבוקש. 1
#include <stdlib.h> void splitratios(pr* phead, pbr* pbhead){ pr prunner, pnewhead=null, ptemp; pbr pbrunner, pbtemp; while(?? 1?? ){ *phead = (*phead)->next; if(?? 2?? ){ else pbrunner =?? 3?? ;?? 4?? ; pbrunner->denominator = prunner->denominator ; pbrunner->wholenumber =?? 5?? ; if(!(*pbhead)?? 6?? ) {?? 7?? ; *pbhead = pbrunner; else{ for(pbtemp=*pbhead;?? 8?? ; pbtemp = pbtemp->next); pbrunner->next = pbtemp->next; pbtemp->next = pbrunner; free(prunner); if(?? 9?? ){?? 10?? ;?? 11?? ; else{ for(ptemp=pnewhead;?? 12?? ; ptemp = ptemp->next );?? 13?? ; prunner->next = ptemp->next; ptemp->next = prunner; 2
typedef struct node{ int val; node* next; Node; Node* what1(node* list1, Node* list2){ if(list1==null && list2==null) return NULL; if(list1==null) return list2; if(list2==null) return list1; if(list1->val < list2->val){ list1->next = what1(list1->next, list2); return list1; list2->next = what1(list1, list2->next); return list2; Node* what2(node* list, int size){ Node* temp=null, *temp2=null; int i; if(!list!list->next) return list; שאלה )20 2 נקודות( כדי לממש רשימה משורשרת נתונה ההגדרה הבאה: for(temp=list, i=1; i<size/2; temp=temp->next, i++); temp2 = temp->next; temp->next = NULL; return what1(what2(list, i), what2(temp2, size-i)); נתונות הפונקציות הבאות: סעיף א'. )6 נקודות( ציירו מה נקבל אחרי הקריאה ל- what2 עם הרשימה הבאה: 8 1 7 20 5 3 99 54 45 107 NULL ו- size שווה 10..what1 סעיף ב'. )6 נקודות( הסברו במשפט אחד מה יעודה של הפונקציה סעיף ג'. )8 נקודות( הסברו במשפט אחד מה יעודה של הפונקציה.what2 3
typedef struct node{ int val; שווה אפס בהתחלה // extraval; int struct node* left; struct node* right; Node; שאלה )20 3 נקודות( כדי לממש עץ בינארי נתונה ההגדרה הבאה: כתבו פונקציה index) void printsums(node* root, int OriginSum, int sum, int arr[ ], int המקבלת root מצביע לשורש של עץ בינארי ומחפשת את כל המסלולים שסכום הערכים שבשדה val שלהם שווה ל-,sum הפונקציה תדפיס עבור כל מסלול כזה את רשימת השדות val במסלול. extraval index שווה אפס ובכל העץ השדות ידוע שבקריאה לפונקציה OriginSum שווה,sum שווים אפס. שימו לב: הפונקציה מדפיסה לא רק מסלולים שמתחילים בשורש אלא גם מסלולים שמתחילים בצמתים אחרים. ניתן להשתמש בפונקציה (n print(int arr[,[ int שמדפיסה את n האיברים הראשונים במערך. ניתן להניח ש- arr ארוך יותר מהמסלול הארוך ביותר בעץ. אין להשתמש במשתנים סטטיים/ גלובליים. אין להשתמש בהקצאות דינמיות אין להגדיר פונקציית עזר שאלה ( 4 20 נקודות( כתובו פונקציה strb) char* selectsubstr(char* stra, char* המקבלת שתי מחרוזות ומחזירה מחרוזת חדשה שבה כל המופעים של המחרוזת strb בתוך stra מופיעים בסוגריים. לדוגמא: עבור stra "bc"= ו- strb "abcjbc" = הפונקציה תחזיר."a(bc)j(bc)" שימו לב כי תת-מחרוזת יכולה "להתנגש" עם עצמה, במקרה כזה יש סוגריים פעם אחת בלבד עבור כל הופעה עם "התנגשות". )יינתן בונוס של 5 נקודות עבור טיפול מלא ב-"התנגשות"( לדוגמא: עבור "abcabcabcabppqabcab"=stra ו- strb "abcab"= הפונקציה תחזיר."(abcabcabcab)ppq(abcab)" ישנם כאן פעמיים סוגריים למרות שהמחרוזת "abcab" מופיעה ארבעה פעמים. שימו לב: ניתן להשתמש ב- malloc. ניתן ומומלץ לכתוב פונקציות עזר. המקוריות. אין לשנות את המחרוזות 4
שאלה ( 5 22 נקודות( במצפה התת ימי באילת מעוניינים לבצע מעקב אחר הטיפולים באקווריומים )קיימים 125 אקווריומים( ישנם 2 סוגי טיפול: 1- תחזוקה שוטפת 2- עיצוב הוצאה/הוספה של פריטים. במצפה יש 18 עובדים המטפלים באקווריומים. נתוני הטיפולים עבור כל אחד מ- 125 האקווריומים שבמצפה נשמרים ב 2 קבצים : קובץ תחזוקה וקובץ עיצוב, הקבצים מכילים את נתוני הטיפול עבור כל אקווריום והם במבנה זהה: בשורה הראשונה מספר האקווריום 3 ספרות )מספר בין 001 ל- 125( בשורות הבאות יופיעו כל פרטי הטיפולים באקווריום הזה ממוינים לפי תאריך ושעה בסדר עולה: )yymmdd 6 ספרות )במבנה תאריך )hhmm 4 ספרות )במבנה שעה 2 ספרות ( מספר בין 01 ל- 18 ( קוד עובד 20 תווים שם עובד 50 תווים )תיאור מקוצר של הטיפול שהתבצע( תיאור הקובץ ממוין לפי מספר אקווריום בסדר עולה ואחר כך לפי תאריך ושעה. יש לייצר קבצי דו"חות עבור כל אחד מ- 18 העובדים באקווריום. n.dat" "worker_ )כאשר n הוא קוד העובד בין 1 ל- 18(. שם הקובץ יהיה במבנה הבא: השורה הראשונה בקובץ תכיל את שמו של העובד ( 20 תווים(. בשורות הבאות יופיעו נתוני הטיפול עבור כל אחד מהאקווריומים במבנה הבא: מס' אקווריום תאריך שעה סוג הטיפול תיאור 3 ספרות )מספר בתחום שבין 001 ל- 125( 6 ספרות )במבנה )yymmdd 4 ספרות )במבנה )hhmm ספרה אחת ( 1 עבור תחזוקה, 2 עבור עיצוב( 50 תווים )תיאור מקוצר של הטיפול שהתבצע( הקובץ ממוין לפי מספר אקווריום ואחר כך לפי תאריך ושעה. עליכם לכתוב פונקציה ) DReport int AquariumReport (FILE* MReport, FILE * המקבלת כפרמטרים שני מצבעים של קבצי הטיפולים: קובץ התחזוקה וקובץ העיצוב. הפונקציה תייצר את קבצי הדו"חות עבור כל אחד מ- 18 העובדים שבמצפה. במקרה וארעה שגיאה בפתיחה או סגירה של אחד הקבצים הפונקציה תחזיר 0, אחרת 1. הגבלות: בכל הקבצים אין תווי הפרדה בין השדות. אין לעבור על קובץ יותר מפעם אחת. אין להעתיק קובץ למבנה נתונים אחר )מערך, רשימה משורשרת, עץ,קובץ אחר...( 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