תרגילים נוספים: שבוע 1

הביקורת והפידבק שלכם, ככל שהיא מועברת בצורה נעימה ועניינית ובת־התייחסות, חשובה לי באופן אישי.
בעקבות בקשתה של @GBGA, הרי תרגול נוסף בנוגע לשבוע 1.

כיוון שזהו תרגול רשות (התרגילים אינם ברי הגשה), הוספתי פתרונות – אבל זהירות!
אל תיגשו בבקשה לפתרונות לא משנה כמה התייאשתם, או כמה אתם בטוחים בעצמכם שאתם יודעים לפתור. קודם – פתרו ובדקו שעובד, אח"כ – הציצו בפתרון ובדקו אם הוא סבבה בעיניכם.

מחברת 4

  1. מה יודפס בסוף הריצה של הקוד הבא?
a = 1
b = 2
c = a + b
a = a + 1
d = (b + c) // a
print(a + b + c + d)
  1. מעבד בעל 1GHz מבצע בערך 1,000,000,000 פעולות בשנייה. מהירות האור היא 299,792,458 מטרים בשנייה. אורך של שטר חדש של 200 ש"ח הוא 150 מ"מ. אנחנו לוקחים מזוודת שטרות של 200, ופורשים אותם בטור ארוך על הרצפה, כאשר כל שטר מוצמד לקודמו (דמיינו טור ארוך מאוד של שטרות 200, מסודרים אחד בהמשך לשני כמו טור קוביות דומינו, כאשר אין חפיפה בין השטרות). אנחנו מפעילים את המחשב שלנו שכוחו 3.2GHz, ונותנים לו לחשב 4 פעולות בסיסיות. בדיוק באותו זמן בו המחשב מתחיל לבצע את הפעולות, אנחנו מפעילים מנורה בקצהו האחד של טור השטרות. כמה שטרות הספיק האור לעבור עד סיום החישוב? ודאו שאתם משתמשים בשמות משתנים אינדיקטיביים.
  2. תרגיל לוגי קשה: כתבו סדרת פעולות שבהנתן כל ערך מספרי שלם על משתנים a ו־b, תחליף את הערכים בתוכם. אסור לכם להשתמש במשתנים נוספים.

מחברת 5

  1. קלטו מספר 4 ספרתי, וחשבו מה סכום הספרות שלו. לדוגמה: סכום הספרות של 1234 הוא 10. סכום הספרות של 9999 הוא 36.
  2. קבלו מהמשתמש מספר בשניות, והדפיסו לו בחזרה כמה שעות, כמה דקות וכמה שניות יש במספר השניות שהזין.
    לדוגמה, עבור 300 יודפס למשתמש 0 hours, 5 minutes, 0 seconds. עבור 3600 יודפס למשתמש 1 hours, 0 minutes, 0 seconds. עבור 3671 יודפס למשתמש 1 hours, 1 minutes, 11 seconds.
  3. קלטו מהמשתמש את התאריך יום הולדתו ב־EPOCH ואת התאריך הנוכחי ב־EPOCH והדפיסו לו מה גילו בשנים ובימים. הניחו שבשנה יש 365 ימים. לדוגמה, אם מישהו נולד בתאריך 1234567890 והיום ה־EPOCH הוא 1586661160, גילו אמור לצאת 11 שנים ו־60 ימים. הפלט במקרה זה יהיה: “Your age is 11 years and 60 days.”

מחברת 6

  1. כתבו תוכנה שמקבלת את הגובה של משולש, את הבסיס שלו ואת השטח שלו, ומדפיסה האם מדובר במשולש תקין.
  2. קלטו 2 מספרים 4 ספרתיים. חשבו את סכום הספרות של כל אחד מהם, והדפיסו אם הם שווים. לדוגמה: סכום הספרות של 1357 שווה לסכום הספרות של 1267, אבל סכום הספרות של 9999 אינו שווה לסכום הספרות של 9888.

