From 15f2d8dcb8f30da7e4980e331c2912e4451f012f Mon Sep 17 00:00:00 2001 From: Eric G Butler Jr Date: Wed, 17 Sep 2025 21:19:01 -0500 Subject: [PATCH 1/7] =?UTF-8?q?Age=20Calculator:=20fix=20leap-year=20funct?= =?UTF-8?q?ion=20and=20add=20time=20summary=20(days=E2=86=92hours/minutes/?= =?UTF-8?q?seconds)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Age Calculator/calculate.py | 45 ++++++++++++++++++++++--------------- 1 file changed, 27 insertions(+), 18 deletions(-) diff --git a/Age Calculator/calculate.py b/Age Calculator/calculate.py index 83134f0..a5756bb 100644 --- a/Age Calculator/calculate.py +++ b/Age Calculator/calculate.py @@ -1,25 +1,25 @@ import time from calendar import isleap -def judge_leap_year(year): - if isleap(year): - return True - else: - return False +# Check if a year is a leap year +def judge_leap(year: int) -> bool: + return isleap(year) -def month_days(month, leap_year): +# Return number of days in a month, considering leap years +def month_days(month: int, leap_year: bool) -> int: if month in [1, 3, 5, 7, 8, 10, 12]: return 31 elif month in [4, 6, 9, 11]: return 30 elif month == 2 and leap_year: return 29 - elif month == 2 and (not leap_year): + else: return 28 - +# User input name = input("Please enter your name: ") -age = input("Please enter your age: ") +age = int(input("Please enter your age: ")) + localtime = time.localtime(time.time()) year = int(age) @@ -29,16 +29,25 @@ def month_days(month, leap_year): begin_year = int(localtime.tm_year) - year end_year = begin_year + year +# Count days in past years for y in range(begin_year, end_year): - if (judge_leap_year(y)): - day = day + 366 + if judge_leap(y): + day += 366 else: - day = day + 365 + day += 365 -leap_year = judge_leap_year(localtime.tm_year) +# Add days from current year +leap_year = judge_leap(localtime.tm_year) for m in range(1, localtime.tm_mon): - day = day + month_days(m, leap_year) - -day = day + localtime.tm_mday -print("\n\t%s's age is %d years or " % (name, year), end="") -print("%d months or %d days" % (month, day)) + day += month_days(m, leap_year) + +# Approximate breakdown (ignores time of day) +hours = day * 24 +minutes = hours * 60 +seconds = minutes * 60 + +print(f"\nHello {name}, you are approximately:") +print(f" {day:,} days") +print(f" {hours:,} hours") +print(f" {minutes:,} minutes") +print(f" {seconds:,} seconds old!") From db19bc8923ed1456bd946059e07fb515419e77f8 Mon Sep 17 00:00:00 2001 From: Eric G Butler Jr Date: Thu, 18 Sep 2025 08:33:51 -0500 Subject: [PATCH 2/7] Digital Clock: add separate date label below time --- Digital Clock/main.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/Digital Clock/main.py b/Digital Clock/main.py index 831562b..d65d7c5 100644 --- a/Digital Clock/main.py +++ b/Digital Clock/main.py @@ -12,6 +12,13 @@ ) clock_label.place(x=50, y=50) +# NEW date label +date_label = Label( + window, bg="black", fg="white", font=("Arial", 14) +) +date_label.pack(pady=(0, 10), anchor="center") + + def update_label(): current_time = strftime("%H: %M: %S\n %d-%m-%Y ") @@ -20,4 +27,8 @@ def update_label(): clock_label.pack(anchor="center") update_label() -window.mainloop() \ No newline at end of file +window.mainloop()def update_label(): + clock_label.configure(text=strftime("%H:%M:%S")) + date_label.configure(text=strftime("%A, %b %d, %Y")) + clock_label.after(1000, update_label) + From 0173fc92fb118a40a50d037f1c60e729b57e78b8 Mon Sep 17 00:00:00 2001 From: Eric G Butler Jr Date: Thu, 18 Sep 2025 08:41:16 -0500 Subject: [PATCH 3/7] Digital Clock: add 12/24-hour toggle button and 'f' shortcut --- Digital Clock/main.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Digital Clock/main.py b/Digital Clock/main.py index d65d7c5..3266afa 100644 --- a/Digital Clock/main.py +++ b/Digital Clock/main.py @@ -1,5 +1,5 @@ from time import strftime -from tkinter import Label, Tk +from tkinter import Label, Tk , Button window = Tk() window.title("Digital Clock") @@ -27,7 +27,7 @@ def update_label(): clock_label.pack(anchor="center") update_label() -window.mainloop()def update_label(): +window.mainloop() def update_label(): clock_label.configure(text=strftime("%H:%M:%S")) date_label.configure(text=strftime("%A, %b %d, %Y")) clock_label.after(1000, update_label) From 026b56e1b9e2de9cd2234f49e7ce584e8d03c5a8 Mon Sep 17 00:00:00 2001 From: Eric G Butler Jr Date: Thu, 18 Sep 2025 08:53:14 -0500 Subject: [PATCH 4/7] Digital Clock: consolidate update loop and refresh every second --- Digital Clock/main.py | 34 +++++++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/Digital Clock/main.py b/Digital Clock/main.py index 3266afa..632af37 100644 --- a/Digital Clock/main.py +++ b/Digital Clock/main.py @@ -7,12 +7,14 @@ window.configure(bg="green") window.resizable(False, False) +use_24h = True + clock_label = Label( window, bg="black", fg="green", font=("Arial", 30, "bold"), relief="flat" ) clock_label.place(x=50, y=50) -# NEW date label + date_label = Label( window, bg="black", fg="white", font=("Arial", 14) ) @@ -20,15 +22,29 @@ +def toggle_format(_evt=None): + global use_24h + use_24h = not use_24h + fmt_btn.config(text="Switch to 24-hour" if not use_24h else "Switch to 12-hour") + +fmt_btn = Button(window, text="Switch to 12-hour", command=toggle_format) +fmt_btn.pack(pady=(0, 8)) +window.bind("", toggle_format) # press 'f' to toggle + + + def update_label(): - current_time = strftime("%H: %M: %S\n %d-%m-%Y ") - clock_label.configure(text=current_time) - clock_label.after(80, update_label) - clock_label.pack(anchor="center") + + if use_24h: + time_text = strftime("%H:%M:%S") + else: + # strip leading zero in 12h mode for a cleaner look + time_text = strftime("%I:%M:%S %p").lstrip("0") + clock_label.configure(text=time_text) + date_label.configure(text=strftime("%A, %b %d, %Y")) + window.after(1000, update_label) update_label() -window.mainloop() def update_label(): - clock_label.configure(text=strftime("%H:%M:%S")) - date_label.configure(text=strftime("%A, %b %d, %Y")) - clock_label.after(1000, update_label) +window.mainloop() + From 0a32153debe0040f48bdcca55641f95384a461f7 Mon Sep 17 00:00:00 2001 From: Eric G Butler Jr Date: Thu, 18 Sep 2025 21:03:18 -0500 Subject: [PATCH 5/7] Geographic Distance: add validate_coordinates() helper and use it in main() --- Geographic Distance/geographic_distance.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/Geographic Distance/geographic_distance.py b/Geographic Distance/geographic_distance.py index bf6a0e2..bf5208d 100644 --- a/Geographic Distance/geographic_distance.py +++ b/Geographic Distance/geographic_distance.py @@ -17,6 +17,18 @@ def calculate_distance_and_time(coord1, coord2, avg_speed): return distance, travel_time + def validate_coordinates(coord): + """Ensure latitude and longitude are within valid ranges.""" + lat, lon = coord + if not (-90 <= lat <= 90): + raise ValueError(f"Latitude {lat} out of range (-90..90)") + if not (-180 <= lon <= 180): + raise ValueError(f"Longitude {lon} out of range (-180..180)") + return coord + + + + def main(): # Coordinates (latitude, longitude) From 392a9e6041d8fe4f260fc2c02df8e7bec98e99b5 Mon Sep 17 00:00:00 2001 From: Eric G Butler Jr Date: Thu, 18 Sep 2025 21:06:12 -0500 Subject: [PATCH 6/7] Geographic Distance: add km_to_miles() and show distance in km and miles --- Geographic Distance/geographic_distance.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Geographic Distance/geographic_distance.py b/Geographic Distance/geographic_distance.py index bf5208d..1dff49c 100644 --- a/Geographic Distance/geographic_distance.py +++ b/Geographic Distance/geographic_distance.py @@ -26,6 +26,10 @@ def validate_coordinates(coord): raise ValueError(f"Longitude {lon} out of range (-180..180)") return coord + def km_to_miles(km: float) -> float: + """Convert kilometers to miles.""" + return km * 0.621371 + From 672129d25e352975e0783874d71461d0e6a92e11 Mon Sep 17 00:00:00 2001 From: Eric G Butler Jr Date: Thu, 18 Sep 2025 21:07:48 -0500 Subject: [PATCH 7/7] Geographic Distance: format travel time as hours and minutes --- Geographic Distance/geographic_distance.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Geographic Distance/geographic_distance.py b/Geographic Distance/geographic_distance.py index 1dff49c..c91889e 100644 --- a/Geographic Distance/geographic_distance.py +++ b/Geographic Distance/geographic_distance.py @@ -30,6 +30,16 @@ def km_to_miles(km: float) -> float: """Convert kilometers to miles.""" return km * 0.621371 + def format_travel_time(hours: float) -> str: + """Format fractional hours as 'Hh Mm'.""" + h = int(hours) + m = int(round((hours - h) * 60)) + if m == 60: + h += 1 + m = 0 + return f"{h}h {m}m" + +