
ТП7
.docxГУАП
КАФЕДРА 41
ОТЧЕТ ЗАЩИЩЕН С ОЦЕНКОЙ
ПРЕПОДАВАТЕЛЬ
Ассистент |
|
|
|
Е.К. Григорьев |
должность, уч. степень, звание |
|
подпись, дата |
|
инициалы, фамилия |
ОТЧЕТ О ЛАБОРАТОРНОЙ РАБОТЕ №7 |
ООП |
по курсу: ТЕХНОЛОГИИ ПРОГРАММИРОВАНИЯ |
|
|
РАБОТУ ВЫПОЛНИЛ
СТУДЕНТ ГР. № |
4116 |
|
|
|
|
|
|
|
подпись, дата |
|
инициалы, фамилия |
Санкт-Петербург 2023
Цель работы: познакомиться с основными способами объявления и использования классов в Python.
Вариант 4 (4,10)
Ход работы
Задание 4. Напишите класс «Книжный шкаф», в который можно добавлять экземпляры класса "Книга" и удалять из него. В конструктор шкафа надо передавать параметр веса, который он способен вынести. Класс книга должен содержать параметр вес, автор и стоимость. У класса «Книжный шкаф» должны быть следующие методы: поиск книги по автору, общий вес книг и их общая стоимость. При этом если добавляемая может превысить предельный вес, который может выдержать шкаф, она не добавляется в него. Требуется реализовать возможность вывода текущих состояний объектов в терминал.
Код программы 1:
from typing import List
class Book:
def __init__(self, author: str, weight: float, cost: int):
self.author = author
self.weight = weight
self.cost = cost
def __eq__(self, other):
if isinstance(other, Book):
return self.author == other.author and self.weight == other.weight and self.cost == other.cost
return False
class Bookcase:
def __init__(self, max_weight: float):
self.max_weight = max_weight
self.books: List[Book] = []
def add_book(self, book: Book) -> None:
if self.total_weight() + book.weight <= self.max_weight:
self.books.append(book)
def remove_book(self, book: Book) -> None:
if book in self.books:
self.books.remove(book)
print(f"Removed {book.author}'s book")
else:
print(f"{book.author}'s book is not in the bookcase")
def total_weight(self) -> float:
return sum(book.weight for book in self.books)
def total_cost(self) -> int:
return sum(book.cost for book in self.books)
def search_by_author(self, author: str) -> List[Book]:
return [book for book in self.books if book.author == author]
def print_books(self):
for book in self.books:
print(f"{book.author} - {book.weight:.2f}kg - ${book.cost}")
if __name__ == "__main__":
bookcase = Bookcase(50.0)
while True:
print("Add a book to the bookcase:")
author = input("Author: ")
if author == "done":
break
weight = float(input("Weight: "))
cost = int(input("Cost: "))
book = Book(author, weight, cost)
bookcase.add_book(book)
print(f"Total weight of books in bookcase: {bookcase.total_weight():.2f}")
print(f"Total cost of books in bookshelf: {bookcase.total_cost():d}")
author = input("Enter author to search for: ")
books_by_author = bookcase.search_by_author(author)
if books_by_author:
print(f"Books by {author}:")
for book in books_by_author:
print(f"{book.author} - {book.weight:.2f}kg - ${book.cost}")
else:
print(f"No books found by {author}.")
print("Removing a book from bookcase...")
author = input("Author: ")
weight = float(input("Weight: "))
cost = int(input("Cost: "))
book_to_remove = Book(author, weight, cost)
bookcase.remove_book(book_to_remove)
print("all the books in the bookcase")
bookcase.print_books()
Рисунок 1- фрагмент результата работы программы 1
Рисунок 2- фрагмент результата работы программы 1
Тестовые функции для программы 1:
from book import Book, Bookcase
def test_bookcase_add_book():
bookcase = Bookcase(10.0)
book1 = Book('Author 1', 1.5, 100)
book2 = Book('Author 2', 2.0, 50)
book3 = Book('Author 1', 1.0, 80)
bookcase.add_book(book1)
bookcase.add_book(book2)
assert bookcase.books == [book1, book2]
bookcase.add_book(book3)
assert bookcase.books== [book1, book2, book3]
def test_bookcase_total_weight():
bookcase = Bookcase(10.0)
book1 = Book('Author 1', 1.5, 70)
book2 = Book('Author 2', 2.0, 50)
book3 = Book('Author 1', 1.0, 30)
bookcase.add_book(book1)
bookcase.add_book(book2)
bookcase.add_book(book3)
assert bookcase.total_weight() == 4.5
def test_bookcase_total_cost():
bookcase = Bookcase(10.0)
book1 = Book('Author 1', 1.5, 70)
book2 = Book('Author 2', 2.0, 50)
book3 = Book('Author 1', 1.0, 30)
bookcase.add_book(book1)
bookcase.add_book(book2)
bookcase.add_book(book3)
assert bookcase.total_cost() == 150
def test_bookcase_search_by_author():
bookcase = Bookcase(10.0)
book1 = Book('Author 1', 1.5, 70)
book2 = Book('Author 2', 2.0, 50)
book3 = Book('Author 1', 1.0, 30)
bookcase.add_book(book1)
bookcase.add_book(book2)
bookcase.add_book(book3)
assert bookcase.search_by_author("Author 1") == [book1, book3]
def test_bookcase_add_book_max_weight_exceeded():
bookcase = Bookcase(10.0)
book1 = Book('Author 1', 1.5, 70)
book2 = Book('Author 2', 2.0, 50)
too_heavy_book = Book('Author 1', 10.0, 200)
bookcase.add_book(book1)
bookcase.add_book(book2)
bookcase.add_book(too_heavy_book)
assert bookcase.books == [book1, book2]
def test_bookcase_remove_book():
bookcase = Bookcase(10.0)
book1 = Book('Author 1', 1.5, 70)
book2 = Book('Author 2', 2.0, 50)
book3= Book('Author 1', 1.0, 30)
bookcase.add_book(book1)
bookcase.add_book(book2)
bookcase.add_book(book3)
bookcase.remove_book(book1)
assert bookcase.books == [book2,book3]
Рисунок 3- корректная работа тестовых функций
Задание 10. Напишите классы «Холодильник» и «Морозильная камера», в которые можно добавлять (и удалять) экземпляры класса «Продукты». В конструктор «Холодильника» и «Морозильной камеры» следует передавать параметр их текущей рабочей температуры. Класс «Продукты» должен содержать параметры «Наименование продукта», «максимальная температура хранения» и «минимальная температура хранения». У классов «Холодильник» и «Морозильная камера» должны быть реализованы методы: поиск продукта по наименованию, подсчёт общего хранящегося количества продуктов. При добавлении продуктов в «Холодильник» (или «Морозильную камеру») требуется сравнить допустимый диапазон хранения продукта с текущей температурой «Холодильника» (или «Морозильной камеры») в случае, если текущая температура «Холодильника» (или «Морозильной камеры») не входит в диапазон, то продукт не добавляется в «Холодильник» или «Морозильную камеру». Требуется реализовать возможность вывода текущих состояний объектов в терминал.
Код программы 2:
from typing import List
class Product:
def __init__(self, name: str, max_temp: int, min_temp: int) -> None:
self.name = name
self.max_temp = max_temp
self.min_temp = min_temp
class Fridge:
def __init__(self, current_temp: int) -> None:
self.current_temp = current_temp
self.products = []
def add_product(self, product: Product) -> None:
if self.current_temp >= product.min_temp and self.current_temp <= product.max_temp:
self.products.append(product)
else:
print("unsuitable temperature")
def remove_product(self, product: Product) -> None:
if product in self.products:
self.products.remove(product)
def search_product(self, name: str) -> List[Product]:
return [product for product in self.products if product.name == name]
def total_products(self) -> int:
return len(self.products)
class Freezer:
def __init__(self, current_temp: int) -> None:
self.current_temp = current_temp
self.products = []
def add_product(self, product: Product) -> None:
if self.current_temp <= product.min_temp and self.current_temp >=product.max_temp:
self.products.append(product)
else:
print("unsuitable temperature")
def remove_product(self, product: Product) -> None:
if product in self.products:
self.products.remove(product)
def search_product(self, name: str) -> List[Product]:
return [product for product in self.products if product.name == name]
def total_products(self) -> int:
return len(self.products)
if __name__ == "__main__":
fridge = Fridge(5)
freezer = Freezer(-15)
while True:
print("Add a product to the fridge:")
name = input("Name: ")
if name == "done":
break
max_temp = int(input("Max_temp: "))
min_temp = int(input("Min_temp: "))
product = Product(name, max_temp, min_temp)
fridge.add_product(product)
while True:
print("Add a product to the freezer:")
name = input("Name: ")
if name == "done":
break
max_temp = int (input("Max_temp: "))
min_temp = int(input("Min_temp: "))
product = Product(name, max_temp, min_temp)
freezer.add_product(product)
print(f"Total number of products in fridge : {fridge.total_products():}")
print(f"Total number of products in freezer : {freezer.total_products():}")
name = input("Enter name of product to search for: ")
products_in_fridge = fridge.search_product(name)
products_in_freezer = freezer.search_product(name)
if products_in_fridge:
print(f"Products in the fridge:")
for product in products_in_fridge:
print(f"{product.name} - max {product.max_temp}-min {product.min_temp}")
if products_in_freezer:
print(f"Products in the freezer:")
for product in products_in_freezer:
print(f"{product.name} - max {product.max_temp}- min {product.min_temp}")
if not products_in_fridge and not products_in_freezer:
print(f"No products found with name {name}.")
print("Remove a product from the fridge or freezer:")
name = input("Name: ")
products_in_fridge = fridge.search_product(name)
products_in_freezer = freezer.search_product(name)
if products_in_fridge:
for product in products_in_fridge:
print(f"Removing {product.name} from fridge.")
fridge.remove_product(product)
if products_in_freezer:
for product in products_in_freezer:
print(f"Removing {product.name} from freezer.")
freezer.remove_product(product)
print(f"Total number of products in fridge : {fridge.total_products():}")
print(f"Total number of products in freezer : {freezer.total_products():}")
Рисунок 4- фрагмент результата работы программы 2
Рисунок 5- фрагмент результата работы программы 2
Тестовые функции для программы 2:
from product import Product, Fridge, Freezer
def test_fridge_add_product():
fridge = Fridge(5)
product1 = Product("Milk", 5, 1)
product2 = Product("Cheese", 5, 1)
fridge.add_product(product1)
fridge.add_product(product2)
assert fridge.total_products() == 2
def test_fridge_remove_product():
fridge = Fridge(5)
product1 = Product("Milk", 5, 1)
product2 = Product("Cheese", 5, 1)
fridge.add_product(product1)
fridge.add_product(product2)
fridge.remove_product(product1)
assert fridge.products == [product2]
def test_fridge_search_product():
fridge = Fridge(5)
product1= Product("Milk", 5, 1)
product2 = Product("Cheese", 3, 1)
fridge.add_product(product1)
fridge.add_product(product2)
assert fridge.search_product("Milk") == [product1]
def test_freezer_add_product():
freezer = Freezer(-15)
product1 = Product("Ice cream", -10, -20)
product2 = Product("Fish", -10, -15)
freezer.add_product(product1)
freezer.add_product(product2)
assert freezer.total_products() == 2
def test_freezer_remove_product():
freezer = Freezer(-15)
product1 = Product("Ice cream", -10, -20)
product2 = Product("Fish", -10, -15)
freezer.add_product(product1)
freezer.add_product(product2)
freezer.remove_product(product1)
assert freezer.total_products() == 1
def test_freezer_search_product():
freezer = Freezer(-15)
product1 = Product("Ice cream", -10, -20)
product2 = Product("Fish", -10, -15)
freezer.add_product(product1)
freezer.add_product(product2)
result = freezer.search_product("Ice cream")
assert freezer.search_product("Ice cream") == [product1]
def test_fridge_temp_out_of_range():
fridge = Fridge(10)
product = Product("Bread", 23, 20)
fridge.add_product(product)
assert fridge.total_products() == 0
def test_freezer_temp_out_of_range():
freezer = Freezer(-15)
product = Product("Cheese", 3, 1)
freezer.add_product(product)
assert freezer.total_products() == 0
def test_current_temp_fridge():
fridge = Fridge(5)
product = Product("Milk", 4, 1)
fridge.add_product(product)
assert fridge.current_temp == 5
def test_current_temp_freezer():
freezer = Freezer(-15)
product = Product("Ice cream", -10, -20)
freezer.add_product(product)
assert freezer.current_temp == -15
Рисунок 6- корректная работы тестовых функций
Вывод: изучены основные способы объявления и использования классов в Python.