Uploaded by bizusefull

פתרון מועד א תכנות

advertisement
‫המחלקה להנדסת תעשייה וניהול‬
‫קורס ‪ :‬מבוא לתכנות למהנדסים‬
‫‪ - 4212510‬מועד א' – ‪ – 31.1.2022‬תשפ" ב – סמסטר א '‬
‫ד"ר ינון צוקרמן ‪ ,‬ד"ר גיא וכטל‬
‫משך המבחן ‪ :‬שעתיים וחצי )‪ 150‬דקות(‬
‫חומר עזר‪:‬‬
‫ללא חומר עזר )גם לא מחשבון(‬
‫הוראות כלליות‪:‬‬
‫א‪ .‬יש לענות על כל השאלות‪.‬‬
‫ב‪ .‬יש לכתוב את כל התשובות במחברות הבחינה‪.‬‬
‫ג‪.‬‬
‫תשובות לא מנומקות לא יקבלו ניקוד‪.‬‬
‫ד‪ .‬ומידה ולא יודעים תשובה לשאלה‪ ,‬ניתן לכתוב "לא יודע\ת" ולקבל ‪20%‬‬
‫מהניקוד‪.‬‬
‫בהצלחה!‬
‫© אין לשכפל‪ ,‬להעתיק‪ ,‬לצלם‪ ,‬להקליט‪ ,‬לאחסן במאגר מידע לשדר או לקלוט בכל דרך או בכל אמצעי אלקטרו י אופטי או אחר‬
‫כל חלק שהוא ממבחן זה‪ ,‬אלא באישור מפורש של מרצה הקורס‪.‬‬
‫שאלה ‪ 15) 1‬נק'(‬
‫כתבו פונקציה בעלת החתימה )‪ median(lst‬המקבלת רשימה של מספרים שלמים ומחזירה‬
‫את החציון של הרשימה‪ .‬זכרו‪:‬‬
‫𝑥‬
‫𝑑𝑑𝑜 𝑠𝑖 𝑛 𝑓𝑖 ‪,‬‬
‫𝑥 ‪𝑚𝑒𝑑𝑖𝑎𝑛(𝑥) = 𝑥 +‬‬
‫𝑛𝑒𝑣𝑒 𝑠𝑖 𝑛 𝑓𝑖 ‪,‬‬
‫‪2‬‬
‫שימו לב – אין להשתמש במתודות ייעודיות למציאת חציון‪.‬‬
‫פתרון‪:‬‬
‫‪def Median(lst):‬‬
‫)(‪lst.sort‬‬
‫‪if len(lst)%2 == 0:‬‬
‫‪return (lst[(len(lst))//2 - 1] + lst[(len(lst)+2)//2 - 1])/2‬‬
‫]‪return lst[(len(lst)+1)//2 - 1‬‬
‫שאלה ‪ 15) 2‬נק'(‬
‫כתבו פונקציה רקורסיבית בעלת החתימה )‪ product(x,y‬המקבלת שני מספרים )‪(x, y‬‬
‫ומחזירה את מכפלתם‪ .‬אסור להשתמש בכפל‪ ,‬לולאות‪ ,‬משתנים גלובליים‪ ,‬ולא בפונקציות‬
‫וספריות קיימות‪ .‬לדוגמה‪:‬‬
‫)‪>>> product(2, 6‬‬
‫‪12‬‬
‫פתרון‪:‬‬
‫‪def product(x ,y):‬‬
‫‪if y == 0:‬‬
‫‪return 0‬‬
‫)‪return x + product(x, y-1‬‬
‫ד"ר ינון צוקרמן‪ ,‬ד"ר גיא וכטל – "מבוא לתכנות למהנדסים" – תשפ"ב – סמ' א' ‪ -‬הנדסת תעשייה וניהול‬
‫‪2‬‬
‫© אין לשכפל‪ ,‬להעתיק‪ ,‬לצלם‪ ,‬להקליט‪ ,‬לאחסן במאגר מידע לשדר או לקלוט בכל דרך או בכל אמצעי אלקטרו י אופטי או אחר‬
‫כל חלק שהוא ממבחן זה‪ ,‬אלא באישור מפורש של מרצה הקורס‪.‬‬
‫שאלה ‪ 20) 3‬נק'(‬
‫משולש פסקל משולש פסקל הוא סידור של מספרים בצורת משולש‪ ,‬הנבנה באופן הבא‪:‬‬
‫הקודקוד העליון של משולש זה מכיל את המספר ‪ ,1‬תחתיו יופיעו ‪ 1‬ו‪ 1 -‬ומכאן כל מספר‬
‫במשולש מהווה את סכום שני המספרים שנמצאים מעליו‪ ,‬לדוגמה‪:‬‬
‫כתבו פונקציה בעלת החתימה )‪ pascal(x‬המקבלת מספר שלם חיובי ומדפיסה את משולש‬
‫פסקל עם ‪ x-‬שורות‪ .‬דוגמה‪:‬‬
‫)‪>>>pascal(6‬‬
‫‪1‬‬
‫‪1 1‬‬
‫‪1 2 1‬‬
‫‪1 3 3 1‬‬
‫‪1 4 6 4 1‬‬
‫‪1 5 10 10 5 1‬‬
‫פתרון‪:‬‬
‫‪def pascal(n):‬‬
‫‪for line in range(1,n+1):‬‬
‫‪x = 1‬‬
‫‪for i in range(1,line+1):‬‬
‫)" " = ‪print(x,end‬‬
‫)‪x = int(x * (line - i) / i‬‬
‫)""(‪print‬‬
‫ד"ר ינון צוקרמן‪ ,‬ד"ר גיא וכטל – "מבוא לתכנות למהנדסים" – תשפ"ב – סמ' א' ‪ -‬הנדסת תעשייה וניהול‬
‫‪3‬‬
‫© אין לשכפל‪ ,‬להעתיק‪ ,‬לצלם‪ ,‬להקליט‪ ,‬לאחסן במאגר מידע לשדר או לקלוט בכל דרך או בכל אמצעי אלקטרו י אופטי או אחר‬
‫כל חלק שהוא ממבחן זה‪ ,‬אלא באישור מפורש של מרצה הקורס‪.‬‬
‫שאלה ‪ 15) 4‬נק'(‬
‫תארו את פעולתן של התוכניות הבאות ותנו דוגמה לקלט ופלט‪:‬‬
‫א‪.‬‬
‫‪def solution(lst):‬‬
‫‪for i in lst:‬‬
‫‪if 0 in lst:‬‬
‫)‪lst.remove(0‬‬
‫)‪lst.append(0‬‬
‫‪return lst‬‬
‫פתרון‪:‬‬
‫פונקציה המקבלת רשימה ואם נמצאים בה אפסים היא מעבירה אותם לסוף‬
‫קלט דוגמה‪[1,5,2,0,3,6,0,9] :‬‬
‫]‪[1,5,2,3,6,9,0,0‬‬
‫פלט‪:‬‬
‫ב‪.‬‬
‫‪def solution(n):‬‬
‫][ = ‪nums‬‬
‫‪for num in range(n):‬‬
‫‪if num > 1:‬‬
‫‪for i in range(2, num):‬‬
‫‪if (num % i) == 0:‬‬
‫‪break‬‬
‫‪else:‬‬
‫)‪nums.append(num‬‬
‫‪return nums‬‬
‫פתרון‪:‬‬
‫פונקציה המקבלת מספר ומחזירה את רשימת כל המספרים הראשוניים עד לאותו המספר‬
‫קלט דוגמה‪10 :‬‬
‫]‪[2,3,5,7‬‬
‫פלט‪:‬‬
‫בבחינה ניתן הניקוד גם למי שרשם שיש שגיאה בהזחה של ‪ else:‬בשורה ‪8‬‬
‫ד"ר ינון צוקרמן‪ ,‬ד"ר גיא וכטל – "מבוא לתכנות למהנדסים" – תשפ"ב – סמ' א' ‪ -‬הנדסת תעשייה וניהול‬
‫‪4‬‬
‫© אין לשכפל‪ ,‬להעתיק‪ ,‬לצלם‪ ,‬להקליט‪ ,‬לאחסן במאגר מידע לשדר או לקלוט בכל דרך או בכל אמצעי אלקטרו י אופטי או אחר‬
‫כל חלק שהוא ממבחן זה‪ ,‬אלא באישור מפורש של מרצה הקורס‪.‬‬
‫ג‪.‬‬
‫‪def func(x):‬‬
‫)‪str_x = str(x‬‬
‫‪count, n = 0, 0‬‬
‫‪for i in range(len(str_x)):‬‬
‫‪if tmp_x[::-1][i] != '.':‬‬
‫‪count += 1‬‬
‫)]‪n += (10**i) * int(tmp_x[::-1][i‬‬
‫‪else:‬‬
‫‪break‬‬
‫)‪d = int('1' + '0' * count‬‬
‫‪c = 1‬‬
‫‪for i in range(n, 1, -1):‬‬
‫‪if n % i == 0 and d % i == 0:‬‬
‫‪c = i‬‬
‫‪break‬‬
‫'})‪return f'{int(x)} {int(n/c)}/{int(d/c‬‬
‫פתרון‪:‬‬
‫פונקציה המקבלת ‪ float‬ומחזירה במחרוזת את ייצוגו כשבר מורכב‬
‫‪3.456‬‬
‫קלט דוגמה‪:‬‬
‫’‪‘3 57/125‬‬
‫פלט‪:‬‬
‫ד"ר ינון צוקרמן‪ ,‬ד"ר גיא וכטל – "מבוא לתכנות למהנדסים" – תשפ"ב – סמ' א' ‪ -‬הנדסת תעשייה וניהול‬
‫‪5‬‬
‫© אין לשכפל‪ ,‬להעתיק‪ ,‬לצלם‪ ,‬להקליט‪ ,‬לאחסן במאגר מידע לשדר או לקלוט בכל דרך או בכל אמצעי אלקטרו י אופטי או אחר‬
‫כל חלק שהוא ממבחן זה‪ ,‬אלא באישור מפורש של מרצה הקורס‪.‬‬
‫שאלה ‪ 35) 5‬נק'(‬
‫א( צרו מחלקה תחת השם ‪ Client‬שתייצג לקוח בחנות אינטרנטית גדולה‪ .‬בעת ההרשמה‬
‫)אתחול( של לקוח חדש הוא רושם ב‪ 4-‬שדות שונים את שם המשתמש בו הוא מעוניין‪,‬‬
‫שמו הפרטי‪ ,‬שם המשפחה וכתובת הדוא"ל שלו‪ .‬פרטים אלו נכנסים כפרמטרים למתודת‬
‫הבנאי )אותה גם יש להגדיר(‪ .‬כמו‪-‬כן‪ ,‬בשלב זה מאופסת רשימת ההזמנות שלו‬
‫‪ self.orders‬כרשימה ריקה‪.‬‬
‫ללקוח יש שתי יכולות פונקציונאליות בסיסיות‪ .‬ביצוע הזמנה וביטול הזמנה‪:‬‬
‫ )‪makeOrder(itemID, itemName, deliveryMethod‬‬‫מתודה אשר תוסיף אובייקט מסוג הזמנה )‪ ,Order‬ראו בהמשך( לרשימת ההזמנות של הלקוח‬
‫שתקבל כפרמטרים את מספרו הסידורי של הפריט )‪ ,(itemID‬שם הפריט )‪ (itemName‬וכן‬
‫את שיטת השילוח )‪ .(deliveryMethod‬כמו‪-‬כן‪ ,deliveryMethod ,‬אם לא נכנס קלט כלל‬
‫תקבל כערך ברירת מחדל את המחרוזת ”‪.“regular‬‬
‫ )‪cancelOrder(itemID‬‬‫מתודה אשר מבטלת הזמנה מרשימת ההזמנות של הלקוח לפי מספרו הסידורי של ההזמנה‪.‬‬
‫במידה וישנה כפילות ומופיעות שתי הזמנות עם אותו מספר סידורי‪ ,‬המתודה תסיר את המופע‬
‫הראשון ברשימת ההזמנות עם המספר הסידורי הנתון ותעצור‪.‬‬
‫ )(__‪__repr‬‬‫תחזיר מחרוזת עם שם המשתמש‪ ,‬השם הפרטי ושם המשפחה )יחד( וכתובת הדוא"ל‪ .‬בנוסף‪,‬‬
‫אם ישנן הזמנות ללקוח הן יוצגו עם פרטים מלאים על כל הזמנה כולל זמן הזמנה ותאריך‬
‫הגעה משוער‪.‬‬
‫ב( צרו מחלקה שתתאר הזמנה )‪ (Order‬אותה מבצע הלקוח‪ .‬הקשר בין הלקוח להזמנה הינו‬
‫מסוג ”‪ .“Has a‬בעת האתחול מתודת הבנאי תצפה לקבל את מספרו הסידורי של הפריט‪,‬‬
‫שמו וכן את שיטת ההזמנה‪ .‬בנוסף היא תאתחל תכונה בשם ‪ self.openingDate‬שתייצג‬
‫את תאריך פתיחת ההזמנה ותשתמש במתודת )(‪ date.today‬מתוך הספרייה ‪datetime‬‬
‫)מתודה המחזירה את התאריך הנוכחי היום(‪ .‬לסיום‪ ,‬בעת אתחול ההזמנה גם ייווצר‬
‫אובייקט מסוג משלוח )‪ – Shipment‬ראה סעיף ג' של השאלה( ויבטא את אופי המשלוח‪.‬‬
‫ )(__‪__repr‬‬‫תחזיר את שם הפריט והמס"ד וכן את תאריך הפתיחה‪.‬‬
‫ד"ר ינון צוקרמן‪ ,‬ד"ר גיא וכטל – "מבוא לתכנות למהנדסים" – תשפ"ב – סמ' א' ‪ -‬הנדסת תעשייה וניהול‬
‫‪6‬‬
‫ לאחסן במאגר מידע לשדר או לקלוט בכל דרך או בכל אמצעי אלקטרו י אופטי או אחר‬,‫ להקליט‬,‫ לצלם‬,‫ להעתיק‬,‫© אין לשכפל‬
.‫ אלא באישור מפורש של מרצה הקורס‬,‫כל חלק שהוא ממבחן זה‬
‫( שבעת האתחול תבדוק אם סוג המשלוח‬Shipment) ‫ג( צרו מחלקה עבור אופי המשלוח‬
‫ אם המשלוח הוא רגיל הוא‬.(quick) ‫( או מהיר‬preferred) ‫ מועדף‬,(normal) ‫הוא רגיל‬
‫ יום לאחר‬30-‫ אם המושלח מועדף הוא יגיע כ‬,‫ יום לאחר מועד פתיחת ההזמנה‬60-‫יגיע כ‬
‫ לשם ביצוע חישוב זה‬.‫ ממועד פתיחת ההזמנה‬7 ‫מועד פתיחת ההזמנה ואם הוא מהיר אז‬
‫ שהשימוש בה נעשה באופן הבא‬datetime ‫ניתן להשתמש במתודה נוספת מתוך ספריית‬
. timedelta(days=5) :‫ ימים‬5 ‫אם לדוגמה נרצה להוסיף‬
__repr__() .‫תחזיר את זמן המשלוח המשוער‬
:‫פתרון‬
'‫סעיף א‬
class Client:
def __init__(self, username,firstName, lastName, email):
from datetime import date, timedelta
self.username
= username
self.firstName = firstName
self.lastName
= lastName
self.email
= email
self.orders
= []
def makeOrder(self, itemID, itemName, deliveryMethod = "regular"):
self.orders.append( Order(itemID, itemName, deliveryMethod) )
def cancelOrder(self, itemID):
for x in self.orders:
if x.itemID == itemID:
self.orders.remove(x)
break
def __repr__(self):
result = f'Username:\t{self.username}\nName:\t\t{self.firstName
+ " " + self.lastName}\nE-mail:\t\t{self.email}'
if len(self.orders) > 0 :
result += "\n~~~~~~\nOrders:\n"
result += f"{self.orders}"
#for x in self.orders:
# result += f"{x}\n"
return result
7
‫ הנדסת תעשייה וניהול‬- '‫ ד"ר גיא וכטל – "מבוא לתכנות למהנדסים" – תשפ"ב – סמ' א‬,‫ד"ר ינון צוקרמן‬
‫ לאחסן במאגר מידע לשדר או לקלוט בכל דרך או בכל אמצעי אלקטרו י אופטי או אחר‬,‫ להקליט‬,‫ לצלם‬,‫ להעתיק‬,‫© אין לשכפל‬
.‫ אלא באישור מפורש של מרצה הקורס‬,‫כל חלק שהוא ממבחן זה‬
'‫סעיף ב‬
class Order:
def __init__(self, itemID, itemName, deliveryMethod):
from datetime import date, timedelta
self.itemID
= itemID
self.itemName
= itemName
self.deliveryMethod = deliveryMethod
self.openingDate
= date.today()
self.shipment = Shipment(self.openingDate,self.deliveryMethod)
def __repr__(self):
return f"\nItem: {self.itemName} (i.d.:{self.itemID})\nOpening d
ate:{self.openingDate}\n{self.shipment}"
'‫סעיף ג‬
class Shipment:
def __init__(self, openingDate, deliveryMethod):
from datetime import date, timedelta
self.openingDate = openingDate
if deliveryMethod == "regular":
self.arrivelDate = openingDate + timedelta(days=60)
elif deliveryMethod == "priority":
self.arrivelDate = openingDate + timedelta(days=30)
else:
self.arrivelDate = openingDate + timedelta(days=7)
def __repr__(self):
return f"Estimate arrivel date: {self.arrivelDate}"
8
‫ הנדסת תעשייה וניהול‬- '‫ ד"ר גיא וכטל – "מבוא לתכנות למהנדסים" – תשפ"ב – סמ' א‬,‫ד"ר ינון צוקרמן‬
Download