Как напечатать этот шаблон? Я не могу получить логику устранения средней части
Напишите программу, которая запрашивает у пользователя ввод n
(предположим, что пользователь вводит положительное целое число) и печатает только границы треугольника, используя звездочки '*'
height n
.
Например, если пользователь вводит 6, высота треугольника должна быть 6, как показано ниже, и между звездочками сверху не должно быть пробелов
строка:
******
* *
* *
* *
**
*
Я не могу понять, как печатать часть между вершиной и концом рисунка? Это мой код:
n = int(input("Enter a positive integer value: "))
for i in range (n, 0, -1):
print ("*" * i)
Цикл for
предназначен для печати треугольника обратных звездочек. Препятствие - распечатать среднюю часть.
Ответы
Ответ 1
На каждой итерации цикла for
Вы печатаете одну строку рисунка, а длина - i
. Итак, в первой и последней строке шаблона у вас будет "*" * i
.
В каждой другой строке шаблона вы должны напечатать один *
в начале строки, один *
в конце и (i - 2)
пробелы посередине, потому что уже были напечатаны 2 звезды, что приводит к "*" + (" " * (i - 2)) + "*"
. После объединения этих двух случаев мы получаем следующий код:
n = int(input("Enter a positive integer value: "))
for i in range(n, 0, -1):
if i == 1 or i == n:
print("*" * i)
else:
print("*" + (" " * (i - 2)) + "*")
Ответ 2
Попробуйте следующее: он избегает использования инструкции if
в цикле for
:
n = int(input("Enter a positive integer value: "))
print('*' * n)
for i in range (n-3, -1, -1):
print ("*{}*".format(' ' * i))
print('*')
В течение 6 вы получите следующий результат:
******
* *
* *
* *
**
*
Вы также можете обрабатывать специальный случай 1
следующим образом:
n = int(input("Enter a positive integer value: "))
if n == 1:
print '*'
else:
print('*' * n)
for i in range (n-3, -1, -1):
print ("*{}*".format(' ' * i))
print('*')
Ответ 3
Поставьте разные условия для разных способов печати.
Используя тернарный оператор, вы можете сделать его одним строковым кодом:
n = int(input("Enter a positive integer value: "))
for i in range (n, 0, -1):
print ("*" * i if i == n or i == 1 else "*" + " " * (i - 2) + "*")
Обратите внимание, что у вас есть только два способа печати.
Трюк заключается в следующем:
Обратите внимание, что вы действительно печатаете непрерывно, когда i == n or i == 1
:
******
*
Но в остальном вы даете пробелы целых (i - 2)
* * #for 5, 3 spaces
* * #for 4, 2 spaces
* * #for 3, 1 space
** #for 2, 0 space
(Примечание: **
можно классифицировать как оба случая, тем не менее)
И поэтому вы можете сделать 1 оператор строки, чтобы выполнить его.
Edit:
Или, как Bakuriu, предложенный в комментарии, вы можете использовать результат булевой оценки Python как 1, когда true и 0, когда false, чтобы напечатать его без тройного оператора например:
n = int(input("Enter a positive integer value: "))
for i in range (n, 0, -1):
print('*' + '*'[i==n]*(i-2) + '*' * (i>1))
Ответ 4
А для цикла будет более компактным, но цикл while, возможно, проще, если вы не используете петли Python
print('*'*n)
num_spaces = n - 3 # bounded by two stars, and one char shorter
while num_spaces >= 0:
print('*' + ' '*num_spaces + '*')
num_spaces = num_spaces - 1
if n > 1: # Don't need another asterisk for 1
print('*')
Ответ 5
Это похоже на другие... просто используя rjust(), чтобы сделать промежутки в середине.
def print_a_triangle(n):
print("*" * (n+3))
for i in range(n):
print("{}{}{}".format("*", str(" ").rjust(n-i), "*"))
print("*")
print_a_triangle(6)
*********
* *
* *
* *
* *
* *
* *
*