המחלקה להנדסת תעשייה וניהול קורס :מבוא לתכנות למהנדסים - 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 הנדסת תעשייה וניהול- ' ד"ר גיא וכטל – "מבוא לתכנות למהנדסים" – תשפ"ב – סמ' א,ד"ר ינון צוקרמן