מחברת 7

  1. קבלו את אורכי 3 הצלעות של משולש, ובדקו שהוא משולש תקני. משולש תקני הוא משולש שבו סכום כל 2 צלעות בהכרח גדול מהצלע השלישית. לדוגמה: משולש שצלעותיו הם 2, 4 ו־7 הוא משולש לא תקין, מכיוון ש־2 + 4 לא גדול מ־7. משולש שצלעותיו הם 4, 5 ו־6 הוא משולש תקין, כיוון ש־4 + 5 = 9 (גדול מ־6), 5 + 6 = 11 (גדול מ־4), 4 + 6 = 10 (גדול מ־5).
  2. קבלו כקלט מספר שלם קטן מ־10,000. הדפיסו האם ספרת האחדות שהתקבלה היא הספרה הגדולה ביותר במספר. לדוגמה: עבור המספרים 1234, 1 ו־57 התשובה היא כן. עבור המספרים 65, 912 ו־666 התשובה היא לא.
  3. שם של אדם המכיל את ההברה “us” הוא יווני, אלא אם שמו הוא “Perseus”. קלטו מהמשתמש שם ובדקו האם הוא יווני.
  4. קלטו מהמשתמש מספר בעל 5 ספרות, ובדקו האם הוא פלינדרום (ניתן לקרוא אותו מההתחלה לסוף ומהסוף להתחלה). לדוגמה: 54013, 27773, 71193 אינם פלינדרומים. 11111, 12321, 82728 כן פלינדרומים.
  5. תרגיל קשה: קבלו מספר שיכול להיות חד ספרתי, דו ספרתי או תלת ספרתי. הדפיסו את הספרה הגדולה ביותר במספר. לדוגמה, עבור 432 הדפיסו 4. עבור 27 הדפיסו 7. עבור 5 הדפיסו 5.
רמז לתרגיל הקשה במחברת 7

מה קורה כשממירים True ל־int?
מה קורה כשממירים False ל־int?

פתרונות

4.1

9

4.2
operation_per_second_for_1ghz_cpu = 1_000_000_000  # In Python, we can use _ for clarity instead of ,
speed_of_light_in_mps = 299_792_458
length_of_200_nis_banknote_in_mm = 150
mm_in_m = 1_000
length_of_200_nis_banknote_in_m = length_of_200_nis_banknote_in_mm / mm_in_m

my_cpu_power_in_ghz = 3.2
my_cpu_operations_per_second = my_cpu_power_in_ghz * operation_per_second_for_1ghz_cpu
operations_to_calculate = 4
time_to_finish_in_seconds = operations_to_calculate / my_cpu_operations_per_second

distance_light_traveled_in_m = time_to_finish_in_seconds * speed_of_light_in_mps
banknotes_light_traveled = distance_light_traveled_in_m / length_of_200_nis_banknote_in_m
print(banknotes_light_traveled)
4.3
a = 6
b = 2
print("The numbers are now: a = " + str(a) + " and b = " + str(b))
a = b - a
b = b - a
a = a + b
print("The numbers are now: a = " + str(a) + " and b = " + str(b))

5.1
number = int(input("Please enter your number: "))
thousands = number // 1000
hundreds = number // 100 % 10
tens = number % 100 // 10
units = number % 10
print(thousands + hundreds + tens + units)
5.2
seconds = int(input("Please enter your number: "))
hours = seconds // 60 // 60
minutes = seconds // 60 % 60
seconds = seconds % 60
print(str(hours) + " hours, " + str(minutes) + " minutes, and " + str(seconds) + " seconds.")
5.3
DAYS_IN_A_SINGLE_YEAR = 365
SECONDS_IN_A_SINGLE_DAY = 60 * 60 * 24  # Seconds in minute * minutes in hour * hours in day
SECONDS_IN_YEAR = SECONDS_IN_A_SINGLE_DAY * DAYS_IN_A_SINGLE_YEAR

user_age_in_epoch = int(input("Please enter your age in epoch: "))
current_date_in_epoch = int(input("Please enter the current date in epoch: "))

age_in_years = (current_date_in_epoch - user_age_in_epoch) // SECONDS_IN_YEAR
leftover_days_in_age = ((current_date_in_epoch - user_age_in_epoch) % SECONDS_IN_YEAR) // SECONDS_IN_A_SINGLE_DAY

# Test data 1234567890, 1586661330 should yield 11, 60
print("Your age is " + str(age_in_years) + " years and " + str(leftover_days_in_age) + " days.")

6.1
triangle_height = int(input("Enter height: "))
triangle_base = int(input("Enter base: "))
triangle_area = int(input("Enter area: "))

