You are on page 1of 17

Лабораторна робота №6 Програмування

Мохонько Дмитро КІ-2


Виконання лабораторної роботи передбачає створення
програмного застосунку. Тематика застосунку та функціонал
обирається студентом на власний розсуд. Необхідною умовою є
задовільнення застосунку наступним вимогам.
1) Діалог з користувачем. Застосунок повинен забезпечувати діалог
з користувачем, що передбачає запит користувача на введення
даних, виведення результатів. Наприклад, застосунок може
пропонувати обрати режим роботи через введення цифр (1, 2, 3, ...)
або введення символу q для завершення роботи застосунку.
2) Перевірка введених даних. Застосунок повинен забезпечувати
перевірку на валідність даних, що були введені користувачем.
Необхідно перевіряти як тип даних (число, текст) так і входження їх
у межі допустимих значень. У випадку введення не валідних даних,
застосунок повинен вивести користувачу зрозуміле повідомлення
про помилку. Робота з файлами.
3) Застосунок повинен реалізовувати роботу з файлами. Можливим
є отримання вхідних даних з файлу, та/або збереження результатів
роботи застосунку у файл.

Я зробив програму яка буде сортувати файл з телефонами за їхніми


атрибутами(ціна, рік).
Файл:
Створюємо класс Smartphone та задаємо атрибути (name, release_year, price,
company), також створюємо функцію яка буде повертати вік поточного
смартфону.

Далі створюємо класс Store який буде зберігати масив смарфонів.


Далі створюємо функцію add_smartphone за допомогою якої потім
будемо додавати елементи у масив.

Потім створюємо 4 функції, кожна с яких буде відповідати за


певний метод сортування. Кожна функція буде приймати значення
який ввів користувач. Після цього робиться саме сортування, за
допомогою циклу for ми проходимо по кожному значенню масиву,
та за допомогою if робимо перевірку значень елементів масиву.
Після цього робимо перевірку на наявність елементи за умовами
сортування, у разі їх відсутності виводиться певний текст який
вказує що немає смартфонів за данними критеріями. У разі
проходження на наявність робимо вивід масиву за допомогою
цикла for та команди print у якій використовуємо формат.
Далі створюємо функцію за допомогою якої буде проходити
ініціалізація файлу та занесення данних у класс Store. Ця функція
буде приймати назву файлу. Спершу робимо ініціалізацію класу
Store, після цього ініціалізуємо наш файл за допомогою строки:
with open(filename, 'r') as smartphone_file
Функія with відповідає за автоматизоване відкриття та закриття
файлу та знаходження можливих помилок. Після цього є команда
open яка безпосередньо відповідає за ініціалізацію файлу та
повертає файл об’єкту та приймає два аргументи(назву файлу,
режим у якому відкривається файл, в моєму випадку режим “r”).
Існує 3 основних режиму відкриття файлу “r” що означає
read(просте читання файлу) “w” що означає write(можливість
редагування файлу) “a” що означає append(можливість
редагування файлу, але данні додаються вкінці файлу). Та
зазначення цього файлу як smartphone_file за допогою команди as.
Після цього за допомогою цикла for ми проходимося по кожному
рядку файлу. Далі з допомгою команд split(‘,’) ми розбиваємо
кожен рядок на маленкий масив за рахунок елементу який стоїть
між параметрами у файлі та задаємо значення кожному із
елементів нового масиву. Після цього за допомогою функції
add_smartphone ми додаємо кожен елемент у масив. Та в кінці
повертаємо класс Store.
І останні дві функції:
Перша функція за допомогою якої користувач буде задавати який
вид сортування він хотів би використати. Спочатку створюємо
функцію sort_smartphone_by_choice, та створюємо словник у якому
буде зберігатися вибір сортування та виводимо цей словник у
консоль. Потім робимо цикл while True для бескінечної роботи
нашої програми, поки користувач не напише певне значення для
закінчення програми. Потім використовуючи конструкцію try except
робимо перевірку на можливу помилку ValueError (виникає, коли
функція отримує аргумент правильного типу, але невідповідного
значення). Потім користувач вводить данні в консоль та робиться їх
перевірка та 3 можливі подальші дії:
1) Закінчення програми у разі написання “q”
2) Подальшого сортування у обранній категорії
3) Виникнення помилки у разі якої користувача попросить ввести
коректні данні для цієї програми
Далі йде остання функція sort_type_of_sort у якій також
знаходиться цикл while True, а саме для подальшого коретного
продовження роботи у разі написанні неправильних данних. У цій
функції ми маємо 4 основні перевірки if, кожна з яких відповідає за
та який метод сортування буде використанний з урахуванням
введених данних користувачем. Оскільки усі 4 методи є майже
однаковими то розберемо тільки один із них, а саме перший.
Спочатку програма запитує додаткову інформацію у користувача
для подальшого сортування. Після цього йде перевірка на
валідність отриманних данних за допомогою команди isdigit, яка
повертає True у разі отриманні int данних, або к разі отриманні
данних іншого типу False. У разі отримання некоректних данних
програма попросить заново ввести дані або у разі отримання “q”
вона поверне на вибір типів сортування. А у разі коректних данних
буде використанно функцію
my_store.list_smartphones_older_than(int(a))
яка була описанна у минулих пунктах.
Усі 4 перевірки працюють майже однаково, окрім запитаних
данних (роки та ціни) та методом сортування.
Ну і в кінці визиваємо функцію read_data_from_file() та
sort_smartphones_by_choice()

