# -*- coding: utf-8 -*- """ Лаба 2. Проектирование трассы: шаг трассирования по плану в горизонталях. l_тр = dh / i_max (км, в натуре); l_план = l_тр * 1e5 / M (см, в плане), где M — знаменатель масштаба плана. Проверка по примеру методички: категория II, горная местность, i_max = 70 промиллей, dh = 10 м, M = 10000 -> 0,143 км и 1,43 см. """ from math import floor def rup(x, n=3): p = 10 ** n return floor(x * p + 0.5) / p # Наибольшие продольные уклоны, промиллей (табл. 1): (основной, пересеченная, горная) IMAX = { "I": (30, 40, 60), "II": (40, 50, 70), "III": (50, 60, 80), "IV": (60, 70, 90), } # Варианты (табл. 4 методички): местность, категория VARIANTS = { 1: ("горная", "I"), 2: ("пересеченная", "II"), 3: ("горная", "III"), 4: ("пересеченная", "IV"), 5: ("пересеченная", "I"), 6: ("горная", "IV"), 7: ("горная", "II"), 8: ("пересеченная", "IV"), 9: ("горная", "III"), 10: ("горная", "I"), 11: ("пересеченная", "IV"), 12: ("пересеченная", "II"), 13: ("пересеченная", "III"), 14: ("горная", "I"), 15: ("горная", "IV"), 16: ("пересеченная", "I"), 17: ("пересеченная", "II"), 18: ("горная", "III"), 19: ("пересеченная", "II"), 20: ("горная", "I"), } def compute(terrain, category, dh=10, M=10000): """Шаг трассирования. terrain: 'горная'|'пересеченная'.""" idx = {"основной": 0, "пересеченная": 1, "горная": 2}[terrain] i_max = IMAX[category][idx] l_nature_km = rup(dh / i_max, 3) # км в натуре l_nature_m = rup(dh / i_max * 1000, 0) # м в натуре l_plan_sm = rup(dh / i_max * 1e5 / M, 2) # см в плане return { "i_max, промиллей": i_max, "dh, м": dh, "масштаб": f"1:{M}", "l_тр, км (натура)": l_nature_km, "l_тр, м (натура)": l_nature_m, "l_тр, см (план)": l_plan_sm, } def report(title, res): print(f"\n=== {title} ===") for k, v in res.items(): print(f" {k:20} = {v}") if __name__ == "__main__": import sys if len(sys.argv) > 1 and sys.argv[1].isdigit(): n = int(sys.argv[1]) terrain, cat = VARIANTS[n] report(f"Вариант {n}: {terrain} местность, категория {cat}", compute(terrain, cat)) else: # пример методички report("Пример методички: горная, II категория", compute("горная", "II"))