אוניברסיטת בן גוריון בנגב מספר נבחן : תאריך המבחן: כ"ח תשרי תשע"ז 30.10.16 שמות המורים: ציון סיקסיק א' תכנות ב- C מבחן ב: 202-1-9011 מס' הקורס : הנדסה מיועד לתלמידי : ב' מועד סמ' קיץ שנה תשע"ו 3 שעות משך הבחינה : דף פוליו אחד לא מודפס חומר עזר : ולא מצולם. אין להשתמש במחשבון. במבחן זה 5 שאלות רשמו תשובותיכם בדפי התשובות בלבד מחברת הטיוטה לא תימסר לבדיקה בסיום המבחן נאסוף רק את דפי התשובות מותר להגדיר פונקציות עזר בכל השאלות, אלא אם נאמר אחרת. כתבו קוד קריא והקפידו על אינדנטציה והערות )בעברית(. ב ה צ ל ח ה! 1
שאלה )18 1 נקודות( הפונקציה str2) int star(char* str1, char* מקבלת כארגומנטים str1 מחרוזת של אותיות ו- str2 מחרוזת של אותיות וכוכביות. הפונקציה בודקת אם ניתן להחליף ב- str2 כל כוכבית בצירוף אותיות כלשהו )שיכול להיות בגודל אפס( ולקבל בדיוק את המחרוזת.str1 אם כן הפונקציה מחזירה את מספר הצירופים האפשריים אחרת מחזירה אפס. ידוע שאין כוכבית בסוף המחרוזת.str2 לדוגמה עבור הפונקציה הראשית הבאה: void main(){ printf("%d ", star("bcabcc", "b*c")); printf("%d ", star("abcabcc", "b*c")); printf("%d ", star("bbcabcc", "*b*c")); printf("%d ", star("bcbc", "*b*c")); 1 0 3 נקבל את הפלט )משאל לימין(: 2 השלימו בדף התשובות את הקטעים החסרים המסומנים ב-?? N?? int star(char* str1, char* str2){ if(!*str1 &&!*str2) return?? 1?? ; if(!*str1!*str2) return?? 2?? ; if(*str1 == *str2) return star(?? 3??,?? 4?? ); if(*str2 == '*') return star(?? 5??,?? 6?? ) + star(?? 7??,?? 8?? ); return?? 9?? ; 2
שאלה )19 2 נקודות( סעיף א'. )16 נקודות( #include <stdio.h> #include <stdlib.h> #include <string.h> נתונה התכנית הבאה: typedef struct node { char letter; struct node* left; struct node* right; Node; void print(node* root) { if (!root) return; putchar(root->letter); print(root->left); print(root->right); Node* what(char *str, int start, int length){ Node* temp; int end = start + length / 2; if (length == 0) return NULL; temp = (Node*)malloc(sizeof(Node)); temp->letter = str[end]; temp->left = what(str, start, end-start); temp->right = what(str, end + 1, start + length-1-end); return temp; void main() { char st[] = "this*is*a*string"; print(what(st, 0, (int)strlen(st))); בהנחה שהפונקציה malloc עובדת ללא תקלה, מה הפלט של התכנית הנ"ל? סעיף ב'. )3 נקודות( איך לשנות את הפונקציה print כך שהקריאה לפונקציה שב- main תדפיס את המחרוזת המקורית )במקרה שלנו example".)"this is an 3
שאלה )22 3 נקודות( כיתבו פונקציה *p_size) char** wordsfromsentence (char *sent, char limit, int המקבלת מחרוזת,sent תו limit ומצביע.p_size הפונקציה מדפיסה ומחזירה מערך בגודל מדויק של כל המילים )בגודל מדויק( המופיעות במחרוזת.sent ההפרדה בין המילים במחרוזת sent היא מאמצעות התו limit או רצף תווים כזה. אם אותה מילה מופיעה יותר מפעם אחת יודפס וישמר במערך המופע הראשון בלבד. דרך המצביע p_size הפונקציה "מחזירה" את מספר המילים שהודפסו )שהוא גם גודל המערך המוחזר(. חובה להגדיר לפחות פונקציית עזר אחת. יודפס ויוחזר this is a sentence and another word לדוגמא: עבור המחרוזת " this.is..a.sentence.and.this.is.another.word" והתו '.' מערך של המילים: דרך המצביע p_size הפונקציה "מחזריה" את הערך 7. שימו לב שהמילים "this" ו-" is " מופיעות פעם אחת בלבד. 4
שאלה ( 4 22 נקודות( typedef struct item* Item; struct item{ int num; Item next; ; כדי לממש רשימה משורשרת נתונה ההגדרה הבאה: כיתבו פונקציה רקורסיבית sum) int sublistsum(item list, int שמקבלת list מצביע לרשימה משורשרת ומספר שלם.sum הפונקציה מדפיסה את אורכי כל תתי הרשימות שסכום איבריהן הוא sum ומחזירה את מספר תתי הרשימות. לדוגמה עבור sum=7 והרשימה הבאה: list 3 7 1 4 2 1 NULL הפונקציה תדפיס את האורכים 3 1, ו- 3 ותחזיר את הערך 3 עבור תתי הרשימות: Head 7 NULL Head 1 4 2 NULL Head 4 2 1 NULL שימו לב: אין ליצור מבנים חדשים או לשנות את הרשימה. אין להשתמש ביותר מלולאה אחת. אין להגדיר פונקצית עזר. פונקציה לא רקורסיבית תאפשר לקבל לכל היותר חצי הנקודות. 5
שאלה )22 5 נקודות( בסניפי קופת חולים "סי-בריא" קובעים תורים למרפאות חוץ של המרכז הרפואי "בן-גוריון". לקופת חולים 10 סניפים ממוספרים מ- 0 עד 9. למרכז הרפואי 7 מרפאות חוץ ממוספרות מ- 0 עד 6. כל חודש נשלחים למרכז הרפואי 10 הקבצים של 10 הסניפים עבור התורים של אותו חודש. כל שורה בקבצים מכילה: 2 ספרות יום בחודש 4 ספרות )לדוגמה 1145 עבור שעה 11:45( שעת התור 20 תווים שם החולה 9 ספרות ת.ז. ספרה אחת בין 0 ל- 6 מספר המרפאה 20 תווים שם רושם התור הקבצים ממוינים בסדר כרונולוגי )לפי יום ושעה בסדר עולה( ומיון משנה לפי מספר מרפאה. מהקבצים האלה בונים 7 קבצים של התורים של אותו חודש עבור 7 המרפאות. כל שורה בקובץ כזה מכילה את הפרטים הבאים: 2 ספרות יום בחודש 4 ספרות שעת התור 20 תווים שם החולה 9 ספרות ת.ז. ספרה אחת בין 0 ל- 9 מספר סניף ק"ח הקבצים ממוינים בסדר כרונולוגי )לפי יום ושעה בסדר עולה(. אם בטעות משני סניפים נקבע תור לשני חולים באותה שעה באותה מרפאה אזי רושמים את הפרטים של שני התורים בקובץ שגויים. כל שורה בקובץ השגויים מכילה את הפרטים הבאים: 2 ספרות יום בחודש 4 ספרות שעת התור 20 תווים שם החולה 9 ספרות ת.ז. ספרה אחת בין 0 ל- 6 מספר המרפאה ספרה אחת בין 0 ל- 9 מספר סניף ק"ח 20 תווים שם רושם התור הקובץ ממוין בסדר כרונולוגי. כיתבו פונקציה error) int health(file* dispensary[10], FILE* clinic[7], char* שמקבלת dispensary מערך של 10 מצביעים של קבצי הסניפים ו- clinic מערך של 7 מצביעים לקבצי תורים של המרפאות חוץ ו- error מחרוזת שמכילה שם קובץ השגויים. הפונקציה תחזיר 1 עבור מהלך תקין ו- 0 בכל מקרה של תקלה )בקריאה או כתיבה לקובץ(. שימו לב! בכל אחד מהקבצים, אין תווים בין נתון לנתון. אין לעבור על קובץ יותר מפעם אחת. אין להעתיק קובץ למבנה נתונים אחר )מערך, רשימה משורשרת, עץ, קובץ אחר...(. 6
רשימת פונקציות קלט/פלט: 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); ב ה צ ל ח ה! 7