І сам код:
class Smartphone:
def __init__(self, name, release_year, price, company):
self.name = name
self.release_year = release_year
self.price = price
self.company = company

def get_age(self, current_year):


return current_year - self.release_year

class Store:
def __init__(self):
self.smartphones = []
def add_smartphone(self, name, release_year, price, company):
smartphone = Smartphone(name, release_year, price, company)
self.smartphones.append(smartphone)

def list_smartphones_younger_than(self, max_release_year):


filtered_smartphones = [s for s in self.smartphones if
s.release_year < max_release_year]
if filtered_smartphones:
for smartphone in filtered_smartphones:
print(
f"Назва: {smartphone.name}, Ціна: {smartphone.price}, Рік
випуску: {smartphone.release_year}, Назва фірми:
{smartphone.company}")
else:
print("Смартфонів, випущених до вказаного року, не
знайдено.")

def list_smartphones_older_than(self, min_release_year):


filtered_smartphones = [s for s in self.smartphones if
s.release_year > min_release_year]
if filtered_smartphones:
for smartphone in filtered_smartphones:
print(
f"Назва: {smartphone.name}, Ціна: {smartphone.price}, Рік
випуску: {smartphone.release_year}, Назва фірми:
{smartphone.company}")
else:
print("Смартфонів, випущених пізніше вказаного року, не
знайдено.")

def list_smartphones_cheaper_than(self, price):


filtered_smartphones = [s for s in self.smartphones if s.price <
price]
if filtered_smartphones:
for smartphone in filtered_smartphones:
print(
f"Назва: {smartphone.name}, Ціна: {smartphone.price}, Рік
випуску: {smartphone.release_year}, Назва фірми:
{smartphone.company}")
else:
print("Смартфонів з ціною нижче вказаної не знайдено.")

def list_smartphones_pricier_than(self, price):


filtered_smartphones = [s for s in self.smartphones if s.price >
price]
if filtered_smartphones:
for smartphone in filtered_smartphones:
print(
f"Назва: {smartphone.name}, Ціна: {smartphone.price}, Рік
випуску: {smartphone.release_year}, Назва фірми:
{smartphone.company}")
else:
print("Смартфонів з ціною вище вказаної не знайдено.")

def read_data_from_file(filename):
store = Store()
with open(filename, 'r') as smartphone_file:
for line in smartphone_file.readlines():
name, release_year, price, company = line.split(',')
store.add_smartphone(name, int(release_year), float(price),
company)
return store

def sort_smartphones_by_choice():
valid_sort_methods = {
1: "За роком випуску (старші)",
2: "За роком випуску (молдодші)",
3: "За ціною (дорожче)",
4: "За ціною (дешевше)",
"q": "Вихід",
}

print("Доступні методи сортування:")


for key, value in valid_sort_methods.items():
print(f"{key}: {value}")

while True:
try:
user_choice = input("Виберіть метод сортування (введіть
номер): ")
if user_choice == "q":
break
user_choice = int(user_choice)
if user_choice in valid_sort_methods:
chose_type_of_sort(user_choice)
else:
print("Виберіть дійсний номер методу сортування.")
except ValueError:
print("Введіть дійсний номер методу сортування.")
def chose_type_of_sort(sort_method):
while True:
if sort_method == 1:
a = input("Введіть рік для порівняння:")
if a.isdigit():
my_store.list_smartphones_older_than(int(a))
return
elif a == "q":
return
else:
print("Введіть коректні данні")
elif sort_method == 2:
a = input("Введіть рік для порівняння:")
if a.isdigit():
my_store.list_smartphones_younger_than(int(a))
break
elif a == "q":
return
else:
print("Введіть коректні данні")
elif sort_method == 3:
a = input("Введіть ціну для порівняння:")
if a.isdigit():
my_store.list_smartphones_cheaper_than(int(a))
break
elif a == "q":
return
else:
print("Введіть коректні данні")
elif sort_method == 4:
a = input("Введіть ціну для порівняння:")
if a.isdigit():
my_store.list_smartphones_pricier_than(int(a))
break
elif a == "q":
return
else:
print("Введіть коректні данні")

my_store = read_data_from_file('phone.txt')

current_year = 2023
sort_smartphones_by_choice()

You might also like