commit c80e837d44bf12b36cdbfc43df90ae8a6dd1a87e Author: Maргарита Шавлович Date: Sun Apr 12 21:05:22 2026 +0300 1 задание diff --git a/1zadanie.py b/1zadanie.py new file mode 100644 index 0000000..131295b --- /dev/null +++ b/1zadanie.py @@ -0,0 +1,235 @@ +# Практическая работа +# Тема: Обработка данных интернет-магазина + + +def load_products_from_file(filepath): + products = [] + + try: + file = open(filepath, "r", encoding="utf-8") + + for line in file: + line = line.strip() + + if line == "": + continue + + parts = line.split(";") + + if len(parts) != 6: + continue + + try: + product = { + "id": int(parts[0]), + "name": parts[1], + "category": parts[2], + "price": float(parts[3]), + "quantity": int(parts[4]), + "description": parts[5] + } + products.append(product) + except: + continue + + file.close() + + except FileNotFoundError: + print("Файл не найден") + except: + print("Ошибка при чтении файла") + + return products + + +def validate_product(product): + if "id" not in product: + return False + if "name" not in product: + return False + if "category" not in product: + return False + if "price" not in product: + return False + if "quantity" not in product: + return False + if "description" not in product: + return False + + if product["name"].strip() == "": + return False + if product["category"].strip() == "": + return False + if product["price"] < 0: + return False + if product["quantity"] < 0: + return False + + return True + + +def filter_products_by_category(products, category): + result = [] + + for product in products: + if product["category"].lower() == category.lower(): + result.append(product) + + return result + + +def search_products_by_keyword(products, keyword): + result = [] + + for product in products: + text = product["name"] + " " + product["description"] + + if keyword.lower() in text.lower(): + result.append(product) + + return result + + +def sort_products_by_price(products, descending=False): + return sorted(products, key=lambda x: x["price"], reverse=descending) + + +def calculate_discounted_price(price, discount_percent): + new_price = price - price * discount_percent / 100 + return round(new_price, 2) + + +def build_cart(products, product_ids): + cart = [] + + for product_id in product_ids: + for product in products: + if product["id"] == product_id: + cart.append(product) + break + + return cart + + +def calculate_cart_total(cart, discounts=None): + total = 0 + + for product in cart: + current_price = product["price"] + + if discounts is not None: + if product["id"] in discounts: + current_price = calculate_discounted_price(current_price, discounts[product["id"]]) + elif product["category"] in discounts: + current_price = calculate_discounted_price(current_price, discounts[product["category"]]) + + total += current_price + + return round(total, 2) + + +def group_products_by_category(products): + groups = {} + + for product in products: + category = product["category"] + + if category not in groups: + groups[category] = [] + + groups[category].append(product) + + return groups + + +def generate_order_report(cart, total_cost): + report = "Отчет по заказу\n" + report += "-------------------------\n" + + number = 1 + for product in cart: + report += str(number) + ". " + product["name"] + " - " + str(product["price"]) + " руб.\n" + number += 1 + + report += "-------------------------\n" + report += "Количество товаров: " + str(len(cart)) + "\n" + report += "Итоговая стоимость: " + str(total_cost) + " руб.\n" + + return report + + +def main(): + products = load_products_from_file("data.txt") + + print("Загруженные товары:") + for product in products: + print(product) + + valid_products = [] + invalid_products = [] + + for product in products: + if validate_product(product): + valid_products.append(product) + else: + invalid_products.append(product) + + print() + print("Корректных товаров:", len(valid_products)) + print("Некорректных товаров:", len(invalid_products)) + + filtered_products = filter_products_by_category(valid_products, "Электроника") + print() + print("Товары категории Электроника:") + for product in filtered_products: + print(product["name"], "-", product["price"], "руб.") + + found_products = search_products_by_keyword(valid_products, "игровой") + print() + print("Поиск по слову 'игровой':") + for product in found_products: + print(product["name"], "-", product["description"]) + + sorted_products = sort_products_by_price(found_products) + print() + print("После сортировки по цене:") + for product in sorted_products: + print(product["name"], "-", product["price"], "руб.") + + if len(valid_products) > 0: + old_price = valid_products[0]["price"] + new_price = calculate_discounted_price(old_price, 10) + + print() + print("Пример расчета скидки:") + print("Старая цена:", old_price) + print("Новая цена:", new_price) + + cart = build_cart(valid_products, [1, 3, 5]) + print() + print("Корзина:") + for product in cart: + print(product["name"], "-", product["price"], "руб.") + + discounts = { + 1: 10, + "Электроника": 5 + } + + total_cost = calculate_cart_total(cart, discounts) + print() + print("Итоговая стоимость корзины:", total_cost, "руб.") + + groups = group_products_by_category(valid_products) + print() + print("Группировка товаров по категориям:") + for category in groups: + print(category, "-", len(groups[category]), "товаров") + + report = generate_order_report(cart, total_cost) + print() + print(report) + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..fe91b70 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +1 задание по учебной практике \ No newline at end of file diff --git a/data.txt b/data.txt new file mode 100644 index 0000000..8576f67 --- /dev/null +++ b/data.txt @@ -0,0 +1,6 @@ +1;Ноутбук Lenovo;Электроника;55000;10;Игровой ноутбук с мощной видеокартой +2;Мышь Logitech;Электроника;2500;25;Беспроводная мышь для работы +3;Клавиатура Redragon;Электроника;3200;15;Механическая игровая клавиатура +4;Рюкзак Xiaomi;Аксессуары;2800;12;Городской рюкзак для ноутбука +5;Наушники JBL;Электроника;4700;8;Беспроводные наушники с хорошим звуком +6;Блокнот;Канцтовары;150;40;Тетрадь для записей \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..e69de29