תאריך הבחינה: 27.11.2015 שם המרצה: דר' צחי רוזן מר אהוד ברנע בוחן אמצע מר שחף שפרברג שם הקורס: מבוא לתכנות למערכות מידע מספר הקורס: 202-1-1041 שנה: סמסטר: א' מועד: בוחן 2016 אנא ק ראו היטב את הההוראות שלהלן: במבחן זה 4 שאלות. ענו על כל השאלות. בשאלות שבהן לא מצויינת במפורש צורת הפתרון הרצויה, ניתן לכתוב פתרון רקורסיבי או פתרון שאינו רקורסיבי, לבחירתכם. ר שמו את תשובותיכם בדפי התשובות בלבד. המחברת שקיבלתם היא מחברת טיוטה, והיא לא תימסר כלל לבדיקה. בסיום הבחינה נשמור אך ורק את דף התשובות. כל שאר החומר יועבר לגריסה. שימו לב: החשיבות העליונה היא על נכונות הקוד. מאידך, יעילות,סגנון וכתיבה ברורה חשובים גם הם, ולכן תשובה יעילה ומסוגננת תזכה בציון גבוה יותר. הקפידו על אינדנטציה (הזחה או הזזת שורות) נכונה. אתם נבחנים על כתיבת הקוד עצמו. אינכם נדרשים לרשום הערות. אתם רשאים לרשום הערות, אך אלו לא ישפיעו על הציון. בכל מקרה אין לחרוג מהמקום הנתון לתשובה בדף התשובות. בכל השאלות, מספר השורות העומדות לרשותכם בדף התשובות רומז על אורך התשובה הנדרשת. תשובות מסורבלות או ארוכות מדי לא יזכו בניקוד מלא. הקפידו על כתב יד ברור. מומלץ לרשום פתרון לשאלה קודם כל במחברת הטיוטה, ורק לאחר מכן להעתיק אותו בצורה נקיה וברורה לדף התשובות. אין להוסיף פונקציות עזר אלא אם רשום במפורש שמותר. בשאלה רבת סעיפים, מומלץ לקרוא את כל הסעיפים בשאלה לפני שניגשים לפתרונה. אם יש סעיף בשאלה המסתמך על סעיף אחר, מותר להשתמש בו גם אם לא פתרתם את הסעיף האחר. הקפידו לרשום בכל דפי התשובות את מספר הנבחן ואת מספר החדר שבו אתם נבחנים. במידה שאינכם יודעים את התשובה לסעיף שלם כלשהו, רשמו "לא יודע/ת" (במקום תשובה) ותזכו ב- 20% מניקוד הסעיף (מעוגל מטה). אין לרשום "לא יודע/ת" על חלקי סעיפים. בהצלחה! עמוד 1 מתוך 7
שאלה (10 1 נקודות) השלימו את הפונקציה (n int sum11(int המקבלת מספר 1 n ומחזירה את סכום כל המספרים בין 1 ל- n (כולל) שמתחלקים ב- 11. דוגמה: עבור = 25,n על הפונקציה להחזיר = 33 22.11 + שאלה (30 2 נקודות) סעיף א (15 נקודות) השלימו את הפונקציה (n boolean isprime(int המקבלת מספר טבעי (שלם וחיובי) > 1 nn ומחזירה true אם nn ראשוני ו- false אחרת. הניחו כי > 1.nn ניתן להוסיף משתני עזר מטיפוס פרימיטיבי בלבד. סעיף ב (15 נקודות) זוג מספרים טבעיים (שלמים חיוביים) נקראים הגדול ביותר שלהם הוא 1. מספרים זרים (co-prime) אם המחלק המשותף לדוגמה, הזוגות הבאים זרים: 23) (11, 8), (3, 10),.(9, שימו לב שלפי ההגדרה המספר 1 וכל מספר טבעי אחר הם זוג מספרים זרים. השלימו את הפונקציה (m boolean coprime(int,n int המקבלת זוג מספרים טבעיים (שלמים חיוביים) m ו- n ומחזירה true אם הם זרים ו- false אחרת. על הקריאה (10 coprime(9, להחזיר,true שכן המחלק המשותף הגדול ביותר של 9 ו- 10 הוא 1. על הקריאה (8 coprime(3, להחזיר,true שכן המחלק המשותף הגדול ביותר של 3 ו- 8 הוא 1. על הקריאה (9 coprime(6, להחזיר,false שכן ל- 6 ו- 9 יש מחלק משותף גדול מ- 1. על הקריאה (6 coprime(3, להחזיר,false שכן ל- 3 ו- 6 יש מחלק משותף גדול מ- 1. הניחו כי nn ו- mm מספרים טבעיים (שלמים חיוביים) גדולים מ- 1. עמוד 2 מתוך 7
שאלה (30 3 נקודות) מספר טבעי > 1 nn נקרא מספר קרמייקל number) (Carmichael אם הוא מקיים את שני התנאים הבאים:,(aa nn 1 ) % nn = 1 n אינו מספר ראשוני. לכל מספר שלם > 0 aa nn > זר ל- n כאשר הפעולה % היא פעולת השארית. (ראו הגדרה בשאלה 2) מתקיים.1.2 שבעת מספרי קרמייקל הקטנים ביותר הם.561, 1105, 1729, 2465, 2821, 6601, 8911 מספרי קרמייקל נדירים יחסית ונקראים על שמו של רוברט קרמייקל, אשר גילה את מספר קרמייקל הראשון. בשאלה זו עליכם לכתוב פונקציה הבודקת האם מספר טבעי נתון > 1 n הוא מספר קרמייקל. שימו לב. מותר ואף מומלץ להשתמש בפונקציות משאלה 2 גם אם לא פתרתם אותן. סעיף א (15 נקודות) השלימו את הפונקציה הרקורסיבית (m int pow(int a,int n,int המקבלת שלושה מספרים שלמים > 1 mm nn > 1, ו- 0 aa ומחזירה את הערך.(aa nn ) % mm.(2 2 ) % 3 = 1 על הקריאה ל- (3 pow(2,,2 להחזיר 1, שכן על הקריאה ל- 4) pow(2, 3, להחזיר,0 שכן = 0 4 ) % 3.(2 על הקריאה ל- 561) pow(2, 560, להחזיר,1 שכן = 1 561 ) % 560.(2 הדרכה (חובה): למרות שעבור m קטן תוצאת החישוב של 2) nn ) % mm היא מספר קטן (בין 0 ל- (1-m)), לא תמיד אפשר לחשב ב- java את 2) nn ) % mm בצורה ישירה, כלומר קודם לחשב את ) nn 2) ואחר כך לקחת את התוצאה מודולו m, שכן ) nn 2) עצמו עבור n ים גדולים, דוגמת 560, עלול להיות מספר גדול שלא ניתן לאחסון ב- java לא במשתנה מסוג int או אפילו לא במשתנה מסוג.long לכן צריך לנקוט שיטת חישוב עקיפה. הרעיון הוא לחשב בשלבים את הערך של 2) nn ) % mm בעזרת משפט השאריות הסיני שאומר שלכל שלושה מספרים שלמים 0 bb aa, ו- > 0 pp מתקיים: (aa bb) % pp = (aa % pp) (bb % pp) % pp למשל = 1 3 3)) % (5 % * 3) ((8 % = 3 5) % * (8 כך נוכל לשמור לאורך כל שלבי החישוב של 2) nn ) % mm על ערכי ביניים קטנים שהמשתנים של java כן יכולים להכיל. עמוד 3 מתוך 7
סעיף ב (15 נקודות) השלימו את הפונקציה (n boolean iscarmichael(int המקבלת מספר שלם > 1 nn ומחזירה true אם nn הוא מספר קרמייקל ו- false אחרת. הניחו כי > 1.nn על הקריאה iscarmichael(561) להחזיר,true שכן המספר 561 הוא מספר קרימייקל. על הקריאה iscarmichael(1105) להחזיר,true שכן המספר 1105 הוא מספר קרימייקל. על הקריאה iscarmichael(10) להחזיר,false שכן המספר 10 אינו מספר קרימייקל. (30 נקודות) (10 נקודות) שאלה 4 סעיף א השלימו את הפונקציה (c intvalue(char המקבלת את אחד התווים הבאים FF AA, BB, CC, DD, EE, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, (המייצגים ספרות בבסיס (16 ומחזירה את ערכו המספרי. במידה שהתקבל תו אחר על הפונקציה יש להחזיר 1-. על הקריאה intvalue('5') להחזיר 5. על הקריאה intvalue('a') להחזיר 10. על הקריאה intvalue('a') להחזיר 1-. סעיף ב (20 נקודות) בשפות מחשב רבות ניתן לייצג מספרים שלמים בבסיסים 10 8, ו- 16. מספרים בבסיס 8 נכתבים עם קידומת 0. מספרים בבסיס 16 נכתבים עם קידומת 0x. מספרים בבסיס 10 נכתבים ללא קידומת. להלן ייצוג של שלושה מספרים לדוגמה בשלושת הבסיסים הנ"ל: (16) Hexadecimal Decimal (10) Octal (8) בסיס הערך המספרי 0 00 0x0 10 012 0xA 20 024 0x14 בסעיף זה עליכם לכתוב את הפונקציה (s intvalue(string המקבלת מחרוזת המייצגת מספר שלם לא שלילי בבסיס 10 8, או 16 ומחזירה את ערכו העשרוני. עמוד 4 מתוך 7
על הקריאה ל- intvalue("0") להחזיר 0. על הקריאה ל- intvalue("00") להחזיר 0. על הקריאה ל- intvalue("0x0") להחזיר 0. על הקריאה ל- intvalue("20") להחזיר 20. על הקריאה ל- intvalue("024") להחזיר 20. על הקריאה ל- intvalue("0x14") להחזיר 20. הניחו כי המחרוזת s שונה מ- null ומייצגת מספר שלם לא שלילי באחד משלושת הבסיסים 10 8, או 16. הדרכה (חובה): בדף הבא יש רשימה של קטעי קוד ב-.java אתם חייבים להרכיב את תשובתכם מקטעי הקוד הללו ורק מהם. אתם לא חייבים להשתמש בכל הקטעים ויכולים להשתמש בכל אחד מהקטעים יותר מפעם אחת. לשם פשטות לפני כל קטע קוד מופיעה אות. במקום להעתיק את קטעי הקוד עצמם אתם צריכים לרשום ברצף הנכון רק את האותיות שמופיעות לפני הקטעים. דוגמה לאופן השימוש בקטעי הקוד (לתשובה לא נכונה): נניח שאתם רוצים לרשום את התוכנית הבאה כתשובה (לא נכונה!!!!): A E F L K H P K M W Y4 אז תשובתכם הייתה צריכה להיות: public static int intvalue(string s) int base, first; int power = 0; if (s.length()==1 s.charat(0)!= 'x') first=0; base=8; else if (s.length()==0 s.charat(0) == '0') first=0; base=16; else first=1; base=8; for (int i = first+1; i <= s.length()-1; i = i+1) value = intvalue(s.charat(i)) * power; public static int intvalue(string s) A E F L K H P K M W Y4 שימו לב בסוף השאלון יש נספח של שיטות של המחלקה.String עמוד 5 מתוך 7
מפתח אותיות/קוד עבור שאלה 4: A. int base, first; C. int power = 1; E. int power = 0; G. if (s.length()==1 s.charat(0)!= '0') I. if (s.charat(1)!='0') K. else M. first=1; base=8; O. first=1; base=10; Q. first=2; base=16; S. for (int i = s.length(); i >= first; i = i-1) U. for (int i = first; i <= s.length()-1; i = i+1) W. for (int i = first+1; i <= s.length()-1; i = i+1) Y1. value = value + intvalue(s.charat(i)) * power; B. int value = 0; D. int value = 1; F. if (s.length()==1 s.charat(0)!= 'x') H. if (s.length()==0 s.charat(0) == '0') J. if (s.charat(1)!='x') L. first=0; base=8; N. first=0; base=10; P. first=0; base=16; R. for (int i = s.length()-1; i >= first; i = i-1) T. for (int i = s.length()-1; i > first; i = i-1) V. for (int i = first; i <= s.length(); i = i+1) X. return value; Y2. value = value + intvalue(s.charat(i-1)) * power; Y3. value = value + intvalue(s.charat(i)); Y4. value = intvalue(s.charat(i)) * power; עמוד 6 מתוך 7
נספח: מספר שיטות מהמחלקה String int length() שיטה המחזירה את אורך המחרוזת. int indexof(char c) שיטה המחזירה את האינדקס הראשון במחרוזת בו מופיע התו c. אם התו c אינו מופיע השיטה מחזירה 1-. char charat(int i) String substring(int i) שיטה המחזירה את התו במקום i במחרוזת. שיטה המחזירה את תת-המחרוזת מהמקום i (כולל) ועד הסוף. String substring(int i, int j) שיטה המחזירה את תת-המחרוזת מהמקום i (כולל) ועד המקום j (לא כולל). boolean equals(string s) שיטה המחזירה true אם ורק אם המחרוזת שווה למחרוזת s. עמוד 7 מתוך 7