31616 אלקטרוניקה 9:30 ב' תשע"ח שם הקורס: מספר קורס: מחלקה: שעת בחינה: סמסטר: טופס מלווה לשאלון מבחן מבוא למדעי המחשב ושפת C שם מרצה: תאריך בחינה: משך הבחינה: מועד בחינה יעל ארז 14.08.18 3 שעות ב' הוראות לנבחן ולמשגיח 1. יש לענות על הבחינה )לסמן X בסוגריים(: ( ) במחברת הבחינה בלבד ( ) במחברת הבחינה ועל גבי טופס שאלון הבחינה )X( בטופס שאלון הבחינה בלבד 2. המחברות לא ייבדקו. 3. טפסי השאלון ייבדקו. 4. לא ניתן להשתמש בכל חומר עזר. 5. לא ניתן להשתמש במחשבון 6. אין לחלק לסטודנטים פתקי שאלות. 7. יש להחזיר את שאלון המבחן בסוף הבחינה. 8. אין לצרף את מחברת הבחינה לשאלון בסוף הבחינה. 9. יש לענות על כל השאלות. 10. מספר הנקודות לכל שאלה נתון בסוגריים ( (. 11. היכן שדרושים הסברים תן/י הסבר. 12. כל העבודה, כולל טיוטה וחישובי עזר, צריכה להיכתב במחברת הבחינה בלבד ו/או בשאלון )כמסומן בסעיף 1( ואין להשתמש בכל נייר אחר. 13. אין להעביר כל חומר בין הסטודנטים. הערות - - - - - כתוב לפי הכללים של שפת C כולל הערות )אפשר לכתוב הערות בעברית(. כתוב במפורש כל הנחה שאתה מניח. בכל השאלות מותר להשתמש רק בפונקציות ספריה הבאות:.fclose,fopen,free,malloc,delete,new,scanf, printf אלא אם כן צוין אחרת בשאלה. כל סעיף יש לפתור בצורה היעילה ביותר מבחינת זמן ריצה, אלא אם כן צוין אחרת. בכל השאלות אסור להשתמש במשתנים גלובליים או סטטיים בהצלחה! 1
2
שאלה )25 1 נקודות( נגדיר קבוצה כאוסף איברים המקיים את התנאים הבאים: 1. האיברים מסודרים מהקטן לגדול 2. אין חזרות למשל {a,b},{5,0,100,101-} {1,2,3} הן קבוצות. e,h,l,l,o} { אינה קבוצה כיוון שיש בה איבר המופיע פעמיים. {3,2,1} אינה קבוצה כיוון שהאיברים לא מסודרים מהקטן לגדול. סעיף א' )15%( ממשו פונקציה שחתימתה: int* unify_int(int a[], int na, int b[], int nb, int* nc) הפונקציה מקבלת 2 קבוצות של מספרים שלמים קבוצה a שבה na איברים, וקבוצה b שבה nb איברים. הפונקציה תיצור קבוצה חדשה ובה איחוד של כל האיברים משתי הקבוצות. הפונקציה תרשום את מספר האיברים בקבוצה החדשה אל המשתנה אליו מצביע nc ותחזיר מצביע לקבוצה זו. למשל עבור הקבוצות {3,4,5},{1,2,3} הפונקציה תיצור את הקבוצה {1,2,3,4,5}, תרשום למשתנה אליו מצביע 5 nc ותחזיר מצביע לקבוצה החדשה. שימו לב: האיבר 3 נרשם בקבוצה החדשה רק פעם אחת למרות שמופיע בשתי הקבוצות. על הפונקציה להקצות את הזכרון עבור הקבוצה החדשה. int* unify_int(int a[], int na, int b[], int nb, int* nc) { 3
4
5
סעיף ב' )10%( char* unify_str(char* s1, char* s2) ממשו פונקציה שחתימתה: הפונקציה מקבלת 2 מחרוזות s1 ו s2. הפונקציה תחזיר מחרוזת חדשה שהיא למעשה קבוצה ובה כל האיברים מ- 2 המחרוזות. המחרוזת החדשה תהיה חוקית ותסתיים ב 0\. למשל עבור המחרוזות hello ו world הפונקציה תחזיר את המחרוזת. dehlorw שימו לב שהתו l נרשם בקבוצה החדשה רק פעם אחת ושהתווים מסודרים מהקטן לגדול. גם כאן על הפונקציה להקצות את המקום הנדרש למחרוזת החדשה. char* unify_str(char* s1, char* s2) { 6
7
8
שאלה )25 2 נקודות( האות הפופולרית במחרוזת היא האות המופיעה מספר מקסימלי של פעמים. למשל במחרוזת commensalism האות הפופולרית היא m. במחרוזת doodle יש 2 אותיות פופולריות d ו o. ה"פופולריות" של המחרוזת היא מספר הפעמים בהם הופיעה בה האות הפופולרית. למשל הפופולריות של המחרוזת commensalism היא 3 )כי m מופיעה 3 פעמים במילה(. הפופולריות של המחרוזת doodle היא 2 )כי גם o וגם d מופיעות בה פעמיים(. ממשו את הפונקציה הבאה: int longest_sub_string(char* s, int p); הפונקציה מקבלת מחרוזת s, ומחזירה את אורכה של תת המחרוזת הארוכה ביותר שלה פופולריות.p למשל עבור המחרוזת doodle והפופולריות 2 הפונקציה תחזיר 6 כיוון שלמחרוזת כולה פופולריות.2 עבור המחרוזת doodle והפופולריות 1 הפונקציה תחזיר 4 כיוון שתת המחרוזת odle היא הארוכה ביותר שלה פופולריות 1, ואורכה 4. שימו לב: גם למחרוזת do פופולריות 1, אולם היא קצרה יותר. ניתן להניח שהמילה מורכבת מאותיות אנגליות קטנות בלבד. ניתן להניח ש p חיובי. האותיות בתת מחרוזת חייבות להיות סמוכות זו לזו. int longest_sub_string(char* s, int p) { 9
10
11
שאלה )25 3 נקודות( מערך פלינדרום הוא מערך שקריאתו מימין לשמאל שקולה לקריאתו משמאל לימין. למשל {10,5,5,10},{1,3,5,3,1} הם מערכי פלינדרום. סעיף א' )15%( ממשו את הפונקציה: int is_pal(int arr[], int n); המקבלת מערך arr באורך n. הפונקציה מחזירה 1 אם הוא מערך פלינדרום ו- 0 אחרת. למשל עבור המערכים הבאים הפונקציה תחזיר 1: {1, 3, 5, 3, 1} {100, 100} {-5} } { )מערך ריק( עבור המערכים הבאים הפונקציה תחזיר 0: {1, 3, 5, 2, 1} {-5, 0} שימו לב: מימוש רקורסיבי אינו בהכרח הפתרון היעיל ביותר. int is_pal(int arr[], int n){ 12
13
14
סעיף ב' )10%(: struct array{ int n; int a[max_val]; }; בסעיף זה נעבוד עם המבנה הבא: ניתן להניח ש MAX_VAL מוגדר ב.define במבנה נשמר מערך a באורך n )אורכו המקסימלי של המערך הוא,MAX_VAL אך יכול להיות גם קצר יותר(. ממשו את הפונקציה: int find_pair(struct array arr[], int n); המקבלת מערך arr ובו n מבנים מסוג.struct array ידוע כי: המערך במבנה הראשון הוא מערך פלינדרום והמערך במבנה האחרון אינו מערך פלינדרום יש לפחות 2 מבנים במערך arr כל המבנים חוקיים. )שימו לב שמערך באורך 0 הוא גם חוקי, והוא מערך פלינדרום( הפונקציה תחזיר אינדקס של מבנה שבו מערך פלינדרום אשר במבנה מימינו המערך אינו מערך פלינדרום. למשל עבור המערך: index n a 0 5 1, 3, 5, 3, 1 1 3 10, 5, 10 2 3 1, 2, 3 3 2 100, 100 4 3 3, 2, 1 הפונקציה תחזיר 1 )האינדקס שבו המערך {10,5,10}( או 3 )האינדקס שבו המערך {100,100}(. הפונקציה לא תחזיר את האינדקס שבו המערך {1,3,5,3,1} כיוון שהמערך מימינו הוא גם כן מערך פלינדרום. הנחיות: ניתן להשתמש בפונקציה מסעיף א' גם אם לא מימשתם אותה int find_pair(struct array arr[], int n)} 15
16
17
שאלה )25 4 נקודות( ממשו פונקציה רקורסיבית בעלת החתימה: int max_2_digits(int num); הפונקציה מקבלת מספר num ומחזירה את המספר הדו ספרתי הגדול ביותר שניתן להרכיב מ- 2 ספרות סמוכות. למשל עבור המספר 12345 ניתן להרכיב את המספרים הדו ספרתיים 12,23,34,45 לכן הפונקציה תחזיר 45. ניתן להניח כי המספר חיובי. אם המספר num הוא ספרה אחת בלבד )כלומר קטן מ- 10 (, הפונקציה תחזיר ספרה זו. int max_2_digits(int num) 18
19
20
21
22 בהצלחה!