31616 אלקטרוניקה 9:30 ב' תשע"ז שם הקורס: מספר קורס: מחלקה: שעת בחינה: סמסטר: טופס מלווה לשאלון מבחן מבוא למדעי המחשב ושפת C שם מרצה: תאריך בחינה: משך הבחינה: מועד בחינה יעל ארז 26.7.17 3 שעות א' הוראות לנבחן ולמשגיח 1. יש לענות על הבחינה )לסמן X בסוגריים(: ( ) במחברת הבחינה בלבד ( ) במחברת הבחינה ועל גבי טופס שאלון הבחינה )X( בטופס שאלון הבחינה בלבד 2. המחברות לא ייבדקו. 3. טפסי השאלון ייבדקו. 4. לא ניתן להשתמש בכל חומר עזר. 5. לא ניתן להשתמש במחשבון 6. אין לחלק לסטודנטים פתקי שאלות. 7. יש להחזיר את שאלון המבחן בסוף הבחינה.. אין לצרף את מחברת הבחינה לשאלון בסוף הבחינה. 9. יש לענות על כל השאלות. 10. מספר הנקודות לכל שאלה נתון בסוגריים ( (. 11. היכן שדרושים הסברים תן/י הסבר. 12. כל העבודה, כולל טיוטה וחישובי עזר, צריכה להיכתב במחברת הבחינה בלבד ו/או בשאלון )כמסומן בסעיף 1( ואין להשתמש בכל נייר אחר. 13. אין להעביר כל חומר בין הסטודנטים. הערות - - - - כתוב לפי הכללים של שפת C כולל הערות )אפשר לכתוב הערות בעברית(. כתוב במפורש כל הנחה שאתה מניח. בכל השאלות מותר להשתמש רק בפונקציות ספריה הבאות:.fclose,fopen,free,malloc,delete,new,scanf, printf אלא אם כן צוין אחרת בשאלה. כל סעיף יש לפתור בצורה היעילה ביותר מבחינת זמן ריצה, אלא אם כן צוין אחרת. בהצלחה! 1
2
שאלה )25 1 נקודות( עליכם לממש את הפונקציה: void mod_sort(int a[], int n, unsigned int key); אשר מקבלת מערך של מספרים שלמים אי שליליים a, את האורך שלו n, ומספר חיובי שלם.key הפונקציה מסדרת מחדש את האיברים של המערך a לפי שארית החלוקה ב.key כלומר בהתחלה יהיו כל המספרים שבחלוקה ב key השארית היא 0, אחר כך כל המספרים שבחלוקה ב key השארית היא 1 וכך הלאה. דוגמא: עבור המערך a הבא באורך 12=n והאינדקס key=3 9 5 5 4 9 3 3 0 1 תוצאה אפשרית אחרי הקריאה לפונקציה: 9 9 3 3 0 4 1 5 5 הערות: יש הרבה פלטים חוקיים לכל.key ניתן לפתור ללא שימוש במערכי עזר. המספרים במערך הפלט שלהם אותה שארית אינם חייבים לשמור על הסדר שהיה במערך המקורי. כלומר גם המערך הבא הוא תוצאה חוקית לדוגמא לעיל: 3 9 3 9 0 1 4 5 5 void mod_sort(int a[], int n, unsigned int key) { 3
4
5
שאלה )25 2 נקודות( בשאלה זו עליכם לכתוב פונקציה אשר מקבלת מחרוזת המכילה אותיות אנגליות קטנות בלבד,ודוחסת אותה. הפונקציה תמצא את זוג האותיות השונות שמופיעות ביחד )אחת אחרי השניה( הכי הרבה פעמים, ותחליף אותם בתו המיוחד '!'. יש לכתוב את הזוג שנדחס למחרוזת pair שמועברת כפרמטר. אם יש כמה זוגות שמופיעים אותה כמות של פעמים, יש לדחוס את אחד הזוגות )לא חשוב איזה זוג(. חתימת הפונקציה: void compress_string(char *str, char *pair); לדוגמה: במחרוזת" "abababcd הזוג" "ab הופיע 3 פעמים, הזוג" "ba הופיע פעמיים, ושאר הזוגות הופיעו פעם אחת. לכן יש לדחוס את הזוג "ab". בסיום הפונקציה, המחרוזת str תכיל "!!!cd והמחרוזת pair תכיל "ab". במחרוזת "abcdabcd" כל הזוגות "ab" "ab", "bc", "cd", מופיעים אותה כמות של פעמים )2(, לכן ניתן לדחוס איזה שרוצים. בסיום הפונקציה או ש pair="ab",str="!cd!cd" או ש pair="bc",str="a!da!d" או ש pair="cd".str="ab!ab!" הערות:.string.h - אין להשתמש בפונקציות מוכנות מ ניתן להניח שבמחרוזת pair יש מספיק מקום לכתיבת מחרוזת באורך 2. ניתן להניח שבמחרוזת str יש לפחות 2 תווים. ניתן להניח שהמחרוזת מורכבת מאותיות אנגליות קטנות בלבד. ניתן להשתמש במערך עזר..) aa את אותה אות פעמיים ברצף )למשל str ניתן להניח כי אין במחרוזת void compress_string(char *str, char *pair){ 6
7
שאלה )25 3 נקודות( מערך נקרא עולה יורד אם הוא שרשור של שני מערכים השמאלי ממוין מהקטן לגדול והימני מהגדול לקטן. למשל המערך 2 5 5 3-2 -2 הוא עולה יורד. מובטח שבכל אחד משני תתי המערכים יש לפחות 3 איברים ושבמערך העולה יורד יש לפחות 6 איברים. מערך נקרא עולה יורד מסדר 2 אם כל איבר בו מופיע לכל היותר פעמיים. דוגמה : -20-7 -7 12 12 52 52 19 19 4 4 הוא מערך עולה יורד מסדר 2, מכיוון שהמספרים השכיחים ביותר )52, 7-, 12, 4 ו- 19 ( מופיעים בו פעמיים. int max_val(int a[], int n) כתבו פונקציה שחתימתה: הפונקציה מקבלת כפרמטר מערך a ואורכו a n. הוא מערך עולה יורד מסדר 2. הפונקציה מחזירה כתוצאה את הערך המקסימלי מבין איברי המערך. בדוגמה שניתנה לעיל הפונקציה תחזיר 52. int max_val(int a[], int n) { 9
10
11
שאלה )25 4 נקודות( ממשו פונקציה רקורסיבית בעלת החתימה: int keyish(char* s, char* key); הפונקציה מקבלת 2 מחרוזות מילה )s( ומפתח.)key( הפונקציה מחזירה 1 אם כל האותיות של key מופיעות במחרוזת s ו- 0 אחרת. למשל עבור המפתח elf והמחרוזת flower הפונקציה תחזיר 1. עבור המפתח ball והמחרוזת balagan הפונקציה תחזיר 0 כי התו l מופיע במחרוזת רק פעם אחת ולא פעמיים כפי שהוא מופיע במפתח. ניתן להניח כי המחרוזות חוקיות ומכילות אותיות אנגליות קטנות בלבד. הערה: מימוש לא רקורסיבי אבל נכון ויעיל יקבל 20 נקודות. int keyish(char* s, char* key) { 12
13
14
15
16 בהצלחה!