is_triangle_ok = (triangle_base * triangle_height / 2) == triangle_area
print("Is the triangle sababa? " + str(is_triangle_ok))
6.2
# What a great life it could be if we only had our functions, huh?
number_a = int(input("Please enter your number: "))
thousands_a = number_a // 1000
hundreds_a = number_a // 100 % 10
tens_a = number_a % 100 // 10
units_a = number_a % 10
digits_sum_a = thousands_a + hundreds_a + tens_a + units_a

number_b = int(input("Please enter your number: "))
thousands_b = number_b // 1000
hundreds_b = number_b // 100 % 10
tens_b = number_b % 100 // 10
units_b = number_b % 10
digits_sum_b = thousands_b + hundreds_b + tens_b + units_b

print("Are the digit sums equal? " + str(digits_sum_a == digits_sum_b))

7.1
edge_a_length = int(input("Please enter edge a length: "))
edge_b_length = int(input("Please enter edge b length: "))
edge_c_length = int(input("Please enter edge c length: "))

is_triangle_ok = (
    edge_a_length + edge_b_length > edge_c_length
    and edge_b_length + edge_c_length > edge_a_length
    and edge_c_length + edge_a_length > edge_b_length
)
print("Is the triangle OK? " + str(is_triangle_ok))
7.2
number = int(input("Please enter your number: "))
thousands = number // 1000
hundreds = number % 1000 // 100
tens = number % 100 // 10
units = number % 10

is_units_the_biggest = units > tens and units > hundreds and units > thousands
print("Is the units digit the biggest? " + str(is_units_the_biggest))
7.3
name = input("Please enter your name: ")
is_greece = 'us' in name and name != "Perseus"
print("Is he/she greece? " + str(is_greece))
7.4
number = int(input("Please enter your number: "))
ten_thousands = number // 10000
thousands = number // 1000 % 10
hundreds = number % 1000 // 100
tens = number % 100 // 10
units = number % 10

is_palindrom = ten_thousands == units and thousands == tens
print("Is the number palindrom? " + str(is_palindrom))
7.5
number = int(input("Please enter your number: "))
hundreds = number // 100
tens = number % 100 // 10
units = number % 10

the_highest_digit = (
    int(hundreds >= tens and hundreds >= units) * hundreds +
    int(tens >= hundreds and tens >= units) * tens +
    int(units >= tens and units >= hundreds) * units
)
print("The highest digit is " + str(the_highest_digit))
8 לייקים

@Yam ברגע שנסיים עם השיעורים של השבוע, נעשה את זה נראה מעניין ממש…

לייק 1

היי, בתרגיל 4.2 יש פער בערך של מהירות האור בשאלה עצמה (299,792,458 ) לבין הערך שלה בפתרון
(speed_of_light_in_mps = 2_999_792_458)

אז שימו לב אם יש פער של סדרי גודל בתשובה סופית…

תיקנתי את זה, תודה (:

לייק 1
פתרון

number = int(input("Please enter your number: "))
hundreds = number // 100
tens = number % 100 // 10
units = number % 10

the_highest_digit = (
int(hundreds > tens and hundreds > units) * hundreds +
int(tens > hundreds and tens > units) * tens +
int(units > tens and units >= hundreds) * units
)
print("The highest digit is " + str(the_highest_digit))

נראה לי שזה עובד יותר טוב בלי ה"=" כי מספרים כמו 434 נותנים פלט של 8 בשיטה הזו.
אגב עשיתי את זה אחרת, האם השיטה של אמת ושקר היא משמעותית יותר יעילה?

פתרון

number = int(input("number: "))

meot = number // 100 % 10
eser = number // 10 % 10
ehad = number % 10

if meot > eser and meot > ehad:
print (meot)
elif eser > meot and eser > ehad:
print (eser)
elif ehad > meot and ehad > eser:
print (ehad)
elif meot == eser and eser > ehad:
print (meot)
elif eser == ehad and eser > meot:
print (eser)
else:
print (ehad)

במחברות של שבוע 1 לא למדנו עדיין if.
434 החזיר לי 4.

עובד נכון רק בתנאי שהספרה הגבוהה ביותר לא חוזרת יותר מפעם אחת…