Найти - Пользователи
Полная версия: Помогите с задачей на Python
Начало » Центр помощи » Помогите с задачей на Python
1
Frierra
Необходимо исправить код. При вводе разных переменных, особенно B, C, стороны съезжают.

 def draw_parallelepiped(A, B, C):
    A = max(1, A)
    B = max(1, B)
    C = max(1, C)
    print(' ' * (C + 1) + '+' + '-' * (2 * B - 1) + '+')
    for i in range(C):
        print(' ' * (C - i) + '/' + ' ' * i + '|' + ' ' * (2 * B - 2 - i) + '/' + ' ' * i + '|')
    print('+' + '-' * (2 * B - 1) + '+' + ' ' * C + '+')
    for _ in range(A - 1):
        print('|' + ' ' * i + '|' + ' ' * (2 * B - 2 - i) + '|' + ' ' * C + '|')
    print('|' + ' ' * i + '+' + '-' * (2 * B - 2 - i) + '+' + '-' * C + '+')
    for i in range(C - 1, -1, -1):
        print('|' + ' ' * (C + i - B) + '/' + ' ' * (2 * B - 2 - i) + '|' + ' ' * i + '/')
    print('+' + '-' * (2 * B - 1) + '+')
A = int(input("Введите высоту (A): "))
B = int(input("Введите ширину (B): "))
C = int(input("Введите глубину (C): "))
draw_parallelepiped(A, B, C)
xam1816
[code python]код вставлять между этими тегами[/code]
xam1816
  
offset = ''
left_edge = ''
front_side = ''
midl_edge = ''
right_side = ''
right_edge = ''
w = 3
h = 3
d = 3
for i in range(d + h + 3):
    if i == 0:
        offset = ' ' * (d + 1)
        left_edge = '+'
        front_side = '----' * w
        midl_edge = '+'
    if d >= i > 0:
        offset = ' ' * (d + 1 - i)
        left_edge = '/'
        front_side = '    ' * w
        midl_edge = '/'
        right_side = ' ' * (i - 1)
    if i > d:
        offset = ''
        right_side = ' ' * d
    if 0 < i <= h:
        right_edge = '|'
    if  i == h + 1:
        right_edge = '+'
    if i > h + 1:
        right_edge = '/'
        right_side = ' ' * (d + h + 1 - i)
    if i > d + 1:
        left_edge = '|'
        front_side = '    ' * w
        midl_edge = '|'
    if i == d + 1:
        left_edge = '+'
        front_side = '----' * w
        midl_edge = '+'
    if i == d + h + 2:
        left_edge = '+'
        front_side = '----' * w
        midl_edge = '+'
        right_edge = ''
    line = f'{offset}{left_edge}{front_side}{midl_edge}{right_side}{right_edge}'
    print(line)
py.user.next
xam1816
offset
  
>>> offset = ''
>>> left_edge = ''
>>> front_side = ''
>>> midl_edge = ''
>>> right_side = ''
>>> right_edge = ''
>>> 
>>> w = 3
>>> h = 3
>>> d = 6
>>> 
>>> for i in range(d + h + 3):
...     if i == 0:
...         offset = ' ' * (d + 1)
...         left_edge = '+'
...         front_side = '----' * w
...         midl_edge = '+'
...     if d >= i > 0:
...         offset = ' ' * (d + 1 - i)
...         left_edge = '/'
...         front_side = '    ' * w
...         midl_edge = '/'
...         right_side = ' ' * (i - 1)
...     if i > d:
...         offset = ''
...         right_side = ' ' * d
...     if 0 < i <= h:
...         right_edge = '|'
...     if  i == h + 1:
...         right_edge = '+'
...     if i > h + 1:
...         right_edge = '/'
...         right_side = ' ' * (d + h + 1 - i)
...     if i > d + 1:
...         left_edge = '|'
...         front_side = '    ' * w
...         midl_edge = '|'
...     if i == d + 1:
...         left_edge = '+'
...         front_side = '----' * w
...         midl_edge = '+'
...     if i == d + h + 2:
...         left_edge = '+'
...         front_side = '----' * w
...         midl_edge = '+'
...         right_edge = ''
...     line = f'{offset}{left_edge}{front_side}{midl_edge}{right_side}{right_edge}'
...     print(line)
... 
       +------------+
      /            /|
     /            / |
    /            /  |
   /            /   +
  /            /     /
 /            /    /
+------------+   /
|            |  /
|            | /
|            |/
+------------+
>>>
Протекла коробка.

И там ещё внутренность должна быть - ну те линии, которые пунктиром идут внутри фигуры.
Frierra
Спасибо Вам, что отозвались, но только у Вас параллепипеды не имеют внутренних ребер, а это основное правило задания, + стороны должен задавать пользователь .・゚゚・(/ω\)・゚゚・.
py.user.next
Тут надо декомпозировать задачу - разложить на два отдельных этапа.
На первом этапе сначала нужно представить, что мы выводим это всё не построчно, а по точкам, имея доступ в любую точку экрана в любой момент.
Таким образом, мы можем сообразить, как вообще нарисовать фигуру, как она должна выглядеть, включая все пропорции и все необходимые линии при любых заданных параметрах, которые могут сильно отличаться друг от друга.
Когда мы получили способ изображения фигуры при любых входных параметрах, мы можем перейти ко второму этапу.
На втором этапе мы делаем построчный вывод нескольких разных фигур, и, возможно, пишем даже несколько разных кодов для их вывода, чтобы просто понять, что в этих кодах похоже, а что различается.
Дальше мы уже придумываем параметры для изменяющихся частей ранее полученных кодов. Какие-то части кодов будут одинаковые, а какие-то будут различаться. Вот для этих различающихся нужно будет сделать параметры ещё одни, благодаря которым для этих различающихся частей можно будет сделать единую форму, которая только от параметров зависит. Это как отдельный подалгоритм, параметризованный при этом.
И вот после этого получится соединить это всё воедино и оно будет работать для любых входных параметров правильно и выводить правильно фигуры.

Вот если это всё не проделать, то у вас либо вообще ничего не получится вывести, либо одна из тысячи коробок будет протекать. Все будут показываться правильно, а одна какая-нибудь будет кривой.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB