Вы находитесь на странице: 1из 19

Міністерство освіти і науки України

Харківський національний університет радіоелектроніки

Кафедра БІТ

Звіт
з практичного заняття № 2
з дисципліни «Об'єктно-орієнтоване програмування»

Виконав: Перевірив:
ст. гр. КБІКС-21-1 старший викладач
Томченко О. Ю. Данилов А. Д.

Харків
2023
2 РОЗРОБКА ПРОГРАМ З ВИКОРИСТАННЯМ ПРОЦЕДУР ТА
ФУНКЦІЙ

1.1 Мета роботи:


Познайомитися з принципами побудови функцій користувача на мові
Python, з використанням локальних і глобальних змінних.

1.2 Приклади
1.2.1 Приклад №1.
Визначити символ, що входить до рядка найбільшу кількість разів.

Лістинг коду:
def construct_dict(S): # S - формальний параметр (рядок)
char_dict = {} # char_dict - словник символів
for c in S:
if c not in char_dict:
char_dict[c] = S.count(c)

return char_dict
D = construct_dict("молоко")
print(D)

def find_most_popular_char(D):
max_char = '' # найпопулярніший символ
max_num = 0 # кількість його входжень
for c, num in D.items():
if num > max_num:
max_char = c
max_num = num
return max_char, max_num # функція повертає пару значень max_char,
max_num
D = construct_dict("молоко")
C, N = find_most_popular_char(D)
print(C, N)

Результат виконання програми:

Рисунок 2.1 – Результат роботи створеної програми до прикладу №1

1.2.2 Приклад №2.


За допомогою розкладу функції e x в ряд Тейлора

xi x x2 xn
y ( x )=e x =∑ =1+ + +…+ +…
i=0 i! 1 ! 2! n!

обчислити з точністю ε > 0 її значення для заданого значення x

Лістинг коду:
# Описуємо функцію exp
def exp(x, eps=0.0001):
S=a=1
n=0
while abs(a) >= eps:
n += 1
a *= x / float(n)
S += a
return S

# головна програма
x = float(input("x = "))
y = exp(x) # використовуємо типове значення параметра eps
print("exp(%f) = %f" % (x, y))
Результат виконання програми:

Рисунок 2.2 – Результат роботи створеної програми до прикладу №2

1.2.3 Приклад №3.


Опишемо функцію, що знаходить суму елементів заданої послідовності.

Лістинг коду:
def suma(*elements):
res = 0
# Оскільки elements – кортеж скористаємося циклом for
for el in elements:
res += el
return res

# Головна програма полягає у виклиці функції suma.


print(suma(1, 2, 3, 4, 5))

Результат виконання програми:

Рисунок 2.3 – Результат роботи створеної програми до прикладу №3

1.2.4 Приклад №4.


Для заданої функції потрібно побудувати таблицю її значень.
Розв'язок. Згідно з умовою задачі нам необхідно побудувати, наприклад,
для функції f =x 2 для точок {0, 1, 2, 3, 4} таку таблицю
x 0 1 2 3 4
f =x
2
0 1 4 9 16

Лістинг коду:
import math

def table(l, f): # l – список точок, f - функція


d = {} # Словник d - таблиця значень функції
for x in l: # Проходимо по всіх х
d[x] = f(x) # Додаємо пару (x, f(x)) у словник
return d # Повертаємо таблицю (словник)
# Створюємо список точок, що є розбиттям відрізка
# [0, pi] на 5 частин
l = [x * math.pi / 10 for x in range(6)]
# Будуємо таблицю значень функції sin для заданого списку
D = table(l, math.sin)
# Виводимо результат на екран у вигляді sin(0) = 0
for x in l:
print("sin(%f) = %f" % (x, D[x]))

Результат виконання програми:

Рисунок 2.4 – Результат роботи створеної програми до прикладу №4


1.2.5 Приклад №5.
Обчислимо значення виразу
2 n
1+ x + …+ x
для заданих дійсного числа xx і натурального n.

Лістинг коду:
def pow_nat(n):
def tmp_pow(x):
res = 1
for i in range(n):
res *= x
return res

return tmp_pow

n = int(input("n= "))
x = float(input("x= "))
res = 0
for k in range(n + 1):
res += pow_nat(k)(x)
print(res)

Результат виконання програми:

Рисунок 2.5 – Результат роботи створеної програми до прикладу №5


1.2.6 Приклад №6.
Описати рекурсивну функцію для знаходження факторіала натурального
числа.

Лістинг коду:
def Fact(n):
if n == 0: # Термінальна гілка
return 1 # Тривіальне значення
else: # Рекурсивна гілка
return n * Fact(n - 1) # Рекурсивний виклик
# Виклик рекурсивної функції
n = int(input("n = "))
print("%d! = %d" % (n, Fact(n)))

Результат виконання програми:

Рисунок 2.6 – Результат роботи створеної програми до прикладу №6

1.2.7 Приклад №7.


Описати рекурсивну функцію перевірки рядка на симетричність.

Лістинг коду:
def is_symetric(s):
if len(s) <= 1: # якщо рядок s порожній або
# складається з одного символа
return True # то він симетричний
else:
# cond1 - умова, що 1-й і останній символи однакові
cond1 = s[0] == s[len(s) - 1]
# cond2 - умова, що рядок без першого і останнього
# символа є симетричним – рекурсивний виклик
cond2 = is_symetric(s[1: len(s) - 1])
# рядок симетричний, якщо обидві умови істині

return cond1 and cond2

# Виклик рекурсивної функції для введеного з клавіатури рядка


S = input("S = ")
sym = is_symetric(S)
if sym:
print("Заданий рядок є симетричним")
else:
print("Заданий рядок не є симетричним")

Результат виконання програми:

Рис. 2.7.1 та рис 2.7.2 – Результат роботи створеної програми до прикладу №7

1.2.8 Приклад №8.


Опишемо генератор-функцію побудови чисел Фібоначчі.

Лістинг коду:
def Fib(n):
F1 = F2 = 1
yield F2
yield F1
for i in range(3, n+1):
F2, F1 = F1, F1 + F2
yield F1

N = int(input("N = "))
# Створюємо об'єкт генератор-функцію
generator = Fib(N)
for a in generator:
print(a, end=" ")

Результат виконання програми:

Рисунок 2.8 – Результат роботи створеної програми до прикладу №8

1.2.9 Приклад №9.


Опишемо декоратор, що вимірює час виконання функції.

Лістинг коду:
from time import perf_counter
def benchmark(f):
def _benchmark(*args, **kw):
current_time = perf_counter()
rez = f(*args, **kw)
dt = perf_counter() - current_time
print('Час виконання функції %1.5f cек' % dt)
return rez

return _benchmark

@benchmark
def Fib1(n):
F1 = F2 = 1
for i in range(2, n + 1):
F2, F1 = F1, F1 + F2
return F1
def FibRecursive(n):
if n == 0 or n == 1:
return 1
else:
return FibRecursive(n - 1) + FibRecursive(n - 2)

@benchmark
def Fib2(n):
return FibRecursive(n)

N = 30
print(Fib1(N))
print(Fib2(N))

Результат виконання програми:


Рисунок 2.9 – Результат роботи створеної програми до прикладу №9

1.3 Індивідуальне завдання № 1


Описати функцію обчислення значень функції (визначити m значень
заданої функції f(x) на відрізку [a, b]). Результат вивести на екран у вигляді
табл. Значення a, b, ε ввести з клавіатури.
Стовпчики таблиці: 1 – значення xi; 2 – значення функції f (xi) , яке
обчислено з використанням функцій інтерпретатора (модуль math); 3 –
значення функції f ( x i ), яке обчислено за допомогою розкладання в ряд із
точністю ε=10-5 – точність обчислень – значення | f ( x i ) - f ( x i ) ∨¿ ; 5 – кількість
ітерацій, необхідних для досягнення заданої точності.
Використати табл. 2.2 для побудови розкладання елементарних функцій в
ряд Тейлора.
Обмеження.
1. Масиви не використовувати.
2. Не застосовувати факторіали для членів ряду в явному вигляді, а
використовувати тільки для обчислення точного значення функції в модулі
math.
3. Кількість точок на відрізку [a, b] складає не менше 10 (розбиття може
бути рівномірним або за визначеним правилом).
4. Для тригонометричних функцій в програмі привести значення
аргумента до вигляду 0 ≤ x ≤π/2 .
Варіант 15:
f(x) = 1/(1+e(1+x)), [a, b] = [3, 4].

Побудова блок-схеми:
Рисунок 2.10 – Блок-схема створеного додатку до завдання №1
Лістинг коду:
import math

a = int(input("Введіть значення a: "))


b = int(input("Введіть значення b: "))
epsilon = 10 ** (-5)
m = 10

def fx1_func(x):
return 1 / (1 + math.exp(1 + x))

def fx2_func(x):
i=1
result = ((-1) ** i) * ((math.exp(1 + x)) ** (i + 1)) / (i + 1)
term = result
while abs(term) > epsilon:
i += 1
term *= -x * (m - 1) / m
result += term
return result

# Виведення заголовків таблиці


print("\n{:<10} {:<10} {:<10} {:<20} {:<10}".format("x", "f(x1)", "f(x2)", "|
f(x2)-f(x1)|", "Ітерації"))
delta = (b - a) / (m - 1)
for i in range(m):
x = a + i * delta
if x > math.pi / 2:
x = math.pi - x
fx1 = fx1_func(x)
fx2 = fx2_func(x)
tochnist = abs(fx2 - fx1)
print("{:<10.3f} {:<10.3f} {:<10.3f} {:<20.3f} {:<10}".format(x, fx1, fx2,
tochnist, i+1))

Результат виконання програми:


Рисунок 2.11 – Результат роботи створеного додатку до завдання №1

1.4 Завдання № 2
Визначити рекурсивні підпрограми зображення натурального числа:
a) у двійковій системі числення;
b) у вісімковій системі числення:
c) у системі числення з основою 𝑏 ≥ 2.

