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!") diff --git a/Digital Clock/main.py b/Digital Clock/main.py index 831562b..632af37 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") @@ -7,17 +7,44 @@ 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) +date_label = Label( + window, bg="black", fg="white", font=("Arial", 14) +) +date_label.pack(pady=(0, 10), anchor="center") + + + +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() \ No newline at end of file +window.mainloop() + + diff --git a/Geographic Distance/geographic_distance.py b/Geographic Distance/geographic_distance.py index bf6a0e2..c91889e 100644 --- a/Geographic Distance/geographic_distance.py +++ b/Geographic Distance/geographic_distance.py @@ -17,6 +17,32 @@ 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 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" + + + + + def main(): # Coordinates (latitude, longitude) diff --git a/Resume Builder/resume_builder.py b/Resume Builder/resume_builder.py index 8d2211e..8ee0060 100644 --- a/Resume Builder/resume_builder.py +++ b/Resume Builder/resume_builder.py @@ -15,7 +15,9 @@ def clear_screen(): "skills": [], "projects": [], "certifications": [], - "achievements": [] + "achievements": [], + "internships":[] + } # Function to navigate back to the main menu @@ -54,6 +56,9 @@ def add_experience(): break back_to_menu() + + + # Add education details def add_education(): while True: @@ -127,6 +132,29 @@ def add_achievements(): if more == "no": break back_to_menu() + + # Add internships +def add_internships(): + while True: + clear_screen() + print("Enter Internship Information") + internship = { + "role": prompt("Role/Title: "), + "company": prompt("Company: "), + "location": prompt("Location (optional): "), + "start_date": prompt("Start Date (e.g., Jun 2024): "), + "end_date": prompt("End Date (e.g., Aug 2024 or 'Present'): "), + "details": [s.strip() for s in prompt("Highlights (comma-separated): ").split(",") if s.strip()] + } + resume_data["internships"].append(internship) + + more = prompt("Add another internship? (yes/no): ").strip().lower() + if more == "no": + break + back_to_menu() + + + # PDF Generation class class ResumePDF(FPDF): @@ -186,7 +214,21 @@ def generate_pdf(): pdf.cell(0, 10, proj["name"], 0, 1) pdf.multi_cell(0, 10, proj["description"]) pdf.cell(0, 10, f"Technologies Used: {proj['technologies']}", 0, 1) + # Internships + if resume_data["internships"]: + pdf.set_font('Arial', 'B', 12) + pdf.cell(0, 10, "Internships", 0, 1) + pdf.set_font('Arial', '', 11) + for it in resume_data["internships"]: + hdr = f"{it['role']} at {it['company']}" + if it.get("location"): + hdr += f" — {it['location']}" + pdf.cell(0, 10, f"{hdr} ({it['start_date']} - {it['end_date']})", 0, 1) + if it.get("details"): + pdf.multi_cell(0, 10, "Highlights: " + ", ".join(it["details"])) + + # Certifications pdf.set_font('Arial', 'B', 12) pdf.cell(0, 10, "Certifications", 0, 1) @@ -209,6 +251,8 @@ def generate_pdf(): os.system(f"start {pdf_output_path}" if os.name == "nt" else f"open {pdf_output_path}") print(f"Resume generated: {pdf_output_path}") + + # Main Menu using button_dialog from prompt_toolkit def interactive_menu(): while True: @@ -222,10 +266,11 @@ def interactive_menu(): ("Education", 3), ("Skills", 4), ("Projects", 5), - ("Certifications", 6), - ("Achievements", 7), - ("Generate PDF", 8), - ("Exit", 9) + ("Internships", 6), + ("Certifications", 7), + ("Achievements", 8), + ("Generate PDF", 9), + ("Exit", 10) ] ).run() @@ -240,12 +285,14 @@ def interactive_menu(): elif choice == 5: add_projects() elif choice == 6: - add_certifications() + add_internships() elif choice == 7: - add_achievements() + add_certifications() elif choice == 8: - generate_pdf() + add_achievements() elif choice == 9: + generate_pdf() + elif choice == 10: break # Start the program