Advertisement
myloyo

Задание 5. Исключения

Nov 25th, 2024 (edited)
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.42 KB | None | 0 0
  1. import csv
  2.  
  3.  
  4. class InvalidInputError(Exception):
  5.     pass
  6.  
  7.  
  8. def parse_input_parameters(params):
  9.     parsed = {"file": "input.csv", "rows": None, "cols": None, "n": None, "m": None, "items": []}
  10.     for param in params:
  11.         try:
  12.             param = param.strip().strip(",")
  13.             if param.startswith(("f=", "file=")):
  14.                 parsed["file"] = param.split("=", 1)[1]
  15.             elif param.startswith(("n=", "number=")):
  16.                 parsed["n"] = int(param.split("=", 1)[1])
  17.             elif param.startswith("rows="):
  18.                 parsed["rows"] = int(param.split("=", 1)[1])
  19.             elif param.startswith("cols="):
  20.                 parsed["cols"] = int(param.split("=", 1)[1])
  21.             elif param.startswith(("m=", "pigeons=")):
  22.                 parsed["m"] = int(param.split("=", 1)[1])
  23.             else:
  24.                 items = param.split(";") if ";" in param else param.split(",")
  25.                 parsed["items"].extend(item.strip() for item in items)
  26.         except ValueError:
  27.             raise InvalidInputError(f"Неверный формат параметра: {param}")
  28.     return parsed
  29.  
  30.  
  31. def validate_csv_and_params(file_path, rows, cols, n, m, items):
  32.     try:
  33.         with open(file_path, 'r', encoding='utf-8') as file:
  34.             reader = csv.reader(file)
  35.             csv_content = [row for row in reader]
  36.     except FileNotFoundError:
  37.         raise InvalidInputError(f"Файл {file_path} не найден.")
  38.  
  39.     errors = []
  40.     unique_items = set(item for row in csv_content for cell in row for item in cell.split(",") if cell.strip())
  41.  
  42.     if rows is not None and rows != len(csv_content):
  43.         errors.append(f"Ожидалось {rows} строк, но в файле их {len(csv_content)}.")
  44.     if cols is not None and cols != max(len(row) for row in csv_content):
  45.         errors.append(f"Ожидалось {cols} колонок, но в файле их {max(len(row) for row in csv_content)}.")
  46.     if n is not None and n != len(csv_content) * max(len(row) for row in csv_content):
  47.         errors.append(f"Ожидалось {n} ящиков, но в файле их {len(csv_content) * max(len(row) for row in csv_content)}.")
  48.     if m is not None and m != len(items):
  49.         errors.append(f"Ожидалось {m} предметов, но в списке их {len(items)}.")
  50.     if set(items) != unique_items:
  51.         errors.append(f"Предметы из параметров не совпадают с предметами в файле.")
  52.  
  53.     return errors, csv_content
  54.  
  55.  
  56. def dirichlet(n, m):
  57.     if n == 0:
  58.         return "Невозможно сформулировать принцип Дирихле: ящиков нет."
  59.     if m == 0:
  60.         return f"Если в {n} ящиках лежит 0 предметов, то все ящики пусты."
  61.     if m > n:
  62.         return f"Если в {n} ящиках лежит {m} предметов, то хотя бы в одном ящике лежит не менее {-(m // -n)} предметов."
  63.     else:
  64.         return f"Если в {n} ящиках лежит {m} предметов, то пустых ящиков как минимум {n - m}."
  65.  
  66. def vvod_params():
  67.     print("Введите параметры в формате: ")
  68.     print("file=<имя файла>, n=<число ящиков>, rows=<число рядов>, cols=<число колонок>, m=<число предметов>")
  69.     print("перечисление предметов через запятую или точку с запятой. 'end' для завершения.")
  70.  
  71.     params = []
  72.     while True:
  73.         s = input("Параметр: ").strip()
  74.         if s.lower() == "end":
  75.             break
  76.         if s:
  77.             params.append(s)
  78.  
  79.     return params
  80.  
  81.  
  82. input_param = [
  83.     "file=input.csv",
  84.     "cols=4",
  85.     "rows=3",
  86.     "n=12",
  87.     "m=9",
  88.     'игрушка,коробка,свечка,лего,кукла,свитер с оленями,ни,че,го'
  89. ]
  90.  
  91. if __name__ == "__main__":
  92.     input_parameters = vvod_params()
  93.     params = parse_input_parameters(input_parameters)
  94.  
  95.     errors, csv_data = validate_csv_and_params(
  96.         params["file"], params["rows"], params["cols"], params["n"], params["m"], params["items"]
  97.     )
  98.  
  99.     if errors:
  100.         print("Ошибки проверки:")
  101.         print("\n".join(errors))
  102.     else:
  103.         print(dirichlet(params["n"], params["m"]))
  104.  
  105.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement