תרגיל בית מספר 1#

‫אוניברסיטת תל אביב ‪ -‬בית הספר למדעי המחשב‬
‫מבוא מורחב למדעי המחשב‪ ,‬חורף ‪3102‬‬
‫תרגיל בית מספר ‪ - 2‬להגשה עד ‪ 81‬בנובמבר בשעה ‪25:22‬‬
‫קיראו בעיון את קובץ הנחיות הגשת תרגילי בית שמופיע באתר‪.‬‬
‫את הפונקציות מ שאלות ‪ 3‬ו ‪ 5 -‬הגישו בקובץ ‪ py‬אחד‪ .‬הקובץ צריך להכיל את שתי הפונקציות בלבד ולא שום‬
‫דבר נוסף (למשל‪ ,‬אין להוסיף קריאות לפונקציות)‪ .‬הקפידו על שמות הפונקציות כפי שהן מצויינות בשאלות‪.‬‬
‫את התשובות לשאלות ‪ 2 ,1‬ו ‪ ,4 -‬וכן העתק של הקוד שכתבתם כדי לענות על שאלות אלו‪ ,‬הגישו בקובץ ‪ doc‬או‬
‫‪ docx‬אחד‪.‬‬
‫בסה"כ מגישים שני קבצים בלבד‪.‬‬
‫הקפידו לענות על כל מה שנשאלתם‪.‬‬
‫שאלה ‪ – 0‬לא להגשה (שאלת "חימום")‬
‫סעיף א‬
‫מה הפלט של כל אחת מההדפסות הבאות? ( שימו לב – חלק מהפקודות לא חוקיות!)‪.‬‬
‫חישבו קודם לבד ואח"כ הריצו ובידקו‪.‬‬
‫]]‪my_list = [6, -4.7, "bla", [5,6‬‬
‫)‪print(my_list *2‬‬
‫)‪print(my_list[2][0]*2‬‬
‫)‪print(my_list[1] *2‬‬
‫)‪print(my_list[2] *2‬‬
‫)‪print("*"*50‬‬
‫)"!‪print(my_list[1] *2 + "BLA‬‬
‫)]"‪print(my_list *2 + [13]+["13‬‬
‫)"!‪print("he" + my_list[2][1] *2 + "o‬‬
‫))]‪print(len(my_list + my_list[3‬‬
‫))]‪print(len(my_list + my_list[3][0‬‬
‫סעיף ב‬
‫נניח שהגדרנו את הרשימה ]‪ ,lst = [1,2,3,4,5‬וב רצוננו להפוך את סדר האיברים בה‪ ,‬במקום (‪,)in-place‬‬
‫כלומר‪ ,‬לשנות את איברי ‪ lst‬עצמה מבלי לייצר רשימה חדשה‪.‬‬
‫‪ .1‬האם הפקודה ]‪ x=x[::-1‬עושה זאת ? בידקו באמצעות הפונקציה )(‪.id‬‬
‫‪ .2‬כיתבו פונקציה )(‪ reverse‬שמקבלת רשימה‪ ,‬והופכת את סדר האיברים שלה‪ ,‬במקום‪.‬‬
‫‪ .3‬כעת בחנו את התנהגות הפונקציה )(‪ reverse‬של המחלקה ‪ .list‬בצעו )‪ lst2 = list.reverse(lst‬ונסו‬
‫להבין מה מתרחש‪ .‬האם ההיפוך מתבצע במקום? מה מחזירה הפונקציה ?‬
‫שאלה ‪8‬‬
‫סדרת מחלקים היא סדרת מספרים‪ ,‬שהראשון שבהם הוא מספר טבעי כלשהו‪ ,‬הבא אחריו הוא סכום‬
‫המחלקים ממש של הקודם (כולל ‪ ,1‬לא כולל את המספר עצמו)‪ ,‬השלישי הוא סכום מחלקי השני‪ ,‬וכך‬
‫הלאה‪ .‬אם מגיעים ל ‪ - 0 -‬עוצרים (שכן ל ‪ 0 -‬אין מחלקים)‪.‬‬
‫למשל‪ ,‬להלן סדרת מחלקים שמתחילה ב ‪:45 -‬‬
‫סדרות מחלקים נחלקות ל ‪ 3 -‬סוגים ‪:‬‬
‫‪ .1‬סדרות שמסתיימות ב ‪( 0 -‬סדרות סופיות)‪.‬‬
‫‪ .2‬סדרות שלא מגיעות ל ‪ 0 -‬לעולם (אינסופיות)‪ ,‬שנכנסות למעגל מחזורי כלשהו‪.‬‬
‫‪ .3‬סדרות שלא מגיעות ל ‪ 0 -‬לעולם (אינסופיות)‪ ,‬שלא נכנסות למעגל מחזורי כלשהו (סדרות כאלו‬
‫חייבות להיות בלתי חסומות)‪.‬‬
‫ישנן סדרות שלא ידוע לאיזה סוג הן שייכות‪ .‬למעשה לא ידוע אם בכלל יש סדרות מהסוג השלישי –‬
‫זוהי שאלה פתוחה במתמטיקה‪.‬‬
‫א‪ .‬הסבירו בקצרה מדוע יש אינסוף סדרות מהסוג הראשון (רמז ‪ :‬מספרים ראשוניים)‪ ,‬ומדוע יש סדרות‬
‫מהסוג השני (רמז ‪ :‬מספרים מושלמים)‪.‬‬
‫ב‪ .‬כמה מספרים בין ‪ 1‬ל ‪ 275 -‬הם התחלה של סדרות מהסוג הראשון? ומהסוג השני? (כל המספרים בתחום‬
‫זה פותחים סדרה ששייכת לאחד משני הסוגים הללו‪ .‬לגבי ‪ 272‬אגב‪ ,‬לא ידוע כיום לאיזה סוג הוא‬
‫שייך‪.)...‬‬
‫ג‪ .‬כמה פעמים מופיעה הספרה ‪ 3‬בכל איברי סדרת המחלקים שמתחילה ב ‪?107 -‬‬
‫לשם הבהרה‪ ,‬עבור ‪ ,45‬הספרה ‪ 3‬מופיעה ‪ 3‬פעמים‪ .‬לצורך עזרה בבדיקת תקינות ‪ :‬בסדרה שמתחילה ב ‪-‬‬
‫‪ 131‬הספרה ‪ 3‬מופיעה ‪ 101‬פעמים‪.‬‬
‫שאלה ‪2‬‬
‫למספר ‪ 5200000‬כמעט ‪ 140000‬ספרות בכתיב עשרוני‪.‬‬
‫א‪ .‬מיצאו את הסכום המקסימלי של ‪ 5‬ספרות עוקבות במספר‪ .‬לשם הבהרה‪ :‬אם נחפש את הסכום‬
‫המקסימלי של ‪ 5‬ספרות עוקבות במספר ‪ 123452711‬התשובה תהיה ‪ .)562676161( 35‬האם התשובה‬
‫מפתיעה ?‬
‫ב‪ .‬מיצאו את הסכום המקסימלי של ‪ 20000‬ספרות עוקבות במספר‪ .‬לשם עזרה בבדיקת תקינות‪ :‬עבור‬
‫‪ 5100000‬התוצאה היא ‪.221304‬‬
‫טיפ‪ :‬כדאי לתת דעתכם על יעילות הקוד שלכם‪ .‬קוד בלתי יעיל‪ ,‬שיכול להתאים לסעיף א'‪ ,‬עלול לרוץ‬
‫משך זמן בלתי סביר עבור סעיף ב'‪ .‬פתרון יעיל לסעיף ב' אמור להסתיים תוך מספר שניות עד דקה על‬
‫מחשב סביר‪.‬‬
‫עמוד ‪ 2‬מתוך ‪3‬‬
‫שאלה ‪5‬‬
‫כיתבו פונקציה בשם ‪ .spellit‬לפונקציה קלט יחיד ‪ ,n‬שהוא מספר השייך ל ‪ .range(1000000) -‬על הפונקציה‬
‫להחזיר מחרוזת ובה המספר ‪ ,n‬כפי שהוא נכתב באנגלית‪ .‬מותר להניח שהקלט חוקי ואין צורך לבדוק זאת‪.‬‬
‫דוגמאות ‪:‬‬
‫)‪>>> spellit(11‬‬
‫'‪'eleven‬‬
‫)‪>>> spellit(123‬‬
‫'‪'one hundred twenty three‬‬
‫)‪>>> spellit(999999‬‬
‫'‪'nine hundred ninety nine thousand nine hundred ninety nine‬‬
‫שאלה ‪4‬‬
‫ציירו את תמונת הזיכרון ("בלונים"‪ ,‬נלמד בתרגול השלישי) לאחר ביצוע הקוד הבא‪ .‬אין צורך לצייר מצבי‬
‫ביניים‪ ,‬אלא רק את המצב הסופי‪.‬‬
‫]"‪x = ["bye‬‬
‫]‪y = ["x", x , 3‬‬
‫]‪x = x+[1000‬‬
‫]‪y[0] = y[1][0‬‬
‫)‪list.append(y, 1000‬‬
‫שאלה ‪2‬‬
‫כיתבו פונקציה בשם )‪ read_number(s,b‬שמקבלת כקלט מחרוזת ‪ s‬ומספר ‪ b‬מתוך )‪.range(2,37‬‬
‫הפונקציה מחזירה כפלט את המספר הממשי החיובי שהייצוג שלו בבסיס ‪ b‬הוא ‪.s‬‬
‫לדוגמה‪:‬‬
‫)‪>>> read_number("123.45", 10‬‬
‫‪123.45‬‬
‫)‪>>> read_number("3e8.6", 16‬‬
‫‪1000.375‬‬
‫)‪>>> read_number("10q", 30‬‬
‫‪926‬‬
‫אין להשתמש בפונקציות ‪ int‬או ‪ .float‬ניתן להניח שתווי ‪ s‬הם ספרות בבסיס ‪ b‬או התו '‪( '.‬שמציין את‬
‫המעבר מהחלק השלם לשיברי)‪.‬‬
‫בהצלחה‬
‫עמוד ‪ 3‬מתוך ‪3‬‬