Лістинг коду:
def decimal_to_binary(n):
if n == 0:
return ""
else:
return decimal_to_binary(n // 2) + str(n % 2)

def decimal_to_octal(n):
if n == 0:
return ""
else:
return decimal_to_octal(n // 8) + str(n % 8)

def decimal_to_base(n, b):


if n == 0:
return ""
else:
return decimal_to_base(n // b, b) + str(n % b)

number = int(input("Введіть натуральне число: "))


base = int(input("Основа системи числення для c: "))

print("\nЧисло у двійковій системі числення = ",


decimal_to_binary(number))
print("Число у вісімковій системі числення = ", decimal_to_octal(number))
print("Число у системі числення з основою ", base, " = ",
decimal_to_base(number, base))

Результат виконання програми:

Рисунок 2.12 – Результат роботи додатку створеного до завдання №2

1.5 Висновок:

На даному практичному занятті я ознайомився з принципами побудови


функцій користувача на мові Python та використанням локальних і глобальних
змінних, застосував на практиці здобуті знання на заняттях з об’єктно-
орієнтованого програмування та вищої математики.

1.6 Контрольні запитання та відповіді:


1. Як створити функцію у мові Python?
Щоб створити функцію у мові Python можна використати ключове слово
"def", за яким слідує назва функції і список аргументів в дужках.
Тіло функції вказується відступом від рядка з оголошенням функції.
Наприклад:
def add_numbers(a, b):
result = a + b
return result

2. Що таке модулі та пакети?


Модулі та пакети - це засоби організації коду в Python. Модуль - це файл
з кодом, який містить функції, класи та інші об'єкти, що можуть
використовуватися в інших програмах. Пакет - це каталог, що містить набір
модулів, пов'язаних за тематикою чи функціональністю.

3. Які бувають способи підключення модулів та пакетів?


Модулі та пакети можна підключати за допомогою ключового слова
"import". Якщо пакет містить підпакети, то їх можна імпортувати з
використанням крапки. Наприклад:
import module_name
from package_name.subpackage_name import module_name

4. Що таке анонімні функції та інструкція lambda?


Анонімна функція - це функція без імені, яку можна визначити за
допомогою інструкції "lambda". Вона зазвичай використовується для створення
функцій, що передаються як аргументи іншим функціям. Наприклад:
add_numbers = lambda a, b: a + b
result = add_numbers(3, 4)

5. Який синтаксис оголошення функції?


Синтаксис оголошення функції складається з ключового слова "def",
назви функції, списку аргументів в дужках та відступу для тіла функції.
Наприклад:
def add_numbers(a, b):
result = a + b
return result

6. Що таке позиційні та ключові аргументи функції?


Позиційні аргументи функції - це аргументи, які передаються в функцію в
порядку їх визначення у сигнатурі функції. Ключові аргументи функції - це
аргументи, які передаються в функцію у вигляді пар ключ-значення і можуть
бути передані у будь-якому порядку.

7. Як створити функцію зі значеннями за замовчуванням?


Для створення функції зі значеннями за замовчуванням потрібно
встановити значення аргумента в тілі функції. Наприклад:
def greet(name, greeting="Hello"):
print(greeting, name)
greet("John") # виведе "Hello John"
greet("Kate", "Hi") # виведе "Hi Kate"

8. Який порядок передачі аргументів у функцію, якщо вона містить


позиційні та ключові аргументи та аргументи із значеннями за
замовчуванням?
Порядок передачі аргументів у функцію, якщо вона містить позиційні,
ключові аргументи та аргументи із значеннями за замовчуванням, повинен бути
наступним: спочатку передаються позиційні аргументи, потім ключові
аргументи, і, нарешті, аргументи зі значеннями за замовчуванням.

9. Для чого використовується інструкція return? Чи обов’язково вона


присутня у функції?
Інструкція return використовується для повернення значення з функції та
завершення її виконання. Return є необов’язковою інструкцією, але її
використання дозволяє більш ефективно використовувати функції, оскільки
вони можуть повертати значення, які можуть бути використані в іншій частині
коду.

10. Що повертає функція, якщо в її тілі відсутня інструкція return?


Функція у Python може повертати будь-який об'єкт – число, рядок, список,
кортеж, тощо. Якщо тіло функції не містить інструкції return або під час
виклику функції інтерпретатор не натрапляє на неї, то функція повертає
значення None ("ніщо").

11. Як описується рекурсивна функція?


Рекурсивна функція – метод визначення функції, при якому функція
прямо або неявно викликає сама себе.
Стандартний алгоритм опису рекурсивної функції:
Структурно рекурсивна функція на верхньому рівні завжди є
розгалуженням, що складається з двох або більше альтернатив, з яких:
– принаймні одна є термінальною (припинення рекурсії);
– принаймні одна є рекурсивною (тобто здійснює виклик себе з іншими
аргументами).
def recursive_func(args):
if terminal_case: # Термінальна гілка
...
return trivial_value # Тривіальне значення
else: # Рекурсивна гілка
...
# Виклик функції з іншими аргументами
return expr(recursive_func(new_args))

12. Що таке декоратор, і як він використовується на практиці?


Декоратор – це функція, що дозволяє змінити поведінку функції
(отриманої у якості аргументу) не змінюючи коду самої функції. Як правило
декоратори використовуються для того, щоб додати додаткові можливості
функціям. Власне сенс застосування декоратора і полягає у тому, що вони
можуть додавати однакову поведінку різним функціям. Наприклад, широко
використовуються декоратори, що обчислюють час роботи функції,
перевіряють коректність аргументів функцій, контролюють безпеку даних під
час виконання функції тощо.

Вам также может понравиться