2016-02-22 10 views
11

Viết chương trình yêu cầu người dùng nhập n (giả sử rằng người dùng nhập một số nguyên dương) và chỉ in các đường viền của hình tam giác sử dụng dấu hoa thị '*' chiều cao n.Làm cách nào để in mẫu này? Tôi không thể có được logic để loại bỏ phần giữa

Ví dụ, nếu người dùng nhập vào 6 thì chiều cao của tam giác nên 6 như hình dưới đây và không nên có khoảng trống giữa các dấu sao trên dòng trên cùng:

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

Tôi không thể hiểu làm thế nào để in phần giữa đầu và cuối của mẫu? Đây là mã của tôi:

n = int(input("Enter a positive integer value: ")) 
for i in range (n, 0, -1): 
    print ("*" * i) 

Vòng lặp for dùng để in hình tam giác dấu sao ngược. Trở ngại là in phần giữa.

Trả lời

15

Trong mỗi lần lặp của vòng lặp for Bạn in một dòng của mẫu và chiều dài của nó là i. Vì vậy, trong dòng đầu tiên và dòng cuối cùng của mẫu Bạn sẽ có "*" * i. Trong mỗi dòng khác của mẫu, bạn phải in một * ở đầu dòng, * ở cuối và (i - 2) khoảng trống ở giữa vì 2 sao đã được in ra, kết quả là "*" + (" " * (i - 2)) + "*". Sau khi kết hợp hai trường hợp đó, chúng tôi nhận được mã sau:

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)) + "*") 
+1

Tôi không thể hiểu phần cuối cùng khác. Bạn có thể giải thích dùm không? –

+0

Ở giữa mẫu, bạn phải in một '*' ở đầu dòng, một '*' ở cuối, và '(i-2)' khoảng trống ở giữa vì 2 sao đã được in ra. Đó là khá nhiều. –

+0

Ah, hiểu rồi. Cảm ơn. –

10

Hãy thử những điều sau đây, nó tránh sử dụng một tuyên bố if trong for loop:

n = int(input("Enter a positive integer value: ")) 
print('*' * n) 

for i in range (n-3, -1, -1): 
    print ("*{}*".format(' ' * i)) 

print('*') 

Đối với 6, bạn sẽ nhận được kết quả như sau:

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

Bạn cũng có thể xử lý các trường hợp đặc biệt của 1 như sau:

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('*') 
5

Đặt các điều kiện khác nhau cho các cách in khác nhau.

Sử dụng nhà điều hành ternary, bạn có thể làm cho nó một mã một dòng:

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) + "*") 

Chú ý rằng bạn chỉ có hai cách in ấn.

Bí quyết là:

Lưu ý rằng bạn thực sự in liên tục khi i == n or i == 1:

****** 
* 

Nhưng nếu không bạn cung cấp cho không gian càng nhiều càng (i - 2)

* * #for 5, 3 spaces 
* * #for 4, 2 spaces 
* * #for 3, 1 space 
** #for 2, 0 space 

(Lưu ý: ** thể được phân loại là cả hai trường hợp, tuy nhiên)

Và vì vậy bạn có thể thực hiện tuyên bố 1 dòng để hoàn thành nó.

Edit:

Hoặc, như Bakuriu gợi ý trong các bình luận, bạn có thể khai thác các kết quả đánh giá boolean Python như 1 khi đúng và 0 khi sai để in nó mà không điều hành ternary như thế này:

n = int(input("Enter a positive integer value: ")) 
for i in range (n, 0, -1): 
    print('*' + '*'[i==n]*(i-2) + '*' * (i>1)) 
+1

Thậm chí ngắn hơn: 'in ('*' + '*' [i == n] * (i-2) + '*' * (i> 1))' – Bakuriu

+0

@Bakuriu wow! Tôi không thể tin rằng bạn có thể * tìm thấy * cái * ngắn * đó. Nhưng bạn đúng ... nó thậm chí còn ngắn hơn! ;) – Ian

+0

Câu trả lời @Bakuriu đã thay đổi. Đó chắc chắn là giá trị bao gồm. ;) – Ian

3

một vòng lặp for sẽ nhỏ gọn hơn, nhưng một vòng lặp while có lẽ là đơn giản hơn nếu bạn không sử dụng để vòng Python của

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('*') 
2

Điều này cũng tương tự như những người khác ... chỉ cần sử dụng rjust() để tạo khoảng trống ở giữa.

def print_a_triangle(n): 
    print("*" * (n+3)) 
    for i in range(n): 
     print("{}{}{}".format("*", str(" ").rjust(n-i), "*")) 

    print("*") 

print_a_triangle(6) 

********* 
*  * 
*  * 
* * 
* * 
* * 
* * 
* 
Các vấn đề liên quan