/
Intercruz
/
Python_Calculator
Обзор
Документация
Войти
/
Intercruz
/
Python_Calculator
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
main.py
202 строки
8 KB
Intercruz
Create: main.py
21 июл 2026, 15:43
Верифицирован
21 июл 2026, 15:43
9b01611
Код
Авторство
О чём код?
""" Кейс 1: Консольный калькулятор с историей операций. """ import os import datetime import sys from simpleeval import simple_eval # ---------------------- Арифметические функции ---------------------- def add(a: float, b: float) -> float: """Возвращает сумму двух чисел.""" return a + b def subtract(a: float, b: float) -> float: """Возвращает разность двух чисел.""" return a - b def multiply(a: float, b: float) -> float: """Возвращает произведение двух чисел.""" return a * b def divide(a: float, b: float) -> float: """ Возвращает частное от деления a на b. Выбрасывает ValueError при делении на ноль. """ if b == 0: raise ValueError("Деление на ноль невозможно.") return a / b # ---------------------- Валидация ввода (Сгенерировано ИИ) ---------------------- def get_number(prompt: str) -> float: """ Запрашивает у пользователя число с плавающей точкой. Обрабатывает некорректный ввод (повторный запрос). """ while True: try: value = input(prompt) return float(value) except ValueError: print("Ошибка: введите корректное число (целое или с плавающей точкой).") def get_operation_choice() -> str: """ Запрашивает у пользователя выбор операции (+, -, *, /). Возвращает символ операции. """ valid_ops = {'+', '-', '*', '/'} while True: choice = input("Выберите операцию (+, -, *, /): ").strip() if choice in valid_ops: return choice print("Ошибка: допустимые операции: +, -, *, /") # ---------------------- Работа с историей ---------------------- HISTORY_FILE = "history.txt" def save_history_simple(operation: str, a: float, b: float, result: float) -> None: """ Сохраняет запись об операции в файл истории. Каждая запись содержит: временную метку, выражение и результат. Используется в режиме 2 операндов и выбора операции """ timestamp = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") record = f"[{timestamp}] {a} {operation} {b} = {result}\n" try: with open(HISTORY_FILE, "a", encoding="utf-8") as f: f.write(record) except Exception as e: print(f"Ошибка при сохранении истории: {e}") def save_history(expression: str, result: float) -> None: """ Сохраняет запись об операции в файл истории. Каждая запись содержит: временную метку, выражение и результат. Используется в режиме ввода выражений """ timestamp = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") with open(HISTORY_FILE, "a", encoding="utf-8") as f: f.write(f"[{timestamp}] {expression} = {result}\n") def load_history() -> list[str]: """ Загружает все записи из файла истории. Если файл отсутствует или повреждён, возвращает пустой список. """ history = [] if not os.path.exists(HISTORY_FILE): return history try: with open(HISTORY_FILE, "r", encoding="utf-8") as f: history = f.readlines() except Exception as e: print(f"Ошибка при чтении истории: {e}") return history def show_history() -> None: """Выводит на экран всю историю операций.""" history = load_history() if not history: print("История пуста.") return print("\n--- История операций ---") for line in history: print(line.strip()) print("-------------------------\n") # ---------------------- Основная логика калькулятора ---------------------- def perform_calculation(): """Основной цикл режима выражений: запрос чисел, операции, вывод результата.""" expr = input("Введите арифметическое выражение (например, 5 + 2 * 6): ") try: result = simple_eval(expr) result = round(result, 10) print(f"Результат: {expr} = {result}") save_history(expr, result) except Exception as e: print(f"Ошибка в выражении: {e}") def perform_calculation_simple() -> None: """Основной цикл режима 2 операндов: запрос чисел, операции, вывод результата.""" print("\n--- Новое вычисление ---") a = get_number("Введите первое число: ") b = get_number("Введите второе число: ") op = get_operation_choice() try: if op == '+': result = add(a, b) elif op == '-': result = subtract(a, b) elif op == '*': result = multiply(a, b) elif op == '/': result = divide(a, b) else: print("Неподдерживаемая операция.") return result = round(result, 10) print(f"Результат: {a} {op} {b} = {result}") save_history_simple(op, a, b, result) except ValueError as e: print(f"Ошибка: {e}") except Exception as e: print(f"Неожиданная ошибка: {e}") # ---------------------- Меню и точка входа ---------------------- def main() -> None: """Главное меню программы.""" while True: print("\n=== КАЛЬКУЛЯТОР ===") print("1. Выполнить выражение") print("2. Выполнить операцию (2 операнда с выбором операции)") print("3. Показать историю") print("4. Очистить историю") print("5. Выйти") choice = input("Выберите пункт меню: ").strip() if choice == '1': perform_calculation() elif choice == '2': perform_calculation_simple() elif choice == '3': show_history() elif choice == '4': confirm = input("Вы уверены, что хотите очистить историю? (y/n): ").lower() if confirm == 'y': try: if os.path.exists(HISTORY_FILE): os.remove(HISTORY_FILE) print("История очищена.") else: print("Файл истории не существует.") except Exception as e: print(f"Ошибка при очистке истории: {e}") elif choice == '5': print("До свидания!") sys.exit(0) else: print("Неверный выбор. Попробуйте снова.") if __name__ == "__main__": main()