From dcf434bd1089856eb7fc2e93c4527db26dc98025 Mon Sep 17 00:00:00 2001 From: pajjilykk Date: Wed, 1 Apr 2026 13:51:44 +0700 Subject: [PATCH] fix integer validation lab 1 --- lab1/main.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/lab1/main.py b/lab1/main.py index 55e5bc6..3a00da8 100644 --- a/lab1/main.py +++ b/lab1/main.py @@ -1,9 +1,12 @@ from decimal import Decimal, InvalidOperation +import re COUNT = 20 HEADER = "Лабораторная работа №1" TASK = "Задача: найти максимальный элемент списка и поменять его с первым" -FORMAT_HINT = "Можно вводить числа в формате: 10, -5.3, 1e20\n" +FORMAT_HINT = "Можно вводить только целые числа: 10, -5, 1e20\n" + +INTEGER_INPUT_PATTERN = re.compile(r"^[+-]?\d+(?:[eE][+-]?\d+)?$") def parse_number(user_input: str) -> tuple[Decimal, bool]: @@ -11,17 +14,22 @@ def parse_number(user_input: str) -> tuple[Decimal, bool]: if normalized == "": raise ValueError("Ошибка: пустой ввод. Повторите.") + if not INTEGER_INPUT_PATTERN.fullmatch(normalized): + raise ValueError("Ошибка: введите целое число (например, 10 или 1e3).") + used_scientific = "e" in normalized.lower() - normalized = normalized.replace(",", ".") try: number = Decimal(normalized) except InvalidOperation as error: - raise ValueError("Ошибка: это не число. Попробуйте снова.") from error + raise ValueError("Ошибка: введите целое число (например, 10 или 1e3).") from error if not number.is_finite(): raise ValueError("Ошибка: число должно быть конечным.") + if number != number.to_integral_value(): + raise ValueError("Ошибка: введите целое число (например, 10 или 1e3).") + return number, used_scientific