משך המבחן שעתיים מבוא למדעי המחשב 3. מבחן סוף סמסטר מועד א' סמסטר אביב תשע"ד 6/6/4 וחצי. במבחן 5 שאלות, יש לפתור את כולן. בשאלה מופיע קטע קוד ואחריו מספר פקודות הדפסה. בכל סעיף יש לכתוב את הפלט המדויק בקופסא המתאימה. אין צורך לנמק. בשאלות,3 יש לענות תשובות קצרות ותמציתיות. בשאלה 4,5 יש לכתוב קוד. ניתן יש להגיש את טופס הבחינה בסוף המבחן. כל חומר עזר, כולל מחשבונים, אסור. להוסיף הסבר במילים. בהצלחה! שאלה 3 4 5 סה"כ: ציון /8 / / /3 /3 /
char c = 'a'; int a[]={,3,4}; int b[]={7,3,,5}; int* p[] = {a, b+}; char *s = &c; char *s = "awsome"; char *arr[] = {"once", "upon", "a", "time"}; printf("a=%d\n", *(a+)); שאלה : ) נק', 3 נק' לכל סעיף( א. נתון קטע הקוד הבא, כתבו מה יהיה הפלט במקום המתאים. printf("b=%d \n", b[a[]]); ב. printf("p=%d \n", (*p)[]); ג. printf("s=%c\n", (*s)+); ד. printf("s=%s\n", s+)arr[3][3]-'c'(); ה. printf("arr=%s\n", arr[a[]]); ו.
שאלה : ) נק'( void mystery(char a[], int n) נתון הקוד הבא: { int i,j; for (i=n-; i>=; i--) for (j=; j+i<n; j++) if (a[j] < a[i+j]) { a[j] += a[i+j]; a[i+j] = a[j]-a[i+j]; a[j] = a[j] - a[i+j]; } return; } א. מה יהיו ערכי התאים של המערך a={ e, x, a, m } לאחר הקריאה?mystery(a,4) ב. תאר בקצרה מה עושה הפונקציה: ג. מה סיבוכיות זמן הריצה של הפונקציה כפונקציה של n? 3
שאלה 3: ) נק'( typedef struct node{ נתון הקוד הבא: int info; struct node* next; } Node; void mystery (Node* p) { static int s = ; if (p){ s *= p->info; p->info = s; mystery (p->next); s = ; } } א. מה יהיו ערכי הרשימה הבאה p 3 4 NULL אחרי הקריאה לפונקציה?mystery(p) ב. תאר בקצרה מה עושה הפונקציה: 4
שאלה 4: )3 נק'( סעיף א' )5 נק'(: מערך של מספרים שלמים,,arr בגודל n נקרא מערך מאוזן אם קיים אינדקס p במערך כך ש p<n ובנוסף סכום האיברים במערך עד p )כולל את p( שווה בדיוק לסכום האיברים במערך מp+ עד n. זאת אומרת, קיים p כך ש: arr[p+]+..+arr[n-] arr[]+..+arr[p] = למשל: המערך הבא הוא מאוזן: 4 3 זאת כי עבור 3=p מתקיים arr[4]+arr[5]+arr[6]+arr[7]+arr[8]+arr[9] arr[]+arr[]+arr[]+arr[3] = לעומת זאת, המערך הבא אינו מאוזן: ממשו את הפונקציה is_balanced שחתימתה היא n).int is_balanced(int arr[], int הפונקציה מקבלת כפרמטר מערך arr בגודל n ובודקת האם הוא מערך מאוזן. אם כן, הפונקציה מחזירה ערך אינדקס עבורו מתקיים התנאי לאיזון המערך, אחרת היא מחזירה -. שימו לב שיכולים להיות מספר אינדקסים המקיימים את התכונה, הפונקציה צריכה להחזיר אחד מהאינדקסים האלה. דרישה נוספת: על הפונקציה לעבוד בסיבוכיות זמן O(n) ובסיבוכיות מקום נוסף ()O )זאת אומרת, אין להגדיר מערך עזר, אלה להשתמש במספר משתנים בלבד(. 5
6
סעיף ב' )5 נק'(: חציון של מערך של מספרים שלמים,,arr בגודל n הוא איבר במערך כך שלכל היותר חצי מהאיברים במערך קטנים ממנו ולכל היותר חצי מהאיברים במערך גדולים ממנו. למשל: החציון של המערך הבא הוא : 4 3 זאת כי arr[4],arr[6],arr[9]} } arr[], קטנים מ- וגם arr[5],arr[8]} {arr[3], גדולים מ-. ממשו את הפונקציה find_median שחתימתה היא n).int find_median (int arr[], int הפונקציה מקבלת כפרמטר מערך arr בגודל n ומחזירה מספר שהוא החציון של האיברים במערך. שימו לב שאם המערך הוא באורך זוגי, יכולים להיות שני חציונים לאיברי המערך. הפונקציה תחזיר אחד מהם בתור פלט. ניתן להשתמש בפונקציות שנלמדו בכיתה. במקרה כזה, עליכם לציין את חתימת הפונקציות בלבד ואין צורך לכתוב את המימוש שלהן. על הפונקציה לעבוד בסיבוכיות זמן של.O(nlogn) סיבוכיות המקום אינה משנה. 7
שאלה 5: )3 נק'( עץ בינארי נקרא עץ פקטורים אם הוא עץ ריק או שכל עלה בו הוא מספר ראשוני וכל צומת פנימי מכיל מספר לא ראשוני שהוא מכפלת הערכים של שני בניו. לדוגמא: 4 5 4 4 5 4 עץ פקטורים אינו עץ פקטורים סעיף א' ) נק'(: ממשו את הפונקציה is_prime שחתימתה היא number).int is_prime(int הפונקציה מקבלת כפרמטר מספר שלם ומחזירה אם המספר הוא ראשוני ו- אחרת. )בתרגיל זה נתייחס למספר כאל מספר ראשוני(. ניקוד מירבי ינתן עבור פונקציה שעובדת בסיבוכיות זמן של )O. רמז: בספריה <math.h> מוגדרת הפונקציה sqrt(double) double המקבלת כפרמטר מספר ומחזירה את השורש שלו. 8
סעיף ב' ) נק'(: typedef struct tnode{ int val; struct tnode *left, *right; } TNode; נגדיר את המבנה הבא: ממשו את הפונקציה is_factor שחתימתה היא node).int is_factor(tnode* הפונקציה מקבלת כפרמטר מצביע לעץ בינארי שמכיל מספרים חיוביים ומחזירה אם הוא עץ פקטורים ו- אחרת. ניתן להניח שהקלט תקין: המספרים בעץ הם חיוביים ולכל צומת או שיש שני בנים או שהוא עלה. בסעיף זה יש להשתמש בפונקציה שכתבתם בסעיף א'. אפשר להשתמש בפונקציה גם אם לא מימשתם אותה. ניקוד מירבי ינתן עבור מימוש של פונקציה שתעבוד בזמן לינארי לגודל העץ )למספר הצמתים שבעץ(. 9