Python 3 центрированный треугольник - PullRequest
0 голосов
/ 06 октября 2018

Я пытаюсь отточить свой Python 3 (в частности, вложенные циклы) с помощью старых добрых упражнений с треугольниками (которые пока требуют только нечетного ввода).Тем не менее, я столкнулся с проблемой, с которой я не могу исказить голову.

user_input = 7
x = 1
temp = user_input
spaces = " "
stars = ""
y = temp - 2
t = 0
while x < temp:
    while y > t:
        stars = "*" * x
        spaces = spaces * y
        print(spaces + stars)
        spaces= " "
        y -= 1
        x += 2

У меня есть user_input (сейчас это 7, поэтому мне не нужно вводить каждыйраз бегаю).

Переменная x и t, используемая для цикла while

Другая переменная temp, которая содержит мой user_input (на случай, если я уменьшу его как 'повреждение 'исходная переменная).

Переменная spaces и другая переменная stars (что самоочевидно, поскольку я пытаюсь нарисовать треугольник на основе звездочек).

У меня есть переменная y, которая равна temp - 2

Ожидаемый результат 7 должен быть таким:

     *
    ***
   *****
  *******

Причина, по которой я сделал y равным temp - 2 потому что в первой строке пробелы равны user_input - 2.

Итак, допустим, что наш вход был 7, количество пробелов в первой строке равно 5.

Если наш вход 9, количество пробелов в первой строке равно 7

Первый *Цикл 1036 * будет повторять цикл от 1 до 7 (1, 3, 5, 7), поэтому я сделал x равным 1.

Второй цикл while должен выполнить цикл из input - 2до 0.

Странно то, что если мой user_input равен 5, он выдает то, что я ожидал.

   *
  ***
 *****

Но как только я что-то ввожукак 7, он строит треугольник от 1 до 9 (1, 3, 5, 7, 9)

     *
    ***
   *****
  *******
 *********

Но я ожидаю, что он закончится прямо перед последней строкой, он должен вывести как можно большезвездочки как мой вклад.

Мой мыслительный процесс неправильный?Если да, то где я в итоге ошибся?

Надеюсь, я все максимально разъяснил.

Спасибо большое.

Ответы [ 4 ]

0 голосов
/ 06 октября 2018

В вашем коде есть ошибка.Вот исправленный код.

user_input = 7
x = 1
temp = user_input
spaces = " "
stars = ""
y = temp - 2
t = 0
while x <= temp:
    stars = "*" * x
    spaces = spaces * y
    print(spaces + stars)
    spaces= " "
    y -= 1
    x += 2

Нет необходимости проверять y>0, так как вашего первого цикла while достаточно для удовлетворения требования.Из-за этого дополнительного while loop вы получаете неоднозначные значения (x,y).

0 голосов
/ 06 октября 2018

Ленивое решение с использованием встроенного center() и мини-языка формата :

user_input = [5,7,9]

def getStars(num):
    return ('*' * i for i in range(1,num+1,2))

def sol1(num):
    for s in getStars(num):
        print(s.center(num)) 

def sol2(num):
    stars = getStars(num)

    for s in stars:
        print( ("{:^"+str(num)+"}").format(s))

for s in user_input:
    sol1(s)
    sol2(s) 

Вывод:

  *  
 *** 
*****
  *  
 *** 
*****
   *   
  ***  
 ***** 
*******
   *   
  ***  
 ***** 
*******
    *    
   ***   
  *****  
 ******* 
*********
    *    
   ***   
  *****  
 ******* 
*********
0 голосов
/ 06 октября 2018

Давайте немного поясним ваш код:

  • t бесполезен, поскольку он содержит только 0 и никогда не меняется, вместо него используйте 0
  • user_input никогда не используетсякроме как для temp = user_input, используйте user_input вместо temp.Что касается уменьшения его, этого не происходит, и в любом случае вы никогда не вернете его пользователю, так что все будет в порядке.
  • Это своего рода опечатка, так что все в порядке, но не позволяйте печатать отладочные отпечатки вроде print(x,y) когда вы показываете некоторый код в переполнении стека, нам сложнее понять весь код.
  • Если вы вернетесь назад spaces = " " в конце while, просто используйте spaces = " " * y.
  • Вы ничего не делаете между двумя while, чтобы вы могли "объединить" их с and условиями.

Итак, теперь у нас есть:

user_input = 9
x = 1
y = user_input - 2
while x < user_input and y > 0:
    stars = "*" * x
    spaces = " " * y
    print(spaces + stars)
    y -= 1
    x += 2

Как видите, у вас есть два условия остановки на вашем while, когда только одно будет более ясным.Причина того, что ваш код работает с 7 и не более, заключается в том, что 7 - это предел между тем, когда одно условие останавливает цикл, и другим.

Я бы предложил изменить ваш код на:

user_input = 3
x = 0
while x < user_input//2:
    stars = "*" * (x * 2 + 1)
    spaces = " " * (user_input//2 - x)
    print(spaces + stars)
    x += 1
0 голосов
/ 06 октября 2018

Кажется слишком сложным.Почему бы просто:

input = 7
i = 1
while i <= input:
    spaces = ' ' * ((input-i) // 2) 
    stars = '*' * i
    print(spaces + stars)
    i += 2 

   *
  ***
 *****
*******

Или даже проще, используя str.center:

while i <= input:
    print(('*' * i).center(input))
    i += 2
...