Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ТП7

.docx
Скачиваний:
0
Добавлен:
12.04.2025
Размер:
262.22 Кб
Скачать

ГУАП

КАФЕДРА 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.

Соседние файлы в предмете Технологии программирования