Created
January 31, 2025 22:25
-
-
Save Ruthenus/ac32fe7c4101adaba6ecf57d5d7094fd to your computer and use it in GitHub Desktop.
Week 7 Homework in IT STEP Academy (functions tasks)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import os | |
os.system("cls") | |
# ПОЧАТОК КОДУ ЗАДАЧІ | |
print("\tЗАВДАННЯ 2\n") | |
# Написати функцію draw_rectangle, яка виводить на екран прямокутник. | |
# Функція приймає такі параметри: ширина, висота, символ рамки, | |
# символ заповнення. У функції мають бути параметри за замовчуванням. | |
def draw_rectangle(width, height, border="#", fill="*_"): | |
"""Виводить на екран прямокутник, заповнений символами за шаблоном.""" | |
if width < 2 or height < 2: | |
print("У прямокутника ширина та висота – не менше 2. Виправте!") | |
return | |
for row in range(height): | |
if row == 0 or row == height - 1: | |
print(border * width) | |
else: | |
fill_area = "" | |
for i in range(width - 2): | |
fill_area += fill[(i) % len(fill)] | |
print(border + fill_area + border) | |
draw_rectangle(29, 11) | |
print("–" * 80 + "\n") | |
# КІНЕЦЬ КОДУ ЗАДАЧІ | |
# ПОЧАТОК КОДУ ЗАДАЧІ | |
print("\tЗАВДАННЯ 3\n") | |
# Написати функцію, яка перевіряє, чи є передане їй число простим | |
# (і повертає True або False). Число називається простим, якщо воно | |
# ділиться без залишку тільки на себе і на одиницю. | |
def the_prime_number(natural: int) -> bool: | |
"""Перевірка простоти числа – чи це правда, чи ні. Аргумент – ціле число | |
(натуральне!), очікуваний результат – булеве значення.""" | |
assert isinstance(natural, int), "Введене число має бути цілим." | |
# твердження про належність до класу цілих та невід'ємних чисел. | |
assert natural >= 0, "Просте число за визначенням не може бути від'ємним." | |
if natural <= 1: # або нуль, або одиниця, коли assert без помилок | |
return False | |
for divisor in range(2, int(natural**0.5) + 1): | |
if natural % divisor == 0: | |
return False | |
return True | |
# https://oeis.org/A000668 | |
mersenne_primes = [3, 7, 31, 127, 8191, 131071, 524287, 2147483647] | |
for prime in mersenne_primes: | |
print(the_prime_number(prime)) | |
try: | |
number = int(input("Число просте? Введіть для перевірки: ")) | |
if the_prime_number(number): | |
print(f"Це правда! Число {number} – просте.") | |
else: | |
print(f"Брехня!!! Число {number} не просте, хіба не видно?!") | |
except ValueError: # якщо число дробове, не доходить до AssertionError | |
print("Ви в чомусь помиляєтеся.") | |
# Невипадково ввів з клавіатури прості числа 82589933 та 999999000001. | |
print("–" * 80 + "\n") | |
# КІНЕЦЬ КОДУ ЗАДАЧІ | |
# ПОЧАТОК КОДУ ЗАДАЧІ | |
print("\tЗАВДАННЯ 6\n") | |
# Написати функцію, що показує на екрані мінімум і максимум | |
# (значення та індекс) серед елементів переданого їй списку. | |
def print_minimax_in_list(list_with_numbers): | |
"""Виводить на екран мінімум та максимум серед чисел списку.""" | |
minimum = min(list_with_numbers) | |
maximum = max(list_with_numbers) | |
min_indexes = [] # для індексів однакових мінімальних значень | |
# https://acode.com.ua/function-enumerate-python/ | |
for index, value in enumerate(list_with_numbers): | |
if value == minimum: | |
min_indexes.append(index) | |
max_indexes = [] # для індексів однакових максимальних значень | |
for index, value in enumerate(list_with_numbers): | |
if value == maximum: | |
max_indexes.append(index) | |
print(f"Мінімальне значення: {minimum}, індекс(и): {min_indexes}") | |
print(f"Максимальне значення: {maximum}, індекс(и): {max_indexes}") | |
print_minimax_in_list([31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]) | |
print("–" * 80 + "\n") | |
# КІНЕЦЬ КОДУ ЗАДАЧІ | |
# ПОЧАТОК КОДУ ЗАДАЧІ | |
print("\tЗАВДАННЯ 7\n") | |
# Написати функцію, яка приймає дві дати (тобто функція приймає шість | |
# параметрів) і обчислює різницю в днях між цими датами. | |
def period(day_1, month_1, year_1, day_2, month_2, year_2): | |
"""Обчислює період у днях між двома датами.""" | |
def is_leap_year(year): | |
"""Допоміжна функція для визначення, чи рік є високосний.""" | |
return (year % 4 == 0 and year % 100 != 0) or year % 400 == 0 | |
# Кількість днів за місяцями звичайного року | |
days_in_month = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31) | |
def is_correct_date(day, month, year): | |
"""Допоміжна функція для перевірки правильності дати.""" | |
if day < 1 or month < 1 or month > 12: | |
return False | |
if month == 2 and is_leap_year(year): | |
return day <= 29 | |
return day <= days_in_month[month-1] | |
# Якщо одна з дат неправильна, ініціюємо повідомлення про помилку! | |
if not is_correct_date(day_1, month_1, year_1) or \ | |
not is_correct_date(day_2, month_2, year_2): | |
raise ValueError("Помилка в даті!") | |
def day_in_year(day, month, year): | |
"""Допоміжна функція для обчислення кількості днів з початку року.""" | |
days = sum(days_in_month[:month-1]) + day | |
# просумували дні в попередніх місяцях | |
if month > 2 and is_leap_year(year): | |
days += 1 | |
return days | |
# Тіло основної функції | |
period_in_days = 0 | |
if year_1 > year_2: # у такому разі функція range() не працюватиме | |
day_1, month_1, year_1, day_2, month_2, year_2 = \ | |
day_2, month_2, year_2, day_1, month_1, year_1 | |
for year in range(year_1, year_2): | |
period_in_days += 366 if is_leap_year(year) else 365 | |
period_in_days += day_in_year(day_2, month_2, year_2) - \ | |
day_in_year(day_1, month_1, year_1) | |
return abs(period_in_days) | |
# Тестування функції period() | |
try: | |
days_and_nights = period(31, 1, 2025, 24, 2, 2022) | |
print(f"Різниця в днях між цими датами: {days_and_nights}") | |
except ValueError as error: | |
print(error) | |
print("–" * 80 + "\n") | |
# КІНЕЦЬ КОДУ ЗАДАЧІ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment